Skip to content

Commit dd1c11e

Browse files
committed
Add types and functions for trait aliases
1 parent e59ada9 commit dd1c11e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+256
-33
lines changed

crates/hir-def/src/attr.rs

+2
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ impl AttrsWithOwner {
300300
AdtId::UnionId(it) => attrs_from_item_tree(it.lookup(db).id, db),
301301
},
302302
AttrDefId::TraitId(it) => attrs_from_item_tree(it.lookup(db).id, db),
303+
AttrDefId::TraitAliasId(it) => attrs_from_item_tree(it.lookup(db).id, db),
303304
AttrDefId::MacroId(it) => match it {
304305
MacroId::Macro2Id(it) => attrs_from_item_tree(it.lookup(db).id, db),
305306
MacroId::MacroRulesId(it) => attrs_from_item_tree(it.lookup(db).id, db),
@@ -404,6 +405,7 @@ impl AttrsWithOwner {
404405
AttrDefId::StaticId(id) => id.lookup(db).source(db).map(ast::AnyHasAttrs::new),
405406
AttrDefId::ConstId(id) => id.lookup(db).source(db).map(ast::AnyHasAttrs::new),
406407
AttrDefId::TraitId(id) => id.lookup(db).source(db).map(ast::AnyHasAttrs::new),
408+
AttrDefId::TraitAliasId(id) => id.lookup(db).source(db).map(ast::AnyHasAttrs::new),
407409
AttrDefId::TypeAliasId(id) => id.lookup(db).source(db).map(ast::AnyHasAttrs::new),
408410
AttrDefId::MacroId(id) => match id {
409411
MacroId::Macro2Id(id) => id.lookup(db).source(db).map(ast::AnyHasAttrs::new),

crates/hir-def/src/child_by_source.rs

+1
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ impl ChildBySource for ItemScope {
145145
ModuleDefId::StaticId(id) => insert!(map[keys::STATIC].insert(id)),
146146
ModuleDefId::TypeAliasId(id) => insert!(map[keys::TYPE_ALIAS].insert(id)),
147147
ModuleDefId::TraitId(id) => insert!(map[keys::TRAIT].insert(id)),
148+
ModuleDefId::TraitAliasId(id) => insert!(map[keys::TRAIT_ALIAS].insert(id)),
148149
ModuleDefId::AdtId(adt) => match adt {
149150
AdtId::StructId(id) => insert!(map[keys::STRUCT].insert(id)),
150151
AdtId::UnionId(id) => insert!(map[keys::UNION].insert(id)),

crates/hir-def/src/data.rs

+23-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::{
2222
visibility::RawVisibility,
2323
AssocItemId, AstIdWithPath, ConstId, ConstLoc, FunctionId, FunctionLoc, HasModule, ImplId,
2424
Intern, ItemContainerId, ItemLoc, Lookup, Macro2Id, MacroRulesId, ModuleId, ProcMacroId,
25-
StaticId, TraitId, TypeAliasId, TypeAliasLoc,
25+
StaticId, TraitAliasId, TraitId, TypeAliasId, TypeAliasLoc,
2626
};
2727

2828
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -299,6 +299,28 @@ impl TraitData {
299299
}
300300
}
301301

302+
#[derive(Debug, Clone, PartialEq, Eq)]
303+
pub struct TraitAliasData {
304+
pub name: Name,
305+
pub bounds: Vec<Interned<TypeBound>>,
306+
pub visibility: RawVisibility,
307+
}
308+
309+
impl TraitAliasData {
310+
pub(crate) fn trait_alias_query(db: &dyn DefDatabase, id: TraitAliasId) -> Arc<TraitAliasData> {
311+
let loc = id.lookup(db);
312+
let item_tree = loc.id.item_tree(db);
313+
let alias = &item_tree[loc.id.value];
314+
let visibility = item_tree[alias.visibility].clone();
315+
316+
Arc::new(TraitAliasData {
317+
name: alias.name.clone(),
318+
bounds: alias.bounds.to_vec(),
319+
visibility,
320+
})
321+
}
322+
}
323+
302324
#[derive(Debug, Clone, PartialEq, Eq)]
303325
pub struct ImplData {
304326
pub target_trait: Option<Interned<TraitRef>>,

crates/hir-def/src/db.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
body::{scope::ExprScopes, Body, BodySourceMap},
1515
data::{
1616
ConstData, FunctionData, ImplData, Macro2Data, MacroRulesData, ProcMacroData, StaticData,
17-
TraitData, TypeAliasData,
17+
TraitAliasData, TraitData, TypeAliasData,
1818
},
1919
generics::GenericParams,
2020
import_map::ImportMap,
@@ -25,8 +25,8 @@ use crate::{
2525
AttrDefId, BlockId, BlockLoc, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc, ExternBlockId,
2626
ExternBlockLoc, FunctionId, FunctionLoc, GenericDefId, ImplId, ImplLoc, LocalEnumVariantId,
2727
LocalFieldId, Macro2Id, Macro2Loc, MacroRulesId, MacroRulesLoc, ProcMacroId, ProcMacroLoc,
28-
StaticId, StaticLoc, StructId, StructLoc, TraitId, TraitLoc, TypeAliasId, TypeAliasLoc,
29-
UnionId, UnionLoc, VariantId,
28+
StaticId, StaticLoc, StructId, StructLoc, TraitAliasId, TraitAliasLoc, TraitId, TraitLoc,
29+
TypeAliasId, TypeAliasLoc, UnionId, UnionLoc, VariantId,
3030
};
3131

3232
#[salsa::query_group(InternDatabaseStorage)]
@@ -46,6 +46,8 @@ pub trait InternDatabase: SourceDatabase {
4646
#[salsa::interned]
4747
fn intern_trait(&self, loc: TraitLoc) -> TraitId;
4848
#[salsa::interned]
49+
fn intern_trait_alias(&self, loc: TraitAliasLoc) -> TraitAliasId;
50+
#[salsa::interned]
4951
fn intern_type_alias(&self, loc: TypeAliasLoc) -> TypeAliasId;
5052
#[salsa::interned]
5153
fn intern_impl(&self, loc: ImplLoc) -> ImplId;
@@ -125,6 +127,9 @@ pub trait DefDatabase: InternDatabase + AstDatabase + Upcast<dyn AstDatabase> {
125127
#[salsa::invoke(TraitData::trait_data_with_diagnostics_query)]
126128
fn trait_data_with_diagnostics(&self, tr: TraitId) -> (Arc<TraitData>, Arc<[DefDiagnostic]>);
127129

130+
#[salsa::invoke(TraitAliasData::trait_alias_query)]
131+
fn trait_alias_data(&self, e: TraitAliasId) -> Arc<TraitAliasData>;
132+
128133
#[salsa::invoke(TypeAliasData::type_alias_data_query)]
129134
fn type_alias_data(&self, e: TypeAliasId) -> Arc<TypeAliasData>;
130135

crates/hir-def/src/generics.rs

+5
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ impl GenericParams {
187187
GenericDefId::AdtId(AdtId::EnumId(id)) => id_to_generics!(id),
188188
GenericDefId::AdtId(AdtId::UnionId(id)) => id_to_generics!(id),
189189
GenericDefId::TraitId(id) => id_to_generics!(id),
190+
GenericDefId::TraitAliasId(id) => id_to_generics!(id),
190191
GenericDefId::TypeAliasId(id) => id_to_generics!(id),
191192
GenericDefId::ImplId(id) => id_to_generics!(id),
192193
GenericDefId::EnumVariantId(_) | GenericDefId::ConstId(_) => {
@@ -421,6 +422,10 @@ fn file_id_and_params_of(
421422
let src = it.lookup(db).source(db);
422423
(src.file_id, src.value.generic_param_list())
423424
}
425+
GenericDefId::TraitAliasId(it) => {
426+
let src = it.lookup(db).source(db);
427+
(src.file_id, src.value.generic_param_list())
428+
}
424429
GenericDefId::TypeAliasId(it) => {
425430
let src = it.lookup(db).source(db);
426431
(src.file_id, src.value.generic_param_list())

crates/hir-def/src/import_map.rs

+2
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ pub enum ImportKind {
268268
Const,
269269
Static,
270270
Trait,
271+
TraitAlias,
271272
TypeAlias,
272273
BuiltinType,
273274
AssociatedItem,
@@ -463,6 +464,7 @@ fn item_import_kind(item: ItemInNs) -> Option<ImportKind> {
463464
ModuleDefId::ConstId(_) => ImportKind::Const,
464465
ModuleDefId::StaticId(_) => ImportKind::Static,
465466
ModuleDefId::TraitId(_) => ImportKind::Trait,
467+
ModuleDefId::TraitAliasId(_) => ImportKind::TraitAlias,
466468
ModuleDefId::TypeAliasId(_) => ImportKind::TypeAlias,
467469
ModuleDefId::BuiltinType(_) => ImportKind::BuiltinType,
468470
ModuleDefId::MacroId(_) => ImportKind::Macro,

crates/hir-def/src/item_scope.rs

+1
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,7 @@ impl PerNs {
431431
ModuleDefId::EnumVariantId(_) => PerNs::both(def, def, v),
432432
ModuleDefId::ConstId(_) | ModuleDefId::StaticId(_) => PerNs::values(def, v),
433433
ModuleDefId::TraitId(_) => PerNs::types(def, v),
434+
ModuleDefId::TraitAliasId(_) => PerNs::types(def, v),
434435
ModuleDefId::TypeAliasId(_) => PerNs::types(def, v),
435436
ModuleDefId::BuiltinType(_) => PerNs::types(def, v),
436437
ModuleDefId::MacroId(mac) => PerNs::macros(mac, v),

crates/hir-def/src/item_tree.rs

+15
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ impl ItemTree {
204204
consts,
205205
statics,
206206
traits,
207+
trait_aliases,
207208
impls,
208209
type_aliases,
209210
mods,
@@ -226,6 +227,7 @@ impl ItemTree {
226227
consts.shrink_to_fit();
227228
statics.shrink_to_fit();
228229
traits.shrink_to_fit();
230+
trait_aliases.shrink_to_fit();
229231
impls.shrink_to_fit();
230232
type_aliases.shrink_to_fit();
231233
mods.shrink_to_fit();
@@ -276,6 +278,7 @@ struct ItemTreeData {
276278
consts: Arena<Const>,
277279
statics: Arena<Static>,
278280
traits: Arena<Trait>,
281+
trait_aliases: Arena<TraitAlias>,
279282
impls: Arena<Impl>,
280283
type_aliases: Arena<TypeAlias>,
281284
mods: Arena<Mod>,
@@ -496,6 +499,7 @@ mod_items! {
496499
Const in consts -> ast::Const,
497500
Static in statics -> ast::Static,
498501
Trait in traits -> ast::Trait,
502+
TraitAlias in trait_aliases -> ast::Trait,
499503
Impl in impls -> ast::Impl,
500504
TypeAlias in type_aliases -> ast::TypeAlias,
501505
Mod in mods -> ast::Module,
@@ -677,6 +681,15 @@ pub struct Trait {
677681
pub ast_id: FileAstId<ast::Trait>,
678682
}
679683

684+
#[derive(Debug, Clone, Eq, PartialEq)]
685+
pub struct TraitAlias {
686+
pub name: Name,
687+
pub visibility: RawVisibilityId,
688+
pub generic_params: Interned<GenericParams>,
689+
pub bounds: Box<[Interned<TypeBound>]>,
690+
pub ast_id: FileAstId<ast::Trait>,
691+
}
692+
680693
#[derive(Debug, Clone, Eq, PartialEq)]
681694
pub struct Impl {
682695
pub generic_params: Interned<GenericParams>,
@@ -872,6 +885,7 @@ impl ModItem {
872885
| ModItem::Enum(_)
873886
| ModItem::Static(_)
874887
| ModItem::Trait(_)
888+
| ModItem::TraitAlias(_)
875889
| ModItem::Impl(_)
876890
| ModItem::Mod(_)
877891
| ModItem::MacroRules(_)
@@ -899,6 +913,7 @@ impl ModItem {
899913
ModItem::Const(it) => tree[it.index].ast_id().upcast(),
900914
ModItem::Static(it) => tree[it.index].ast_id().upcast(),
901915
ModItem::Trait(it) => tree[it.index].ast_id().upcast(),
916+
ModItem::TraitAlias(it) => tree[it.index].ast_id().upcast(),
902917
ModItem::Impl(it) => tree[it.index].ast_id().upcast(),
903918
ModItem::TypeAlias(it) => tree[it.index].ast_id().upcast(),
904919
ModItem::Mod(it) => tree[it.index].ast_id().upcast(),

crates/hir-def/src/item_tree/pretty.rs

+17-14
Original file line numberDiff line numberDiff line change
@@ -374,23 +374,26 @@ impl<'a> Printer<'a> {
374374
}
375375
w!(self, "trait {}", name);
376376
self.print_generic_params(generic_params);
377-
match items {
378-
Some(items) => {
379-
self.print_where_clause_and_opening_brace(generic_params);
380-
self.indented(|this| {
381-
for item in &**items {
382-
this.print_mod_item((*item).into());
383-
}
384-
});
385-
}
386-
None => {
387-
w!(self, " = ");
388-
// FIXME: Print the aliased traits
389-
self.print_where_clause_and_opening_brace(generic_params);
377+
self.print_where_clause_and_opening_brace(generic_params);
378+
self.indented(|this| {
379+
for item in &**items {
380+
this.print_mod_item((*item).into());
390381
}
391-
}
382+
});
392383
wln!(self, "}}");
393384
}
385+
ModItem::TraitAlias(it) => {
386+
let TraitAlias { name, visibility, generic_params, bounds, ast_id: _ } =
387+
&self.tree[it];
388+
self.print_visibility(*visibility);
389+
w!(self, "trait {}", name);
390+
self.print_generic_params(generic_params);
391+
w!(self, " = ");
392+
self.print_type_bounds(bounds);
393+
self.print_where_clause(generic_params);
394+
w!(self, ";");
395+
wln!(self);
396+
}
394397
ModItem::Impl(it) => {
395398
let Impl { target_trait, self_ty, is_negative, items, generic_params, ast_id: _ } =
396399
&self.tree[it];

crates/hir-def/src/keys.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use syntax::{ast, AstNode, AstPtr};
99
use crate::{
1010
dyn_map::{DynMap, Policy},
1111
ConstId, EnumId, EnumVariantId, FieldId, FunctionId, ImplId, LifetimeParamId, Macro2Id,
12-
MacroRulesId, ProcMacroId, StaticId, StructId, TraitId, TypeAliasId, TypeOrConstParamId,
13-
UnionId,
12+
MacroRulesId, ProcMacroId, StaticId, StructId, TraitAliasId, TraitId, TypeAliasId,
13+
TypeOrConstParamId, UnionId,
1414
};
1515

1616
pub type Key<K, V> = crate::dyn_map::Key<K, V, AstPtrPolicy<K, V>>;
@@ -21,6 +21,7 @@ pub const STATIC: Key<ast::Static, StaticId> = Key::new();
2121
pub const TYPE_ALIAS: Key<ast::TypeAlias, TypeAliasId> = Key::new();
2222
pub const IMPL: Key<ast::Impl, ImplId> = Key::new();
2323
pub const TRAIT: Key<ast::Trait, TraitId> = Key::new();
24+
pub const TRAIT_ALIAS: Key<ast::Trait, TraitAliasId> = Key::new();
2425
pub const STRUCT: Key<ast::Struct, StructId> = Key::new();
2526
pub const UNION: Key<ast::Union, UnionId> = Key::new();
2627
pub const ENUM: Key<ast::Enum, EnumId> = Key::new();

crates/hir-def/src/lib.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ use crate::{
8686
builtin_type::BuiltinType,
8787
item_tree::{
8888
Const, Enum, Function, Impl, ItemTreeId, ItemTreeNode, MacroDef, MacroRules, ModItem,
89-
Static, Struct, Trait, TypeAlias, Union,
89+
Static, Struct, Trait, TraitAlias, TypeAlias, Union,
9090
},
9191
};
9292

@@ -261,6 +261,11 @@ pub struct TraitId(salsa::InternId);
261261
pub type TraitLoc = ItemLoc<Trait>;
262262
impl_intern!(TraitId, TraitLoc, intern_trait, lookup_intern_trait);
263263

264+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
265+
pub struct TraitAliasId(salsa::InternId);
266+
pub type TraitAliasLoc = ItemLoc<TraitAlias>;
267+
impl_intern!(TraitAliasId, TraitAliasLoc, intern_trait_alias, lookup_intern_trait_alias);
268+
264269
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
265270
pub struct TypeAliasId(salsa::InternId);
266271
type TypeAliasLoc = AssocItemLoc<TypeAlias>;
@@ -453,6 +458,7 @@ pub enum ModuleDefId {
453458
ConstId(ConstId),
454459
StaticId(StaticId),
455460
TraitId(TraitId),
461+
TraitAliasId(TraitAliasId),
456462
TypeAliasId(TypeAliasId),
457463
BuiltinType(BuiltinType),
458464
MacroId(MacroId),
@@ -466,6 +472,7 @@ impl_from!(
466472
ConstId,
467473
StaticId,
468474
TraitId,
475+
TraitAliasId,
469476
TypeAliasId,
470477
BuiltinType
471478
for ModuleDefId
@@ -516,6 +523,7 @@ pub enum GenericDefId {
516523
FunctionId(FunctionId),
517524
AdtId(AdtId),
518525
TraitId(TraitId),
526+
TraitAliasId(TraitAliasId),
519527
TypeAliasId(TypeAliasId),
520528
ImplId(ImplId),
521529
// enum variants cannot have generics themselves, but their parent enums
@@ -528,6 +536,7 @@ impl_from!(
528536
FunctionId,
529537
AdtId(StructId, EnumId, UnionId),
530538
TraitId,
539+
TraitAliasId,
531540
TypeAliasId,
532541
ImplId,
533542
EnumVariantId,
@@ -555,6 +564,7 @@ pub enum AttrDefId {
555564
StaticId(StaticId),
556565
ConstId(ConstId),
557566
TraitId(TraitId),
567+
TraitAliasId(TraitAliasId),
558568
TypeAliasId(TypeAliasId),
559569
MacroId(MacroId),
560570
ImplId(ImplId),
@@ -714,6 +724,7 @@ impl HasModule for GenericDefId {
714724
GenericDefId::FunctionId(it) => it.lookup(db).module(db),
715725
GenericDefId::AdtId(it) => it.module(db),
716726
GenericDefId::TraitId(it) => it.lookup(db).container,
727+
GenericDefId::TraitAliasId(it) => it.lookup(db).container,
717728
GenericDefId::TypeAliasId(it) => it.lookup(db).module(db),
718729
GenericDefId::ImplId(it) => it.lookup(db).container,
719730
GenericDefId::EnumVariantId(it) => it.parent.lookup(db).container,
@@ -747,6 +758,7 @@ impl ModuleDefId {
747758
ModuleDefId::ConstId(id) => id.lookup(db).container.module(db),
748759
ModuleDefId::StaticId(id) => id.lookup(db).module(db),
749760
ModuleDefId::TraitId(id) => id.lookup(db).container,
761+
ModuleDefId::TraitAliasId(id) => id.lookup(db).container,
750762
ModuleDefId::TypeAliasId(id) => id.lookup(db).module(db),
751763
ModuleDefId::MacroId(id) => id.module(db),
752764
ModuleDefId::BuiltinType(_) => return None,
@@ -765,6 +777,7 @@ impl AttrDefId {
765777
AttrDefId::StaticId(it) => it.lookup(db).module(db).krate,
766778
AttrDefId::ConstId(it) => it.lookup(db).module(db).krate,
767779
AttrDefId::TraitId(it) => it.lookup(db).container.krate,
780+
AttrDefId::TraitAliasId(it) => it.lookup(db).container.krate,
768781
AttrDefId::TypeAliasId(it) => it.lookup(db).module(db).krate,
769782
AttrDefId::ImplId(it) => it.lookup(db).container.krate,
770783
AttrDefId::ExternBlockId(it) => it.lookup(db).container.krate,

crates/hir-def/src/nameres/collector.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ use crate::{
5151
AdtId, AstId, AstIdWithPath, ConstLoc, EnumLoc, EnumVariantId, ExternBlockLoc, FunctionId,
5252
FunctionLoc, ImplLoc, Intern, ItemContainerId, LocalModuleId, Macro2Id, Macro2Loc,
5353
MacroExpander, MacroId, MacroRulesId, MacroRulesLoc, ModuleDefId, ModuleId, ProcMacroId,
54-
ProcMacroLoc, StaticLoc, StructLoc, TraitLoc, TypeAliasLoc, UnionLoc, UnresolvedMacro,
54+
ProcMacroLoc, StaticLoc, StructLoc, TraitAliasLoc, TraitLoc, TypeAliasLoc, UnionLoc,
55+
UnresolvedMacro,
5556
};
5657

5758
static GLOB_RECURSION_LIMIT: Limit = Limit::new(100);
@@ -1707,6 +1708,20 @@ impl ModCollector<'_, '_> {
17071708
false,
17081709
);
17091710
}
1711+
ModItem::TraitAlias(id) => {
1712+
let it = &self.item_tree[id];
1713+
1714+
let vis = resolve_vis(def_map, &self.item_tree[it.visibility]);
1715+
update_def(
1716+
self.def_collector,
1717+
TraitAliasLoc { container: module, id: ItemTreeId::new(self.tree_id, id) }
1718+
.intern(db)
1719+
.into(),
1720+
&it.name,
1721+
vis,
1722+
false,
1723+
);
1724+
}
17101725
ModItem::TypeAlias(id) => {
17111726
let it = &self.item_tree[id];
17121727

crates/hir-def/src/nameres/tests/incremental.rs

+1
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ pub type Ty = ();
223223
ModuleDefId::ConstId(it) => drop(db.const_data(it)),
224224
ModuleDefId::StaticId(it) => drop(db.static_data(it)),
225225
ModuleDefId::TraitId(it) => drop(db.trait_data(it)),
226+
ModuleDefId::TraitAliasId(it) => drop(db.trait_alias_data(it)),
226227
ModuleDefId::TypeAliasId(it) => drop(db.type_alias_data(it)),
227228
ModuleDefId::EnumVariantId(_)
228229
| ModuleDefId::ModuleId(_)

0 commit comments

Comments
 (0)