Skip to content

Commit 059cb84

Browse files
philbertyCohenArthur
authored andcommitted
Support outer attribute handling on trait items just like normal items
This patch adds a proxy class ItemWrapper to be a proxy allowing us to use the same code paths for attribute handling as we have with normal items. We need this so we can grab the fn trait associated type lang item's. Which are being missed currently. Addresses #195
1 parent 9eab71f commit 059cb84

7 files changed

+72
-15
lines changed

gcc/rust/hir/rust-ast-lower-base.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -824,7 +824,7 @@ ASTLoweringBase::lower_qualifiers (const AST::FunctionQualifiers &qualifiers)
824824
}
825825

826826
void
827-
ASTLoweringBase::handle_outer_attributes (const HIR::Item &item)
827+
ASTLoweringBase::handle_outer_attributes (const ItemWrapper &item)
828828
{
829829
for (const auto &attr : item.get_outer_attrs ())
830830
{
@@ -855,7 +855,7 @@ ASTLoweringBase::handle_outer_attributes (const HIR::Item &item)
855855
}
856856

857857
void
858-
ASTLoweringBase::handle_doc_item_attribute (const HIR::Item &item,
858+
ASTLoweringBase::handle_doc_item_attribute (const ItemWrapper &item,
859859
const AST::Attribute &attr)
860860
{
861861
auto simple_doc_comment = attr.has_attr_input ()
@@ -878,7 +878,7 @@ ASTLoweringBase::handle_doc_item_attribute (const HIR::Item &item,
878878
}
879879

880880
void
881-
ASTLoweringBase::handle_lang_item_attribute (const HIR::Item &item,
881+
ASTLoweringBase::handle_lang_item_attribute (const ItemWrapper &item,
882882
const AST::Attribute &attr)
883883
{
884884
auto &literal = static_cast<AST::AttrInputLiteral &> (attr.get_attr_input ());

gcc/rust/hir/rust-ast-lower-base.h

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,30 @@
2929
namespace Rust {
3030
namespace HIR {
3131

32+
// proxy class so we can do attribute checking on items and trait items
33+
class ItemWrapper
34+
{
35+
public:
36+
ItemWrapper (const HIR::Item &item)
37+
: mappings (item.get_mappings ()), locus (item.get_locus ()),
38+
outer_attrs (item.get_outer_attrs ())
39+
{}
40+
41+
ItemWrapper (const HIR::TraitItem &item)
42+
: mappings (item.get_mappings ()), locus (item.get_trait_locus ()),
43+
outer_attrs (item.get_outer_attrs ())
44+
{}
45+
46+
const Analysis::NodeMapping &get_mappings () const { return mappings; }
47+
Location get_locus () const { return locus; }
48+
const AST::AttrVec &get_outer_attrs () const { return outer_attrs; }
49+
50+
private:
51+
const Analysis::NodeMapping &mappings;
52+
Location locus;
53+
const AST::AttrVec &outer_attrs;
54+
};
55+
3256
// base class to allow derivatives to overload as needed
3357
class ASTLoweringBase : public AST::ASTVisitor
3458
{
@@ -264,12 +288,12 @@ class ASTLoweringBase : public AST::ASTVisitor
264288
HIR::FunctionQualifiers
265289
lower_qualifiers (const AST::FunctionQualifiers &qualifiers);
266290

267-
void handle_outer_attributes (const HIR::Item &item);
291+
void handle_outer_attributes (const ItemWrapper &item);
268292

269-
void handle_lang_item_attribute (const HIR::Item &item,
293+
void handle_lang_item_attribute (const ItemWrapper &item,
270294
const AST::Attribute &attr);
271295

272-
void handle_doc_item_attribute (const HIR::Item &item,
296+
void handle_doc_item_attribute (const ItemWrapper &item,
273297
const AST::Attribute &attr);
274298

275299
bool is_known_attribute (const std::string &attribute_path) const;

gcc/rust/hir/rust-ast-lower-implitem.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -305,16 +305,14 @@ class ASTLowerTraitItem : public ASTLoweringBase
305305

306306
if (resolver.translated != nullptr)
307307
{
308-
// FIXME
308+
auto id = resolver.translated->get_mappings ().get_hirid ();
309+
auto defid = resolver.translated->get_mappings ().get_defid ();
310+
auto locus = resolver.translated->get_trait_locus ();
309311

310-
// auto id = resolver.translated->get_mappings ().get_hirid ();
311-
// auto defid = resolver.translated->get_mappings ().get_defid ();
312-
// auto locus = resolver.translated->get_locus ();
313-
314-
// resolver.handle_outer_attributes (*resolver.translated);
312+
resolver.handle_outer_attributes (*resolver.translated);
315313
resolver.mappings->insert_hir_trait_item (resolver.translated);
316-
// resolver.mappings->insert_location (id, locus);
317-
// resolver.mappings->insert_defid_mapping (defid, resolver.item_cast);
314+
resolver.mappings->insert_location (id, locus);
315+
resolver.mappings->insert_defid_mapping (defid, resolver.translated);
318316
}
319317

320318
return resolver.translated;

gcc/rust/hir/tree/rust-hir-item.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2394,6 +2394,8 @@ class TraitItemFunc : public TraitItem
23942394
return outer_attrs;
23952395
}
23962396

2397+
Location get_trait_locus () const override { return get_locus (); }
2398+
23972399
protected:
23982400
// Clone function implementation as (not pure) virtual method
23992401
TraitItemFunc *clone_trait_item_impl () const override
@@ -2480,6 +2482,8 @@ class TraitItemConst : public TraitItem
24802482
return outer_attrs;
24812483
}
24822484

2485+
Location get_trait_locus () const override { return get_locus (); }
2486+
24832487
protected:
24842488
// Clone function implementation as (not pure) virtual method
24852489
TraitItemConst *clone_trait_item_impl () const override
@@ -2567,6 +2571,8 @@ class TraitItemType : public TraitItem
25672571
return outer_attrs;
25682572
}
25692573

2574+
Location get_trait_locus () const override { return get_locus (); }
2575+
25702576
protected:
25712577
// Clone function implementation as (not pure) virtual method
25722578
TraitItemType *clone_trait_item_impl () const override

gcc/rust/hir/tree/rust-hir.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,9 @@ class TraitItem : public Node
796796

797797
virtual const std::string trait_identifier () const = 0;
798798

799-
const Analysis::NodeMapping get_mappings () const { return mappings; }
799+
const Analysis::NodeMapping &get_mappings () const { return mappings; }
800+
801+
virtual Location get_trait_locus () const = 0;
800802

801803
virtual TraitItemKind get_item_kind () const = 0;
802804

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ Mappings::insert_defid_mapping (DefId id, HIR::Item *item)
316316

317317
rust_assert (lookup_defid (id) == nullptr);
318318
rust_assert (lookup_local_defid (crate_num, local_def_id) == nullptr);
319+
rust_assert (lookup_trait_item_defid (id) == nullptr);
319320

320321
defIdMappings[id] = item;
321322
insert_local_defid_mapping (crate_num, local_def_id, item);
@@ -331,6 +332,29 @@ Mappings::lookup_defid (DefId id)
331332
return it->second;
332333
}
333334

335+
void
336+
Mappings::insert_defid_mapping (DefId id, HIR::TraitItem *item)
337+
{
338+
CrateNum crate_num = id.crateNum;
339+
LocalDefId local_def_id = id.localDefId;
340+
341+
rust_assert (lookup_defid (id) == nullptr);
342+
rust_assert (lookup_local_defid (crate_num, local_def_id) == nullptr);
343+
rust_assert (lookup_trait_item_defid (id) == nullptr);
344+
345+
defIdTraitItemMappings[id] = item;
346+
}
347+
348+
HIR::TraitItem *
349+
Mappings::lookup_trait_item_defid (DefId id)
350+
{
351+
auto it = defIdTraitItemMappings.find (id);
352+
if (it == defIdTraitItemMappings.end ())
353+
return nullptr;
354+
355+
return it->second;
356+
}
357+
334358
void
335359
Mappings::insert_hir_item (HIR::Item *item)
336360
{

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class Mappings
104104

105105
void insert_defid_mapping (DefId id, HIR::Item *item);
106106
HIR::Item *lookup_defid (DefId id);
107+
void insert_defid_mapping (DefId id, HIR::TraitItem *item);
108+
HIR::TraitItem *lookup_trait_item_defid (DefId id);
107109

108110
void insert_local_defid_mapping (CrateNum crateNum, LocalDefId id,
109111
HIR::Item *item);
@@ -307,6 +309,7 @@ class Mappings
307309
std::map<CrateNum, AST::Crate *> ast_crate_mappings;
308310
std::map<CrateNum, HIR::Crate *> hir_crate_mappings;
309311
std::map<DefId, HIR::Item *> defIdMappings;
312+
std::map<DefId, HIR::TraitItem *> defIdTraitItemMappings;
310313
std::map<CrateNum, std::map<LocalDefId, HIR::Item *>> localDefIdMappings;
311314

312315
std::map<HirId, HIR::Module *> hirModuleMappings;

0 commit comments

Comments
 (0)