Skip to content

Commit 128dab4

Browse files
committed
Simplify symbol bindings
1 parent 28fb2c3 commit 128dab4

File tree

3 files changed

+59
-75
lines changed

3 files changed

+59
-75
lines changed

src/parser/cxx/parser.cc

Lines changed: 57 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -744,40 +744,6 @@ struct Parser::ClassSpecifierContext {
744744
}
745745
};
746746

747-
struct Parser::DeclareSymbol {
748-
Parser* p;
749-
Scope* scope_;
750-
751-
explicit DeclareSymbol(Parser* p, Scope* scope) : p(p), scope_(scope) {}
752-
753-
auto control() const -> Control* { return p->control_; }
754-
755-
void operator()(Symbol* symbol) {
756-
if (auto f = symbol_cast<FunctionSymbol>(symbol)) {
757-
for (Symbol* candidate : scope_->find(symbol->name())) {
758-
if (auto currentFunction = symbol_cast<FunctionSymbol>(candidate)) {
759-
auto ovl =
760-
control()->newOverloadSetSymbol(candidate->enclosingScope(), {});
761-
ovl->setName(symbol->name());
762-
scope_->replaceSymbol(currentFunction, ovl);
763-
764-
ovl->addFunction(currentFunction);
765-
ovl->addFunction(f);
766-
767-
return;
768-
}
769-
770-
if (auto ovl = symbol_cast<OverloadSetSymbol>(candidate)) {
771-
ovl->addFunction(f);
772-
return;
773-
}
774-
}
775-
}
776-
777-
scope_->addSymbol(symbol);
778-
}
779-
};
780-
781747
Parser::Parser(TranslationUnit* unit) : unit(unit) {
782748
control_ = unit->control();
783749
diagnosticClient_ = unit->diagnosticsClient();
@@ -1778,16 +1744,15 @@ auto Parser::parse_lambda_expression(ExpressionAST*& yyast) -> bool {
17781744

17791745
if (auto params = ast->parameterDeclarationClause) {
17801746
auto lambdaScope = symbol->scope();
1781-
std::invoke(DeclareSymbol{this, lambdaScope},
1782-
params->functionParametersSymbol);
1747+
lambdaScope->addSymbol(params->functionParametersSymbol);
17831748
setScope(params->functionParametersSymbol);
17841749
} else {
17851750
setScope(symbol);
17861751
}
17871752

17881753
if (!lookat(TokenKind::T_LBRACE)) return false;
17891754

1790-
std::invoke(DeclareSymbol{this, scope_}, symbol);
1755+
scope_->addSymbol(symbol);
17911756

17921757
if (!parse_compound_statement(ast->statement)) {
17931758
parse_error("expected a compound statement");
@@ -3821,7 +3786,7 @@ void Parser::parse_init_statement(StatementAST*& yyast) {
38213786
for (auto initDeclaraotr :
38223787
ListView(simpleDeclaration->initDeclaratorList)) {
38233788
auto symbol = initDeclaraotr->symbol;
3824-
std::invoke(DeclareSymbol{this, scope_}, symbol);
3789+
scope_->addSymbol(symbol);
38253790
}
38263791
}
38273792

@@ -3986,7 +3951,7 @@ auto Parser::parse_compound_statement(CompoundStatementAST*& yyast, bool skip)
39863951
ScopeGuard scopeGuard{this};
39873952

39883953
auto blockSymbol = control_->newBlockSymbol(scope_, lbraceLoc);
3989-
std::invoke(DeclareSymbol{this, scope_}, blockSymbol);
3954+
scope_->addSymbol(blockSymbol);
39903955
setScope(blockSymbol);
39913956

39923957
auto ast = make_node<CompoundStatementAST>(pool_);
@@ -4070,7 +4035,7 @@ auto Parser::parse_if_statement(StatementAST*& yyast) -> bool {
40704035
ScopeGuard scopeGuard{this};
40714036

40724037
auto blockSymbol = control_->newBlockSymbol(scope_, ifLoc);
4073-
std::invoke(DeclareSymbol{this, scope_}, blockSymbol);
4038+
scope_->addSymbol(blockSymbol);
40744039
setScope(blockSymbol);
40754040

40764041
if (LA().isOneOf(TokenKind::T_EXCLAIM, TokenKind::T_CONSTEVAL)) {
@@ -4153,7 +4118,7 @@ auto Parser::parse_while_statement(StatementAST*& yyast) -> bool {
41534118
ScopeGuard scopeGuard{this};
41544119

41554120
auto blockSymbol = control_->newBlockSymbol(scope_, whileLoc);
4156-
std::invoke(DeclareSymbol{this, scope_}, blockSymbol);
4121+
scope_->addSymbol(blockSymbol);
41574122
setScope(blockSymbol);
41584123

41594124
auto ast = make_node<WhileStatementAST>(pool_);
@@ -4224,7 +4189,7 @@ auto Parser::parse_for_range_statement(StatementAST*& yyast) -> bool {
42244189

42254190
lookahead.commit();
42264191

4227-
std::invoke(DeclareSymbol{this, scope_}, blockSymbol);
4192+
scope_->addSymbol(blockSymbol);
42284193

42294194
auto ast = make_node<ForRangeStatementAST>(pool_);
42304195
yyast = ast;
@@ -4254,7 +4219,7 @@ auto Parser::parse_for_statement(StatementAST*& yyast) -> bool {
42544219
ScopeGuard scopeGuard{this};
42554220

42564221
auto blockSymbol = control_->newBlockSymbol(scope_, forLoc);
4257-
std::invoke(DeclareSymbol{this, scope_}, blockSymbol);
4222+
scope_->addSymbol(blockSymbol);
42584223
setScope(blockSymbol);
42594224

42604225
auto ast = make_node<ForStatementAST>(pool_);
@@ -4602,7 +4567,7 @@ auto Parser::enterOrCreateNamespace(const Identifier* identifier,
46024567

46034568
namespaceSymbol->setInline(isInline);
46044569

4605-
std::invoke(DeclareSymbol{this, parentScope}, namespaceSymbol);
4570+
parentScope->addSymbol(namespaceSymbol);
46064571

46074572
if (isInline || !namespaceSymbol->name()) {
46084573
parentNamespace->scope()->addUsingDirective(namespaceSymbol->scope());
@@ -4903,8 +4868,7 @@ auto Parser::parse_simple_declaration(
49034868

49044869
if (auto params = functionDeclarator->parameterDeclarationClause) {
49054870
auto functionScope = functionSymbol->scope();
4906-
std::invoke(DeclareSymbol{this, functionScope},
4907-
params->functionParametersSymbol);
4871+
functionScope->addSymbol(params->functionParametersSymbol);
49084872
setScope(params->functionParametersSymbol);
49094873
} else {
49104874
setScope(functionSymbol);
@@ -5064,8 +5028,7 @@ auto Parser::parse_notypespec_function_definition(
50645028

50655029
if (auto params = functionDeclarator->parameterDeclarationClause) {
50665030
auto functionScope = functionSymbol->scope();
5067-
std::invoke(DeclareSymbol{this, functionScope},
5068-
params->functionParametersSymbol);
5031+
functionScope->addSymbol(params->functionParametersSymbol);
50695032
setScope(params->functionParametersSymbol);
50705033
} else {
50715034
setScope(functionSymbol);
@@ -7415,7 +7378,7 @@ auto Parser::parse_parameter_declaration(ParameterDeclarationAST*& yyast,
74157378
control_->newParameterSymbol(scope_, decl.location());
74167379
parameterSymbol->setName(ast->identifier);
74177380
parameterSymbol->setType(ast->type);
7418-
std::invoke(DeclareSymbol{this, scope_}, parameterSymbol);
7381+
scope_->addSymbol(parameterSymbol);
74197382
}
74207383

74217384
if (match(TokenKind::T_EQUAL, ast->equalLoc)) {
@@ -7767,7 +7730,7 @@ auto Parser::parse_enum_specifier(SpecifierAST*& yyast, DeclSpecs& specs)
77677730

77687731
enumSymbol->setName(enumName);
77697732
enumSymbol->setUnderlyingType(underlyingType);
7770-
std::invoke(DeclareSymbol{this, scope_}, enumSymbol);
7733+
scope_->addSymbol(enumSymbol);
77717734

77727735
setScope(enumSymbol);
77737736
} else {
@@ -7776,7 +7739,7 @@ auto Parser::parse_enum_specifier(SpecifierAST*& yyast, DeclSpecs& specs)
77767739

77777740
enumSymbol->setName(enumName);
77787741
enumSymbol->setUnderlyingType(underlyingType);
7779-
std::invoke(DeclareSymbol{this, scope_}, enumSymbol);
7742+
scope_->addSymbol(enumSymbol);
77807743

77817744
setScope(enumSymbol);
77827745
}
@@ -7935,7 +7898,7 @@ void Parser::parse_enumerator(EnumeratorAST*& yyast, const Type* type) {
79357898
enumeratorSymbol->setType(type);
79367899
enumeratorSymbol->setValue(value);
79377900

7938-
std::invoke(DeclareSymbol{this, scope_}, enumeratorSymbol);
7901+
scope_->addSymbol(enumeratorSymbol);
79397902

79407903
if (auto enumSymbol = symbol_cast<EnumSymbol>(scope_->owner())) {
79417904
auto enumeratorSymbol =
@@ -7945,7 +7908,7 @@ void Parser::parse_enumerator(EnumeratorAST*& yyast, const Type* type) {
79457908
enumeratorSymbol->setValue(value);
79467909

79477910
auto parentScope = enumSymbol->enclosingScope();
7948-
std::invoke(DeclareSymbol{this, parentScope}, enumeratorSymbol);
7911+
parentScope->addSymbol(enumeratorSymbol);
79497912
}
79507913
}
79517914

@@ -8283,7 +8246,7 @@ auto Parser::parse_using_declarator(UsingDeclaratorAST*& yyast) -> bool {
82838246
symbol->setDeclarator(yyast);
82848247
symbol->setTarget(target);
82858248

8286-
std::invoke(DeclareSymbol{this, scope_}, symbol);
8249+
scope_->addSymbol(symbol);
82878250

82888251
return true;
82898252
}
@@ -9255,7 +9218,7 @@ auto Parser::parse_class_head(ClassHead& classHead) -> bool {
92559218
classSymbol->setName(identifier);
92569219
classSymbol->setTemplateParameters(currentTemplateParameters());
92579220

9258-
std::invoke(DeclareSymbol{this, declaringScope()}, classSymbol);
9221+
declaringScope()->addSymbol(classSymbol);
92599222
}
92609223

92619224
classHead.symbol = classSymbol;
@@ -9424,8 +9387,7 @@ auto Parser::parse_member_declaration_helper(DeclarationAST*& yyast) -> bool {
94249387

94259388
if (auto params = functionDeclarator->parameterDeclarationClause) {
94269389
auto functionScope = functionSymbol->scope();
9427-
std::invoke(DeclareSymbol{this, functionScope},
9428-
params->functionParametersSymbol);
9390+
functionScope->addSymbol(params->functionParametersSymbol);
94299391
setScope(params->functionParametersSymbol);
94309392
} else {
94319393
setScope(functionSymbol);
@@ -9564,25 +9526,26 @@ auto Parser::declareTypeAlias(SourceLocation identifierLoc, TypeIdAST* typeId)
95649526
symbol->setName(name);
95659527
if (typeId) symbol->setType(typeId->type);
95669528
symbol->setTemplateParameters(currentTemplateParameters());
9567-
std::invoke(DeclareSymbol{this, declaringScope()}, symbol);
9529+
declaringScope()->addSymbol(symbol);
95689530
return symbol;
95699531
}
95709532

95719533
auto Parser::declareTypedef(DeclaratorAST* declarator, const Decl& decl)
95729534
-> TypeAliasSymbol* {
95739535
auto name = decl.getName();
95749536
auto type = GetDeclaratorType{this}(declarator, decl.specs.getType());
9575-
auto typedefSymbol = control_->newTypeAliasSymbol(scope_, decl.location());
9576-
typedefSymbol->setName(name);
9577-
typedefSymbol->setType(type);
9578-
std::invoke(DeclareSymbol{this, scope_}, typedefSymbol);
9579-
return typedefSymbol;
9537+
auto symbol = control_->newTypeAliasSymbol(scope_, decl.location());
9538+
symbol->setName(name);
9539+
symbol->setType(type);
9540+
scope_->addSymbol(symbol);
9541+
return symbol;
95809542
}
95819543

95829544
auto Parser::declareFunction(DeclaratorAST* declarator, const Decl& decl)
95839545
-> FunctionSymbol* {
95849546
auto name = decl.getName();
95859547
auto type = GetDeclaratorType{this}(declarator, decl.specs.getType());
9548+
95869549
auto functionSymbol = control_->newFunctionSymbol(scope_, decl.location());
95879550
applySpecifiers(functionSymbol, decl.specs);
95889551
functionSymbol->setName(name);
@@ -9595,8 +9558,31 @@ auto Parser::declareFunction(DeclaratorAST* declarator, const Decl& decl)
95959558
if (enclosingClass) {
95969559
enclosingClass->addConstructor(functionSymbol);
95979560
}
9561+
9562+
return functionSymbol;
9563+
}
9564+
9565+
auto scope = declaringScope();
9566+
9567+
OverloadSetSymbol* overloadSet = nullptr;
9568+
9569+
for (Symbol* candidate : scope->find(functionSymbol->name())) {
9570+
overloadSet = symbol_cast<OverloadSetSymbol>(candidate);
9571+
if (overloadSet) break;
9572+
9573+
if (auto previousFunction = symbol_cast<FunctionSymbol>(candidate)) {
9574+
overloadSet = control_->newOverloadSetSymbol(scope, {});
9575+
overloadSet->setName(functionSymbol->name());
9576+
overloadSet->addFunction(previousFunction);
9577+
scope_->replaceSymbol(previousFunction, overloadSet);
9578+
break;
9579+
}
9580+
}
9581+
9582+
if (overloadSet) {
9583+
overloadSet->addFunction(functionSymbol);
95989584
} else {
9599-
std::invoke(DeclareSymbol{this, declaringScope()}, functionSymbol);
9585+
scope->addSymbol(functionSymbol);
96009586
}
96019587

96029588
return functionSymbol;
@@ -9610,7 +9596,7 @@ auto Parser::declareField(DeclaratorAST* declarator, const Decl& decl)
96109596
applySpecifiers(fieldSymbol, decl.specs);
96119597
fieldSymbol->setName(name);
96129598
fieldSymbol->setType(type);
9613-
std::invoke(DeclareSymbol{this, scope_}, fieldSymbol);
9599+
scope_->addSymbol(fieldSymbol);
96149600
return fieldSymbol;
96159601
}
96169602

@@ -9624,7 +9610,7 @@ auto Parser::declareVariable(DeclaratorAST* declarator, const Decl& decl,
96249610
symbol->setType(type);
96259611
symbol->setTemplateParameters(currentTemplateParameters());
96269612
if (ctx != BindingContext::kInitStatement) {
9627-
std::invoke(DeclareSymbol{this, declaringScope()}, symbol);
9613+
declaringScope()->addSymbol(symbol);
96289614
}
96299615
return symbol;
96309616
}
@@ -10397,7 +10383,7 @@ void Parser::parse_template_parameter(TemplateParameterAST*& yyast) {
1039710383
symbol->setName(parameter->identifier);
1039810384
symbol->setParameterPack(parameter->isPack);
1039910385
symbol->setObjectType(parameter->type);
10400-
std::invoke(DeclareSymbol{this, scope_}, symbol);
10386+
scope_->addSymbol(symbol);
1040110387

1040210388
auto ast = make_node<NonTypeTemplateParameterAST>(pool_);
1040310389
yyast = ast;
@@ -10454,7 +10440,7 @@ auto Parser::parse_typename_type_parameter(TemplateParameterAST*& yyast)
1045410440
symbol->setDepth(templateParameterDepth_);
1045510441
symbol->setParameterPack(isPack);
1045610442
symbol->setName(ast->identifier);
10457-
std::invoke(DeclareSymbol{this, scope_}, symbol);
10443+
scope_->addSymbol(symbol);
1045810444

1045910445
ast->symbol = symbol;
1046010446

@@ -10515,7 +10501,7 @@ void Parser::parse_template_type_parameter(TemplateParameterAST*& yyast) {
1051510501
mark_maybe_template_name(ast->identifier);
1051610502
}
1051710503

10518-
std::invoke(DeclareSymbol{this, scope_}, symbol);
10504+
scope_->addSymbol(symbol);
1051910505

1052010506
if (match(TokenKind::T_EQUAL, ast->equalLoc)) {
1052110507
if (!parse_id_expression(ast->idExpression,
@@ -10564,7 +10550,7 @@ auto Parser::parse_constraint_type_parameter(TemplateParameterAST*& yyast)
1056410550
symbol->setIndex(templateParameterCount_);
1056510551
symbol->setDepth(templateParameterDepth_);
1056610552
symbol->setName(ast->identifier);
10567-
std::invoke(DeclareSymbol{this, scope_}, symbol);
10553+
scope_->addSymbol(symbol);
1056810554

1056910555
return true;
1057010556
}
@@ -10972,7 +10958,7 @@ auto Parser::parse_concept_definition(DeclarationAST*& yyast) -> bool {
1097210958
symbol->setName(ast->identifier);
1097310959
symbol->setTemplateParameters(templateParameters);
1097410960

10975-
std::invoke(DeclareSymbol{this, declaringScope()}, symbol);
10961+
declaringScope()->addSymbol(symbol);
1097610962

1097710963
if (ast->identifierLoc) {
1097810964
concept_names_.insert(ast->identifier);

src/parser/cxx/parser.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ class Parser final {
7979
struct LoopParser;
8080
struct ClassHead;
8181
struct GetDeclaratorType;
82-
struct DeclareSymbol;
8382

8483
enum struct BindingContext {
8584
kNamespace,

src/parser/cxx/scope.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,11 @@ void Scope::addSymbol(Symbol* symbol) {
6666
return;
6767
}
6868

69-
if (auto templateParameters = symbol_cast<TemplateParametersSymbol>(owner_)) {
69+
if (isTemplateParametersScope()) {
7070
if (!(symbol->isTypeParameter() || symbol->isTemplateTypeParameter() ||
7171
symbol->isNonTypeParameter() ||
7272
symbol->isConstraintTypeParameter())) {
73-
cxx_runtime_error(
74-
"invalid symbol in template parameters scope");
73+
cxx_runtime_error("invalid symbol in template parameters scope");
7574
}
7675
}
7776

0 commit comments

Comments
 (0)