@@ -705,10 +705,10 @@ struct Parser::ScopeGuard {
705705
706706 explicit ScopeGuard (Parser* p, Scope* scope = nullptr )
707707 : p(p), savedScope(p->scope_) {
708- if (scope) p->scope_ = scope;
708+ if (scope) p->setScope ( scope) ;
709709 }
710710
711- ~ScopeGuard () { p->scope_ = savedScope; }
711+ ~ScopeGuard () { p->setScope ( savedScope) ; }
712712};
713713
714714struct Parser ::ExprContext {
@@ -792,7 +792,7 @@ Parser::Parser(TranslationUnit* unit) : unit(unit) {
792792 overrideId_ = control_->getIdentifier (" override" );
793793
794794 globalScope_ = unit->globalScope ();
795- scope_ = globalScope_;
795+ setScope ( globalScope_) ;
796796
797797 // temporary workarounds to the gnu until we have a proper
798798 // support for templates
@@ -1727,7 +1727,7 @@ auto Parser::parse_lambda_expression(ExpressionAST*& yyast) -> bool {
17271727
17281728 auto symbol = control_->newLambdaSymbol (scope_, currentLocation ());
17291729
1730- scope_ = symbol-> scope ( );
1730+ setScope (symbol );
17311731
17321732 TemplateHeadContext templateHeadContext{this };
17331733
@@ -1786,9 +1786,9 @@ auto Parser::parse_lambda_expression(ExpressionAST*& yyast) -> bool {
17861786 auto lambdaScope = symbol->scope ();
17871787 std::invoke (DeclareSymbol{this , lambdaScope},
17881788 params->functionParametersSymbol );
1789- scope_ = params->functionParametersSymbol -> scope ( );
1789+ setScope ( params->functionParametersSymbol );
17901790 } else {
1791- scope_ = symbol-> scope ( );
1791+ setScope (symbol );
17921792 }
17931793
17941794 if (!lookat (TokenKind::T_LBRACE)) return false ;
@@ -3964,7 +3964,7 @@ auto Parser::parse_compound_statement(CompoundStatementAST*& yyast, bool skip)
39643964
39653965 auto blockSymbol = control_->newBlockSymbol (scope_, lbraceLoc);
39663966 std::invoke (DeclareSymbol{this , scope_}, blockSymbol);
3967- scope_ = blockSymbol-> scope ( );
3967+ setScope (blockSymbol );
39683968
39693969 auto ast = make_node<CompoundStatementAST>(pool_);
39703970 yyast = ast;
@@ -4002,7 +4002,7 @@ auto Parser::parse_compound_statement(CompoundStatementAST*& yyast, bool skip)
40024002void Parser::finish_compound_statement (CompoundStatementAST* ast) {
40034003 ScopeGuard scopeGuard{this };
40044004
4005- scope_ = ast->symbol -> scope ( );
4005+ setScope ( ast->symbol );
40064006
40074007 bool skipping = false ;
40084008
@@ -4048,7 +4048,7 @@ auto Parser::parse_if_statement(StatementAST*& yyast) -> bool {
40484048
40494049 auto blockSymbol = control_->newBlockSymbol (scope_, ifLoc);
40504050 std::invoke (DeclareSymbol{this , scope_}, blockSymbol);
4051- scope_ = blockSymbol-> scope ( );
4051+ setScope (blockSymbol );
40524052
40534053 if (LA ().isOneOf (TokenKind::T_EXCLAIM, TokenKind::T_CONSTEVAL)) {
40544054 auto ast = make_node<ConstevalIfStatementAST>(pool_);
@@ -4131,7 +4131,7 @@ auto Parser::parse_while_statement(StatementAST*& yyast) -> bool {
41314131
41324132 auto blockSymbol = control_->newBlockSymbol (scope_, whileLoc);
41334133 std::invoke (DeclareSymbol{this , scope_}, blockSymbol);
4134- scope_ = blockSymbol-> scope ( );
4134+ setScope (blockSymbol );
41354135
41364136 auto ast = make_node<WhileStatementAST>(pool_);
41374137 yyast = ast;
@@ -4185,7 +4185,7 @@ auto Parser::parse_for_range_statement(StatementAST*& yyast) -> bool {
41854185 ScopeGuard scopeGuard{this };
41864186
41874187 auto blockSymbol = control_->newBlockSymbol (scope_, forLoc);
4188- scope_ = blockSymbol-> scope ( );
4188+ setScope (blockSymbol );
41894189
41904190 SourceLocation lparenLoc;
41914191 if (!match (TokenKind::T_LPAREN, lparenLoc)) return false ;
@@ -4232,7 +4232,7 @@ auto Parser::parse_for_statement(StatementAST*& yyast) -> bool {
42324232
42334233 auto blockSymbol = control_->newBlockSymbol (scope_, forLoc);
42344234 std::invoke (DeclareSymbol{this , scope_}, blockSymbol);
4235- scope_ = blockSymbol-> scope ( );
4235+ setScope (blockSymbol );
42364236
42374237 auto ast = make_node<ForStatementAST>(pool_);
42384238 yyast = ast;
@@ -4562,8 +4562,7 @@ auto Parser::enterOrCreateNamespace(const Identifier* identifier,
45624562 if (!identifier) {
45634563 namespaceSymbol = parentNamespace->unnamedNamespace ();
45644564 } else {
4565- auto resolved = parentScope->find (identifier) |
4566- std::views::filter (&Symbol::isNamespace);
4565+ auto resolved = parentScope->find (identifier) | views::namespaces;
45674566 if (std::ranges::distance (resolved) == 1 ) {
45684567 namespaceSymbol =
45694568 symbol_cast<NamespaceSymbol>(*std::ranges::begin (resolved));
@@ -4588,7 +4587,7 @@ auto Parser::enterOrCreateNamespace(const Identifier* identifier,
45884587 }
45894588 }
45904589
4591- scope_ = namespaceSymbol-> scope ( );
4590+ setScope (namespaceSymbol );
45924591
45934592 return namespaceSymbol;
45944593}
@@ -4891,7 +4890,7 @@ auto Parser::parse_simple_declaration(
48914890 auto q = decl.getNestedNameSpecifier ();
48924891
48934892 if (auto scope = decl.getScope ()) {
4894- scope_ = scope;
4893+ setScope ( scope) ;
48954894 } else if (q && config_.checkTypes ) {
48964895 parse_error (q->firstSourceLocation (),
48974896 std::format (" unresolved class or namespace" ));
@@ -4918,9 +4917,9 @@ auto Parser::parse_simple_declaration(
49184917 auto functionScope = functionSymbol->scope ();
49194918 std::invoke (DeclareSymbol{this , functionScope},
49204919 params->functionParametersSymbol );
4921- scope_ = params->functionParametersSymbol -> scope ( );
4920+ setScope ( params->functionParametersSymbol );
49224921 } else {
4923- scope_ = functionSymbol-> scope ( );
4922+ setScope (functionSymbol );
49244923 }
49254924
49264925 if (ctx == BindingContext::kTemplate ) {
@@ -5005,7 +5004,7 @@ auto Parser::parse_notypespec_function_definition(
50055004 ScopeGuard scopeGuard{this };
50065005
50075006 if (auto scope = decl.getScope ()) {
5008- scope_ = scope;
5007+ setScope ( scope) ;
50095008 } else if (auto q = decl.getNestedNameSpecifier ()) {
50105009 if (config_.checkTypes ) {
50115010 parse_error (q->firstSourceLocation (),
@@ -5091,9 +5090,9 @@ auto Parser::parse_notypespec_function_definition(
50915090 auto functionScope = functionSymbol->scope ();
50925091 std::invoke (DeclareSymbol{this , functionScope},
50935092 params->functionParametersSymbol );
5094- scope_ = params->functionParametersSymbol -> scope ( );
5093+ setScope ( params->functionParametersSymbol );
50955094 } else {
5096- scope_ = functionSymbol-> scope ( );
5095+ setScope (functionSymbol );
50975096 }
50985097
50995098 FunctionBodyAST* functionBody = nullptr ;
@@ -6686,23 +6685,18 @@ auto Parser::parse_elaborated_type_specifier_helper(
66866685
66876686 auto symbol = Lookup{scope_}(nestedNameSpecifier, nameId->identifier );
66886687
6689- auto class_symbols_view = std::views::filter (&Symbol::isClass);
6690-
6691- auto enum_symbols_view = std::views::filter ([](Symbol* symbol) {
6692- return symbol->isEnum () || symbol->isScopedEnum ();
6693- });
6694-
66956688 if (ast->classKey == TokenKind::T_CLASS ||
66966689 ast->classKey == TokenKind::T_STRUCT ||
66976690 ast->classKey == TokenKind::T_UNION) {
6698- for (auto symbol : SymbolChainView (symbol) | class_symbols_view ) {
6691+ for (auto symbol : SymbolChainView (symbol) | views::classes ) {
66996692 if (symbol->name () != nameId->identifier ) continue ;
67006693 ast->symbol = symbol;
67016694 specs.type = symbol->type ();
67026695 break ;
67036696 }
67046697 } else if (ast->classKey == TokenKind::T_ENUM) {
6705- for (auto symbol : SymbolChainView (symbol) | enum_symbols_view) {
6698+ for (auto symbol :
6699+ SymbolChainView (symbol) | views::enum_or_scoped_enums) {
67066700 if (symbol->name () != nameId->identifier ) continue ;
67076701 ast->symbol = symbol;
67086702 specs.type = symbol->type ();
@@ -6944,7 +6938,7 @@ auto Parser::parse_declarator(DeclaratorAST*& yyast, Decl& decl,
69446938 auto q = decl.getNestedNameSpecifier ();
69456939
69466940 if (auto scope = decl.getScope ()) {
6947- scope_ = scope;
6941+ setScope ( scope) ;
69486942 } else if (q && config_.checkTypes ) {
69496943 parse_error (q->firstSourceLocation (),
69506944 std::format (" unresolved class or namespace" ));
@@ -7412,7 +7406,7 @@ auto Parser::parse_parameter_declaration_list(
74127406
74137407 functionParametersSymbol = control_->newFunctionParametersSymbol (scope_, {});
74147408
7415- scope_ = functionParametersSymbol-> scope ( );
7409+ setScope (functionParametersSymbol );
74167410
74177411 ParameterDeclarationAST* declaration = nullptr ;
74187412
@@ -7849,7 +7843,7 @@ auto Parser::parse_enum_specifier(SpecifierAST*& yyast, DeclSpecs& specs)
78497843 enumSymbol->setUnderlyingType (underlyingType);
78507844 std::invoke (DeclareSymbol{this , scope_}, enumSymbol);
78517845
7852- scope_ = enumSymbol-> scope ( );
7846+ setScope (enumSymbol );
78537847 } else {
78547848 auto enumSymbol = control_->newEnumSymbol (scope_, location);
78557849 symbol = enumSymbol;
@@ -7858,7 +7852,7 @@ auto Parser::parse_enum_specifier(SpecifierAST*& yyast, DeclSpecs& specs)
78587852 enumSymbol->setUnderlyingType (underlyingType);
78597853 std::invoke (DeclareSymbol{this , scope_}, enumSymbol);
78607854
7861- scope_ = enumSymbol-> scope ( );
7855+ setScope (enumSymbol );
78627856 }
78637857
78647858 auto ast = make_node<EnumSpecifierAST>(pool_);
@@ -9281,13 +9275,11 @@ auto Parser::parse_class_head(ClassHead& classHead) -> bool {
92819275 enclosingScope = enclosingNamespace->scope ();
92829276 }
92839277
9284- if (!scope_) {
9285- if (config_.checkTypes ) {
9286- parse_error (classHead.nestedNameSpecifier ->firstSourceLocation (),
9287- " unresolved nested name specifier" );
9288- }
9289- } else {
9290- scope_ = enclosingScope;
9278+ if (enclosingScope) {
9279+ setScope (enclosingScope);
9280+ } else if (config_.checkTypes ) {
9281+ parse_error (classHead.nestedNameSpecifier ->firstSourceLocation (),
9282+ " unresolved nested name specifier" );
92919283 }
92929284 }
92939285 }
@@ -9309,17 +9301,14 @@ auto Parser::parse_class_head(ClassHead& classHead) -> bool {
93099301 ClassSymbol* classSymbol = nullptr ;
93109302
93119303 if (id && !isTemplateSpecialization) {
9312- for (auto previous :
9313- scope_->find (id) | std::views::filter (&Symbol::isClass)) {
9314- if (auto previousClass = symbol_cast<ClassSymbol>(previous)) {
9315- if (previousClass->isComplete ()) {
9316- parse_error (classHead.name ->firstSourceLocation (),
9317- " class name already declared" );
9318- } else {
9319- classSymbol = previousClass;
9320- }
9321- break ;
9304+ for (auto previousClass : scope_->find (id) | views::classes) {
9305+ if (previousClass->isComplete ()) {
9306+ parse_error (classHead.name ->firstSourceLocation (),
9307+ " class name already declared" );
9308+ } else {
9309+ classSymbol = previousClass;
93229310 }
9311+ break ;
93239312 }
93249313 }
93259314
@@ -9337,7 +9326,7 @@ auto Parser::parse_class_head(ClassHead& classHead) -> bool {
93379326 classSymbol->setFinal (true );
93389327 }
93399328
9340- scope_ = classSymbol-> scope ( );
9329+ setScope (classSymbol );
93419330
93429331 (void )parse_base_clause (classSymbol, classHead.colonLoc ,
93439332 classHead.baseSpecifierList );
@@ -9502,9 +9491,9 @@ auto Parser::parse_member_declaration_helper(DeclarationAST*& yyast) -> bool {
95029491 auto functionScope = functionSymbol->scope ();
95039492 std::invoke (DeclareSymbol{this , functionScope},
95049493 params->functionParametersSymbol );
9505- scope_ = params->functionParametersSymbol -> scope ( );
9494+ setScope ( params->functionParametersSymbol );
95069495 } else {
9507- scope_ = functionSymbol-> scope ( );
9496+ setScope (functionSymbol );
95089497 }
95099498
95109499 FunctionBodyAST* functionBody = nullptr ;
@@ -10215,7 +10204,7 @@ auto Parser::parse_template_declaration(
1021510204
1021610205 std::invoke (DeclareSymbol{this , scope_}, templateParametersSymbol);
1021710206
10218- scope_ = ast->symbol -> scope ( );
10207+ setScope ( ast->symbol );
1021910208
1022010209 templateDeclarations.push_back (ast);
1022110210
@@ -10482,13 +10471,13 @@ void Parser::parse_template_type_parameter(TemplateParameterAST*& yyast) {
1048210471 auto parameters =
1048310472 control_->newTemplateParametersSymbol (scope_, ast->templateLoc );
1048410473
10485- scope_ = parameters-> scope ( );
10474+ setScope (parameters );
1048610475
1048710476 parse_template_parameter_list (ast->templateParameterList );
1048810477
1048910478 expect (TokenKind::T_GREATER, ast->greaterLoc );
1049010479
10491- scope_ = parameters->enclosingScope ();
10480+ setScope ( parameters->enclosingScope () );
1049210481 }
1049310482
1049410483 (void )parse_requires_clause (ast->requiresClause );
@@ -11250,6 +11239,10 @@ void Parser::completePendingFunctionDefinitions() {
1125011239 }
1125111240}
1125211241
11242+ void Parser::setScope (Scope* scope) { scope_ = scope; }
11243+
11244+ void Parser::setScope (ScopedSymbol* symbol) { setScope (symbol->scope ()); }
11245+
1125311246void Parser::completeFunctionDefinition (FunctionDefinitionAST* ast) {
1125411247 if (!ast->functionBody ) return ;
1125511248
@@ -11260,7 +11253,7 @@ void Parser::completeFunctionDefinition(FunctionDefinitionAST* ast) {
1126011253
1126111254 ScopeGuard scopeGuard{this };
1126211255
11263- scope_ = ast->symbol -> scope ( );
11256+ setScope ( ast->symbol );
1126411257
1126511258 const auto saved = currentLocation ();
1126611259
0 commit comments