]> git.lizzy.rs Git - rust.git/commitdiff
Revert "Merge #2629"
authorAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 21 Dec 2019 14:04:33 +0000 (15:04 +0100)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Sat, 21 Dec 2019 14:04:33 +0000 (15:04 +0100)
This reverts commit cdc9d682b066b110e0a44e5f8f1c574b38c16ba9, reversing
changes made to 90ef070db3dce0a7acb9cd11d0b0d72de13c9d79.

13 files changed:
crates/ra_hir/src/code_model.rs
crates/ra_hir/src/db.rs
crates/ra_hir/src/has_source.rs
crates/ra_hir/src/lib.rs
crates/ra_hir_def/src/db.rs
crates/ra_hir_def/src/item_scope.rs
crates/ra_hir_def/src/lib.rs
crates/ra_hir_def/src/nameres/collector.rs
crates/ra_hir_def/src/nameres/raw.rs
crates/ra_hir_def/src/trace.rs
crates/ra_ide/src/change.rs
crates/ra_ide/src/completion/complete_path.rs
crates/ra_ide/src/completion/completion_context.rs

index e6768ea0bc0f98ce840f49746e24669105d0b512..fca3a295099df43da265eec1babd7330d36f0f44 100644 (file)
@@ -12,8 +12,8 @@
     resolver::HasResolver,
     type_ref::{Mutability, TypeRef},
     AdtId, ConstId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, LocalEnumVariantId,
