diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.cpp | 10 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.h | 6 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTClone.cpp | 3 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatcher.cpp | 7 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTPatternBuilder.h | 3 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTVisit.cpp | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 2 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 37 | ||||
-rw-r--r-- | src/libs/cplusplus/FindUsages.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cpplocalsymbols.cpp | 5 |
10 files changed, 61 insertions, 15 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp index fd8b4fcfed..0e885862da 100644 --- a/src/libs/3rdparty/cplusplus/AST.cpp +++ b/src/libs/3rdparty/cplusplus/AST.cpp @@ -403,12 +403,22 @@ unsigned CallAST::lastToken() const /** \generated */ unsigned CaptureAST::firstToken() const { + if (amper_token) + return amper_token; + if (identifier) + if (unsigned candidate = identifier->firstToken()) + return candidate; return 0; } /** \generated */ unsigned CaptureAST::lastToken() const { + if (identifier) + if (unsigned candidate = identifier->lastToken()) + return candidate; + if (amper_token) + return amper_token + 1; return 1; } diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index c792581d42..961bc2e1a7 100644 --- a/src/libs/3rdparty/cplusplus/AST.h +++ b/src/libs/3rdparty/cplusplus/AST.h @@ -4395,7 +4395,13 @@ protected: class CaptureAST: public AST { public: + unsigned amper_token; + NameAST *identifier; + +public: CaptureAST() + : amper_token(0) + , identifier(0) {} virtual CaptureAST *asCapture() { return this; } diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp index 7c151f09f6..79e8b7818d 100644 --- a/src/libs/3rdparty/cplusplus/ASTClone.cpp +++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp @@ -1703,6 +1703,9 @@ LambdaCaptureAST *LambdaCaptureAST::clone(MemoryPool *pool) const CaptureAST *CaptureAST::clone(MemoryPool *pool) const { CaptureAST *ast = new (pool) CaptureAST; + ast->amper_token = amper_token; + if (identifier) + ast->identifier = identifier->clone(pool); return ast; } diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp index e2df7d7583..091a5dfd84 100644 --- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp +++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp @@ -2898,6 +2898,13 @@ bool ASTMatcher::match(CaptureAST *node, CaptureAST *pattern) (void) node; (void) pattern; + pattern->amper_token = node->amper_token; + + if (! pattern->identifier) + pattern->identifier = node->identifier; + else if (! AST::match(node->identifier, pattern->identifier, this)) + return false; + return true; } diff --git a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h index 142737d44e..fcf1f56d04 100644 --- a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h +++ b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h @@ -1107,9 +1107,10 @@ public: return __ast; } - CaptureAST *Capture() + CaptureAST *Capture(NameAST *identifier = 0) { CaptureAST *__ast = new (&pool) CaptureAST; + __ast->identifier = identifier; return __ast; } diff --git a/src/libs/3rdparty/cplusplus/ASTVisit.cpp b/src/libs/3rdparty/cplusplus/ASTVisit.cpp index 6434a7c5e2..24c5a2372f 100644 --- a/src/libs/3rdparty/cplusplus/ASTVisit.cpp +++ b/src/libs/3rdparty/cplusplus/ASTVisit.cpp @@ -1237,6 +1237,7 @@ void LambdaCaptureAST::accept0(ASTVisitor *visitor) void CaptureAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { + accept(identifier, visitor); } visitor->endVisit(this); } diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index 19c99ae491..ef71f2900e 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -1069,7 +1069,7 @@ void Bind::capture(CaptureAST *ast) if (! ast) return; - // See QTCREATORBUG-7968 + name(ast->identifier); } bool Bind::visit(LambdaDeclaratorAST *ast) diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index c7abe2002b..c7d00c9817 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -6294,43 +6294,56 @@ bool Parser::parseLambdaCapture(LambdaCaptureAST *&node) return true; } -bool Parser::parseCapture(CaptureAST *&) +bool Parser::parseCapture(CaptureAST *&node) { - // See QTCREATORBUG-7968 - DEBUG_THIS_RULE(); - if (LA() == T_IDENTIFIER) { - consumeToken(); - return true; - } else if (LA() == T_AMPER && LA(2) == T_IDENTIFIER) { - consumeToken(); + if (LA() == T_THIS) { consumeToken(); return true; + } - } else if (LA() == T_THIS) { + if (LA() == T_AMPER) consumeToken(); + + if (LA() == T_IDENTIFIER) { + SimpleNameAST *ast = new (_pool) SimpleNameAST; + ast->identifier_token = consumeToken(); + + node = new (_pool) CaptureAST; + node->identifier = ast; return true; } return false; } -bool Parser::parseCaptureList(CaptureListAST *&) +bool Parser::parseCaptureList(CaptureListAST *&node) { DEBUG_THIS_RULE(); CaptureAST *capture = 0; if (parseCapture(capture)) { + node = new (_pool) CaptureListAST; + node->value = capture; + + CaptureListAST **l = &node->next; while (LA() == T_COMMA) { consumeToken(); // consume `,' - + CaptureAST *capture = 0; parseCapture(capture); + if (capture) { + *l = new (_pool) CaptureListAST; + (*l)->value = capture; + l = &(*l)->next; + } } + + return true; } - return true; + return false; } bool Parser::parseLambdaDeclarator(LambdaDeclaratorAST *&node) diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp index 392f58d0ee..e83d7d220f 100644 --- a/src/libs/cplusplus/FindUsages.cpp +++ b/src/libs/cplusplus/FindUsages.cpp @@ -869,7 +869,7 @@ void FindUsages::capture(CaptureAST *ast) if (! ast) return; - // See QTCREATORBUG-7968 + this->name(ast->identifier); } bool FindUsages::visit(LambdaDeclaratorAST *ast) diff --git a/src/plugins/cpptools/cpplocalsymbols.cpp b/src/plugins/cpptools/cpplocalsymbols.cpp index 026c0274cb..8522196957 100644 --- a/src/plugins/cpptools/cpplocalsymbols.cpp +++ b/src/plugins/cpptools/cpplocalsymbols.cpp @@ -127,6 +127,11 @@ protected: return true; } + virtual bool visit(CaptureAST *ast) + { + return checkLocalUse(ast->identifier, ast->firstToken()); + } + virtual bool visit(IdExpressionAST *ast) { return checkLocalUse(ast->name, ast->firstToken()); |