diff options
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/AST.cpp | 18 | ||||
-rw-r--r-- | src/shared/cplusplus/AST.h | 25 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTClone.cpp | 8 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatch0.cpp | 8 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatcher.cpp | 13 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatcher.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisit.cpp | 8 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisitor.h | 2 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTfwd.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 4 |
10 files changed, 86 insertions, 2 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 3922b44a33..3d5f80a7f5 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -4211,3 +4211,21 @@ unsigned AttributeSpecifierAST::lastToken() const return 0; } +/** \generated */ +unsigned IdExpressionAST::firstToken() const +{ + if (name) + if (unsigned candidate = name->firstToken()) + return candidate; + return 0; +} + +/** \generated */ +unsigned IdExpressionAST::lastToken() const +{ + if (name) + if (unsigned candidate = name->lastToken()) + return candidate; + return 0; +} + diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 5eaa6624e5..2bbe99e2c6 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -201,6 +201,7 @@ public: virtual FunctionDeclaratorAST *asFunctionDeclarator() { return 0; } virtual FunctionDefinitionAST *asFunctionDefinition() { return 0; } virtual GotoStatementAST *asGotoStatement() { return 0; } + virtual IdExpressionAST *asIdExpression() { return 0; } virtual IfStatementAST *asIfStatement() { return 0; } virtual LabeledStatementAST *asLabeledStatement() { return 0; } virtual LambdaCaptureAST *asLambdaCapture() { return 0; } @@ -337,7 +338,7 @@ public: virtual DeclarationAST *clone(MemoryPool *pool) const = 0; }; -class CPLUSPLUS_EXPORT NameAST: public ExpressionAST +class CPLUSPLUS_EXPORT NameAST: public AST { public: // annotations const Name *name; @@ -965,6 +966,28 @@ protected: virtual bool match0(AST *, ASTMatcher *); }; +class CPLUSPLUS_EXPORT IdExpressionAST: public ExpressionAST +{ +public: + NameAST *name; + +public: + IdExpressionAST() + : name(0) + {} + + virtual IdExpressionAST *asIdExpression() { return this; } + + virtual unsigned firstToken() const; + virtual unsigned lastToken() const; + + virtual IdExpressionAST *clone(MemoryPool *pool) const; + +protected: + virtual void accept0(ASTVisitor *visitor); + virtual bool match0(AST *, ASTMatcher *); +}; + class CPLUSPLUS_EXPORT CompoundExpressionAST: public ExpressionAST { public: diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp index cb08a05f7c..c5a522ebdb 100644 --- a/src/shared/cplusplus/ASTClone.cpp +++ b/src/shared/cplusplus/ASTClone.cpp @@ -273,6 +273,14 @@ BaseSpecifierAST *BaseSpecifierAST::clone(MemoryPool *pool) const return ast; } +IdExpressionAST *IdExpressionAST::clone(MemoryPool *pool) const +{ + IdExpressionAST *ast = new (pool) IdExpressionAST; + if (name) + ast->name = name->clone(pool); + return ast; +} + CompoundExpressionAST *CompoundExpressionAST::clone(MemoryPool *pool) const { CompoundExpressionAST *ast = new (pool) CompoundExpressionAST; diff --git a/src/shared/cplusplus/ASTMatch0.cpp b/src/shared/cplusplus/ASTMatch0.cpp index 1ab0b0c077..d955b69971 100644 --- a/src/shared/cplusplus/ASTMatch0.cpp +++ b/src/shared/cplusplus/ASTMatch0.cpp @@ -201,6 +201,14 @@ bool BaseSpecifierAST::match0(AST *pattern, ASTMatcher *matcher) return false; } +bool IdExpressionAST::match0(AST *pattern, ASTMatcher *matcher) +{ + if (IdExpressionAST *_other = pattern->asIdExpression()) + return matcher->match(this, _other); + + return false; +} + bool CompoundExpressionAST::match0(AST *pattern, ASTMatcher *matcher) { if (CompoundExpressionAST *_other = pattern->asCompoundExpression()) diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp index 7601430862..2b4c88bf93 100644 --- a/src/shared/cplusplus/ASTMatcher.cpp +++ b/src/shared/cplusplus/ASTMatcher.cpp @@ -427,6 +427,19 @@ bool ASTMatcher::match(BaseSpecifierAST *node, BaseSpecifierAST *pattern) return true; } +bool ASTMatcher::match(IdExpressionAST *node, IdExpressionAST *pattern) +{ + (void) node; + (void) pattern; + + if (! pattern->name) + pattern->name = node->name; + else if (! AST::match(node->name, pattern->name, this)) + return false; + + return true; +} + bool ASTMatcher::match(CompoundExpressionAST *node, CompoundExpressionAST *pattern) { (void) node; diff --git a/src/shared/cplusplus/ASTMatcher.h b/src/shared/cplusplus/ASTMatcher.h index c5fff82629..22c643c666 100644 --- a/src/shared/cplusplus/ASTMatcher.h +++ b/src/shared/cplusplus/ASTMatcher.h @@ -90,6 +90,7 @@ public: virtual bool match(FunctionDeclaratorAST *node, FunctionDeclaratorAST *pattern); virtual bool match(FunctionDefinitionAST *node, FunctionDefinitionAST *pattern); virtual bool match(GotoStatementAST *node, GotoStatementAST *pattern); + virtual bool match(IdExpressionAST *node, IdExpressionAST *pattern); virtual bool match(IfStatementAST *node, IfStatementAST *pattern); virtual bool match(LabeledStatementAST *node, LabeledStatementAST *pattern); virtual bool match(LinkageBodyAST *node, LinkageBodyAST *pattern); diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index 5a299ed53f..be0ffe01a2 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -205,6 +205,14 @@ void BaseSpecifierAST::accept0(ASTVisitor *visitor) visitor->endVisit(this); } +void IdExpressionAST::accept0(ASTVisitor *visitor) +{ + if (visitor->visit(this)) { + accept(name, visitor); + } + visitor->endVisit(this); +} + void CompoundExpressionAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h index a515da4d1b..56bb720f10 100644 --- a/src/shared/cplusplus/ASTVisitor.h +++ b/src/shared/cplusplus/ASTVisitor.h @@ -151,6 +151,7 @@ public: virtual bool visit(FunctionDeclaratorAST *) { return true; } virtual bool visit(FunctionDefinitionAST *) { return true; } virtual bool visit(GotoStatementAST *) { return true; } + virtual bool visit(IdExpressionAST *) { return true; } virtual bool visit(IfStatementAST *) { return true; } virtual bool visit(LabeledStatementAST *) { return true; } virtual bool visit(LinkageBodyAST *) { return true; } @@ -293,6 +294,7 @@ public: virtual void endVisit(FunctionDeclaratorAST *) { } virtual void endVisit(FunctionDefinitionAST *) { } virtual void endVisit(GotoStatementAST *) { } + virtual void endVisit(IdExpressionAST *) { } virtual void endVisit(IfStatementAST *) { } virtual void endVisit(LabeledStatementAST *) { } virtual void endVisit(LinkageBodyAST *) { } diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index 897edb6ccc..cd434c05ef 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -108,6 +108,7 @@ class ForeachStatementAST; class FunctionDeclaratorAST; class FunctionDefinitionAST; class GotoStatementAST; +class IdExpressionAST; class IfStatementAST; class LabeledStatementAST; class LambdaCaptureAST; diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 663fc6d8b2..aa1a622b2c 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -3822,7 +3822,9 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node) default: { NameAST *name = 0; if (parseNameId(name)) { - node = name; + IdExpressionAST *ast = new (_pool) IdExpressionAST; + ast->name = name; + node = ast; return true; } break; |