-    LocalModuleId, LocalStructFieldId, Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId,
-    TypeParamId, UnionId,
+    LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, StaticId, StructId,
+    TraitId, TypeAliasId, TypeParamId, UnionId,
 };
 use hir_expand::{
     diagnostics::DiagnosticSink,
@@ -180,11 +180,13 @@ pub fn path_to_root(self, db: &impl HirDatabase) -> Vec<Module> {
     }
 
     /// Returns a `ModuleScope`: a set of items, visible in this module.
-    pub fn scope(self, db: &impl HirDatabase) -> Vec<(Name, ScopeDef)> {
+    pub fn scope(self, db: &impl HirDatabase) -> Vec<(Name, ScopeDef, Option<Import>)> {
         db.crate_def_map(self.id.krate)[self.id.local_id]
             .scope
             .entries()
-            .map(|(name, res)| (name.clone(), res.def.into()))
+            .map(|(name, res)| {
+                (name.clone(), res.def.into(), res.import.map(|id| Import { parent: self, id }))
+            })
             .collect()
     }
 
@@ -227,10 +229,10 @@ pub(crate) fn with_module_id(self, module_id: LocalModuleId) -> Module {
     }
 }
 
-// pub struct Import {
-//     pub(crate) parent: Module,
-//     pub(crate) id: LocalImportId,
-// }
+pub struct Import {
+    pub(crate) parent: Module,
+    pub(crate) id: LocalImportId,
+}
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct StructField {
index f5ffd64fa7b17622250d204d26ebf855fad4295b..bfae3660b41fa2e68c58ce20a2ce4aedb823417e 100644 (file)
@@ -4,8 +4,8 @@
     BodyQuery, BodyWithSourceMapQuery, ConstDataQuery, CrateDefMapQuery, CrateLangItemsQuery,
     DefDatabase, DefDatabaseStorage, DocumentationQuery, EnumDataQuery, ExprScopesQuery,
     FunctionDataQuery, GenericParamsQuery, ImplDataQuery, InternDatabase, InternDatabaseStorage,
-    LangItemQuery, ModuleLangItemsQuery, RawItemsQuery, StaticDataQuery, StructDataQuery,
-    TraitDataQuery, TypeAliasDataQuery,
+    LangItemQuery, ModuleLangItemsQuery, RawItemsQuery, RawItemsWithSourceMapQuery,
+    StaticDataQuery, StructDataQuery, TraitDataQuery, TypeAliasDataQuery,
 };
 pub use hir_expand::db::{
     AstDatabase, AstDatabaseStorage, AstIdMapQuery, MacroArgQuery, MacroDefQuery, MacroExpandQuery,
index 5541266e2b1e0f534909313d9d630ee7c1b71087..72afecf26c3d71318a27a586b8f389f69203d9f0 100644 (file)
@@ -9,8 +9,8 @@
 use ra_syntax::ast;
 
 use crate::{
-    db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, MacroDef, Module,
-    Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union,
+    db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, Import, MacroDef,
+    Module, Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union,
 };
 
 pub use hir_expand::InFile;
@@ -117,6 +117,18 @@ fn source(self, db: &impl DefDatabase) -> InFile<ast::ImplBlock> {
         self.id.lookup(db).source(db)
     }
 }
+impl HasSource for Import {
+    type Ast = Either<ast::UseTree, ast::ExternCrateItem>;
+
+    /// Returns the syntax of the last path segment corresponding to this import
+    fn source(self, db: &impl DefDatabase) -> InFile<Self::Ast> {
+        let src = self.parent.definition_source(db);
+        let (_, source_map) = db.raw_items_with_source_map(src.file_id);
+        let root = db.parse_or_expand(src.file_id).unwrap();
+        let ptr = source_map.get(self.id);
+        src.with_value(ptr.map_left(|it| it.to_node(&root)).map_right(|it| it.to_node(&root)))
+    }
+}
 
 impl HasSource for TypeParam {
     type Ast = Either<ast::TraitDef, ast::TypeParam>;
index 0008a8858fc44a45813fe5f96830c90594c2c6c4..7f9aef77074fedabc4f6fafd39252c9b82c545ba 100644 (file)
@@ -40,8 +40,8 @@ fn from(it: $sv) -> $e {
 pub use crate::{
     code_model::{
         Adt, AssocItem, AttrDef, Const, Crate, CrateDependency, DefWithBody, Docs, Enum,
-        EnumVariant, FieldSource, Function, GenericDef, HasAttrs, ImplBlock, Local, MacroDef,
-        Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias,
+        EnumVariant, FieldSource, Function, GenericDef, HasAttrs, ImplBlock, Import, Local,
+        MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias,
         TypeParam, Union, VariantDef,
     },
     from_source::FromSource,
index c55fd411107f9baca6fa9d569c6318a7aebbaa35..98bff6cb7836686900497803c159bf189563d8e8 100644 (file)
     docs::Documentation,
     generics::GenericParams,
     lang_item::{LangItemTarget, LangItems},
-    nameres::{raw::RawItems, CrateDefMap},
+    nameres::{
+        raw::{ImportSourceMap, RawItems},
+        CrateDefMap,
+    },
     AttrDefId, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc, FunctionId, FunctionLoc,
     GenericDefId, ImplId, ImplLoc, ModuleId, StaticId, StaticLoc, StructId, StructLoc, TraitId,
     TraitLoc, TypeAliasId, TypeAliasLoc, UnionId, UnionLoc,
@@ -43,6 +46,12 @@ pub trait InternDatabase: SourceDatabase {
 
 #[salsa::query_group(DefDatabaseStorage)]
 pub trait DefDatabase: InternDatabase + AstDatabase {
+    #[salsa::invoke(RawItems::raw_items_with_source_map_query)]
+    fn raw_items_with_source_map(
+        &self,
+        file_id: HirFileId,
+    ) -> (Arc<RawItems>, Arc<ImportSourceMap>);
+
     #[salsa::invoke(RawItems::raw_items_query)]
     fn raw_items(&self, file_id: HirFileId) -> Arc<RawItems>;
 
index 5c14fefff4378be1f8e923507654d427b4663909..6b9be8325d498f3e481273742a353772d242795c 100644 (file)
@@ -5,7 +5,7 @@
 use once_cell::sync::Lazy;
 use rustc_hash::FxHashMap;
 
-use crate::{per_ns::PerNs, BuiltinType, ImplId, MacroDefId, ModuleDefId, TraitId};
+use crate::{per_ns::PerNs, BuiltinType, ImplId, LocalImportId, MacroDefId, ModuleDefId, TraitId};
 
 #[derive(Debug, Default, PartialEq, Eq)]
 pub struct ItemScope {
@@ -30,7 +30,7 @@ pub struct ItemScope {
     BuiltinType::ALL
         .iter()
         .map(|(name, ty)| {
-            (name.clone(), Resolution { def: PerNs::types(ty.clone().into()), declaration: false })
+            (name.clone(), Resolution { def: PerNs::types(ty.clone().into()), import: None })
         })
         .collect()
 });
@@ -53,9 +53,11 @@ pub fn entries<'a>(&'a self) -> impl Iterator<Item = (&'a Name, &'a Resolution)>
     }
 
     pub fn declarations(&self) -> impl Iterator<Item = ModuleDefId> + '_ {
-        self.entries().filter(|(_name, res)| res.declaration).flat_map(|(_name, res)| {
-            res.def.take_types().into_iter().chain(res.def.take_values().into_iter())
-        })
+        self.entries()
+            .filter_map(|(_name, res)| if res.import.is_none() { Some(res.def) } else { None })
+            .flat_map(|per_ns| {
+                per_ns.take_types().into_iter().chain(per_ns.take_values().into_iter())
+            })
     }
 
     pub fn impls(&self) -> impl Iterator<Item = ImplId> + ExactSizeIterator + '_ {
@@ -110,26 +112,38 @@ pub(crate) fn define_legacy_macro(&mut self, name: Name, mac: MacroDefId) {
         self.legacy_macros.insert(name, mac);
     }
 
-    pub(crate) fn push_res(&mut self, name: Name, res: &Resolution, declaration: bool) -> bool {
+    pub(crate) fn push_res(
+        &mut self,
+        name: Name,
+        res: &Resolution,
+        import: Option<LocalImportId>,
+    ) -> bool {
         let mut changed = false;
         let existing = self.items.entry(name.clone()).or_default();
 
         if existing.def.types.is_none() && res.def.types.is_some() {
             existing.def.types = res.def.types;
-            existing.declaration |= declaration;
+            existing.import = import.or(res.import);
             changed = true;
         }
         if existing.def.values.is_none() && res.def.values.is_some() {
             existing.def.values = res.def.values;
-            existing.declaration |= declaration;
+            existing.import = import.or(res.import);
             changed = true;
         }
         if existing.def.macros.is_none() && res.def.macros.is_some() {
             existing.def.macros = res.def.macros;
-            existing.declaration |= declaration;
+            existing.import = import.or(res.import);
             changed = true;
         }
 
+        if existing.def.is_none()
+            && res.def.is_none()
+            && existing.import.is_none()
+            && res.import.is_some()
+        {
+            existing.import = res.import;
+        }
         changed
     }
 
@@ -146,5 +160,6 @@ pub(crate) fn collect_legacy_macros(&self) -> FxHashMap<Name, MacroDefId> {
 pub struct Resolution {
     /// None for unresolved
     pub def: PerNs,
-    pub declaration: bool,
+    /// ident by which this is imported into local scope.
+    pub import: Option<LocalImportId>,
 }
index f6c7f38d171c2e06812bc79f8de962672966951c..acd4f4af17b85052c8c7d4f4b88e2d2100d1fc44 100644 (file)
 use crate::body::Expander;
 use crate::builtin_type::BuiltinType;
 
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub struct LocalImportId(RawId);
+impl_arena_id!(LocalImportId);
+
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct ModuleId {
     pub krate: CrateId,
index 9419461a864fd80f3b022afd3b582f82b828e5db..45199fa11496d05951bd0dd761f4479413903a5a 100644 (file)
@@ -26,7 +26,8 @@
     path::{ModPath, PathKind},
     per_ns::PerNs,
     AdtId, AstId, ConstLoc, ContainerId, EnumLoc, EnumVariantId, FunctionLoc, ImplLoc, Intern,
-    LocalModuleId, ModuleDefId, ModuleId, StaticLoc, StructLoc, TraitLoc, TypeAliasLoc, UnionLoc,
+    LocalImportId, LocalModuleId, ModuleDefId, ModuleId, StaticLoc, StructLoc, TraitLoc,
+    TypeAliasLoc, UnionLoc,
 };
 
 pub(super) fn collect_defs(db: &impl DefDatabase, mut def_map: CrateDefMap) -> CrateDefMap {
@@ -92,7 +93,7 @@ fn namespaces(&self) -> PerNs {
 #[derive(Clone, Debug, Eq, PartialEq)]
 struct ImportDirective {
     module_id: LocalModuleId,
-    import_id: raw::LocalImportId,
+    import_id: LocalImportId,
     import: raw::ImportData,
     status: PartialResolvedImport,
 }
@@ -109,7 +110,7 @@ struct MacroDirective {
 struct DefCollector<'a, DB> {
     db: &'a DB,
     def_map: CrateDefMap,
-    glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, raw::LocalImportId)>>,
+    glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, LocalImportId)>>,
     unresolved_imports: Vec<ImportDirective>,
     resolved_imports: Vec<ImportDirective>,
     unexpanded_macros: Vec<MacroDirective>,
@@ -217,7 +218,8 @@ fn define_macro(
         if export {
             self.update(
                 self.def_map.root,
-                &[(name, Resolution { def: PerNs::macros(macro_), declaration: false })],
+                None,
+                &[(name, Resolution { def: PerNs::macros(macro_), import: None })],
             );
         }
     }
@@ -372,7 +374,7 @@ fn record_resolved_import(&mut self, directive: &ImportDirective) {
                         // Module scoped macros is included
                         let items = scope.collect_resolutions();
 
-                        self.update(module_id, &items);
+                        self.update(module_id, Some(import_id), &items);
                     } else {
                         // glob import from same crate => we do an initial
                         // import, and then need to propagate any further
@@ -382,7 +384,7 @@ fn record_resolved_import(&mut self, directive: &ImportDirective) {
                         // Module scoped macros is included
                         let items = scope.collect_resolutions();
 
-                        self.update(module_id, &items);
+                        self.update(module_id, Some(import_id), &items);
                         // record the glob import in case we add further items
                         let glob = self.glob_imports.entry(m.local_id).or_default();
                         if !glob.iter().any(|it| *it == (module_id, import_id)) {
@@ -402,12 +404,12 @@ fn record_resolved_import(&mut self, directive: &ImportDirective) {
                             let variant = EnumVariantId { parent: e, local_id };
                             let res = Resolution {
                                 def: PerNs::both(variant.into(), variant.into()),
-                                declaration: false,
+                                import: Some(import_id),
                             };
                             (name, res)
                         })
                         .collect::<Vec<_>>();
-                    self.update(module_id, &resolutions);
+                    self.update(module_id, Some(import_id), &resolutions);
                 }
                 Some(d) => {
                     log::debug!("glob import {:?} from non-module/enum {:?}", import, d);
@@ -429,21 +431,27 @@ fn record_resolved_import(&mut self, directive: &ImportDirective) {
                         }
                     }
 
-                    let resolution = Resolution { def, declaration: false };
-                    self.update(module_id, &[(name, resolution)]);
+                    let resolution = Resolution { def, import: Some(import_id) };
+                    self.update(module_id, Some(import_id), &[(name, resolution)]);
                 }
                 None => tested_by!(bogus_paths),
             }
         }
     }
 
-    fn update(&mut self, module_id: LocalModuleId, resolutions: &[(Name, Resolution)]) {
-        self.update_recursive(module_id, resolutions, 0)
+    fn update(
+        &mut self,
+        module_id: LocalModuleId,
+        import: Option<LocalImportId>,
+        resolutions: &[(Name, Resolution)],
+    ) {
+        self.update_recursive(module_id, import, resolutions, 0)
     }
 
     fn update_recursive(
         &mut self,
         module_id: LocalModuleId,
+        import: Option<LocalImportId>,
         resolutions: &[(Name, Resolution)],
         depth: usize,
     ) {
@@ -454,7 +462,7 @@ fn update_recursive(
         let scope = &mut self.def_map.modules[module_id].scope;
         let mut changed = false;
         for (name, res) in resolutions {
-            changed |= scope.push_res(name.clone(), res, depth == 0 && res.declaration);
+            changed |= scope.push_res(name.clone(), res, import);
         }
 
         if !changed {
@@ -467,9 +475,9 @@ fn update_recursive(
             .flat_map(|v| v.iter())
             .cloned()
             .collect::<Vec<_>>();
-        for (glob_importing_module, _glob_import) in glob_imports {
+        for (glob_importing_module, glob_import) in glob_imports {
             // We pass the glob import so that the tracked import in those modules is that glob import
-            self.update_recursive(glob_importing_module, resolutions, depth + 1);
+            self.update_recursive(glob_importing_module, Some(glob_import), resolutions, depth + 1);
         }
     }
 
@@ -711,9 +719,9 @@ fn push_child_module(
             def: PerNs::types(
                 ModuleId { krate: self.def_collector.def_map.krate, local_id: res }.into(),
             ),
-            declaration: true,
+            import: None,
         };
-        self.def_collector.update(self.module_id, &[(name, resolution)]);
+        self.def_collector.update(self.module_id, None, &[(name, resolution)]);
         res
     }
 
@@ -783,8 +791,8 @@ fn define_def(&mut self, def: &raw::DefData, attrs: &Attrs) {
                 PerNs::types(def.into())
             }
         };
-        let resolution = Resolution { def, declaration: true };
-        self.def_collector.update(self.module_id, &[(name, resolution)])
+        let resolution = Resolution { def, import: None };
+        self.def_collector.update(self.module_id, None, &[(name, resolution)])
     }
 
     fn collect_derives(&mut self, attrs: &Attrs, def: &raw::DefData) {
index b10e458a2072ca3cb2d9b46bcd0dca3796542a8a..ecb4d7c03d65a3cddf803959a2273157c73cb563 100644 (file)
@@ -7,24 +7,24 @@
 
 use std::{ops::Index, sync::Arc};
 
+use either::Either;
 use hir_expand::{
     ast_id_map::AstIdMap,
     db::AstDatabase,
     hygiene::Hygiene,
     name::{AsName, Name},
 };
-use ra_arena::{impl_arena_id, Arena, RawId};
+use ra_arena::{impl_arena_id, map::ArenaMap, Arena, RawId};
 use ra_syntax::{
     ast::{self, AttrsOwner, NameOwner},
-    AstNode,
+    AstNode, AstPtr,
 };
 use test_utils::tested_by;
 
-use crate::{attr::Attrs, db::DefDatabase, path::ModPath, FileAstId, HirFileId, InFile};
-
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
-pub(super) struct LocalImportId(RawId);
-impl_arena_id!(LocalImportId);
+use crate::{
+    attr::Attrs, db::DefDatabase, path::ModPath, trace::Trace, FileAstId, HirFileId, InFile,
+    LocalImportId,
+};
 
 /// `RawItems` is a set of top-level items in a file (except for impls).
 ///
@@ -41,14 +41,35 @@ pub struct RawItems {
     items: Vec<RawItem>,
 }
 
+#[derive(Debug, Default, PartialEq, Eq)]
+pub struct ImportSourceMap {
+    map: ArenaMap<LocalImportId, ImportSourcePtr>,
+}
+
+type ImportSourcePtr = Either<AstPtr<ast::UseTree>, AstPtr<ast::ExternCrateItem>>;
+
+impl ImportSourceMap {
+    pub fn get(&self, import: LocalImportId) -> ImportSourcePtr {
+        self.map[import].clone()
+    }
+}
+
 impl RawItems {
     pub(crate) fn raw_items_query(
         db: &(impl DefDatabase + AstDatabase),
         file_id: HirFileId,
     ) -> Arc<RawItems> {
+        db.raw_items_with_source_map(file_id).0
+    }
+
+    pub(crate) fn raw_items_with_source_map_query(
+        db: &(impl DefDatabase + AstDatabase),
+        file_id: HirFileId,
+    ) -> (Arc<RawItems>, Arc<ImportSourceMap>) {
         let mut collector = RawItemsCollector {
             raw_items: RawItems::default(),
             source_ast_id_map: db.ast_id_map(file_id),
+            imports: Trace::new(),
             file_id,
             hygiene: Hygiene::new(db, file_id),
         };
@@ -59,8 +80,11 @@ pub(crate) fn raw_items_query(
                 collector.process_module(None, item_list);
             }
         }
-        let raw_items = collector.raw_items;
-        Arc::new(raw_items)
+        let mut raw_items = collector.raw_items;
+        let (arena, map) = collector.imports.into_arena_and_map();
+        raw_items.imports = arena;
+        let source_map = ImportSourceMap { map };
+        (Arc::new(raw_items), Arc::new(source_map))
     }
 
     pub(super) fn items(&self) -> &[RawItem] {
@@ -199,6 +223,7 @@ pub(super) struct ImplData {
 
 struct RawItemsCollector {
     raw_items: RawItems,
+    imports: Trace<LocalImportId, ImportData, ImportSourcePtr>,
     source_ast_id_map: Arc<AstIdMap>,
     file_id: HirFileId,
     hygiene: Hygiene,
@@ -305,7 +330,7 @@ fn add_use_item(&mut self, current_module: Option<Module>, use_item: ast::UseIte
         ModPath::expand_use_item(
             InFile { value: use_item, file_id: self.file_id },
             &self.hygiene,
-            |path, _use_tree, is_glob, alias| {
+            |path, use_tree, is_glob, alias| {
                 let import_data = ImportData {
                     path,
                     alias,
@@ -314,11 +339,11 @@ fn add_use_item(&mut self, current_module: Option<Module>, use_item: ast::UseIte
                     is_extern_crate: false,
                     is_macro_use: false,
                 };
-                buf.push(import_data);
+                buf.push((import_data, Either::Left(AstPtr::new(use_tree))));
             },
         );
-        for import_data in buf {
-            self.push_import(current_module, attrs.clone(), import_data);
+        for (import_data, ptr) in buf {
+            self.push_import(current_module, attrs.clone(), import_data, ptr);
         }
     }
 
@@ -341,7 +366,12 @@ fn add_extern_crate_item(
                 is_extern_crate: true,
                 is_macro_use,
             };
-            self.push_import(current_module, attrs, import_data);
+            self.push_import(
+                current_module,
+                attrs,
+                import_data,
+                Either::Right(AstPtr::new(&extern_crate)),
+            );
         }
     }
 
@@ -372,8 +402,14 @@ fn add_impl(&mut self, current_module: Option<Module>, imp: ast::ImplBlock) {
         self.push_item(current_module, attrs, RawItemKind::Impl(imp))
     }
 
-    fn push_import(&mut self, current_module: Option<Module>, attrs: Attrs, data: ImportData) {
-        let import = self.raw_items.imports.alloc(data);
+    fn push_import(
+        &mut self,
+        current_module: Option<Module>,
+        attrs: Attrs,
+        data: ImportData,
+        source: ImportSourcePtr,
+    ) {
+        let import = self.imports.alloc(|| source, || data);
         self.push_item(current_module, attrs, RawItemKind::Import(import))
     }
 
index 9769e88df583779c035a9d8a33c7d4d7df574814..2bcd707bcd3a46901e87e8a55fa78b42681bd839 100644 (file)
@@ -18,6 +18,10 @@ pub(crate) struct Trace<ID: ArenaId, T, V> {
 }
 
 impl<ID: ra_arena::ArenaId + Copy, T, V> Trace<ID, T, V> {
+    pub(crate) fn new() -> Trace<ID, T, V> {
+        Trace { arena: Some(Arena::default()), map: Some(ArenaMap::default()), len: 0 }
+    }
+
     pub(crate) fn new_for_arena() -> Trace<ID, T, V> {
         Trace { arena: Some(Arena::default()), map: None, len: 0 }
     }
@@ -48,4 +52,8 @@ pub(crate) fn into_arena(mut self) -> Arena<ID, T> {
     pub(crate) fn into_map(mut self) -> ArenaMap<ID, V> {
         self.map.take().unwrap()
     }
+
+    pub(crate) fn into_arena_and_map(mut self) -> (Arena<ID, T>, ArenaMap<ID, V>) {
+        (self.arena.take().unwrap(), self.map.take().unwrap())
+    }
 }
index 387a9cafb65751833f6335248c3f2325121e4657..4a76d1dd83ce996d5e00b50752f4e554d6e44ccb 100644 (file)
@@ -270,6 +270,7 @@ pub(crate) fn collect_garbage(&mut self) {
 
         self.query(hir::db::AstIdMapQuery).sweep(sweep);
 
+        self.query(hir::db::RawItemsWithSourceMapQuery).sweep(sweep);
         self.query(hir::db::BodyWithSourceMapQuery).sweep(sweep);
 
         self.query(hir::db::ExprScopesQuery).sweep(sweep);
@@ -308,6 +309,7 @@ macro_rules! sweep_each_query {
             hir::db::StructDataQuery
             hir::db::EnumDataQuery
             hir::db::TraitDataQuery
+            hir::db::RawItemsWithSourceMapQuery
             hir::db::RawItemsQuery
             hir::db::CrateDefMapQuery
             hir::db::GenericParamsQuery
index 8ce86ad7d210fa4d73511a28d9cc5f2c145d7406..28f94e0a776762df2e2e6a18e1efc471fb14f78c 100644 (file)
@@ -1,6 +1,7 @@
 //! FIXME: write short doc here
 
-use hir::{Adt, PathResolution, ScopeDef};
+use either::Either;
+use hir::{Adt, HasSource, PathResolution};
 use ra_syntax::AstNode;
 use test_utils::tested_by;
 
@@ -18,15 +19,17 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) {
     match def {
         hir::ModuleDef::Module(module) => {
             let module_scope = module.scope(ctx.db);
-            for (name, def) in module_scope {
-                if ctx.use_item_syntax.is_some() {
-                    if let hir::ScopeDef::ModuleDef(hir::ModuleDef::BuiltinType(..)) = def {
+            for (name, def, import) in module_scope {
+                if let hir::ScopeDef::ModuleDef(hir::ModuleDef::BuiltinType(..)) = def {
+                    if ctx.use_item_syntax.is_some() {
                         tested_by!(dont_complete_primitive_in_use);
                         continue;
                     }
-                    if let ScopeDef::Unknown = def {
-                        if let Some(name_ref) = ctx.name_ref.as_ref() {
-                            if &name_ref.syntax().text() == name.to_string().as_str() {
+                }
+                if Some(module) == ctx.module {
+                    if let Some(import) = import {
+                        if let Either::Left(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);
                                 continue;
index 8f56ce7062a63d1a85d44fa0abf1e4951b971936..4894ea2f6b734b8f6d7056896d2f87a19f891b36 100644 (file)
@@ -18,7 +18,6 @@ pub(crate) struct CompletionContext<'a> {
     pub(super) analyzer: hir::SourceAnalyzer,
     pub(super) offset: TextUnit,
     pub(super) token: SyntaxToken,
-    pub(super) name_ref: Option<ast::NameRef>,
     pub(super) module: Option<hir::Module>,
     pub(super) function_syntax: Option<ast::FnDef>,
     pub(super) use_item_syntax: Option<ast::UseItem>,
@@ -69,7 +68,6 @@ pub(super) fn new(
             analyzer,
             token,
             offset: position.offset,
-            name_ref: None,
             module,
             function_syntax: None,
             use_item_syntax: None,
@@ -144,8 +142,6 @@ fn fill(&mut self, original_parse: &'a Parse<ast::SourceFile>, offset: TextUnit)
     }
 
     fn classify_name_ref(&mut self, original_file: SourceFile, name_ref: ast::NameRef) {
-        self.name_ref =
-            find_node_at_offset(original_file.syntax(), name_ref.syntax().text_range().start());
         let name_range = name_ref.syntax().text_range();
         if name_ref.syntax().parent().and_then(ast::RecordField::cast).is_some() {
             self.record_lit_syntax = find_node_at_offset(original_file.syntax(), self.offset);