From 4fa0326813b4fc9d3c85cb9235f42cf22beead72 Mon Sep 17 00:00:00 2001 From: Lu Guanqun Date: Tue, 22 Dec 2015 16:44:51 +0000 Subject: [PATCH] [cond-expr] add an AST node --- libsolidity/ast/AST.h | 27 +++++++++++++++++++++++++++ libsolidity/ast/ASTForward.h | 1 + libsolidity/ast/AST_accept.h | 22 ++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/libsolidity/ast/AST.h b/libsolidity/ast/AST.h index 4baf95d30..e10634676 100644 --- a/libsolidity/ast/AST.h +++ b/libsolidity/ast/AST.h @@ -1119,6 +1119,33 @@ public: ExpressionAnnotation& annotation() const override; }; +class Conditional: public Expression +{ +public: + Conditional( + SourceLocation const& _location, + ASTPointer const& _condition, + ASTPointer const& _trueExpression, + ASTPointer const& _falseExpression + ): + Expression(_location), + m_condition(_condition), + m_trueExpression(_trueExpression), + m_falseExpression(_falseExpression) + {} + virtual void accept(ASTVisitor& _visitor) override; + virtual void accept(ASTConstVisitor& _visitor) const override; + + Expression const& condition() const { return *m_condition; } + Expression const& trueExpression() const { return *m_trueExpression; } + Expression const& falseExpression() const { return *m_falseExpression; } + +private: + ASTPointer m_condition; + ASTPointer m_trueExpression; + ASTPointer m_falseExpression; +}; + /// Assignment, can also be a compound assignment. /// Examples: (a = 7 + 8) or (a *= 2) class Assignment: public Expression diff --git a/libsolidity/ast/ASTForward.h b/libsolidity/ast/ASTForward.h index 6aaa77ce0..dad2b2e2b 100644 --- a/libsolidity/ast/ASTForward.h +++ b/libsolidity/ast/ASTForward.h @@ -69,6 +69,7 @@ class Throw; class VariableDeclarationStatement; class ExpressionStatement; class Expression; +class Conditional; class Assignment; class TupleExpression; class UnaryOperation; diff --git a/libsolidity/ast/AST_accept.h b/libsolidity/ast/AST_accept.h index 61370c557..dee9d5b14 100644 --- a/libsolidity/ast/AST_accept.h +++ b/libsolidity/ast/AST_accept.h @@ -551,6 +551,28 @@ void VariableDeclarationStatement::accept(ASTConstVisitor& _visitor) const _visitor.endVisit(*this); } +void Conditional::accept(ASTVisitor& _visitor) +{ + if (_visitor.visit(*this)) + { + m_condition->accept(_visitor); + m_trueExpression->accept(_visitor); + m_falseExpression->accept(_visitor); + } + _visitor.endVisit(*this); +} + +void Conditional::accept(ASTConstVisitor& _visitor) const +{ + if (_visitor.visit(*this)) + { + m_condition->accept(_visitor); + m_trueExpression->accept(_visitor); + m_falseExpression->accept(_visitor); + } + _visitor.endVisit(*this); +} + void Assignment::accept(ASTVisitor& _visitor) { if (_visitor.visit(*this))