Skip to content

Commit 2ebb4fa

Browse files
committed
Changed NestedNameSpecifierAST to use ScopedSymbol
Signed-off-by: Roberto Raggi <[email protected]>
1 parent 22d67c7 commit 2ebb4fa

File tree

4 files changed

+35
-4
lines changed

4 files changed

+35
-4
lines changed

src/parser/cxx/ast.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ class MemInitializerAST : public AST {
217217
class NestedNameSpecifierAST : public AST {
218218
public:
219219
using AST::AST;
220-
Symbol* symbol = nullptr;
220+
ScopedSymbol* symbol = nullptr;
221221
};
222222

223223
class NewInitializerAST : public AST {

src/parser/cxx/binder.cc

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,32 @@ auto Binder::isConstructor(Symbol* symbol) const -> bool {
652652
return true;
653653
}
654654

655+
auto Binder::resolveNestedNameSpecifier(Symbol* symbol) -> ScopedSymbol* {
656+
if (auto classSymbol = symbol_cast<ClassSymbol>(symbol)) return classSymbol;
657+
658+
if (auto namespaceSymbol = symbol_cast<NamespaceSymbol>(symbol))
659+
return namespaceSymbol;
660+
661+
if (auto enumSymbol = symbol_cast<EnumSymbol>(symbol)) return enumSymbol;
662+
663+
if (auto scopedEnumSymbol = symbol_cast<ScopedEnumSymbol>(symbol))
664+
return scopedEnumSymbol;
665+
666+
if (auto typeAliasSymbol = symbol_cast<TypeAliasSymbol>(symbol)) {
667+
if (auto classType = type_cast<ClassType>(typeAliasSymbol->type()))
668+
return classType->symbol();
669+
670+
if (auto enumType = type_cast<EnumType>(typeAliasSymbol->type()))
671+
return enumType->symbol();
672+
673+
if (auto scopedEnumType =
674+
type_cast<ScopedEnumType>(typeAliasSymbol->type()))
675+
return scopedEnumType->symbol();
676+
}
677+
678+
return nullptr;
679+
}
680+
655681
auto Binder::resolve(NestedNameSpecifierAST* nestedNameSpecifier,
656682
UnqualifiedIdAST* unqualifiedId, bool canInstantiate)
657683
-> Symbol* {

src/parser/cxx/binder.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ class Binder {
136136
UnqualifiedIdAST* unqualifiedId,
137137
bool canInstantiate) -> Symbol*;
138138

139+
[[nodiscard]] auto resolveNestedNameSpecifier(Symbol* symbol)
140+
-> ScopedSymbol*;
141+
139142
class ScopeGuard {
140143
public:
141144
Binder* p = nullptr;

src/parser/cxx/parser.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,7 @@ auto Parser::parse_type_nested_name_specifier(NestedNameSpecifierAST*& yyast,
972972
ast->identifierLoc = identifierLoc;
973973
ast->identifier = identifier;
974974
ast->scopeLoc = scopeLoc;
975-
ast->symbol = symbol;
975+
ast->symbol = binder_.resolveNestedNameSpecifier(symbol);
976976

977977
return true;
978978
}
@@ -1048,12 +1048,14 @@ auto Parser::parse_template_nested_name_specifier(
10481048
}
10491049

10501050
if (isReferencingPrimaryTemplate) {
1051-
ast->symbol = templateId->primaryTemplateSymbol;
1051+
ast->symbol =
1052+
binder_.resolveNestedNameSpecifier(templateId->primaryTemplateSymbol);
10521053
}
10531054
}
10541055

10551056
if (!ast->symbol && config().checkTypes) {
1056-
ast->symbol = binder_.instantiate(templateId);
1057+
ast->symbol =
1058+
binder_.resolveNestedNameSpecifier(binder_.instantiate(templateId));
10571059
}
10581060

10591061
return true;

0 commit comments

Comments
 (0)