From 2a016d05b2eabdeaab6ce97e203f46fc8f8accce Mon Sep 17 00:00:00 2001 From: Colin Duquesnoy Date: Sun, 4 Feb 2018 16:24:57 +0100 Subject: Add support for nested namespaces (C++17) Task-number: QTCREATORBUG-16774 Change-Id: I3de3ac65810213e21c9a3bafef2474d252e191f7 Reviewed-by: Nikolai Kosjar --- src/libs/3rdparty/cplusplus/Parser.cpp | 23 +++++++++++++++++++++-- src/libs/3rdparty/cplusplus/Parser.h | 3 +++ 2 files changed, 24 insertions(+), 2 deletions(-) (limited to 'src/libs/3rdparty/cplusplus') 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 -- cgit v1.2.3