Skip to content

Commit f0558a0

Browse files
committed
ast: Add new GlobContainer class and use it
Allow crates to be used as targets for glob imports, like modules and enums. gcc/rust/ChangeLog: * ast/rust-ast-full-decls.h (class GlobContainer): New. * ast/rust-ast.h (class GlobContainer): New. (struct Crate): Inherit from GlobContainer. * ast/rust-item.h (class Module): Likewise. (class Enum): Likewise. * resolve/rust-finalize-imports-2.0.cc (GlobbingVisitor::go): Handle crates. (GlobbingVisitor::visit_crate_container): New. (GlobbingVisitor::visit): Remove privacy check as it is wrong. * resolve/rust-finalize-imports-2.0.h: Declare new methods. * resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::go): Handle crates. (TopLevel::visit): Use new insert_glob_container API. * util/rust-hir-map.cc (Mappings::get_ast_crate_by_node_id_raw): New private method. (Mappings::get_ast_crate_by_node_id): Use it. (Mappings::insert_glob_container): New API. * util/rust-hir-map.h: Likewise. * resolve/rust-early-name-resolver-2.0.cc (Early::finalize_glob_import): Likewise.
1 parent 17231c8 commit f0558a0

File tree

9 files changed

+105
-58
lines changed

9 files changed

+105
-58
lines changed

gcc/rust/ast/rust-ast-full-decls.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class AttrInputMetaItemContainer;
4040
class MetaItem;
4141
class Stmt;
4242
class Item;
43+
class GlobContainer;
4344
class Expr;
4445
class ExprWithoutBlock;
4546
class IdentifierExpr;

gcc/rust/ast/rust-ast.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,19 @@ class Item : public Stmt
11431143
Item *clone_stmt_impl () const final override { return clone_item_impl (); }
11441144
};
11451145

1146+
class GlobContainer
1147+
{
1148+
public:
1149+
enum class Kind
1150+
{
1151+
Crate,
1152+
Module,
1153+
Enum,
1154+
};
1155+
1156+
virtual Kind get_glob_container_kind () const = 0;
1157+
};
1158+
11461159
// Item that supports visibility - abstract base class
11471160
class VisItem : public Item
11481161
{
@@ -2021,7 +2034,7 @@ class SingleASTNode : public Visitable
20212034
};
20222035

20232036
// A crate AST object - holds all the data for a single compilation unit
2024-
struct Crate
2037+
struct Crate : public GlobContainer
20252038
{
20262039
std::vector<Attribute> inner_attrs;
20272040
// dodgy spacing required here
@@ -2094,6 +2107,11 @@ struct Crate
20942107
{
20952108
items = std::move (new_items);
20962109
}
2110+
2111+
GlobContainer::Kind get_glob_container_kind () const override
2112+
{
2113+
return GlobContainer::Kind::Crate;
2114+
}
20972115
};
20982116

20992117
} // namespace AST

gcc/rust/ast/rust-item.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ class FunctionParam : public Param
750750
};
751751

752752
// Rust module item - abstract base class
753-
class Module : public VisItem
753+
class Module : public VisItem, public GlobContainer
754754
{
755755
public:
756756
// Type of the current module. A module can be either loaded or unloaded,
@@ -911,6 +911,11 @@ class Module : public VisItem
911911
/* Use covariance to implement clone function as returning this object
912912
* rather than base */
913913
Module *clone_item_impl () const override { return new Module (*this); }
914+
915+
GlobContainer::Kind get_glob_container_kind () const override
916+
{
917+
return GlobContainer::Kind::Module;
918+
}
914919
};
915920

916921
// Rust extern crate declaration AST node
@@ -2247,7 +2252,7 @@ class EnumItemDiscriminant : public EnumItem
22472252
};
22482253

