diff options
author | Colin Duquesnoy <colin.duquesnoy@gmail.com> | 2018-02-04 16:24:57 +0100 |
---|---|---|
committer | Colin Duquesnoy <colin.duquesnoy@gmail.com> | 2018-02-09 17:54:30 +0000 |
commit | 2a016d05b2eabdeaab6ce97e203f46fc8f8accce (patch) | |
tree | 2a9e12115940cf019a07eede0432b64a19a9fc73 | |
parent | 7cf1ba2855691c5abe3763a872f2ed98a477c1fc (diff) |
Add support for nested namespaces (C++17)
Task-number: QTCREATORBUG-16774
Change-Id: I3de3ac65810213e21c9a3bafef2474d252e191f7
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 23 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.h | 3 | ||||
-rw-r--r-- | tests/auto/cplusplus/cxx11/cxx11.pro | 2 | ||||
-rw-r--r-- | tests/auto/cplusplus/cxx11/data/nestedNamespace.1.cpp | 7 | ||||
-rw-r--r-- | tests/auto/cplusplus/cxx11/data/nestedNamespace.1.errors.txt | 0 | ||||
-rw-r--r-- | tests/auto/cplusplus/cxx11/tst_cxx11.cpp | 1 |
6 files changed, 34 insertions, 2 deletions
diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 3547041212..81d90e7dfb 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -863,7 +863,8 @@ bool Parser::parseStaticAssertDeclaration(DeclarationAST *&node) bool Parser::parseNamespace(DeclarationAST *&node) { DEBUG_THIS_RULE(); - if (LA() != T_NAMESPACE && !(_languageFeatures.cxx11Enabled && LA() == T_INLINE && LA(2) == T_NAMESPACE)) + if (LA() != T_NAMESPACE && !(_languageFeatures.cxx11Enabled && LA() == T_INLINE && LA(2) == T_NAMESPACE) + && !isNestedNamespace()) return false; unsigned inline_token = 0; @@ -892,7 +893,9 @@ bool Parser::parseNamespace(DeclarationAST *&node) if (LA() == T_IDENTIFIER) ast->identifier_token = consumeToken(); parseOptionalAttributeSpecifierSequence(ast->attribute_list); - if (LA() == T_LBRACE) { + if (isNestedNamespace()) { + parseNestedNamespace(ast->linkage_body); + } else if (LA() == T_LBRACE) { parseLinkageBody(ast->linkage_body); } else { // attempt to do error recovery unsigned pos = cursor(); @@ -923,6 +926,22 @@ bool Parser::parseNamespace(DeclarationAST *&node) return true; } +bool Parser::isNestedNamespace() const +{ + return _languageFeatures.cxx11Enabled && LA() == T_COLON_COLON && LA(2) == T_IDENTIFIER; +} + +bool Parser::parseNestedNamespace(DeclarationAST *&node) +{ + DEBUG_THIS_RULE(); + DeclarationAST *ast = 0; + if (isNestedNamespace() && parseNamespace(ast)) { + node = ast; + return true; + } + return false; +} + bool Parser::parseUsing(DeclarationAST *&node) { DEBUG_THIS_RULE(); diff --git a/src/libs/3rdparty/cplusplus/Parser.h b/src/libs/3rdparty/cplusplus/Parser.h index 004d533109..110bb29d2b 100644 --- a/src/libs/3rdparty/cplusplus/Parser.h +++ b/src/libs/3rdparty/cplusplus/Parser.h @@ -119,6 +119,7 @@ public: bool parseNestedNameSpecifierOpt(NestedNameSpecifierListAST *&name, bool acceptTemplateId); bool parseStaticAssertDeclaration(DeclarationAST *&node); bool parseNamespace(DeclarationAST *&node); + bool parseNestedNamespace(DeclarationAST *&node); bool parseNamespaceAliasDefinition(DeclarationAST *&node); bool parseNewArrayDeclarator(NewArrayDeclaratorListAST *&node); bool parseNewExpression(ExpressionAST *&node); @@ -332,6 +333,8 @@ private: private: Parser(const Parser& source); void operator =(const Parser& source); + + bool isNestedNamespace() const; }; } // namespace CPlusPlus diff --git a/tests/auto/cplusplus/cxx11/cxx11.pro b/tests/auto/cplusplus/cxx11/cxx11.pro index f1b414bc78..51ed3028f0 100644 --- a/tests/auto/cplusplus/cxx11/cxx11.pro +++ b/tests/auto/cplusplus/cxx11/cxx11.pro @@ -7,6 +7,8 @@ SOURCES += tst_cxx11.cpp DISTFILES += \ data/inlineNamespace.1.cpp \ data/inlineNamespace.1.errors.txt \ + data/nestedNamespace.1.cpp \ + data/nestedNamespace.1.errors.txt \ data/staticAssert.1.cpp \ data/staticAssert.1.errors.txt \ data/noExcept.1.cpp \ diff --git a/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.cpp b/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.cpp new file mode 100644 index 0000000000..92a42a33ad --- /dev/null +++ b/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.cpp @@ -0,0 +1,7 @@ + +namespace A::B::C { + class Foo { + + }; +} + diff --git a/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.errors.txt b/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.errors.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/auto/cplusplus/cxx11/data/nestedNamespace.1.errors.txt diff --git a/tests/auto/cplusplus/cxx11/tst_cxx11.cpp b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp index a39f367473..108d93f18f 100644 --- a/tests/auto/cplusplus/cxx11/tst_cxx11.cpp +++ b/tests/auto/cplusplus/cxx11/tst_cxx11.cpp @@ -176,6 +176,7 @@ void tst_cxx11::parse_data() QTest::addColumn<QString>("errorFile"); QTest::newRow("inlineNamespace.1") << "inlineNamespace.1.cpp" << "inlineNamespace.1.errors.txt"; + QTest::newRow("nestedNamespace.1") << "nestedNamespace.1.cpp" << "nestedNamespace.1.errors.txt"; QTest::newRow("staticAssert.1") << "staticAssert.1.cpp" << "staticAssert.1.errors.txt"; QTest::newRow("noExcept.1") << "noExcept.1.cpp" << "noExcept.1.errors.txt"; QTest::newRow("braceInitializers.1") << "braceInitializers.1.cpp" << "braceInitializers.1.errors.txt"; |