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 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'src/libs/3rdparty/cplusplus/Parser.cpp') diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 3547041212e..81d90e7dfb4 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(); -- cgit v1.2.3