Skip to content

Commit 78c06c7

Browse files
powerboat9philberty
authored andcommitted
nr2.0: Adjust resolution of external crates
This ensures Session::load_extern_crate doesn't try to use the old name resolver when nr2.0 is enabled, while also ensuring that nr2.0 handles external crates. gcc/rust/ChangeLog: * resolve/rust-default-resolver.cc (DefaultResolver::visit_extern_crate): New function. (DefaultResolver::visit): New visitor function for ExternCrate. * resolve/rust-default-resolver.h (DefaultResolver::visit_extern_crate): New function. (DefaultResolver::visit): New visitor function for ExternCrate. * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::visit): Adjust ExternCrate visitor and rename to... (TopLevel::visit_extern_crate): ...here. * resolve/rust-toplevel-name-resolver-2.0.h (TopLevel::visit): Remove ExternCrate visitor override. (TopLevel::visit_extern_crate): New function. * rust-session-manager.cc (Session::load_extern_crate): Only run name resolution 1.0 if name resolution 2.0 is disabled. Signed-off-by: Owen Avery <[email protected]>
1 parent 545500a commit 78c06c7

File tree

5 files changed

+74
-47
lines changed

5 files changed

+74
-47
lines changed

gcc/rust/resolve/rust-default-resolver.cc

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,5 +394,46 @@ DefaultResolver::visit (AST::TypeParam &param)
394394
ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (), expr_vis);
395395
}
396396

397+
void
398+
DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
399+
AST::Crate &crate, CrateNum num)
400+
{
401+
visit (crate);
402+
}
403+
404+
void
405+
DefaultResolver::visit (AST::ExternCrate &crate)
406+
{
407+
auto &mappings = Analysis::Mappings::get ();
408+
auto num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
409+
410+
if (!num_opt)
411+
{
412+
rust_error_at (crate.get_locus (), "unknown crate %qs",
413+
crate.get_referenced_crate ().c_str ());
414+
return;
415+
}
416+
417+
CrateNum num = *num_opt;
418+
419+
AST::Crate &referenced_crate = mappings.get_ast_crate (num);
420+
421+
auto sub_visitor_1
422+
= [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
423+
424+
auto sub_visitor_2 = [&] () {
425+
ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
426+
crate.get_referenced_crate (),
427+
std::move (sub_visitor_1));
428+
};
429+
430+
if (crate.has_as_clause ())
431+
ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
432+
sub_visitor_2, crate.get_as_clause ());
433+
else
434+
ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
435+
sub_visitor_2, crate.get_referenced_crate ());
436+
}
437+
397438
} // namespace Resolver2_0
398439
} // namespace Rust

gcc/rust/resolve/rust-default-resolver.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class DefaultResolver : public AST::DefaultASTVisitor
5858

5959
void visit (AST::TypeParam &) override;
6060

61+
virtual void visit_extern_crate (AST::ExternCrate &, AST::Crate &, CrateNum);
62+
void visit (AST::ExternCrate &) override;
63+
6164
// type dec nodes, which visit their fields or variants by default
6265
void visit (AST::StructStruct &) override;
6366
void visit (AST::TupleStruct &) override;

gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc

Lines changed: 22 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -173,60 +173,38 @@ insert_macros (std::vector<PROC_MACRO> &macros, NameResolutionContext &ctx)
173173
}
174174

