Skip to content

Commit 30942a3

Browse files
committed
Add UsingDeclarationSymbol
Signed-off-by: Roberto Raggi <[email protected]>
1 parent 30918cb commit 30942a3

File tree

11 files changed

+136
-7
lines changed

11 files changed

+136
-7
lines changed

src/parser/cxx/ast.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2334,6 +2334,7 @@ class UsingDeclaratorAST final : public AST {
23342334
NestedNameSpecifierAST* nestedNameSpecifier = nullptr;
23352335
UnqualifiedIdAST* unqualifiedId = nullptr;
23362336
SourceLocation ellipsisLoc;
2337+
UsingDeclarationSymbol* symbol = nullptr;
23372338
bool isPack = false;
23382339

23392340
void accept(ASTVisitor* visitor) override { visitor->visit(this); }

src/parser/cxx/control.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ struct Control::Private {
149149
std::forward_list<ConstraintTypeParameterSymbol>
150150
constraintTypeParameterSymbols;
151151
std::forward_list<EnumeratorSymbol> enumeratorSymbols;
152+
std::forward_list<UsingDeclarationSymbol> usingDeclarationSymbols;
152153

153154
std::forward_list<TypeTraitIdentifierInfo> typeTraitIdentifierInfos;
154155

@@ -624,6 +625,14 @@ auto Control::newEnumeratorSymbol(Scope* enclosingScope, SourceLocation loc)
624625
return symbol;
625626
}
626627

628+
auto Control::newUsingDeclarationSymbol(Scope* enclosingScope,
629+
SourceLocation loc)
630+
-> UsingDeclarationSymbol* {
631+
auto symbol = &d->usingDeclarationSymbols.emplace_front(enclosingScope);
632+
symbol->setLocation(loc);
633+
return symbol;
634+
}
635+
627636
auto Control::is_void(const Type* type) -> bool {
628637
return d->traits.is_void(type);
629638
}

src/parser/cxx/control.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,9 @@ class Control {
217217
[[nodiscard]] auto newEnumeratorSymbol(Scope* enclosingScope,
218218
SourceLocation sourceLocation)
219219
-> EnumeratorSymbol*;
220+
[[nodiscard]] auto newUsingDeclarationSymbol(Scope* enclosingScope,
221+
SourceLocation sourceLocation)
222+
-> UsingDeclarationSymbol*;
220223

221224
[[nodiscard]] auto instantiate(TranslationUnit* unit, Symbol* primaryTemplate,
222225
const std::vector<TemplateArgument>& arguments)

src/parser/cxx/external_name_encoder.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ struct ExternalNameEncoder::SymbolVisitor {
177177
void operator()(OverloadSetSymbol* symbol) {}
178178

179179
void operator()(BaseClassSymbol* symbol) {}
180+
181+
void operator()(UsingDeclarationSymbol* symbol) {}
180182
};
181183

182184
ExternalNameEncoder::ExternalNameEncoder() {}

src/parser/cxx/parser.cc

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8277,8 +8277,6 @@ auto Parser::parse_using_declarator_list(List<UsingDeclaratorAST*>*& yyast)
82778277

82788278
if (!parse_using_declarator(declarator)) return false;
82798279

8280-
declarator->isPack = match(TokenKind::T_DOT_DOT_DOT, declarator->ellipsisLoc);
8281-
82828280
*it = make_list_node(pool_, declarator);
82838281
it = &(*it)->next;
82848282

@@ -8287,9 +8285,6 @@ auto Parser::parse_using_declarator_list(List<UsingDeclaratorAST*>*& yyast)
82878285
while (match(TokenKind::T_COMMA, commaLoc)) {
82888286
if (UsingDeclaratorAST* declarator = nullptr;
82898287
parse_using_declarator(declarator)) {
8290-
declarator->isPack =
8291-
match(TokenKind::T_DOT_DOT_DOT, declarator->ellipsisLoc);
8292-
82938288
*it = make_list_node(pool_, declarator);
82948289
it = &(*it)->next;
82958290
} else {
@@ -8316,10 +8311,30 @@ auto Parser::parse_using_declarator(UsingDeclaratorAST*& yyast) -> bool {
83168311
/*inRequiresClause*/ false))
83178312
return false;
83188313

8314+
auto name = convertName(unqualifiedId);
8315+
8316+
SourceLocation ellipsisLoc;
8317+
auto isPack = match(TokenKind::T_DOT_DOT_DOT, ellipsisLoc);
8318+
83198319
yyast = make_node<UsingDeclaratorAST>(pool_);
83208320
yyast->typenameLoc = typenameLoc;
83218321
yyast->nestedNameSpecifier = nestedNameSpecifier;
83228322
yyast->unqualifiedId = unqualifiedId;
8323+
yyast->ellipsisLoc = ellipsisLoc;
8324+
yyast->isPack = isPack;
8325+
8326+
auto target = Lookup{scope_}.lookup(nestedNameSpecifier, name);
8327+
8328+
auto symbol = control_->newUsingDeclarationSymbol(
8329+
scope_, unqualifiedId->firstSourceLocation());
8330+
8331+
yyast->symbol = symbol;
8332+
8333+
symbol->setName(name);
8334+
symbol->setDeclarator(yyast);
8335+
symbol->setTarget(target);
8336+
8337+
std::invoke(DeclareSymbol{this, scope_}, symbol);
83238338

83248339
return true;
83258340
}

src/parser/cxx/symbol_instantiation.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ struct SymbolInstantiation::VisitSymbol {
7373
-> Symbol*;
7474
[[nodiscard]] auto operator()(OverloadSetSymbol* symbol) -> Symbol*;
7575
[[nodiscard]] auto operator()(BaseClassSymbol* symbol) -> Symbol*;
76+
[[nodiscard]] auto operator()(UsingDeclarationSymbol* symbol) -> Symbol*;
7677
};
7778

7879
struct SymbolInstantiation::VisitType {
@@ -373,6 +374,13 @@ auto SymbolInstantiation::VisitSymbol::operator()(BaseClassSymbol* symbol)
373374
return newSymbol;
374375
}
375376

377+
auto SymbolInstantiation::VisitSymbol::operator()(
378+
UsingDeclarationSymbol* symbol) -> Symbol* {
379+
auto newSymbol = self.replacement(symbol);
380+
newSymbol->setTarget(self.instantiate(symbol->target()));
381+
return newSymbol;
382+
}
383+
376384
// types
377385

378386
auto SymbolInstantiation::VisitType::operator()(const BuiltinVaListType* type)

src/parser/cxx/symbol_printer.cc

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ struct DumpSymbols {
104104
} else {
105105
out << std::format("{} {}\n", classKey, to_string(symbol->name()));
106106
}
107-
indent();
108107
if (!symbol->constructors().empty()) {
109108
++depth;
110109
for (auto constructor : symbol->constructors()) {
@@ -308,6 +307,18 @@ struct DumpSymbols {
308307
out << std::format("enumerator {}\n",
309308
to_string(symbol->type(), symbol->name()));
310309
}
310+
311+
void operator()(UsingDeclarationSymbol* symbol) {
312+
indent();
313+
314+
if (auto target = symbol->target()) {
315+
out << std::format("using {}\n",
316+
to_string(target->type(), target->name()));
317+
} else {
318+
// unresolved symbol
319+
out << std::format("using unresolved {}\n", to_string(symbol->name()));
320+
}
321+
}
311322
};
312323

313324
} // namespace

src/parser/cxx/symbols.cc

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,4 +614,21 @@ void EnumeratorSymbol::setValue(const std::optional<ConstValue>& value) {
614614
value_ = value;
615615
}
616616

617+
UsingDeclarationSymbol::UsingDeclarationSymbol(Scope* enclosingScope)
618+
: Symbol(Kind, enclosingScope) {}
619+
620+
UsingDeclarationSymbol::~UsingDeclarationSymbol() {}
621+
622+
auto UsingDeclarationSymbol::target() const -> Symbol* { return target_; }
623+
624+
void UsingDeclarationSymbol::setTarget(Symbol* symbol) { target_ = symbol; }
625+
626+
auto UsingDeclarationSymbol::declarator() const -> UsingDeclaratorAST* {
627+
return declarator_;
628+
}
629+
630+
void UsingDeclarationSymbol::setDeclarator(UsingDeclaratorAST* declarator) {
631+
declarator_ = declarator;
632+
}
633+
617634
} // namespace cxx

src/parser/cxx/symbols.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,6 +697,24 @@ class EnumeratorSymbol final : public Symbol {
697697
std::optional<ConstValue> value_;
698698
};
699699

700+
class UsingDeclarationSymbol final : public Symbol {
701+
public:
702+
constexpr static auto Kind = SymbolKind::kUsingDeclaration;
703+
704+
explicit UsingDeclarationSymbol(Scope* enclosingScope);
705+
~UsingDeclarationSymbol() override;
706+
707+
[[nodiscard]] auto declarator() const -> UsingDeclaratorAST*;
708+
void setDeclarator(UsingDeclaratorAST* declarator);
709+
710+
[[nodiscard]] auto target() const -> Symbol*;
711+
void setTarget(Symbol* symbol);
712+
713+
private:
714+
Symbol* target_ = nullptr;
715+
UsingDeclaratorAST* declarator_ = nullptr;
716+
};
717+
700718
template <typename Visitor>
701719
auto visit(Visitor&& visitor, Symbol* symbol) {
702720
#define PROCESS_SYMBOL(S) \

src/parser/cxx/symbols_fwd.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ namespace cxx {
4545
V(TemplateTypeParameter) \
4646
V(ConstraintTypeParameter) \
4747
V(OverloadSet) \
48-
V(BaseClass)
48+
V(BaseClass) \
49+
V(UsingDeclaration)
4950

5051
class Symbol;
5152
class ScopedSymbol;

0 commit comments

Comments
 (0)