C++: Split designator AST

Change-Id: I9bfed2023624c818c0f35f24476693cffeaf2bbc
Reviewed-by: Wang Hoi <wanghoi@126.com>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
Orgad Shaneh
2014-06-20 09:57:46 +03:00
committed by Nikolai Kosjar
parent cb079c5319
commit ea4b4bff40
14 changed files with 177 additions and 79 deletions

View File

@@ -138,6 +138,7 @@ public:
virtual BinaryExpressionAST *asBinaryExpression() { return 0; }
virtual BoolLiteralAST *asBoolLiteral() { return 0; }
virtual BracedInitializerAST *asBracedInitializer() { return 0; }
virtual BracketDesignatorAST *asBracketDesignator() { return 0; }
virtual BreakStatementAST *asBreakStatement() { return 0; }
virtual CallAST *asCall() { return 0; }
virtual CaptureAST *asCapture() { return 0; }
@@ -165,6 +166,7 @@ public:
virtual DesignatorAST *asDesignator() { return 0; }
virtual DestructorNameAST *asDestructorName() { return 0; }
virtual DoStatementAST *asDoStatement() { return 0; }
virtual DotDesignatorAST *asDotDesignator() { return 0; }
virtual DynamicExceptionSpecificationAST *asDynamicExceptionSpecification() { return 0; }
virtual ElaboratedTypeSpecifierAST *asElaboratedTypeSpecifier() { return 0; }
virtual EmptyDeclarationAST *asEmptyDeclaration() { return 0; }
@@ -4531,38 +4533,54 @@ protected:
class DesignatorAST: public AST
{
public:
enum Type
{
Invalid,
Dot,
Bracket
};
Type type;
union Designator
{
struct DotDesignator
{
unsigned dot_token;
unsigned identifier_token;
} dot;
struct BracketDesignator
{
unsigned lbracket_token;
ExpressionAST *expression;
unsigned rbracket_token;
} bracket;
} u;
public:
DesignatorAST()
{}
virtual DesignatorAST *asDesignator() { return this; }
virtual DesignatorAST *clone(MemoryPool *pool) const = 0;
};
class DotDesignatorAST: public DesignatorAST
{
public:
unsigned dot_token;
unsigned identifier_token;
public:
DotDesignatorAST()
: dot_token(0)
, identifier_token(0)
{}
virtual DotDesignatorAST *asDotDesignator() { return this; }
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
virtual DesignatorAST *clone(MemoryPool *pool) const;
virtual DotDesignatorAST *clone(MemoryPool *pool) const;
protected:
virtual void accept0(ASTVisitor *visitor);
virtual bool match0(AST *, ASTMatcher *);
};
class BracketDesignatorAST: public DesignatorAST
{
public:
unsigned lbracket_token;
ExpressionAST *expression;
unsigned rbracket_token;
public:
BracketDesignatorAST()
: lbracket_token(0)
, expression(0)
, rbracket_token(0)
{}
virtual BracketDesignatorAST *asBracketDesignator() { return this; }
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
virtual BracketDesignatorAST *clone(MemoryPool *pool) const;
protected:
virtual void accept0(ASTVisitor *visitor);