175175
void
176-
TopLevel::visit (AST::ExternCrate &crate)
176+
TopLevel::visit_extern_crate (AST::ExternCrate &extern_crate, AST::Crate &crate,
177+
CrateNum num)
177178
{
178179
auto &mappings = Analysis::Mappings::get ();
179-
auto num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
180-
181-
if (!num_opt)
182-
{
183-
rust_error_at (crate.get_locus (), "unknown crate %qs",
184-
crate.get_referenced_crate ().c_str ());
185-
return;
186-
}
187-
188-
CrateNum num = *num_opt;
189180

190181
auto attribute_macros = mappings.lookup_attribute_proc_macros (num);
191182

192183
auto bang_macros = mappings.lookup_bang_proc_macros (num);
193184

194185
auto derive_macros = mappings.lookup_derive_proc_macros (num);
195186

196-
auto sub_visitor_1 = [&] () {
197-
// TODO: Find a way to keep this part clean without the double dispatch.
198-
if (derive_macros.has_value ())
199-
{
200-
insert_macros (derive_macros.value (), ctx);
201-
for (auto &macro : derive_macros.value ())
202-
mappings.insert_derive_proc_macro_def (macro);
203-
}
204-
if (attribute_macros.has_value ())
205-
{
206-
insert_macros (attribute_macros.value (), ctx);
207-
for (auto &macro : attribute_macros.value ())
208-
mappings.insert_attribute_proc_macro_def (macro);
209-
}
210-
if (bang_macros.has_value ())
211-
{
212-
insert_macros (bang_macros.value (), ctx);
213-
for (auto &macro : bang_macros.value ())
214-
mappings.insert_bang_proc_macro_def (macro);
215-
}
216-
};
217-
218-
auto sub_visitor_2 = [&] () {
219-
ctx.canonical_ctx.scope_crate (crate.get_node_id (),
220-
crate.get_referenced_crate (),
221-
std::move (sub_visitor_1));
222-
};
187+
// TODO: Find a way to keep this part clean without the double dispatch.
188+
if (derive_macros.has_value ())
189+
{
190+
insert_macros (derive_macros.value (), ctx);
191+
for (auto &macro : derive_macros.value ())
192+
mappings.insert_derive_proc_macro_def (macro);
193+
}
194+
if (attribute_macros.has_value ())
195+
{
196+
insert_macros (attribute_macros.value (), ctx);
197+
for (auto &macro : attribute_macros.value ())
198+
mappings.insert_attribute_proc_macro_def (macro);
199+
}
200+
if (bang_macros.has_value ())
201+
{
202+
insert_macros (bang_macros.value (), ctx);
203+
for (auto &macro : bang_macros.value ())
204+
mappings.insert_bang_proc_macro_def (macro);
205+
}
223206

224-
if (crate.has_as_clause ())
225-
ctx.scoped (Rib::Kind::Module, crate.get_node_id (), sub_visitor_2,
226-
crate.get_as_clause ());
227-
else
228-
ctx.scoped (Rib::Kind::Module, crate.get_node_id (), sub_visitor_2,
229-
crate.get_referenced_crate ());
207+
visit (crate);
230208
}
231209

232210
static bool

gcc/rust/resolve/rust-toplevel-name-resolver-2.0.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class TopLevel : public DefaultResolver
176176
void visit (AST::Union &union_item) override;
177177
void visit (AST::ConstantItem &const_item) override;
178178
void visit (AST::TypeAlias &type_item) override;
179-
void visit (AST::ExternCrate &crate) override;
179+
void visit_extern_crate (AST::ExternCrate &, AST::Crate &, CrateNum) override;
180180
void visit (AST::TypeParam &type_param) override;
181181
void visit (AST::ConstGenericParam &const_param) override;
182182

gcc/rust/rust-session-manager.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,8 +1189,13 @@ Session::load_extern_crate (const std::string &crate_name, location_t locus)
11891189
mappings.insert_bang_proc_macros (crate_num, bang_macros);
11901190
mappings.insert_derive_proc_macros (crate_num, derive_macros);
11911191

1192-
// name resolve it
1193-
Resolver::NameResolution::Resolve (parsed_crate);
1192+
// if flag_name_resolution_2_0 is enabled
1193+
// then we perform resolution later
1194+
if (!flag_name_resolution_2_0)
1195+
{
1196+
// name resolve it
1197+
Resolver::NameResolution::Resolve (parsed_crate);
1198+
}
11941199

11951200
// always restore the crate_num
11961201
mappings.set_current_crate (saved_crate_num);

0 commit comments

Comments
 (0)