diff options
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/AST.cpp | 14 | ||||
-rw-r--r-- | src/shared/cplusplus/AST.h | 4 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisit.cpp | 7 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTfwd.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/CheckName.cpp | 18 | ||||
-rw-r--r-- | src/shared/cplusplus/CheckName.h | 2 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 40 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.h | 4 | ||||
-rw-r--r-- | src/shared/cplusplus/Semantic.cpp | 2 | ||||
-rw-r--r-- | src/shared/cplusplus/Semantic.h | 2 |
10 files changed, 46 insertions, 48 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 30ba2cba5a..4286cc8dff 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -1299,12 +1299,10 @@ unsigned PointerToMemberAST::lastToken() const if (star_token) return star_token + 1; - for (NestedNameSpecifierAST *it = nested_name_specifier; it; it = it->next) { - if (! it->next) - return it->lastToken(); - } + else if (nested_name_specifier) + return nested_name_specifier->lastToken(); - if (global_scope_token) + else if (global_scope_token) return global_scope_token + 1; return 0; @@ -1349,10 +1347,8 @@ unsigned QualifiedNameAST::lastToken() const if (unqualified_name) return unqualified_name->lastToken(); - for (NestedNameSpecifierAST *it = nested_name_specifier; it; it = it->next) { - if (! it->next) - return it->lastToken(); - } + if (nested_name_specifier) + return nested_name_specifier->lastToken(); if (global_scope_token) return global_scope_token + 1; diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index e1b901dca5..97a56da8ef 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -1175,7 +1175,7 @@ class CPLUSPLUS_EXPORT QualifiedNameAST: public NameAST { public: unsigned global_scope_token; - NestedNameSpecifierAST *nested_name_specifier; + NestedNameSpecifierListAST *nested_name_specifier; NameAST *unqualified_name; public: @@ -1614,7 +1614,7 @@ class CPLUSPLUS_EXPORT PointerToMemberAST: public PtrOperatorAST { public: unsigned global_scope_token; - NestedNameSpecifierAST *nested_name_specifier; + NestedNameSpecifierListAST *nested_name_specifier; unsigned star_token; SpecifierAST *cv_qualifier_seq; diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index 2a9160094f..63ef418ec9 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -453,8 +453,7 @@ void NestedNameSpecifierAST::accept0(ASTVisitor *visitor) void QualifiedNameAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { - for (NestedNameSpecifierAST *it = nested_name_specifier; it; it = it->next) - accept(it, visitor); + accept(nested_name_specifier, visitor); accept(unqualified_name, visitor); } visitor->endVisit(this); @@ -668,8 +667,8 @@ void PostfixExpressionAST::accept0(ASTVisitor *visitor) void PointerToMemberAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { - for (NestedNameSpecifierAST *it = nested_name_specifier; it; it = it->next) - accept(it, visitor); + accept(nested_name_specifier, visitor); + for (SpecifierAST *it = cv_qualifier_seq; it; it = it->next) accept(it, visitor); } diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index 07f51b40ae..ac70f735db 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -202,6 +202,7 @@ typedef List<NewArrayDeclaratorAST *> NewArrayDeclaratorListAST; typedef List<PostfixAST *> PostfixListAST; typedef List<PostfixDeclaratorAST *> PostfixDeclaratorListAST; typedef List<AttributeAST *> AttributeListAST; +typedef List<NestedNameSpecifierAST *> NestedNameSpecifierListAST; typedef List<NameAST *> ObjCIdentifierListAST; typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST; diff --git a/src/shared/cplusplus/CheckName.cpp b/src/shared/cplusplus/CheckName.cpp index 4b1c62ff0e..bd899bb7bb 100644 --- a/src/shared/cplusplus/CheckName.cpp +++ b/src/shared/cplusplus/CheckName.cpp @@ -82,17 +82,19 @@ Name *CheckName::check(NameAST *name, Scope *scope) return switchName(previousName); } -Name *CheckName::check(NestedNameSpecifierAST *nested_name_specifier, Scope *scope) +Name *CheckName::check(NestedNameSpecifierListAST *nested_name_specifier_list, Scope *scope) { Name *previousName = switchName(0); Scope *previousScope = switchScope(scope); std::vector<Name *> names; - for (NestedNameSpecifierAST *it = nested_name_specifier; - it; it = it->next) { - names.push_back(semantic()->check(it->class_or_namespace_name, _scope)); + for (NestedNameSpecifierListAST *it = nested_name_specifier_list; it; it = it->next) { + NestedNameSpecifierAST *nested_name_specifier = it->value; + names.push_back(semantic()->check(nested_name_specifier->class_or_namespace_name, _scope)); } - _name = control()->qualifiedNameId(&names[0], names.size()); + + if (! names.empty()) + _name = control()->qualifiedNameId(&names[0], names.size()); (void) switchScope(previousScope); return switchName(previousName); @@ -137,9 +139,9 @@ Scope *CheckName::switchScope(Scope *scope) bool CheckName::visit(QualifiedNameAST *ast) { std::vector<Name *> names; - for (NestedNameSpecifierAST *it = ast->nested_name_specifier; - it; it = it->next) { - names.push_back(semantic()->check(it->class_or_namespace_name, _scope)); + for (NestedNameSpecifierListAST *it = ast->nested_name_specifier; it; it = it->next) { + NestedNameSpecifierAST *nested_name_specifier = it->value; + names.push_back(semantic()->check(nested_name_specifier->class_or_namespace_name, _scope)); } names.push_back(semantic()->check(ast->unqualified_name, _scope)); _name = control()->qualifiedNameId(&names[0], names.size(), diff --git a/src/shared/cplusplus/CheckName.h b/src/shared/cplusplus/CheckName.h index ec2b97beea..7f86d75167 100644 --- a/src/shared/cplusplus/CheckName.h +++ b/src/shared/cplusplus/CheckName.h @@ -62,7 +62,7 @@ public: virtual ~CheckName(); Name *check(NameAST *name, Scope *scope); - Name *check(NestedNameSpecifierAST *name, Scope *scope); + Name *check(NestedNameSpecifierListAST *name, Scope *scope); Name *check(ObjCSelectorAST *args, Scope *scope); void check(ObjCMessageArgumentDeclarationAST *arg, Scope *scope); diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index d9b3635e4b..904a5c76f0 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -348,28 +348,30 @@ bool Parser::parseTemplateId(NameAST *&node) return false; } -bool Parser::parseNestedNameSpecifier(NestedNameSpecifierAST *&node, +bool Parser::parseNestedNameSpecifier(NestedNameSpecifierListAST *&node, bool /*acceptTemplateId*/) { DEBUG_THIS_RULE(); - NestedNameSpecifierAST **nested_name_specifier = &node; + NestedNameSpecifierListAST **nested_name_specifier = &node; NameAST *class_or_namespace_name = 0; - if (parseClassOrNamespaceName(class_or_namespace_name) && - LA() == T_COLON_COLON) { + if (parseClassOrNamespaceName(class_or_namespace_name) && LA() == T_COLON_COLON) { unsigned scope_token = consumeToken(); - *nested_name_specifier = new (_pool) NestedNameSpecifierAST; - (*nested_name_specifier)->class_or_namespace_name - = class_or_namespace_name; - (*nested_name_specifier)->scope_token = scope_token; + NestedNameSpecifierAST *name = new (_pool) NestedNameSpecifierAST; + name->class_or_namespace_name = class_or_namespace_name; + name->scope_token = scope_token; + + *nested_name_specifier = new (_pool) NestedNameSpecifierListAST(name); nested_name_specifier = &(*nested_name_specifier)->next; - while (parseClassOrNamespaceName(class_or_namespace_name) && - LA() == T_COLON_COLON) { + while (parseClassOrNamespaceName(class_or_namespace_name) && LA() == T_COLON_COLON) { scope_token = consumeToken(); - *nested_name_specifier = new (_pool) NestedNameSpecifierAST; - (*nested_name_specifier)->class_or_namespace_name = class_or_namespace_name; - (*nested_name_specifier)->scope_token = scope_token; + + name = new (_pool) NestedNameSpecifierAST; + name->class_or_namespace_name = class_or_namespace_name; + name->scope_token = scope_token; + + *nested_name_specifier = new (_pool) NestedNameSpecifierListAST(name); nested_name_specifier = &(*nested_name_specifier)->next; } @@ -382,8 +384,7 @@ bool Parser::parseNestedNameSpecifier(NestedNameSpecifierAST *&node, return false; } -bool Parser::parseNestedNameSpecifierOpt(NestedNameSpecifierAST *&name, - bool acceptTemplateId) +bool Parser::parseNestedNameSpecifierOpt(NestedNameSpecifierListAST *&name, bool acceptTemplateId) { DEBUG_THIS_RULE(); unsigned start = cursor(); @@ -399,7 +400,7 @@ bool Parser::parseName(NameAST *&node, bool acceptTemplateId) if (LA() == T_COLON_COLON) global_scope_token = consumeToken(); - NestedNameSpecifierAST *nested_name_specifier = 0; + NestedNameSpecifierListAST *nested_name_specifier = 0; parseNestedNameSpecifierOpt(nested_name_specifier, /*acceptTemplateId=*/ true); @@ -976,13 +977,12 @@ bool Parser::parsePtrOperator(PtrOperatorAST *&node) if (LA() == T_COLON_COLON) global_scope_token = consumeToken(); - NestedNameSpecifierAST *nested_name_specifier = 0; - bool has_nested_name_specifier = parseNestedNameSpecifier( - nested_name_specifier, true); + NestedNameSpecifierListAST *nested_name_specifiers = 0; + bool has_nested_name_specifier = parseNestedNameSpecifier(nested_name_specifiers, true); if (has_nested_name_specifier && LA() == T_STAR) { PointerToMemberAST *ast = new (_pool) PointerToMemberAST; ast->global_scope_token = global_scope_token; - ast->nested_name_specifier = nested_name_specifier; + ast->nested_name_specifier = nested_name_specifiers; ast->star_token = consumeToken(); parseCvQualifiers(ast->cv_qualifier_seq); node = ast; diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index 39f42ba0bb..2ab563f09a 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -142,8 +142,8 @@ public: bool parseClassOrNamespaceName(NameAST *&node); bool parseNameId(NameAST *&node); bool parseName(NameAST *&node, bool acceptTemplateId = true); - bool parseNestedNameSpecifier(NestedNameSpecifierAST *&node, bool acceptTemplateId); - bool parseNestedNameSpecifierOpt(NestedNameSpecifierAST *&name, bool acceptTemplateId); + bool parseNestedNameSpecifier(NestedNameSpecifierListAST *&node, bool acceptTemplateId); + bool parseNestedNameSpecifierOpt(NestedNameSpecifierListAST *&name, bool acceptTemplateId); bool parseNamespace(DeclarationAST *&node); bool parseNamespaceAliasDefinition(DeclarationAST *&node); bool parseNewArrayDeclarator(NewArrayDeclaratorListAST *&node); diff --git a/src/shared/cplusplus/Semantic.cpp b/src/shared/cplusplus/Semantic.cpp index e3b4b0b7ca..c2dfa42ff7 100644 --- a/src/shared/cplusplus/Semantic.cpp +++ b/src/shared/cplusplus/Semantic.cpp @@ -152,7 +152,7 @@ void Semantic::check(StatementAST *statement, Scope *scope) Name *Semantic::check(NameAST *name, Scope *scope) { return d->checkName->check(name, scope); } -Name *Semantic::check(NestedNameSpecifierAST *name, Scope *scope) +Name *Semantic::check(NestedNameSpecifierListAST *name, Scope *scope) { return d->checkName->check(name, scope); } Name *Semantic::check(ObjCSelectorAST *args, Scope *scope) diff --git a/src/shared/cplusplus/Semantic.h b/src/shared/cplusplus/Semantic.h index b07883e847..b42b13efed 100644 --- a/src/shared/cplusplus/Semantic.h +++ b/src/shared/cplusplus/Semantic.h @@ -84,7 +84,7 @@ public: Name *check(NameAST *name, Scope *scope); - Name *check(NestedNameSpecifierAST *name, Scope *scope); + Name *check(NestedNameSpecifierListAST *name, Scope *scope); Name *check(ObjCSelectorAST *args, Scope *scope); FullySpecifiedType check(ObjCTypeNameAST *typeName, Scope *scope); |