From 0d5ae89948903bb150b72885c6d9f24dc7a2bb51 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 19 Feb 2020 14:45:49 +0100 Subject: Derive visibility as well --- crates/ra_ide_db/src/defs.rs | 83 +++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 39 deletions(-) (limited to 'crates/ra_ide_db') diff --git a/crates/ra_ide_db/src/defs.rs b/crates/ra_ide_db/src/defs.rs index cc772de51..aec748abf 100644 --- a/crates/ra_ide_db/src/defs.rs +++ b/crates/ra_ide_db/src/defs.rs @@ -6,8 +6,8 @@ // FIXME: this badly needs rename/rewrite (matklad, 2020-02-06). use hir::{ - Adt, HasSource, ImplBlock, InFile, Local, MacroDef, Module, ModuleDef, SourceBinder, - StructField, TypeParam, VariantDef, + Adt, FieldSource, HasSource, ImplBlock, InFile, Local, MacroDef, Module, ModuleDef, + SourceBinder, StructField, TypeParam, }; use ra_prof::profile; use ra_syntax::{ @@ -29,7 +29,6 @@ pub enum NameKind { #[derive(PartialEq, Eq)] pub struct NameDefinition { - pub visibility: Option, /// FIXME: this doesn't really make sense. For example, builtin types don't /// really have a module. pub kind: NameKind, @@ -46,6 +45,34 @@ impl NameDefinition { NameKind::TypeParam(it) => Some(it.module(db)), } } + + pub fn visibility(&self, db: &RootDatabase) -> Option { + match self.kind { + NameKind::Macro(_) => None, + NameKind::StructField(sf) => match sf.source(db).value { + FieldSource::Named(it) => it.visibility(), + FieldSource::Pos(it) => it.visibility(), + }, + NameKind::ModuleDef(def) => match def { + ModuleDef::Module(it) => it.declaration_source(db)?.value.visibility(), + ModuleDef::Function(it) => it.source(db).value.visibility(), + ModuleDef::Adt(adt) => match adt { + Adt::Struct(it) => it.source(db).value.visibility(), + Adt::Union(it) => it.source(db).value.visibility(), + Adt::Enum(it) => it.source(db).value.visibility(), + }, + ModuleDef::Const(it) => it.source(db).value.visibility(), + ModuleDef::Static(it) => it.source(db).value.visibility(), + ModuleDef::Trait(it) => it.source(db).value.visibility(), + ModuleDef::TypeAlias(it) => it.source(db).value.visibility(), + ModuleDef::EnumVariant(_) => None, + ModuleDef::BuiltinType(_) => None, + }, + NameKind::SelfType(_) => None, + NameKind::Local(_) => None, + NameKind::TypeParam(_) => None, + } + } } pub fn classify_name( @@ -61,65 +88,63 @@ pub fn classify_name( let src = name.with_value(it); let local = sb.to_def(src)?; Some(NameDefinition { - visibility: None, kind: NameKind::Local(local), }) }, ast::RecordFieldDef(it) => { let src = name.with_value(it); let field: hir::StructField = sb.to_def(src)?; - Some(from_struct_field(sb.db, field)) + Some(from_struct_field(field)) }, ast::Module(it) => { let def = sb.to_def(name.with_value(it))?; - Some(from_module_def(sb.db, def.into())) + Some(from_module_def(def.into())) }, ast::StructDef(it) => { let src = name.with_value(it); let def: hir::Struct = sb.to_def(src)?; - Some(from_module_def(sb.db, def.into())) + Some(from_module_def(def.into())) }, ast::EnumDef(it) => { let src = name.with_value(it); let def: hir::Enum = sb.to_def(src)?; - Some(from_module_def(sb.db, def.into())) + Some(from_module_def(def.into())) }, ast::TraitDef(it) => { let src = name.with_value(it); let def: hir::Trait = sb.to_def(src)?; - Some(from_module_def(sb.db, def.into())) + Some(from_module_def(def.into())) }, ast::StaticDef(it) => { let src = name.with_value(it); let def: hir::Static = sb.to_def(src)?; - Some(from_module_def(sb.db, def.into())) + Some(from_module_def(def.into())) }, ast::EnumVariant(it) => { let src = name.with_value(it); let def: hir::EnumVariant = sb.to_def(src)?; - Some(from_module_def(sb.db, def.into())) + Some(from_module_def(def.into())) }, ast::FnDef(it) => { let src = name.with_value(it); let def: hir::Function = sb.to_def(src)?; - Some(from_module_def(sb.db, def.into())) + Some(from_module_def(def.into())) }, ast::ConstDef(it) => { let src = name.with_value(it); let def: hir::Const = sb.to_def(src)?; - Some(from_module_def(sb.db, def.into())) + Some(from_module_def(def.into())) }, ast::TypeAliasDef(it) => { let src = name.with_value(it); let def: hir::TypeAlias = sb.to_def(src)?; - Some(from_module_def(sb.db, def.into())) + Some(from_module_def(def.into())) }, ast::MacroCall(it) => { let src = name.with_value(it); let def = sb.to_def(src.clone())?; Some(NameDefinition { - visibility: None, kind: NameKind::Macro(def), }) }, @@ -127,7 +152,6 @@ pub fn classify_name( let src = name.with_value(it); let def = sb.to_def(src)?; Some(NameDefinition { - visibility: None, kind: NameKind::TypeParam(def), }) }, @@ -136,31 +160,12 @@ pub fn classify_name( } } -pub fn from_struct_field(db: &RootDatabase, field: StructField) -> NameDefinition { +pub fn from_struct_field(field: StructField) -> NameDefinition { let kind = NameKind::StructField(field); - let parent = field.parent_def(db); - let visibility = match parent { - VariantDef::Struct(s) => s.source(db).value.visibility(), - VariantDef::Union(e) => e.source(db).value.visibility(), - VariantDef::EnumVariant(e) => e.source(db).value.parent_enum().visibility(), - }; - NameDefinition { kind, visibility } + NameDefinition { kind } } -pub fn from_module_def(db: &RootDatabase, def: ModuleDef) -> NameDefinition { +pub fn from_module_def(def: ModuleDef) -> NameDefinition { let kind = NameKind::ModuleDef(def); - let visibility = match def { - ModuleDef::Module(it) => it.declaration_source(db).and_then(|s| s.value.visibility()), - ModuleDef::EnumVariant(it) => it.source(db).value.parent_enum().visibility(), - ModuleDef::Function(it) => it.source(db).value.visibility(), - ModuleDef::Const(it) => it.source(db).value.visibility(), - ModuleDef::Static(it) => it.source(db).value.visibility(), - ModuleDef::Trait(it) => it.source(db).value.visibility(), - ModuleDef::TypeAlias(it) => it.source(db).value.visibility(), - ModuleDef::Adt(Adt::Struct(it)) => it.source(db).value.visibility(), - ModuleDef::Adt(Adt::Union(it)) => it.source(db).value.visibility(), - ModuleDef::Adt(Adt::Enum(it)) => it.source(db).value.visibility(), - ModuleDef::BuiltinType(..) => None, - }; - NameDefinition { kind, visibility } + NameDefinition { kind } } -- cgit v1.2.3