22492254
// AST node for Rust "enum" - tagged union
2250-
class Enum : public VisItem
2255+
class Enum : public VisItem, public GlobContainer
22512256
{
22522257
Identifier enum_name;
22532258

@@ -2357,6 +2362,11 @@ class Enum : public VisItem
23572362

23582363
Item::Kind get_item_kind () const override { return Item::Kind::Enum; }
23592364

2365+
GlobContainer::Kind get_glob_container_kind () const override
2366+
{
2367+
return GlobContainer::Kind::Enum;
2368+
}
2369+
23602370
protected:
23612371
/* Use covariance to implement clone function as returning this object
23622372
* rather than base */

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "rust-early-name-resolver-2.0.h"
2020
#include "optional.h"
2121
#include "options.h"
22+
#include "rust-ast.h"
2223
#include "rust-diagnostics.h"
2324
#include "rust-hir-map.h"
2425
#include "rust-item.h"
@@ -413,10 +414,10 @@ Early::finalize_glob_import (NameResolutionContext &ctx,
413414

414415
if (mapping.import_kind.is_prelude)
415416
{
416-
rust_assert (container.value ()->get_item_kind ()
417-
== AST::Item::Kind::Module);
417+
rust_assert (container.value ()->get_glob_container_kind ()
418+
== AST::GlobContainer::Kind::Module);
418419

419-
ctx.prelude = container.value ()->get_node_id ();
420+
ctx.prelude = mapping.data.container ().get_node_id ();
420421
}
421422

422423
GlobbingVisitor (ctx).go (container.value ());

gcc/rust/resolve/rust-finalize-imports-2.0.cc

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,31 @@ namespace Rust {
2828
namespace Resolver2_0 {
2929

3030
void
31-
GlobbingVisitor::go (AST::Item *container)
31+
GlobbingVisitor::go (AST::GlobContainer *container)
3232
{
33-
switch (container->get_item_kind ())
33+
switch (container->get_glob_container_kind ())
3434
{
35-
case AST::Item::Kind::Module:
35+
case AST::GlobContainer::Kind::Module:
3636
visit_module_container (static_cast<AST::Module &> (*container));
3737
break;
38-
case AST::Item::Kind::Enum:
38+
case AST::GlobContainer::Kind::Crate:
39+
visit_crate_container (static_cast<AST::Crate &> (*container));
40+
break;
41+
case AST::GlobContainer::Kind::Enum:
3942
visit_enum_container (static_cast<AST::Enum &> (*container));
4043
break;
4144
default:
4245
rust_unreachable ();
4346
}
4447
}
4548

49+
void
50+
GlobbingVisitor::visit_crate_container (AST::Crate &crate)
51+
{
52+
for (auto &i : crate.items)
53+
visit (i);
54+
}
55+
4656
void
4757
GlobbingVisitor::visit_module_container (AST::Module &module)
4858
{
@@ -61,83 +71,70 @@ GlobbingVisitor::visit_enum_container (AST::Enum &item)
6171
void
6272
GlobbingVisitor::visit (AST::Module &module)
6373
{
64-
if (module.get_visibility ().is_public ())
65-
ctx.insert_globbed (module.get_name (), module.get_node_id (),
66-
Namespace::Types);
74+
ctx.insert_globbed (module.get_name (), module.get_node_id (),
75+
Namespace::Types);
6776
}
6877

6978
void
7079
GlobbingVisitor::visit (AST::MacroRulesDefinition &macro)
7180
{
72-
if (macro.get_visibility ().is_public ())
73-
ctx.insert_globbed (macro.get_rule_name (), macro.get_node_id (),
74-
Namespace::Macros);
81+
ctx.insert_globbed (macro.get_rule_name (), macro.get_node_id (),
82+
Namespace::Macros);
7583
}
7684

7785
void
7886
GlobbingVisitor::visit (AST::Function &function)
7987
{
80-
if (function.get_visibility ().is_public ())
81-
ctx.insert_globbed (function.get_function_name (), function.get_node_id (),
82-
Namespace::Values);
88+
ctx.insert_globbed (function.get_function_name (), function.get_node_id (),
89+
Namespace::Values);
8390
}
8491

8592
void
8693
GlobbingVisitor::visit (AST::StaticItem &static_item)
8794
{
88-
if (static_item.get_visibility ().is_public ())
89-
ctx.insert_globbed (static_item.get_identifier (),
90-
static_item.get_node_id (), Namespace::Values);
95+
ctx.insert_globbed (static_item.get_identifier (), static_item.get_node_id (),
96+
Namespace::Values);
9197
}
9298

9399
void
94100
GlobbingVisitor::visit (AST::StructStruct &struct_item)
95101
{
96-
if (struct_item.get_visibility ().is_public ())
97-
{
98-
ctx.insert_globbed (struct_item.get_identifier (),
99-
struct_item.get_node_id (), Namespace::Types);
100-
if (struct_item.is_unit_struct ())
101-
ctx.insert_globbed (struct_item.get_identifier (),
102-
struct_item.get_node_id (), Namespace::Values);
103-
}
102+
ctx.insert_globbed (struct_item.get_identifier (), struct_item.get_node_id (),
103+
Namespace::Types);
104+
if (struct_item.is_unit_struct ())
105+
ctx.insert_globbed (struct_item.get_identifier (),
106+
struct_item.get_node_id (), Namespace::Values);
104107
}
105108

106109
void
107110
GlobbingVisitor::visit (AST::TupleStruct &tuple_struct)
108111
{
109-
if (tuple_struct.get_visibility ().is_public ())
110-
{
111-
ctx.insert_globbed (tuple_struct.get_identifier (),
112-
tuple_struct.get_node_id (), Namespace::Types);
112+
ctx.insert_globbed (tuple_struct.get_identifier (),
113+
tuple_struct.get_node_id (), Namespace::Types);
113114

114-
ctx.insert_globbed (tuple_struct.get_identifier (),
115-
tuple_struct.get_node_id (), Namespace::Values);
116-
}
115+
ctx.insert_globbed (tuple_struct.get_identifier (),
116+
tuple_struct.get_node_id (), Namespace::Values);
117117
}
118118

119119
void
120120
GlobbingVisitor::visit (AST::Enum &enum_item)
121121
{
122-
if (enum_item.get_visibility ().is_public ())
123-
ctx.insert_globbed (enum_item.get_identifier (), enum_item.get_node_id (),
124-
Namespace::Types);
122+
ctx.insert_globbed (enum_item.get_identifier (), enum_item.get_node_id (),
123+
Namespace::Types);
125124
}
126125

127126
void
128127
GlobbingVisitor::visit (AST::Union &union_item)
129128
{
130-
if (union_item.get_visibility ().is_public ())
131-
ctx.insert_globbed (union_item.get_identifier (), union_item.get_node_id (),
132-
Namespace::Values);
129+
ctx.insert_globbed (union_item.get_identifier (), union_item.get_node_id (),
130+
Namespace::Values);
133131
}
134132

135133
void
136134
GlobbingVisitor::visit (AST::ConstantItem &const_item)
137135
{
138-
if (const_item.get_visibility ().is_public ())
139-
ctx.insert_globbed (const_item.get_identifier (), const_item.get_node_id (),
140-
Namespace::Values);
136+
ctx.insert_globbed (const_item.get_identifier (), const_item.get_node_id (),
137+
Namespace::Values);
141138
}
142139

143140
void

gcc/rust/resolve/rust-finalize-imports-2.0.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ class GlobbingVisitor : public AST::DefaultASTVisitor
3333
public:
3434
GlobbingVisitor (NameResolutionContext &ctx) : ctx (ctx) {}
3535

36-
void go (AST::Item *container);
36+
void go (AST::GlobContainer *container);
3737

38+
void visit_crate_container (AST::Crate &crate);
3839
void visit_module_container (AST::Module &module);
3940
void visit_enum_container (AST::Enum &item);
4041

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@ TopLevel::go (AST::Crate &crate)
9696
// responsible for this ugly and perfom a lot of error checking.
9797

9898
visit (crate);
99+
100+
if (Analysis::Mappings::get ().lookup_glob_container (crate.get_node_id ())
101+
== tl::nullopt)
102+
Analysis::Mappings::get ().insert_glob_container (crate.get_node_id (),
103+
&crate);
99104
}
100105

101106
void
@@ -105,7 +110,8 @@ TopLevel::visit (AST::Module &module)
105110

106111
if (Analysis::Mappings::get ().lookup_glob_container (module.get_node_id ())
107112
== tl::nullopt)
108-
Analysis::Mappings::get ().insert_glob_container (&module);
113+
Analysis::Mappings::get ().insert_glob_container (module.get_node_id (),
114+
&module);
109115
}
110116

111117
void
@@ -345,7 +351,8 @@ TopLevel::visit (AST::Enum &enum_item)
345351
if (Analysis::Mappings::get ().lookup_glob_container (
346352
enum_item.get_node_id ())
347353
== tl::nullopt)
348-
Analysis::Mappings::get ().insert_glob_container (&enum_item);
354+
Analysis::Mappings::get ().insert_glob_container (enum_item.get_node_id (),
355+
&enum_item);
349356
}
350357

351358
void

gcc/rust/util/rust-hir-map.cc

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "rust-hir-map.h"
2020
#include "optional.h"
2121
#include "rust-ast-full.h"
22+
#include "rust-ast.h"
2223
#include "rust-diagnostics.h"
2324
#include "rust-hir-full.h"
2425
#include "rust-item.h"
@@ -250,14 +251,20 @@ Mappings::get_ast_crate (CrateNum crateNum)
250251

251252
AST::Crate &
252253
Mappings::get_ast_crate_by_node_id (NodeId id)
254+
{
255+
return *get_ast_crate_by_node_id_raw (id);
256+
}
257+
258+
AST::Crate *
259+
Mappings::get_ast_crate_by_node_id_raw (NodeId id)
253260
{
254261
auto i = crate_node_to_crate_num.find (id);
255262
rust_assert (i != crate_node_to_crate_num.end ());
256263

257264
CrateNum crateNum = i->second;
258265
auto it = ast_crate_mappings.find (crateNum);
259266
rust_assert (it != ast_crate_mappings.end ());
260-
return *it->second;
267+
return it->second;
261268
}
262269

263270
AST::Crate &
@@ -1150,15 +1157,18 @@ Mappings::lookup_module_children (NodeId module)
11501157
}
11511158

11521159
void
1153-
Mappings::insert_glob_container (AST::Item *container)
1160+
Mappings::insert_glob_container (NodeId id, AST::GlobContainer *container)
11541161
{
1155-
rust_assert (glob_containers.find (container->get_node_id ())
1156-
== glob_containers.end ());
1162+
rust_assert (glob_containers.find (id) == glob_containers.end ());
11571163

1158-
glob_containers[container->get_node_id ()] = container;
1164+
// Crates have different memory managements that regular items
1165+
if (container->get_glob_container_kind () == AST::GlobContainer::Kind::Crate)
1166+
glob_containers[id] = get_ast_crate_by_node_id_raw (id);
1167+
else
1168+
glob_containers[id] = container;
11591169
}
11601170

1161-
tl::optional<AST::Item *>
1171+
tl::optional<AST::GlobContainer *>
11621172
Mappings::lookup_glob_container (NodeId id)
11631173
{
11641174
auto it = glob_containers.find (id);

gcc/rust/util/rust-hir-map.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,8 @@ class Mappings
321321
void insert_visibility (NodeId id, Privacy::ModuleVisibility visibility);
322322
tl::optional<Privacy::ModuleVisibility &> lookup_visibility (NodeId id);
323323

324-
void insert_glob_container (AST::Item *);
325-
tl::optional<AST::Item *> lookup_glob_container (NodeId id);
324+
void insert_glob_container (NodeId, AST::GlobContainer *);
325+
tl::optional<AST::GlobContainer *> lookup_glob_container (NodeId id);
326326
void insert_module_child (NodeId module, NodeId child);
327327
tl::optional<std::vector<NodeId> &> lookup_module_children (NodeId module);
328328

@@ -363,6 +363,8 @@ class Mappings
363363
std::map<CrateNum, LocalDefId> localIdIter;
364364
HIR::ImplBlock *builtinMarker;
365365

366+
AST::Crate *get_ast_crate_by_node_id_raw (NodeId id);
367+
366368
std::map<NodeId, CrateNum> crate_node_to_crate_num;
367369
std::map<CrateNum, AST::Crate *> ast_crate_mappings;
368370
std::map<CrateNum, HIR::Crate *> hir_crate_mappings;
@@ -439,7 +441,7 @@ class Mappings
439441
std::map<NodeId, std::vector<NodeId>> module_child_map;
440442
std::map<NodeId, std::vector<Resolver::CanonicalPath>> module_child_items;
441443
std::map<NodeId, NodeId> child_to_parent_module_map;
442-
std::map<NodeId, AST::Item *> glob_containers;
444+
std::map<NodeId, AST::GlobContainer *> glob_containers;
443445

444446
// AST mappings
445447
std::map<NodeId, AST::Item *> ast_item_mappings;

0 commit comments

Comments
 (0)