mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
Auto merge of #14184 - lowr:feat/trait-alias-def, r=Veykril
Handle trait alias definitions Part of #2773 This PR adds a bunch of structs and enum variants for trait aliases. Trait aliases should be handled as an independent item because they are semantically distinct from traits. I basically started by adding `TraitAlias{Id, Loc}` to `hir_def::item_tree` and iterated adding necessary stuffs until compiler stopped complaining what's missing. Let me know if there's still anything I need to add. I'm opening up this PR for early review and stuff. I'm planning to add tests for IDE functionalities in this PR, but not type-related support, for which I put FIXME notes.
This commit is contained in:
commit
6756294aa0
63 changed files with 623 additions and 206 deletions
|
@ -53,7 +53,7 @@ use hir_def::{
|
|||
AdtId, AssocItemId, AssocItemLoc, AttrDefId, ConstId, ConstParamId, DefWithBodyId, EnumId,
|
||||
EnumVariantId, FunctionId, GenericDefId, HasModule, ImplId, ItemContainerId, LifetimeParamId,
|
||||
LocalEnumVariantId, LocalFieldId, Lookup, MacroExpander, MacroId, ModuleId, StaticId, StructId,
|
||||
TraitId, TypeAliasId, TypeOrConstParamId, TypeParamId, UnionId,
|
||||
TraitAliasId, TraitId, TypeAliasId, TypeOrConstParamId, TypeParamId, UnionId,
|
||||
};
|
||||
use hir_expand::{name::name, MacroCallKind};
|
||||
use hir_ty::{
|
||||
|
@ -272,6 +272,7 @@ pub enum ModuleDef {
|
|||
Const(Const),
|
||||
Static(Static),
|
||||
Trait(Trait),
|
||||
TraitAlias(TraitAlias),
|
||||
TypeAlias(TypeAlias),
|
||||
BuiltinType(BuiltinType),
|
||||
Macro(Macro),
|
||||
|
@ -284,6 +285,7 @@ impl_from!(
|
|||
Const,
|
||||
Static,
|
||||
Trait,
|
||||
TraitAlias,
|
||||
TypeAlias,
|
||||
BuiltinType,
|
||||
Macro
|
||||
|
@ -310,6 +312,7 @@ impl ModuleDef {
|
|||
ModuleDef::Const(it) => Some(it.module(db)),
|
||||
ModuleDef::Static(it) => Some(it.module(db)),
|
||||
ModuleDef::Trait(it) => Some(it.module(db)),
|
||||
ModuleDef::TraitAlias(it) => Some(it.module(db)),
|
||||
ModuleDef::TypeAlias(it) => Some(it.module(db)),
|
||||
ModuleDef::Macro(it) => Some(it.module(db)),
|
||||
ModuleDef::BuiltinType(_) => None,
|
||||
|
@ -338,6 +341,7 @@ impl ModuleDef {
|
|||
ModuleDef::Const(it) => it.name(db)?,
|
||||
ModuleDef::Adt(it) => it.name(db),
|
||||
ModuleDef::Trait(it) => it.name(db),
|
||||
ModuleDef::TraitAlias(it) => it.name(db),
|
||||
ModuleDef::Function(it) => it.name(db),
|
||||
ModuleDef::Variant(it) => it.name(db),
|
||||
ModuleDef::TypeAlias(it) => it.name(db),
|
||||
|
@ -356,6 +360,7 @@ impl ModuleDef {
|
|||
Adt::Union(it) => it.id.into(),
|
||||
},
|
||||
ModuleDef::Trait(it) => it.id.into(),
|
||||
ModuleDef::TraitAlias(it) => it.id.into(),
|
||||
ModuleDef::Function(it) => it.id.into(),
|
||||
ModuleDef::TypeAlias(it) => it.id.into(),
|
||||
ModuleDef::Module(it) => it.id.into(),
|
||||
|
@ -398,6 +403,7 @@ impl ModuleDef {
|
|||
ModuleDef::Module(_)
|
||||
| ModuleDef::Adt(_)
|
||||
| ModuleDef::Trait(_)
|
||||
| ModuleDef::TraitAlias(_)
|
||||
| ModuleDef::TypeAlias(_)
|
||||
| ModuleDef::Macro(_)
|
||||
| ModuleDef::BuiltinType(_) => None,
|
||||
|
@ -413,6 +419,7 @@ impl ModuleDef {
|
|||
ModuleDef::Const(it) => it.attrs(db),
|
||||
ModuleDef::Static(it) => it.attrs(db),
|
||||
ModuleDef::Trait(it) => it.attrs(db),
|
||||
ModuleDef::TraitAlias(it) => it.attrs(db),
|
||||
ModuleDef::TypeAlias(it) => it.attrs(db),
|
||||
ModuleDef::Macro(it) => it.attrs(db),
|
||||
ModuleDef::BuiltinType(_) => return None,
|
||||
|
@ -429,6 +436,7 @@ impl HasVisibility for ModuleDef {
|
|||
ModuleDef::Const(it) => it.visibility(db),
|
||||
ModuleDef::Static(it) => it.visibility(db),
|
||||
ModuleDef::Trait(it) => it.visibility(db),
|
||||
ModuleDef::TraitAlias(it) => it.visibility(db),
|
||||
ModuleDef::TypeAlias(it) => it.visibility(db),
|
||||
ModuleDef::Variant(it) => it.visibility(db),
|
||||
ModuleDef::Macro(it) => it.visibility(db),
|
||||
|
@ -1942,6 +1950,27 @@ impl HasVisibility for Trait {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub struct TraitAlias {
|
||||
pub(crate) id: TraitAliasId,
|
||||
}
|
||||
|
||||
impl TraitAlias {
|
||||
pub fn module(self, db: &dyn HirDatabase) -> Module {
|
||||
Module { id: self.id.lookup(db.upcast()).container }
|
||||
}
|
||||
|
||||
pub fn name(self, db: &dyn HirDatabase) -> Name {
|
||||
db.trait_alias_data(self.id).name.clone()
|
||||
}
|
||||
}
|
||||
|
||||
impl HasVisibility for TraitAlias {
|
||||
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
|
||||
db.trait_alias_data(self.id).visibility.resolve(db.upcast(), &self.id.resolver(db.upcast()))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub struct TypeAlias {
|
||||
pub(crate) id: TypeAliasId,
|
||||
|
@ -2314,6 +2343,7 @@ pub enum GenericDef {
|
|||
Function(Function),
|
||||
Adt(Adt),
|
||||
Trait(Trait),
|
||||
TraitAlias(TraitAlias),
|
||||
TypeAlias(TypeAlias),
|
||||
Impl(Impl),
|
||||
// enum variants cannot have generics themselves, but their parent enums
|
||||
|
@ -2326,6 +2356,7 @@ impl_from!(
|
|||
Function,
|
||||
Adt(Struct, Enum, Union),
|
||||
Trait,
|
||||
TraitAlias,
|
||||
TypeAlias,
|
||||
Impl,
|
||||
Variant,
|
||||
|
@ -4074,6 +4105,12 @@ impl HasCrate for Trait {
|
|||
}
|
||||
}
|
||||
|
||||
impl HasCrate for TraitAlias {
|
||||
fn krate(&self, db: &dyn HirDatabase) -> Crate {
|
||||
self.module(db).krate()
|
||||
}
|
||||
}
|
||||
|
||||
impl HasCrate for Static {
|
||||
fn krate(&self, db: &dyn HirDatabase) -> Crate {
|
||||
self.module(db).krate()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue