aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp78
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h66
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp16
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatch0.cpp12
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp23
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.h3
-rw-r--r--src/libs/3rdparty/cplusplus/ASTPatternBuilder.h11
-rw-r--r--src/libs/3rdparty/cplusplus/ASTVisit.cpp10
-rw-r--r--src/libs/3rdparty/cplusplus/ASTVisitor.h6
-rw-r--r--src/libs/3rdparty/cplusplus/ASTfwd.h2
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp16
-rw-r--r--src/plugins/cpptools/cppchecksymbols.cpp5
-rw-r--r--src/plugins/cpptools/cppchecksymbols.h2
-rw-r--r--tests/tools/cplusplus-ast2png/dumpers.inc16
14 files changed, 182 insertions, 84 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp
index dd341db6d9a..312b1dcfc25 100644
--- a/src/libs/3rdparty/cplusplus/AST.cpp
+++ b/src/libs/3rdparty/cplusplus/AST.cpp
@@ -4478,41 +4478,49 @@ unsigned DesignatedInitializerAST::lastToken() const
return 1;
}
-unsigned DesignatorAST::firstToken() const
-{
- if (type == DesignatorAST::Dot) {
- if (u.dot.dot_token)
- return u.dot.dot_token;
- if (u.dot.identifier_token)
- return u.dot.identifier_token;
- } else if (type == DesignatorAST::Bracket) {
- if (u.bracket.lbracket_token)
- return u.bracket.lbracket_token;
- if (u.bracket.expression)
- if (unsigned candidate = u.bracket.expression->firstToken())
- return candidate;
- if (u.bracket.rbracket_token)
- return u.bracket.rbracket_token;
- }
- return 0;
-}
-
-unsigned DesignatorAST::lastToken() const
-{
- if (type == DesignatorAST::Dot) {
- if (u.dot.identifier_token)
- return u.dot.identifier_token + 1;
- if (u.dot.dot_token)
- return u.dot.dot_token + 1;
- } else if (type == DesignatorAST::Bracket) {
- if (u.bracket.rbracket_token)
- return u.bracket.rbracket_token + 1;
- if (u.bracket.expression)
- if (unsigned candidate = u.bracket.expression->lastToken())
- return candidate;
- if (u.bracket.lbracket_token)
- return u.bracket.lbracket_token + 1;
- }
+/** \generated */
+unsigned BracketDesignatorAST::firstToken() const
+{
+ if (lbracket_token)
+ return lbracket_token;
+ if (expression)
+ if (unsigned candidate = expression->firstToken())
+ return candidate;
+ if (rbracket_token)
+ return rbracket_token;
+ return 0;
+}
+
+/** \generated */
+unsigned BracketDesignatorAST::lastToken() const
+{
+ if (rbracket_token)
+ return rbracket_token + 1;
+ if (expression)
+ if (unsigned candidate = expression->lastToken())
+ return candidate;
+ if (lbracket_token)
+ return lbracket_token + 1;
+ return 1;
+}
+
+/** \generated */
+unsigned DotDesignatorAST::firstToken() const
+{
+ if (dot_token)
+ return dot_token;
+ if (identifier_token)
+ return identifier_token;
+ return 0;
+}
+
+/** \generated */
+unsigned DotDesignatorAST::lastToken() const
+{
+ if (identifier_token)
+ return identifier_token + 1;
+ if (dot_token)
+ return dot_token + 1;
return 1;
}
diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h
index b31550453be..d102db0fe0d 100644
--- a/src/libs/3rdparty/cplusplus/AST.h
+++ b/src/libs/3rdparty/cplusplus/AST.h
@@ -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; }
@@ -4532,37 +4534,53 @@ 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 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 DesignatorAST *clone(MemoryPool *pool) const;
+ virtual BracketDesignatorAST *clone(MemoryPool *pool) const;
protected:
virtual void accept0(ASTVisitor *visitor);
diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp
index 086b12b1c9b..969adef311a 100644
--- a/src/libs/3rdparty/cplusplus/ASTClone.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp
@@ -1762,9 +1762,21 @@ BracedInitializerAST *BracedInitializerAST::clone(MemoryPool *pool) const
return ast;
}
-DesignatorAST *DesignatorAST::clone(MemoryPool *pool) const
+DotDesignatorAST *DotDesignatorAST::clone(MemoryPool *pool) const
{
- DesignatorAST *ast = new (pool) DesignatorAST;
+ DotDesignatorAST *ast = new (pool) DotDesignatorAST;
+ ast->dot_token = dot_token;
+ ast->identifier_token = identifier_token;
+ return ast;
+}
+
+BracketDesignatorAST *BracketDesignatorAST::clone(MemoryPool *pool) const
+{
+ BracketDesignatorAST *ast = new (pool) BracketDesignatorAST;
+ ast->lbracket_token = lbracket_token;
+ if (expression)
+ ast->expression = expression->clone(pool);
+ ast->rbracket_token = rbracket_token;
return ast;
}
diff --git a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp
index efeb2c57e0e..ff51efcd1a9 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatch0.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTMatch0.cpp
@@ -1192,9 +1192,17 @@ bool BracedInitializerAST::match0(AST *pattern, ASTMatcher *matcher)
return false;
}
-bool DesignatorAST::match0(AST *pattern, ASTMatcher *matcher)
+bool DotDesignatorAST::match0(AST *pattern, ASTMatcher *matcher)
{
- if (DesignatorAST *_other = pattern->asDesignator())
+ if (DotDesignatorAST *_other = pattern->asDotDesignator())
+ return matcher->match(this, _other);
+
+ return false;
+}
+
+bool BracketDesignatorAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+ if (BracketDesignatorAST *_other = pattern->asBracketDesignator())
return matcher->match(this, _other);
return false;
diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
index 02cdb9f0689..415adbcf3d7 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
@@ -2999,11 +2999,32 @@ bool ASTMatcher::match(BracedInitializerAST *node, BracedInitializerAST *pattern
return true;
}
-bool ASTMatcher::match(DesignatorAST *node, DesignatorAST *pattern)
+bool ASTMatcher::match(DotDesignatorAST *node, DotDesignatorAST *pattern)
{
(void) node;
(void) pattern;
+ pattern->dot_token = node->dot_token;
+
+ pattern->identifier_token = node->identifier_token;
+
+ return true;
+}
+
+bool ASTMatcher::match(BracketDesignatorAST *node, BracketDesignatorAST *pattern)
+{
+ (void) node;
+ (void) pattern;
+
+ pattern->lbracket_token = node->lbracket_token;
+
+ if (! pattern->expression)
+ pattern->expression = node->expression;
+ else if (! AST::match(node->expression, pattern->expression, this))
+ return false;
+
+ pattern->rbracket_token = node->rbracket_token;
+
return true;
}
diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.h b/src/libs/3rdparty/cplusplus/ASTMatcher.h
index ebb18884e30..042d5c9c9dc 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatcher.h
+++ b/src/libs/3rdparty/cplusplus/ASTMatcher.h
@@ -45,6 +45,7 @@ public:
virtual bool match(BinaryExpressionAST *node, BinaryExpressionAST *pattern);
virtual bool match(BoolLiteralAST *node, BoolLiteralAST *pattern);
virtual bool match(BracedInitializerAST *node, BracedInitializerAST *pattern);
+ virtual bool match(BracketDesignatorAST *node, BracketDesignatorAST *pattern);
virtual bool match(BreakStatementAST *node, BreakStatementAST *pattern);
virtual bool match(CallAST *node, CallAST *pattern);
virtual bool match(CaptureAST *node, CaptureAST *pattern);
@@ -67,9 +68,9 @@ public:
virtual bool match(DecltypeSpecifierAST *node, DecltypeSpecifierAST *pattern);
virtual bool match(DeleteExpressionAST *node, DeleteExpressionAST *pattern);
virtual bool match(DesignatedInitializerAST *node, DesignatedInitializerAST *pattern);
- virtual bool match(DesignatorAST *node, DesignatorAST *pattern);
virtual bool match(DestructorNameAST *node, DestructorNameAST *pattern);
virtual bool match(DoStatementAST *node, DoStatementAST *pattern);
+ virtual bool match(DotDesignatorAST *node, DotDesignatorAST *pattern);
virtual bool match(DynamicExceptionSpecificationAST *node, DynamicExceptionSpecificationAST *pattern);
virtual bool match(ElaboratedTypeSpecifierAST *node, ElaboratedTypeSpecifierAST *pattern);
virtual bool match(EmptyDeclarationAST *node, EmptyDeclarationAST *pattern);
diff --git a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
index ce55ccfe813..929337ee9b1 100644
--- a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
+++ b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
@@ -1147,9 +1147,16 @@ public:
return __ast;
}
- DesignatorAST *Designator()
+ DotDesignatorAST *DotDesignator()
{
- DesignatorAST *__ast = new (&pool) DesignatorAST;
+ DotDesignatorAST *__ast = new (&pool) DotDesignatorAST;
+ return __ast;
+ }
+
+ BracketDesignatorAST *BracketDesignator(ExpressionAST *expression = 0)
+ {
+ BracketDesignatorAST *__ast = new (&pool) BracketDesignatorAST;
+ __ast->expression = expression;
return __ast;
}
diff --git a/src/libs/3rdparty/cplusplus/ASTVisit.cpp b/src/libs/3rdparty/cplusplus/ASTVisit.cpp
index 983f09fc29c..af8b916c9b9 100644
--- a/src/libs/3rdparty/cplusplus/ASTVisit.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTVisit.cpp
@@ -1279,13 +1279,21 @@ void BracedInitializerAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this);
}
-void DesignatorAST::accept0(ASTVisitor *visitor)
+void DotDesignatorAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
}
visitor->endVisit(this);
}
+void BracketDesignatorAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ accept(expression, visitor);
+ }
+ visitor->endVisit(this);
+}
+
void DesignatedInitializerAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
diff --git a/src/libs/3rdparty/cplusplus/ASTVisitor.h b/src/libs/3rdparty/cplusplus/ASTVisitor.h
index 66c6c011f4c..2d22680380d 100644
--- a/src/libs/3rdparty/cplusplus/ASTVisitor.h
+++ b/src/libs/3rdparty/cplusplus/ASTVisitor.h
@@ -87,6 +87,7 @@ public:
virtual bool visit(BinaryExpressionAST *) { return true; }
virtual bool visit(BoolLiteralAST *) { return true; }
virtual bool visit(BracedInitializerAST *) { return true; }
+ virtual bool visit(BracketDesignatorAST *) { return true; }
virtual bool visit(BreakStatementAST *) { return true; }
virtual bool visit(CallAST *) { return true; }
virtual bool visit(CaptureAST *) { return true; }
@@ -109,9 +110,9 @@ public:
virtual bool visit(DecltypeSpecifierAST *) { return true; }
virtual bool visit(DeleteExpressionAST *) { return true; }
virtual bool visit(DesignatedInitializerAST *) { return true; }
- virtual bool visit(DesignatorAST *) { return true; }
virtual bool visit(DestructorNameAST *) { return true; }
virtual bool visit(DoStatementAST *) { return true; }
+ virtual bool visit(DotDesignatorAST *) { return true; }
virtual bool visit(DynamicExceptionSpecificationAST *) { return true; }
virtual bool visit(ElaboratedTypeSpecifierAST *) { return true; }
virtual bool visit(EmptyDeclarationAST *) { return true; }
@@ -235,6 +236,7 @@ public:
virtual void endVisit(BinaryExpressionAST *) {}
virtual void endVisit(BoolLiteralAST *) {}
virtual void endVisit(BracedInitializerAST *) {}
+ virtual void endVisit(BracketDesignatorAST *) {}
virtual void endVisit(BreakStatementAST *) {}
virtual void endVisit(CallAST *) {}
virtual void endVisit(CaptureAST *) {}
@@ -257,9 +259,9 @@ public:
virtual void endVisit(DecltypeSpecifierAST *) {}
virtual void endVisit(DeleteExpressionAST *) {}
virtual void endVisit(DesignatedInitializerAST *) {}
- virtual void endVisit(DesignatorAST *) {}
virtual void endVisit(DestructorNameAST *) {}
virtual void endVisit(DoStatementAST *) {}
+ virtual void endVisit(DotDesignatorAST *) {}
virtual void endVisit(DynamicExceptionSpecificationAST *) {}
virtual void endVisit(ElaboratedTypeSpecifierAST *) {}
virtual void endVisit(EmptyDeclarationAST *) {}
diff --git a/src/libs/3rdparty/cplusplus/ASTfwd.h b/src/libs/3rdparty/cplusplus/ASTfwd.h
index a3382c89d60..744fd577568 100644
--- a/src/libs/3rdparty/cplusplus/ASTfwd.h
+++ b/src/libs/3rdparty/cplusplus/ASTfwd.h
@@ -45,6 +45,7 @@ class BaseSpecifierAST;
class BinaryExpressionAST;
class BoolLiteralAST;
class BracedInitializerAST;
+class BracketDesignatorAST;
class BreakStatementAST;
class CallAST;
class CaptureAST;
@@ -72,6 +73,7 @@ class DesignatedInitializerAST;
class DesignatorAST;
class DestructorNameAST;
class DoStatementAST;
+class DotDesignatorAST;
class DynamicExceptionSpecificationAST;
class ElaboratedTypeSpecifierAST;
class EmptyDeclarationAST;
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index c09a2cabc9f..333f1e88f89 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -5528,18 +5528,16 @@ bool Parser::parseDesignator(DesignatorAST *&node)
DEBUG_THIS_RULE();
const unsigned start = cursor();
if (LA() == T_DOT) {
- DesignatorAST *ast = new (_pool) DesignatorAST;
- ast->type = DesignatorAST::Dot;
- ast->u.dot.dot_token = consumeToken();
- match(T_IDENTIFIER, &ast->u.dot.identifier_token);
+ DotDesignatorAST *ast = new (_pool) DotDesignatorAST;
+ ast->dot_token = consumeToken();
+ match(T_IDENTIFIER, &ast->identifier_token);
node = ast;
return true;
} else if (LA() == T_LBRACKET) {
- DesignatorAST *ast = new (_pool) DesignatorAST;
- ast->type = DesignatorAST::Bracket;
- ast->u.bracket.lbracket_token = consumeToken();
- if (parseConditionalExpression(ast->u.bracket.expression)) {
- match(T_RBRACKET, &ast->u.bracket.rbracket_token);
+ BracketDesignatorAST *ast = new (_pool) BracketDesignatorAST;
+ ast->lbracket_token = consumeToken();
+ if (parseConditionalExpression(ast->expression)) {
+ match(T_RBRACKET, &ast->rbracket_token);
node = ast;
return true;
}
diff --git a/src/plugins/cpptools/cppchecksymbols.cpp b/src/plugins/cpptools/cppchecksymbols.cpp
index ca6684a5efe..4f528d47d6f 100644
--- a/src/plugins/cpptools/cppchecksymbols.cpp
+++ b/src/plugins/cpptools/cppchecksymbols.cpp
@@ -496,10 +496,9 @@ bool CheckSymbols::visit(EnumeratorAST *ast)
return true;
}
-bool CheckSymbols::visit(DesignatorAST *ast)
+bool CheckSymbols::visit(DotDesignatorAST *ast)
{
- if (ast->type == DesignatorAST::Dot)
- addUse(ast->u.dot.identifier_token, CppHighlightingSupport::FieldUse);
+ addUse(ast->identifier_token, CppHighlightingSupport::FieldUse);
return true;
}
diff --git a/src/plugins/cpptools/cppchecksymbols.h b/src/plugins/cpptools/cppchecksymbols.h
index 3d3a7302c4b..5ccd2fe4cf7 100644
--- a/src/plugins/cpptools/cppchecksymbols.h
+++ b/src/plugins/cpptools/cppchecksymbols.h
@@ -160,7 +160,7 @@ protected:
virtual bool visit(CPlusPlus::MemInitializerAST *ast);
virtual bool visit(CPlusPlus::EnumeratorAST *ast);
- virtual bool visit(CPlusPlus::DesignatorAST *ast);
+ virtual bool visit(CPlusPlus::DotDesignatorAST *ast);
CPlusPlus::NameAST *declaratorId(CPlusPlus::DeclaratorAST *ast) const;
diff --git a/tests/tools/cplusplus-ast2png/dumpers.inc b/tests/tools/cplusplus-ast2png/dumpers.inc
index 8cc0aedcfe5..5e901c386c1 100644
--- a/tests/tools/cplusplus-ast2png/dumpers.inc
+++ b/tests/tools/cplusplus-ast2png/dumpers.inc
@@ -1698,8 +1698,22 @@ virtual bool visit(BracedInitializerAST *ast)
return false;
}
-virtual bool visit(DesignatorAST *ast)
+virtual bool visit(DotDesignatorAST *ast)
{
+ if (ast->dot_token)
+ terminal(ast->dot_token, ast);
+ if (ast->identifier_token)
+ terminal(ast->identifier_token, ast);
+ return false;
+}
+
+virtual bool visit(BracketDesignatorAST *ast)
+{
+ if (ast->lbracket_token)
+ terminal(ast->lbracket_token, ast);
+ nonterminal(ast->expression);
+ if (ast->rbracket_token)
+ terminal(ast->rbracket_token, ast);
return false;
}