diff options
author | Erik Verbruggen <erik.verbruggen@me.com> | 2013-05-30 12:40:08 +0200 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@digia.com> | 2013-06-06 14:10:24 +0200 |
commit | e2a727c4505c76edb896471e17fe915ba7864239 (patch) | |
tree | 475f5aedc63839217b4f6f03111281df01eeddff | |
parent | c2d6081a6cf1ac4a9168790d0f14db93933a9b02 (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.cpp | 10 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/AST.h | 8 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTClone.cpp | 3 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/ASTMatcher.cpp | 5 | ||||
-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 | 21 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.h | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 4 | ||||
-rw-r--r-- | tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp | 16 | ||||
-rw-r--r-- | tests/auto/cplusplus/semantic/tst_semantic.cpp | 20 | ||||
-rw-r--r-- | tests/tools/cplusplus-ast2png/dumpers.inc | 3 |
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); |