Skip to content

Commit 1af49ef

Browse files
committed
chore: Simplify TranslationUnit initialization
Signed-off-by: Roberto Raggi <[email protected]>
1 parent bfcb999 commit 1af49ef

File tree

7 files changed

+32
-31
lines changed

7 files changed

+32
-31
lines changed

src/frontend/cxx/cxx_document.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,8 @@ struct Diagnostics final : cxx::DiagnosticsClient {
7070
struct CxxDocument::Private {
7171
const CLI& cli;
7272
long version;
73-
Control control;
7473
Diagnostics diagnosticsClient;
75-
TranslationUnit unit{&control, &diagnosticsClient};
74+
TranslationUnit unit{&diagnosticsClient};
7675
std::shared_ptr<Toolchain> toolchain;
7776

7877
Private(const CLI& cli, long version) : cli(cli), version(version) {}
@@ -146,7 +145,7 @@ void CxxDocument::Private::configure() {
146145
}
147146

148147
if (toolchain) {
149-
control.setMemoryLayout(toolchain->memoryLayout());
148+
unit.control()->setMemoryLayout(toolchain->memoryLayout());
150149

151150
if (!cli.opt_nostdinc) toolchain->addSystemIncludePaths();
152151

src/frontend/cxx/frontend.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,8 @@ void dumpTokens(const CLI& cli, TranslationUnit& unit, std::ostream& output) {
9898
}
9999

100100
auto runOnFile(const CLI& cli, const std::string& fileName) -> bool {
101-
Control control;
102101
VerifyDiagnosticsClient diagnosticsClient;
103-
TranslationUnit unit(&control, &diagnosticsClient);
102+
TranslationUnit unit(&diagnosticsClient);
104103

105104
auto preprocesor = unit.preprocessor();
106105

@@ -174,7 +173,7 @@ auto runOnFile(const CLI& cli, const std::string& fileName) -> bool {
174173
}
175174

176175
if (toolchain) {
177-
control.setMemoryLayout(toolchain->memoryLayout());
176+
unit.control()->setMemoryLayout(toolchain->memoryLayout());
178177

179178
if (!cli.opt_nostdinc) toolchain->addSystemIncludePaths();
180179

src/js/cxx/api.cc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,12 @@ struct DiagnosticsClient final : cxx::DiagnosticsClient {
5959
};
6060

6161
struct WrappedUnit {
62-
cxx::Control control;
6362
std::unique_ptr<DiagnosticsClient> diagnosticsClient;
6463
std::unique_ptr<cxx::TranslationUnit> unit;
6564

6665
WrappedUnit(std::string source, std::string filename) {
6766
diagnosticsClient = std::make_unique<DiagnosticsClient>();
68-
unit = std::make_unique<cxx::TranslationUnit>(&control,
69-
diagnosticsClient.get());
67+
unit = std::make_unique<cxx::TranslationUnit>(diagnosticsClient.get());
7068
if (auto preprocessor = unit->preprocessor()) {
7169
preprocessor->setCanResolveFiles(false);
7270
}
@@ -275,7 +273,7 @@ auto register_lexer(const char* name = "Lexer") -> class_<cxx::Lexer> {
275273
auto register_translation_unit(const char* name = "TranslationUnit")
276274
-> class_<cxx::TranslationUnit> {
277275
return class_<cxx::TranslationUnit>(name)
278-
.constructor<cxx::Control*, cxx::DiagnosticsClient*>()
276+
.constructor<cxx::DiagnosticsClient*>()
279277
.function("setSource", &cxx::TranslationUnit::setSource)
280278
.function("parse", &cxx::TranslationUnit::parse)
281279
.function("tokenCount", &cxx::TranslationUnit::tokenCount)

src/parser/cxx/parser.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ struct Parser::LookaheadParser {
418418
}
419419

420420
~LookaheadParser() {
421-
p->unit->changeDiagnosticsClient(previousClient);
421+
(void)p->unit->changeDiagnosticsClient(previousClient);
422422

423423
if (!committed) {
424424
p->rewind(loc);

src/parser/cxx/translation_unit.cc

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,21 @@
4141

4242
namespace cxx {
4343

44-
TranslationUnit::TranslationUnit(Control* control,
45-
DiagnosticsClient* diagnosticsClient)
46-
: control_(control), diagnosticsClient_(diagnosticsClient) {
44+
TranslationUnit::TranslationUnit(DiagnosticsClient* diagnosticsClient)
45+
: diagnosticsClient_(diagnosticsClient) {
46+
control_ = std::make_unique<Control>();
4747
arena_ = std::make_unique<Arena>();
4848
globalNamespace_ = control_->newNamespaceSymbol(nullptr, {});
4949

50-
preprocessor_ = std::make_unique<Preprocessor>(control_, diagnosticsClient_);
50+
preprocessor_ =
51+
std::make_unique<Preprocessor>(control_.get(), diagnosticsClient_);
5152

5253
if (diagnosticsClient_) {
5354
diagnosticsClient_->setPreprocessor(preprocessor_.get());
5455
}
5556
}
5657

57-
TranslationUnit::~TranslationUnit() = default;
58+
TranslationUnit::~TranslationUnit() {}
5859

5960
auto TranslationUnit::diagnosticsClient() const -> DiagnosticsClient* {
6061
return diagnosticsClient_;
@@ -63,6 +64,11 @@ auto TranslationUnit::diagnosticsClient() const -> DiagnosticsClient* {
6364
auto TranslationUnit::changeDiagnosticsClient(
6465
DiagnosticsClient* diagnosticsClient) -> DiagnosticsClient* {
6566
std::swap(diagnosticsClient_, diagnosticsClient);
67+
68+
if (diagnosticsClient_) {
69+
diagnosticsClient_->setPreprocessor(preprocessor_.get());
70+
}
71+
6672
return diagnosticsClient;
6773
}
6874

src/parser/cxx/translation_unit.h

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,17 @@ namespace cxx {
4141

4242
class TranslationUnit {
4343
public:
44-
explicit TranslationUnit(Control* control,
45-
DiagnosticsClient* diagosticsClient);
46-
44+
explicit TranslationUnit(DiagnosticsClient* diagosticsClient = nullptr);
4745
~TranslationUnit();
4846

49-
[[nodiscard]] auto control() const -> Control* { return control_; }
47+
[[nodiscard]] auto control() const -> Control* { return control_.get(); }
5048

5149
[[nodiscard]] auto arena() const -> Arena* { return arena_.get(); }
5250

5351
[[nodiscard]] auto diagnosticsClient() const -> DiagnosticsClient*;
5452

55-
auto changeDiagnosticsClient(DiagnosticsClient* diagnosticsClient)
56-
-> DiagnosticsClient*;
53+
[[nodiscard]] auto changeDiagnosticsClient(
54+
DiagnosticsClient* diagnosticsClient) -> DiagnosticsClient*;
5755

5856
[[nodiscard]] auto ast() const -> UnitAST* { return ast_; }
5957

@@ -64,6 +62,7 @@ class TranslationUnit {
6462
[[nodiscard]] auto fileName() const -> const std::string& {
6563
return fileName_;
6664
}
65+
6766
[[nodiscard]] auto preprocessor() const -> Preprocessor* {
6867
return preprocessor_.get();
6968
}
@@ -137,7 +136,7 @@ class TranslationUnit {
137136
const std::function<void(std::span<const std::uint8_t>)>& onData) -> bool;
138137

139138
private:
140-
Control* control_;
139+
std::unique_ptr<Control> control_;
141140
std::unique_ptr<Arena> arena_;
142141
std::vector<Token> tokens_;
143142
std::string fileName_;

tests/api_tests/test_substitution.cc

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,8 @@ auto dump_symbol(Symbol* symbol) -> std::string {
4444
}
4545

4646
struct Source {
47-
Control control;
4847
DiagnosticsClient diagnosticsClient;
49-
TranslationUnit unit{&control, &diagnosticsClient};
48+
TranslationUnit unit{&diagnosticsClient};
5049

5150
explicit Source(std::string_view source) {
5251
unit.setSource(std::string(source), "<test>");
@@ -58,12 +57,13 @@ struct Source {
5857
});
5958
}
6059

60+
auto control() -> Control* { return unit.control(); }
6161
auto ast() -> UnitAST* { return unit.ast(); }
6262
auto scope() -> Scope* { return unit.globalScope(); }
6363

6464
auto get(std::string_view name) -> Symbol* {
6565
Symbol* symbol = nullptr;
66-
auto id = control.getIdentifier(name);
66+
auto id = unit.control()->getIdentifier(name);
6767
for (auto candidate : scope()->get(id)) {
6868
if (symbol) return nullptr;
6969
symbol = candidate;
@@ -74,7 +74,7 @@ struct Source {
7474
auto instantiate(std::string_view name,
7575
const std::vector<TemplateArgument>& arguments) -> Symbol* {
7676
auto symbol = get(name);
77-
return control.instantiate(&unit, symbol, arguments);
77+
return control()->instantiate(&unit, symbol, arguments);
7878
}
7979
};
8080

@@ -86,7 +86,7 @@ struct LookupMember {
8686
Source& source;
8787

8888
auto operator()(Scope* scope, std::string_view name) -> Symbol* {
89-
auto id = source.control.getIdentifier(name);
89+
auto id = source.control()->getIdentifier(name);
9090
for (auto candidate : scope->get(id)) {
9191
return candidate;
9292
}
@@ -110,7 +110,7 @@ TEST(Substitution, TypeAlias) {
110110
using F = T (*)(T const, U*, ...);
111111
)"_cxx;
112112

113-
auto control = &source.control;
113+
auto control = source.control();
114114

115115
{
116116
auto instance = source.instantiate("Ptr", {control->getCharType()});
@@ -142,7 +142,7 @@ TEST(Substitution, Variable) {
142142
constexpr T value = T{};
143143
)"_cxx;
144144

145-
auto control = &source.control;
145+
auto control = source.control();
146146

147147
{
148148
auto instance = source.instantiate("value", {control->getIntType()});
@@ -180,7 +180,7 @@ TEST(Substitution, Class) {
180180

181181
LookupMember getMember{source};
182182

183-
auto control = &source.control;
183+
auto control = source.control();
184184

185185
{
186186
auto instance = source.instantiate("S", {control->getIntType()});

0 commit comments

Comments
 (0)