summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp10
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h6
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp3
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp7
-rw-r--r--src/libs/3rdparty/cplusplus/ASTPatternBuilder.h3
-rw-r--r--src/libs/3rdparty/cplusplus/ASTVisit.cpp1
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.cpp2
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp37
-rw-r--r--src/libs/cplusplus/FindUsages.cpp2
-rw-r--r--src/plugins/cpptools/cpplocalsymbols.cpp5
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());