summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp18
-rw-r--r--src/shared/cplusplus/AST.h25
-rw-r--r--src/shared/cplusplus/ASTClone.cpp8
-rw-r--r--src/shared/cplusplus/ASTMatch0.cpp8
-rw-r--r--src/shared/cplusplus/ASTMatcher.cpp13
-rw-r--r--src/shared/cplusplus/ASTMatcher.h1
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp8
-rw-r--r--src/shared/cplusplus/ASTVisitor.h2
-rw-r--r--src/shared/cplusplus/ASTfwd.h1
-rw-r--r--src/shared/cplusplus/Parser.cpp4
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;