From e5bcb69e4f88c7536b1039a881816cb8f1c1f867 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 23 Nov 2019 16:39:53 +0300 Subject: Hide ImportId --- crates/ra_hir/src/code_model.rs | 26 ++++++++++------------- crates/ra_hir/src/code_model/src.rs | 12 ++++++++++- crates/ra_hir/src/lib.rs | 5 ++--- crates/ra_ide_api/src/completion/complete_path.rs | 4 ++-- 4 files changed, 26 insertions(+), 21 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 4b3ec5457..50c9a79fc 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -9,7 +9,7 @@ use hir_def::{ body::scope::ExprScopes, builtin_type::BuiltinType, docs::Documentation, - nameres::per_ns::PerNs, + nameres::{per_ns::PerNs, raw::ImportId}, resolver::{HasResolver, TypeNs}, type_ref::TypeRef, ContainerId, CrateModuleId, HasModule, ImplId, LocalEnumVariantId, LocalStructFieldId, Lookup, @@ -30,7 +30,7 @@ use crate::{ TypeAliasId, }, ty::{InferenceResult, Namespace, TraitRef}, - Either, HasSource, ImportId, Name, Source, Ty, + Either, HasSource, Name, Source, Ty, }; /// hir::Crate describes a single crate. It's the main interface with which @@ -129,17 +129,6 @@ impl Module { }) } - /// Returns the syntax of the last path segment corresponding to this import - pub fn import_source( - self, - db: &impl HirDatabase, - import: ImportId, - ) -> Either { - let src = self.definition_source(db); - let (_, source_map) = db.raw_items_with_source_map(src.file_id); - source_map.get(&src.value, import) - } - /// Returns the crate this module is part of. pub fn krate(self) -> Crate { Crate { crate_id: self.id.krate } @@ -189,11 +178,13 @@ impl Module { } /// Returns a `ModuleScope`: a set of items, visible in this module. - pub fn scope(self, db: &impl HirDatabase) -> Vec<(Name, ScopeDef, Option)> { + pub fn scope(self, db: &impl HirDatabase) -> Vec<(Name, ScopeDef, Option)> { db.crate_def_map(self.id.krate)[self.id.module_id] .scope .entries() - .map(|(name, res)| (name.clone(), res.def.into(), res.import)) + .map(|(name, res)| { + (name.clone(), res.def.into(), res.import.map(|id| Import { parent: self, id })) + }) .collect() } @@ -236,6 +227,11 @@ impl Module { } } +pub struct Import { + pub(crate) parent: Module, + pub(crate) id: ImportId, +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct StructField { pub(crate) parent: VariantDef, diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 09bacf579..ceb3daa27 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -8,7 +8,7 @@ use crate::{ db::{AstDatabase, DefDatabase, HirDatabase}, ids::AstItemDef, Const, Enum, EnumVariant, FieldSource, Function, HasBody, MacroDef, Module, ModuleSource, - Static, Struct, StructField, Trait, TypeAlias, Union, + Static, Struct, StructField, Trait, TypeAlias, Union, Import }; pub use hir_expand::Source; @@ -113,6 +113,16 @@ impl HasSource for MacroDef { Source { file_id: self.id.ast_id.file_id(), value: self.id.ast_id.to_node(db) } } } +impl HasSource for Import { + type Ast = Either; + + /// Returns the syntax of the last path segment corresponding to this import + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source { + let src = self.parent.definition_source(db); + let (_, source_map) = db.raw_items_with_source_map(src.file_id); + src.with_value(source_map.get(&src.value, self.id)) + } +} pub trait HasBodySource: HasBody + HasSource where diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index d42161612..e51d4d063 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -53,8 +53,8 @@ pub use crate::{ src::{HasBodySource, HasSource}, Adt, AssocItem, AttrDef, Const, Container, Crate, CrateDependency, DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, GenericParam, HasAttrs, HasBody, ImplBlock, - Local, MacroDef, Module, ModuleDef, ModuleSource, ScopeDef, Static, Struct, StructField, - Trait, TypeAlias, Union, VariantDef, + Import, Local, MacroDef, Module, ModuleDef, ModuleSource, ScopeDef, Static, Struct, + StructField, Trait, TypeAlias, Union, VariantDef, }, expr::ExprScopes, from_source::FromSource, @@ -70,7 +70,6 @@ pub use crate::{ pub use hir_def::{ builtin_type::BuiltinType, docs::Documentation, - nameres::raw::ImportId, path::{Path, PathKind}, type_ref::Mutability, }; diff --git a/crates/ra_ide_api/src/completion/complete_path.rs b/crates/ra_ide_api/src/completion/complete_path.rs index 802c7701a..63e25e0bf 100644 --- a/crates/ra_ide_api/src/completion/complete_path.rs +++ b/crates/ra_ide_api/src/completion/complete_path.rs @@ -1,6 +1,6 @@ //! FIXME: write short doc here -use hir::{Adt, Either, PathResolution}; +use hir::{Adt, Either, HasSource, PathResolution}; use ra_syntax::AstNode; use test_utils::tested_by; @@ -27,7 +27,7 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) { } if Some(module) == ctx.module { if let Some(import) = import { - if let Either::A(use_tree) = module.import_source(ctx.db, import) { + if let Either::A(use_tree) = import.source(ctx.db).value { if use_tree.syntax().text_range().contains_inclusive(ctx.offset) { // for `use self::foo<|>`, don't suggest `foo` as a completion tested_by!(dont_complete_current_use); -- cgit v1.2.3