aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@me.com>2013-05-30 12:40:08 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2013-06-06 14:10:24 +0200
commite2a727c4505c76edb896471e17fe915ba7864239 (patch)
tree475f5aedc63839217b4f6f03111281df01eeddff /src/libs/3rdparty
parentc2d6081a6cf1ac4a9168790d0f14db93933a9b02 (diff)
C++: add semantic support for C++11 alias decls.
Task-number: QTCREATORBUG-9386 Change-Id: Ia68f3866c122ca5261dd73b2c740b47fb15744fc Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Diffstat (limited to 'src/libs/3rdparty')
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp10
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h8
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp3
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp5
-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.cpp21
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.h1
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp4
9 files changed, 46 insertions, 10 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp
index da1f61a9325..03dc59e8891 100644
--- a/src/libs/3rdparty/cplusplus/AST.cpp
+++ b/src/libs/3rdparty/cplusplus/AST.cpp
@@ -4419,8 +4419,9 @@ unsigned AliasDeclarationAST::firstToken() const
{
if (using_token)
return using_token;
- if (identifier_token)
- return identifier_token;
+ if (name)
+ if (unsigned candidate = name->firstToken())
+ return candidate;
if (equal_token)
return equal_token;
if (typeId)
@@ -4441,8 +4442,9 @@ unsigned AliasDeclarationAST::lastToken() const
return candidate;
if (equal_token)
return equal_token + 1;
- if (identifier_token)
- return identifier_token + 1;
+ if (name)
+ if (unsigned candidate = name->lastToken())
+ return candidate;
if (using_token)
return using_token + 1;
return 1;
diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h
index a2d3f81ba88..556f898f6d7 100644
--- a/src/libs/3rdparty/cplusplus/AST.h
+++ b/src/libs/3rdparty/cplusplus/AST.h
@@ -2432,18 +2432,22 @@ class CPLUSPLUS_EXPORT AliasDeclarationAST: public DeclarationAST
{
public:
unsigned using_token;
- unsigned identifier_token;
+ NameAST *name;
unsigned equal_token;
TypeIdAST *typeId;
unsigned semicolon_token;
+public: // annotations
+ Declaration *symbol;
+
public:
AliasDeclarationAST()
: using_token(0)
- , identifier_token(0)
+ , name(0)
, equal_token(0)
, typeId(0)
, semicolon_token(0)
+ , symbol(0)
{}
virtual AliasDeclarationAST *asAliasDeclaration() { return this; }
diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp
index 0a8db781cbe..8ff5d0e9d7e 100644
--- a/src/libs/3rdparty/cplusplus/ASTClone.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp
@@ -890,7 +890,8 @@ AliasDeclarationAST *AliasDeclarationAST::clone(MemoryPool *pool) const
{
AliasDeclarationAST *ast = new (pool) AliasDeclarationAST;
ast->using_token = using_token;
- ast->identifier_token = identifier_token;
+ if (name)
+ ast->name = name->clone(pool);
ast->equal_token = equal_token;
if (typeId)
ast->typeId = typeId->clone(pool);
diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
index 3d74bbfcb56..105f236070b 100644
--- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp
@@ -1511,7 +1511,10 @@ bool ASTMatcher::match(AliasDeclarationAST *node, AliasDeclarationAST *pattern)
pattern->using_token = node->using_token;
- pattern->identifier_token = node->identifier_token;
+ if (! pattern->name)
+ pattern->name = node->name;
+ else if (! AST::match(node->name, pattern->name, this))
+ return false;
pattern->equal_token = node->equal_token;
diff --git a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
index a444c7e3f6b..b4d413efd8a 100644
--- a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
+++ b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h
@@ -584,9 +584,10 @@ public:
return __ast;
}
- AliasDeclarationAST *AliasDeclaration(TypeIdAST *typeId = 0)
+ AliasDeclarationAST *AliasDeclaration(NameAST *name = 0, TypeIdAST *typeId = 0)
{
AliasDeclarationAST *__ast = new (&pool) AliasDeclarationAST;
+ __ast->name = name;
__ast->typeId = typeId;
return __ast;
}
diff --git a/src/libs/3rdparty/cplusplus/ASTVisit.cpp b/src/libs/3rdparty/cplusplus/ASTVisit.cpp
index 9fec2311272..69ce44c8f17 100644
--- a/src/libs/3rdparty/cplusplus/ASTVisit.cpp
+++ b/src/libs/3rdparty/cplusplus/ASTVisit.cpp
@@ -646,6 +646,7 @@ void NamespaceAliasDefinitionAST::accept0(ASTVisitor *visitor)
void AliasDeclarationAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
+ accept(name, visitor);
accept(typeId, visitor);
}
visitor->endVisit(this);
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp
index 15ac4fa9ee8..183bebdef1a 100644
--- a/src/libs/3rdparty/cplusplus/Bind.cpp
+++ b/src/libs/3rdparty/cplusplus/Bind.cpp
@@ -2066,6 +2066,27 @@ bool Bind::visit(QtInterfacesDeclarationAST *ast)
return false;
}
+bool Bind::visit(AliasDeclarationAST *ast)
+{
+ if (!ast->name)
+ return false;
+
+ const Name *name = this->name(ast->name);
+
+ FullySpecifiedType ty = expression(ast->typeId);
+ ty.setTypedef(true);
+
+ Declaration *decl = control()->newDeclaration(ast->name->firstToken(), name);
+ decl->setType(ty);
+ decl->setStorage(Symbol::Typedef);
+ ast->symbol = decl;
+ if (_scope->isClass())
+ decl->setVisibility(_visibility);
+ _scope->addMember(decl);
+
+ return false;
+}
+
bool Bind::visit(AsmDefinitionAST *ast)
{
(void) ast;
diff --git a/src/libs/3rdparty/cplusplus/Bind.h b/src/libs/3rdparty/cplusplus/Bind.h
index 04fed44a10a..9fdab3f9054 100644
--- a/src/libs/3rdparty/cplusplus/Bind.h
+++ b/src/libs/3rdparty/cplusplus/Bind.h
@@ -209,6 +209,7 @@ protected:
virtual bool visit(QtEnumDeclarationAST *ast);
virtual bool visit(QtFlagsDeclarationAST *ast);
virtual bool visit(QtInterfacesDeclarationAST *ast);
+ virtual bool visit(AliasDeclarationAST *ast);
virtual bool visit(AsmDefinitionAST *ast);
virtual bool visit(ExceptionDeclarationAST *ast);
virtual bool visit(FunctionDefinitionAST *ast);
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp
index 38938d3545a..9c6804219bc 100644
--- a/src/libs/3rdparty/cplusplus/Parser.cpp
+++ b/src/libs/3rdparty/cplusplus/Parser.cpp
@@ -868,7 +868,9 @@ bool Parser::parseAliasDeclaration(DeclarationAST *&node)
AliasDeclarationAST *alias = new (_pool) AliasDeclarationAST;
alias->using_token = consumeToken();
- alias->identifier_token = consumeToken();
+ SimpleNameAST *name = new (_pool) SimpleNameAST;
+ name->identifier_token = consumeToken();
+ alias->name = name;
// ### attributes!
while (LA() != T_EQUAL)