aboutsummaryrefslogtreecommitdiffstats
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
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>
-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
-rw-r--r--tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp16
-rw-r--r--tests/auto/cplusplus/semantic/tst_semantic.cpp20
-rw-r--r--tests/tools/cplusplus-ast2png/dumpers.inc3
12 files changed, 83 insertions, 12 deletions
diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp
index da1f61a932..03dc59e889 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 a2d3f81ba8..556f898f6d 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 0a8db781cb..8ff5d0e9d7 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 3d74bbfcb5..105f236070 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 a444c7e3f6..b4d413efd8 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 9fec231127..69ce44c8f1 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 15ac4fa9ee..183bebdef1 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 04fed44a10..9fdab3f905 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 38938d3545..9c6804219b 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)
diff --git a/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp b/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp
index ba889c0ee7..fa6a3b7019 100644
--- a/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp
+++ b/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp
@@ -198,6 +198,7 @@ private slots:
void test_checksymbols_highlightingUsedTemplateFunctionParameter_QTCREATORBUG6861();
void test_checksymbols_crashWhenUsingNamespaceClass_QTCREATORBUG9323_namespace();
void test_checksymbols_crashWhenUsingNamespaceClass_QTCREATORBUG9323_insideFunction();
+ void test_alias_decl_QTCREATORBUG9386();
};
void tst_CheckSymbols::test_checksymbols_TypeUse()
@@ -1727,6 +1728,21 @@ void tst_CheckSymbols::test_checksymbols_crashWhenUsingNamespaceClass_QTCREATORB
TestData::check(source, expectedUses);
}
+void tst_CheckSymbols::test_alias_decl_QTCREATORBUG9386()
+{
+ const QByteArray source =
+ "using wobble = int;\n"
+ "wobble cobble = 1;\n"
+ ;
+
+ const QList<Use> expectedUses = QList<Use>()
+ << Use(1, 7, 6, CppHighlightingSupport::TypeUse)
+ << Use(2, 1, 6, CppHighlightingSupport::TypeUse)
+ ;
+
+ TestData::check(source, expectedUses);
+}
+
void tst_CheckSymbols::test_checksymbols_highlightingUsedTemplateFunctionParameter_QTCREATORBUG6861()
{
const QByteArray source =
diff --git a/tests/auto/cplusplus/semantic/tst_semantic.cpp b/tests/auto/cplusplus/semantic/tst_semantic.cpp
index 860a9940bc..bc6631a8a8 100644
--- a/tests/auto/cplusplus/semantic/tst_semantic.cpp
+++ b/tests/auto/cplusplus/semantic/tst_semantic.cpp
@@ -154,6 +154,7 @@ private slots:
void function_declaration_2();
void function_definition_1();
void nested_class_1();
+ void alias_declaration_1();
void typedef_1();
void typedef_2();
void typedef_3();
@@ -320,6 +321,25 @@ void tst_Semantic::nested_class_1()
QCOMPARE(namedTy->name()->asNameId()->identifier(), objectId);
}
+void tst_Semantic::alias_declaration_1()
+{
+ QSharedPointer<Document> doc = document(
+ "using wobble = int;\n"
+ , false, false, true);
+
+ QCOMPARE(doc->errorCount, 0U);
+ QCOMPARE(doc->globals->memberCount(), 1U);
+
+ Declaration *decl = doc->globals->memberAt(0)->asDeclaration();
+ QVERIFY(decl->name());
+ QVERIFY(decl->name()->identifier());
+ QCOMPARE(decl->name()->identifier()->chars(), "wobble");
+
+ QVERIFY(decl->isTypedef());
+ QVERIFY(decl->type().isTypedef());
+ QVERIFY(decl->type()->isIntegerType());
+}
+
void tst_Semantic::typedef_1()
{
QSharedPointer<Document> doc = document(
diff --git a/tests/tools/cplusplus-ast2png/dumpers.inc b/tests/tools/cplusplus-ast2png/dumpers.inc
index bc9c485713..caf4b8d772 100644
--- a/tests/tools/cplusplus-ast2png/dumpers.inc
+++ b/tests/tools/cplusplus-ast2png/dumpers.inc
@@ -865,8 +865,7 @@ virtual bool visit(AliasDeclarationAST *ast)
{
if (ast->using_token)
terminal(ast->using_token, ast);
- if (ast->identifier_token)
- terminal(ast->identifier_token, ast);
+ nonterminal(ast->name);
if (ast->equal_token)
terminal(ast->equal_token, ast);
nonterminal(ast->typeId);