Skip to content

Commit e8c8207

Browse files
committed
Refactor TraitResolver to not require a visitor
We used a visitor to dispatch the HIR::Item so that we could cast it directly to an HIR::Trait and then check for nullptr if it failed. This patch changes this to simply use our new enum item_type_kind to switch so we can directly static_cast.
1 parent c854929 commit e8c8207

File tree

2 files changed

+26
-37
lines changed

2 files changed

+26
-37
lines changed

gcc/rust/typecheck/rust-hir-trait-resolve.cc

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -91,33 +91,42 @@ TraitResolver::Lookup (HIR::TypePath &path)
9191
return resolver.lookup_path (path);
9292
}
9393

94-
TraitResolver::TraitResolver ()
95-
: TypeCheckBase (), resolved_trait_reference (nullptr)
96-
{}
94+
TraitResolver::TraitResolver () : TypeCheckBase () {}
9795

98-
TraitReference *
99-
TraitResolver::resolve_path (HIR::TypePath &path)
96+
bool
97+
TraitResolver::resolve_path_to_trait (const HIR::TypePath &path,
98+
HIR::Trait **resolved) const
10099
{
101100
NodeId ref;
102101
if (!resolver->lookup_resolved_type (path.get_mappings ().get_nodeid (),
103102
&ref))
104103
{
105104
rust_error_at (path.get_locus (), "Failed to resolve path to node-id");
106-
return &TraitReference::error_node ();
105+
return false;
107106
}
108107

109108
HirId hir_node = UNKNOWN_HIRID;
110109
if (!mappings->lookup_node_to_hir (ref, &hir_node))
111110
{
112111
rust_error_at (path.get_locus (), "Failed to resolve path to hir-id");
113-
return &TraitReference::error_node ();
112+
return false;
114113
}
115114

116115
HIR::Item *resolved_item = mappings->lookup_hir_item (hir_node);
117-
118116
rust_assert (resolved_item != nullptr);
119-
resolved_item->accept_vis (*this);
120-
rust_assert (resolved_trait_reference != nullptr);
117+
rust_assert (resolved_item->get_item_kind () == HIR::Item::ItemKind::Trait);
118+
*resolved = static_cast<HIR::Trait *> (resolved_item);
119+
120+
return true;
121+
}
122+
123+
TraitReference *
124+
TraitResolver::resolve_path (HIR::TypePath &path)
125+
{
126+
HIR::Trait *resolved_trait_reference;
127+
bool ok = resolve_path_to_trait (path, &resolved_trait_reference);
128+
if (!ok)
129+
return &TraitReference::error_node ();
121130

122131
return resolve_trait (resolved_trait_reference);
123132
}
@@ -237,26 +246,10 @@ TraitResolver::resolve_trait (HIR::Trait *trait_reference)
237246
TraitReference *
238247
TraitResolver::lookup_path (HIR::TypePath &path)
239248
{
240-
NodeId ref;
241-
if (!resolver->lookup_resolved_type (path.get_mappings ().get_nodeid (),
242-
&ref))
243-
{
244-
rust_error_at (path.get_locus (), "Failed to resolve path to node-id");
245-
return &TraitReference::error_node ();
246-
}
247-
248-
HirId hir_node = UNKNOWN_HIRID;
249-
if (!mappings->lookup_node_to_hir (ref, &hir_node))
250-
{
251-
rust_error_at (path.get_locus (), "Failed to resolve path to hir-id");
252-
return &TraitReference::error_node ();
253-
}
254-
255-
HIR::Item *resolved_item = mappings->lookup_hir_item (hir_node);
256-
257-
rust_assert (resolved_item != nullptr);
258-
resolved_item->accept_vis (*this);
259-
rust_assert (resolved_trait_reference != nullptr);
249+
HIR::Trait *resolved_trait_reference;
250+
bool ok = resolve_path_to_trait (path, &resolved_trait_reference);
251+
if (!ok)
252+
return &TraitReference::error_node ();
260253

261254
TraitReference *tref = &TraitReference::error_node ();
262255
if (context->lookup_trait_reference (

gcc/rust/typecheck/rust-hir-trait-resolve.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,8 @@ class ResolveTraitItemToRef : public TypeCheckBase,
5555
std::vector<TyTy::SubstitutionParamMapping> substitutions;
5656
};
5757

58-
class TraitResolver : public TypeCheckBase, private HIR::HIRFullVisitorBase
58+
class TraitResolver : public TypeCheckBase
5959
{
60-
using HIR::HIRFullVisitorBase::visit;
61-
6260
public:
6361
static TraitReference *Resolve (HIR::TypePath &path);
6462

@@ -75,10 +73,8 @@ class TraitResolver : public TypeCheckBase, private HIR::HIRFullVisitorBase
7573

7674
TraitReference *lookup_path (HIR::TypePath &path);
7775

78-
HIR::Trait *resolved_trait_reference;
79-
80-
public:
81-
void visit (HIR::Trait &trait) override { resolved_trait_reference = &trait; }
76+
bool resolve_path_to_trait (const HIR::TypePath &path,
77+
HIR::Trait **resolved) const;
8278
};
8379

8480
} // namespace Resolver

0 commit comments

Comments
 (0)