From ccd1b0800a5de5e046e6e9a4b6f49030c1ce3639 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 28 Nov 2019 12:50:26 +0300 Subject: Rename Source -> InFile --- crates/ra_hir/src/code_model.rs | 6 ++-- crates/ra_hir/src/code_model/src.rs | 36 ++++++++++----------- crates/ra_hir/src/from_source.rs | 62 ++++++++++++++++++------------------- crates/ra_hir/src/lib.rs | 2 +- crates/ra_hir/src/source_binder.rs | 28 ++++++++--------- 5 files changed, 67 insertions(+), 67 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 38d66c2a7..dddac915b 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -30,7 +30,7 @@ use crate::{ db::{DefDatabase, HirDatabase}, ty::display::HirFormatter, ty::{self, InEnvironment, InferenceResult, TraitEnvironment, Ty, TyDefId, TypeCtor, TypeWalk}, - CallableDef, Either, HirDisplay, Name, Source, + CallableDef, Either, HirDisplay, InFile, Name, }; /// hir::Crate describes a single crate. It's the main interface with which @@ -118,7 +118,7 @@ impl ModuleSource { } } - pub fn from_child_node(db: &impl DefDatabase, child: Source<&SyntaxNode>) -> ModuleSource { + pub fn from_child_node(db: &impl DefDatabase, child: InFile<&SyntaxNode>) -> ModuleSource { if let Some(m) = child.value.ancestors().filter_map(ast::Module::cast).find(|it| !it.has_semi()) { @@ -901,7 +901,7 @@ impl Local { Type { krate, ty: InEnvironment { value: ty, environment } } } - pub fn source(self, db: &impl HirDatabase) -> Source> { + pub fn source(self, db: &impl HirDatabase) -> InFile> { let (_body, source_map) = db.body_with_source_map(self.parent.into()); let src = source_map.pat_syntax(self.pat_id).unwrap(); // Hmm... let root = src.file_syntax(db); diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index bf3ee0834..6fd4e7987 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -9,18 +9,18 @@ use crate::{ Module, ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union, }; -pub use hir_expand::Source; +pub use hir_expand::InFile; pub trait HasSource { type Ast; - fn source(self, db: &impl DefDatabase) -> Source; + fn source(self, db: &impl DefDatabase) -> InFile; } /// NB: Module is !HasSource, because it has two source nodes at the same time: /// definition and declaration. impl Module { /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. - pub fn definition_source(self, db: &impl DefDatabase) -> Source { + pub fn definition_source(self, db: &impl DefDatabase) -> InFile { let def_map = db.crate_def_map(self.id.krate); let src = def_map[self.id.local_id].definition_source(db); src.map(|it| match it { @@ -31,7 +31,7 @@ impl Module { /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. /// `None` for the crate root. - pub fn declaration_source(self, db: &impl DefDatabase) -> Option> { + pub fn declaration_source(self, db: &impl DefDatabase) -> Option> { let def_map = db.crate_def_map(self.id.krate); def_map[self.id.local_id].declaration_source(db) } @@ -39,7 +39,7 @@ impl Module { impl HasSource for StructField { type Ast = FieldSource; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { let var = VariantId::from(self.parent); let src = var.child_source(db); src.map(|it| match it[self.id].clone() { @@ -50,67 +50,67 @@ impl HasSource for StructField { } impl HasSource for Struct { type Ast = ast::StructDef; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.id.source(db) } } impl HasSource for Union { type Ast = ast::UnionDef; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.id.source(db) } } impl HasSource for Enum { type Ast = ast::EnumDef; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.id.source(db) } } impl HasSource for EnumVariant { type Ast = ast::EnumVariant; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.parent.id.child_source(db).map(|map| map[self.id].clone()) } } impl HasSource for Function { type Ast = ast::FnDef; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.id.lookup(db).source(db) } } impl HasSource for Const { type Ast = ast::ConstDef; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.id.lookup(db).source(db) } } impl HasSource for Static { type Ast = ast::StaticDef; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.id.lookup(db).source(db) } } impl HasSource for Trait { type Ast = ast::TraitDef; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.id.source(db) } } impl HasSource for TypeAlias { type Ast = ast::TypeAliasDef; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.id.lookup(db).source(db) } } impl HasSource for MacroDef { type Ast = ast::MacroCall; - fn source(self, db: &impl DefDatabase) -> Source { - Source { file_id: self.id.ast_id.file_id(), value: self.id.ast_id.to_node(db) } + fn source(self, db: &impl DefDatabase) -> InFile { + InFile { file_id: self.id.ast_id.file_id(), value: self.id.ast_id.to_node(db) } } } impl HasSource for ImplBlock { type Ast = ast::ImplBlock; - fn source(self, db: &impl DefDatabase) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { self.id.source(db) } } @@ -118,7 +118,7 @@ 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) -> Source { + fn source(self, db: &impl DefDatabase) -> InFile { 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(); diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 9f7c22b21..82bf641dc 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -10,46 +10,46 @@ use ra_syntax::{ use crate::{ db::{AstDatabase, DefDatabase, HirDatabase}, AssocItem, Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, HasSource, ImplBlock, - Local, MacroDef, Module, ModuleDef, ModuleSource, Source, Static, Struct, StructField, Trait, + InFile, Local, MacroDef, Module, ModuleDef, ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union, VariantDef, }; pub trait FromSource: Sized { type Ast; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option; + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option; } impl FromSource for Struct { type Ast = ast::StructDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let id = from_source(db, src)?; Some(Struct { id }) } } impl FromSource for Union { type Ast = ast::UnionDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let id = from_source(db, src)?; Some(Union { id }) } } impl FromSource for Enum { type Ast = ast::EnumDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let id = from_source(db, src)?; Some(Enum { id }) } } impl FromSource for Trait { type Ast = ast::TraitDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let id = from_source(db, src)?; Some(Trait { id }) } } impl FromSource for Function { type Ast = ast::FnDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let items = match Container::find(db, src.as_ref().map(|it| it.syntax()))? { Container::Trait(it) => it.items(db), Container::ImplBlock(it) => it.items(db), @@ -76,7 +76,7 @@ impl FromSource for Function { impl FromSource for Const { type Ast = ast::ConstDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let items = match Container::find(db, src.as_ref().map(|it| it.syntax()))? { Container::Trait(it) => it.items(db), Container::ImplBlock(it) => it.items(db), @@ -102,7 +102,7 @@ impl FromSource for Const { } impl FromSource for Static { type Ast = ast::StaticDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let module = match Container::find(db, src.as_ref().map(|it| it.syntax()))? { Container::Module(it) => it, Container::Trait(_) | Container::ImplBlock(_) => return None, @@ -120,7 +120,7 @@ impl FromSource for Static { impl FromSource for TypeAlias { type Ast = ast::TypeAliasDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let items = match Container::find(db, src.as_ref().map(|it| it.syntax()))? { Container::Trait(it) => it.items(db), Container::ImplBlock(it) => it.items(db), @@ -147,11 +147,11 @@ impl FromSource for TypeAlias { impl FromSource for MacroDef { type Ast = ast::MacroCall; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let kind = MacroDefKind::Declarative; let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax())); - let module = Module::from_definition(db, Source::new(src.file_id, module_src))?; + let module = Module::from_definition(db, InFile::new(src.file_id, module_src))?; let krate = module.krate().crate_id(); let ast_id = AstId::new(src.file_id, db.ast_id_map(src.file_id).ast_id(&src.value)); @@ -163,7 +163,7 @@ impl FromSource for MacroDef { impl FromSource for ImplBlock { type Ast = ast::ImplBlock; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let id = from_source(db, src)?; Some(ImplBlock { id }) } @@ -171,9 +171,9 @@ impl FromSource for ImplBlock { impl FromSource for EnumVariant { type Ast = ast::EnumVariant; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let parent_enum = src.value.parent_enum(); - let src_enum = Source { file_id: src.file_id, value: parent_enum }; + let src_enum = InFile { file_id: src.file_id, value: parent_enum }; let variants = Enum::from_source(db, src_enum)?.variants(db); variants.into_iter().find(|v| same_source(&v.source(db), &src)) } @@ -181,17 +181,17 @@ impl FromSource for EnumVariant { impl FromSource for StructField { type Ast = FieldSource; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option { + fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let variant_def: VariantDef = match src.value { FieldSource::Named(ref field) => { let value = field.syntax().ancestors().find_map(ast::StructDef::cast)?; - let src = Source { file_id: src.file_id, value }; + let src = InFile { file_id: src.file_id, value }; let def = Struct::from_source(db, src)?; VariantDef::from(def) } FieldSource::Pos(ref field) => { let value = field.syntax().ancestors().find_map(ast::EnumVariant::cast)?; - let src = Source { file_id: src.file_id, value }; + let src = InFile { file_id: src.file_id, value }; let def = EnumVariant::from_source(db, src)?; VariantDef::from(def) } @@ -206,14 +206,14 @@ impl FromSource for StructField { } impl Local { - pub fn from_source(db: &impl HirDatabase, src: Source) -> Option { + pub fn from_source(db: &impl HirDatabase, src: InFile) -> Option { let file_id = src.file_id; let parent: DefWithBody = src.value.syntax().ancestors().find_map(|it| { let res = match_ast! { match it { - ast::ConstDef(value) => { Const::from_source(db, Source { value, file_id})?.into() }, - ast::StaticDef(value) => { Static::from_source(db, Source { value, file_id})?.into() }, - ast::FnDef(value) => { Function::from_source(db, Source { value, file_id})?.into() }, + ast::ConstDef(value) => { Const::from_source(db, InFile { value, file_id})?.into() }, + ast::StaticDef(value) => { Static::from_source(db, InFile { value, file_id})?.into() }, + ast::FnDef(value) => { Function::from_source(db, InFile { value, file_id})?.into() }, _ => return None, } }; @@ -227,16 +227,16 @@ impl Local { } impl Module { - pub fn from_declaration(db: &impl DefDatabase, src: Source) -> Option { + pub fn from_declaration(db: &impl DefDatabase, src: InFile) -> Option { let parent_declaration = src.value.syntax().ancestors().skip(1).find_map(ast::Module::cast); let parent_module = match parent_declaration { Some(parent_declaration) => { - let src_parent = Source { file_id: src.file_id, value: parent_declaration }; + let src_parent = InFile { file_id: src.file_id, value: parent_declaration }; Module::from_declaration(db, src_parent) } _ => { - let src_parent = Source { + let src_parent = InFile { file_id: src.file_id, value: ModuleSource::new(db, Some(src.file_id.original_file(db)), None), }; @@ -248,13 +248,13 @@ impl Module { parent_module.child(db, &child_name.as_name()) } - pub fn from_definition(db: &impl DefDatabase, src: Source) -> Option { + pub fn from_definition(db: &impl DefDatabase, src: InFile) -> Option { match src.value { ModuleSource::Module(ref module) => { assert!(!module.has_semi()); return Module::from_declaration( db, - Source { file_id: src.file_id, value: module.clone() }, + InFile { file_id: src.file_id, value: module.clone() }, ); } ModuleSource::SourceFile(_) => (), @@ -271,13 +271,13 @@ impl Module { } } -fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source) -> Option +fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option where N: AstNode, DEF: AstItemDef, { let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax())); - let module = Module::from_definition(db, Source::new(src.file_id, module_src))?; + let module = Module::from_definition(db, InFile::new(src.file_id, module_src))?; let ctx = LocationCtx::new(db, module.id, src.file_id); let items = db.ast_id_map(src.file_id); let item_id = items.ast_id(&src.value); @@ -291,7 +291,7 @@ enum Container { } impl Container { - fn find(db: &impl DefDatabase, src: Source<&SyntaxNode>) -> Option { + fn find(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option { // FIXME: this doesn't try to handle nested declarations for container in src.value.ancestors() { let res = match_ast! { @@ -322,6 +322,6 @@ impl Container { /// In general, we do not guarantee that we have exactly one instance of a /// syntax tree for each file. We probably should add such guarantee, but, for /// the time being, we will use identity-less AstPtr comparison. -fn same_source(s1: &Source, s2: &Source) -> bool { +fn same_source(s1: &InFile, s2: &InFile) -> bool { s1.as_ref().map(AstPtr::new) == s2.as_ref().map(AstPtr::new) } diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 3c12c61f0..88d2f6e02 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -63,5 +63,5 @@ pub use hir_def::{ type_ref::Mutability, }; pub use hir_expand::{ - either::Either, name::Name, HirFileId, MacroCallId, MacroCallLoc, MacroDefId, MacroFile, Source, + either::Either, name::Name, HirFileId, InFile, MacroCallId, MacroCallLoc, MacroDefId, MacroFile, }; diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 76c493f1a..1661d92a2 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -18,7 +18,7 @@ use hir_def::{ AssocItemId, DefWithBodyId, }; use hir_expand::{ - hygiene::Hygiene, name::AsName, AstId, HirFileId, MacroCallId, MacroFileKind, Source, + hygiene::Hygiene, name::AsName, AstId, HirFileId, InFile, MacroCallId, MacroFileKind, }; use ra_syntax::{ ast::{self, AstNode}, @@ -37,7 +37,7 @@ use crate::{ GenericParam, Local, MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, }; -fn try_get_resolver_for_node(db: &impl HirDatabase, node: Source<&SyntaxNode>) -> Option { +fn try_get_resolver_for_node(db: &impl HirDatabase, node: InFile<&SyntaxNode>) -> Option { match_ast! { match (node.value) { ast::Module(it) => { @@ -71,7 +71,7 @@ fn try_get_resolver_for_node(db: &impl HirDatabase, node: Source<&SyntaxNode>) - fn def_with_body_from_child_node( db: &impl HirDatabase, - child: Source<&SyntaxNode>, + child: InFile<&SyntaxNode>, ) -> Option { child.value.ancestors().find_map(|node| { match_ast! { @@ -141,8 +141,8 @@ impl Expansion { pub fn map_token_down( &self, db: &impl HirDatabase, - token: Source<&SyntaxToken>, - ) -> Option> { + token: InFile<&SyntaxToken>, + ) -> Option> { let exp_info = self.file_id().expansion_info(db)?; exp_info.map_token_down(token) } @@ -155,7 +155,7 @@ impl Expansion { impl SourceAnalyzer { pub fn new( db: &impl HirDatabase, - node: Source<&SyntaxNode>, + node: InFile<&SyntaxNode>, offset: Option, ) -> SourceAnalyzer { let def_with_body = def_with_body_from_child_node(db, node); @@ -192,12 +192,12 @@ impl SourceAnalyzer { } fn expr_id(&self, expr: &ast::Expr) -> Option { - let src = Source { file_id: self.file_id, value: expr }; + let src = InFile { file_id: self.file_id, value: expr }; self.body_source_map.as_ref()?.node_expr(src) } fn pat_id(&self, pat: &ast::Pat) -> Option { - let src = Source { file_id: self.file_id, value: pat }; + let src = InFile { file_id: self.file_id, value: pat }; self.body_source_map.as_ref()?.node_pat(src) } @@ -243,7 +243,7 @@ impl SourceAnalyzer { pub fn resolve_macro_call( &self, db: &impl HirDatabase, - macro_call: Source<&ast::MacroCall>, + macro_call: InFile<&ast::MacroCall>, ) -> Option { let hygiene = Hygiene::new(db, macro_call.file_id); let path = macro_call.value.path().and_then(|ast| Path::from_src(ast, &hygiene))?; @@ -318,7 +318,7 @@ impl SourceAnalyzer { let name = name_ref.as_name(); let source_map = self.body_source_map.as_ref()?; let scopes = self.scopes.as_ref()?; - let scope = scope_for(scopes, source_map, Source::new(self.file_id, name_ref.syntax()))?; + let scope = scope_for(scopes, source_map, InFile::new(self.file_id, name_ref.syntax()))?; let entry = scopes.resolve_name_in_scope(scope, &name)?; Some(ScopeEntryWithSyntax { name: entry.name().clone(), @@ -446,7 +446,7 @@ impl SourceAnalyzer { pub fn expand( &self, db: &impl HirDatabase, - macro_call: Source<&ast::MacroCall>, + macro_call: InFile<&ast::MacroCall>, ) -> Option { let def = self.resolve_macro_call(db, macro_call)?.id; let ast_id = AstId::new( @@ -463,19 +463,19 @@ impl SourceAnalyzer { fn scope_for( scopes: &ExprScopes, source_map: &BodySourceMap, - node: Source<&SyntaxNode>, + node: InFile<&SyntaxNode>, ) -> Option { node.value .ancestors() .filter_map(ast::Expr::cast) - .filter_map(|it| source_map.node_expr(Source::new(node.file_id, &it))) + .filter_map(|it| source_map.node_expr(InFile::new(node.file_id, &it))) .find_map(|it| scopes.scope_for(it)) } fn scope_for_offset( scopes: &ExprScopes, source_map: &BodySourceMap, - offset: Source, + offset: InFile, ) -> Option { scopes .scope_by_expr() -- cgit v1.2.3 From e823c578c9f6886fe9db9767cb81e75a6c56bf15 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 28 Nov 2019 16:00:03 +0300 Subject: Use InFile for AstId --- crates/ra_hir/src/code_model/src.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 6fd4e7987..9a755704f 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -105,7 +105,7 @@ impl HasSource for TypeAlias { impl HasSource for MacroDef { type Ast = ast::MacroCall; fn source(self, db: &impl DefDatabase) -> InFile { - InFile { file_id: self.id.ast_id.file_id(), value: self.id.ast_id.to_node(db) } + InFile { file_id: self.id.ast_id.file_id, value: self.id.ast_id.to_node(db) } } } impl HasSource for ImplBlock { -- cgit v1.2.3 From 8f1f5a783a3ffd0afbf5b1fdf22ff9caf7fda928 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 28 Nov 2019 18:05:28 +0300 Subject: Move source-related traits to a separate module --- crates/ra_hir/src/code_model/src.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 9a755704f..2cf210349 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -1,6 +1,9 @@ //! FIXME: write short doc here -use hir_def::{AstItemDef, HasChildSource, HasSource as _, Lookup, VariantId}; +use hir_def::{ + src::{HasChildSource, HasSource as _}, + AstItemDef, Lookup, VariantId, +}; use hir_expand::either::Either; use ra_syntax::ast; -- cgit v1.2.3 From bb601e7eafa00e471a5306ac920f0be6c809aab0 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sat, 30 Nov 2019 23:29:21 +0800 Subject: Add BuiltinShadowMode --- crates/ra_hir/src/source_binder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 1661d92a2..0df7a7cb4 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -286,7 +286,7 @@ impl SourceAnalyzer { let items = self .resolver - .resolve_module_path(db, &path) + .resolve_module_path_in_items(db, &path) .take_types() .map(|it| PathResolution::Def(it.into())); types.or(values).or(items).or_else(|| { -- cgit v1.2.3 From 009437f5d9949d2276aa26040e03af0ab328acf3 Mon Sep 17 00:00:00 2001 From: ice1000 Date: Tue, 3 Dec 2019 11:07:56 -0500 Subject: Replace `ra_hir_expand::either` with crate --- crates/ra_hir/Cargo.toml | 1 + crates/ra_hir/src/code_model.rs | 7 +++++-- crates/ra_hir/src/code_model/src.rs | 12 ++++++------ crates/ra_hir/src/lib.rs | 2 +- crates/ra_hir/src/source_binder.rs | 7 ++++--- 5 files changed, 17 insertions(+), 12 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/Cargo.toml b/crates/ra_hir/Cargo.toml index e79361e7c..6ca9cc2e7 100644 --- a/crates/ra_hir/Cargo.toml +++ b/crates/ra_hir/Cargo.toml @@ -10,6 +10,7 @@ doctest = false [dependencies] log = "0.4.5" rustc-hash = "1.0" +either = "1.5" ra_syntax = { path = "../ra_syntax" } ra_db = { path = "../ra_db" } diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index dddac915b..5877afefa 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -4,6 +4,7 @@ pub(crate) mod src; use std::sync::Arc; +use either::Either; use hir_def::{ adt::VariantData, body::{Body, BodySourceMap}, @@ -30,7 +31,7 @@ use crate::{ db::{DefDatabase, HirDatabase}, ty::display::HirFormatter, ty::{self, InEnvironment, InferenceResult, TraitEnvironment, Ty, TyDefId, TypeCtor, TypeWalk}, - CallableDef, Either, HirDisplay, InFile, Name, + CallableDef, HirDisplay, InFile, Name, }; /// hir::Crate describes a single crate. It's the main interface with which @@ -905,7 +906,9 @@ impl Local { let (_body, source_map) = db.body_with_source_map(self.parent.into()); let src = source_map.pat_syntax(self.pat_id).unwrap(); // Hmm... let root = src.file_syntax(db); - src.map(|ast| ast.map(|it| it.cast().unwrap().to_node(&root), |it| it.to_node(&root))) + src.map(|ast| { + ast.map_left(|it| it.cast().unwrap().to_node(&root)).map_right(|it| it.to_node(&root)) + }) } } diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 2cf210349..36cfbc8f1 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -1,10 +1,10 @@ //! FIXME: write short doc here +use either::Either; use hir_def::{ src::{HasChildSource, HasSource as _}, AstItemDef, Lookup, VariantId, }; -use hir_expand::either::Either; use ra_syntax::ast; use crate::{ @@ -27,8 +27,8 @@ impl Module { let def_map = db.crate_def_map(self.id.krate); let src = def_map[self.id.local_id].definition_source(db); src.map(|it| match it { - Either::A(it) => ModuleSource::SourceFile(it), - Either::B(it) => ModuleSource::Module(it), + Either::Left(it) => ModuleSource::SourceFile(it), + Either::Right(it) => ModuleSource::Module(it), }) } @@ -46,8 +46,8 @@ impl HasSource for StructField { let var = VariantId::from(self.parent); let src = var.child_source(db); src.map(|it| match it[self.id].clone() { - Either::A(it) => FieldSource::Pos(it), - Either::B(it) => FieldSource::Named(it), + Either::Left(it) => FieldSource::Pos(it), + Either::Right(it) => FieldSource::Named(it), }) } } @@ -126,6 +126,6 @@ impl HasSource for Import { 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(|it| it.to_node(&root), |it| it.to_node(&root))) + src.with_value(ptr.map_left(|it| it.to_node(&root)).map_right(|it| it.to_node(&root))) } } diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 88d2f6e02..853760cb1 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -63,5 +63,5 @@ pub use hir_def::{ type_ref::Mutability, }; pub use hir_expand::{ - either::Either, name::Name, HirFileId, InFile, MacroCallId, MacroCallLoc, MacroDefId, MacroFile, + name::Name, HirFileId, InFile, MacroCallId, MacroCallLoc, MacroDefId, MacroFile, }; diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 0df7a7cb4..28d41b647 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -7,6 +7,7 @@ //! purely for "IDE needs". use std::sync::Arc; +use either::Either; use hir_def::{ body::{ scope::{ExprScopes, ScopeId}, @@ -33,8 +34,8 @@ use crate::{ method_resolution::{self, implements_trait}, InEnvironment, TraitEnvironment, Ty, }, - Adt, AssocItem, Const, DefWithBody, Either, Enum, EnumVariant, FromSource, Function, - GenericParam, Local, MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, + Adt, AssocItem, Const, DefWithBody, Enum, EnumVariant, FromSource, Function, GenericParam, + Local, MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, }; fn try_get_resolver_for_node(db: &impl HirDatabase, node: InFile<&SyntaxNode>) -> Option { @@ -349,7 +350,7 @@ impl SourceAnalyzer { // should switch to general reference search infra there. pub fn find_all_refs(&self, pat: &ast::BindPat) -> Vec { let fn_def = pat.syntax().ancestors().find_map(ast::FnDef::cast).unwrap(); - let ptr = Either::A(AstPtr::new(&ast::Pat::from(pat.clone()))); + let ptr = Either::Left(AstPtr::new(&ast::Pat::from(pat.clone()))); fn_def .syntax() .descendants() -- cgit v1.2.3 From 38853459e3d964cc7f635829cdc66f5faee33d85 Mon Sep 17 00:00:00 2001 From: ice1000 Date: Tue, 3 Dec 2019 15:24:02 -0500 Subject: Add `ModuleSource::Block` --- crates/ra_hir/src/code_model.rs | 65 +++---------------------------------- crates/ra_hir/src/code_model/src.rs | 3 +- crates/ra_hir/src/from_source.rs | 8 ++--- crates/ra_hir/src/lib.rs | 5 +-- crates/ra_hir/src/source_binder.rs | 3 +- 5 files changed, 15 insertions(+), 69 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 5877afefa..7706399ae 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -11,6 +11,7 @@ use hir_def::{ builtin_type::BuiltinType, docs::Documentation, expr::{BindingAnnotation, Pat, PatId}, + nameres::ModuleSource, per_ns::PerNs, resolver::HasResolver, type_ref::{Mutability, TypeRef}, @@ -21,11 +22,11 @@ use hir_def::{ use hir_expand::{ diagnostics::DiagnosticSink, name::{self, AsName}, - AstId, MacroDefId, + MacroDefId, }; use hir_ty::expr::ExprValidator; -use ra_db::{CrateId, Edition, FileId, FilePosition}; -use ra_syntax::{ast, AstNode, SyntaxNode}; +use ra_db::{CrateId, Edition}; +use ra_syntax::ast; use crate::{ db::{DefDatabase, HirDatabase}, @@ -79,64 +80,6 @@ impl Crate { } } -pub enum ModuleSource { - SourceFile(ast::SourceFile), - Module(ast::Module), -} - -impl ModuleSource { - pub fn new( - db: &impl DefDatabase, - file_id: Option, - decl_id: Option>, - ) -> ModuleSource { - match (file_id, decl_id) { - (Some(file_id), _) => { - let source_file = db.parse(file_id).tree(); - ModuleSource::SourceFile(source_file) - } - (None, Some(item_id)) => { - let module = item_id.to_node(db); - assert!(module.item_list().is_some(), "expected inline module"); - ModuleSource::Module(module) - } - (None, None) => panic!(), - } - } - - // FIXME: this methods do not belong here - pub fn from_position(db: &impl DefDatabase, position: FilePosition) -> ModuleSource { - let parse = db.parse(position.file_id); - match &ra_syntax::algo::find_node_at_offset::( - parse.tree().syntax(), - position.offset, - ) { - Some(m) if !m.has_semi() => ModuleSource::Module(m.clone()), - _ => { - let source_file = parse.tree(); - ModuleSource::SourceFile(source_file) - } - } - } - - pub fn from_child_node(db: &impl DefDatabase, child: InFile<&SyntaxNode>) -> ModuleSource { - if let Some(m) = - child.value.ancestors().filter_map(ast::Module::cast).find(|it| !it.has_semi()) - { - ModuleSource::Module(m) - } else { - let file_id = child.file_id.original_file(db); - let source_file = db.parse(file_id).tree(); - ModuleSource::SourceFile(source_file) - } - } - - pub fn from_file_id(db: &impl DefDatabase, file_id: FileId) -> ModuleSource { - let source_file = db.parse(file_id).tree(); - ModuleSource::SourceFile(source_file) - } -} - #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct Module { pub(crate) id: ModuleId, diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 36cfbc8f1..083946729 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -2,6 +2,7 @@ use either::Either; use hir_def::{ + nameres::ModuleSource, src::{HasChildSource, HasSource as _}, AstItemDef, Lookup, VariantId, }; @@ -9,7 +10,7 @@ use ra_syntax::ast; use crate::{ db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, Import, MacroDef, - Module, ModuleSource, Static, Struct, StructField, Trait, TypeAlias, Union, + Module, Static, Struct, StructField, Trait, TypeAlias, Union, }; pub use hir_expand::InFile; diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 82bf641dc..94a5e0b0d 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -1,6 +1,6 @@ //! FIXME: write short doc here -use hir_def::{AstItemDef, LocationCtx, ModuleId}; +use hir_def::{nameres::ModuleSource, AstItemDef, LocationCtx, ModuleId}; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; use ra_syntax::{ ast::{self, AstNode, NameOwner}, @@ -10,8 +10,8 @@ use ra_syntax::{ use crate::{ db::{AstDatabase, DefDatabase, HirDatabase}, AssocItem, Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, HasSource, ImplBlock, - InFile, Local, MacroDef, Module, ModuleDef, ModuleSource, Static, Struct, StructField, Trait, - TypeAlias, Union, VariantDef, + InFile, Local, MacroDef, Module, ModuleDef, Static, Struct, StructField, Trait, TypeAlias, + Union, VariantDef, }; pub trait FromSource: Sized { @@ -257,7 +257,7 @@ impl Module { InFile { file_id: src.file_id, value: module.clone() }, ); } - ModuleSource::SourceFile(_) => (), + ModuleSource::SourceFile(_) | ModuleSource::Block(_) => (), }; let original_file = src.file_id.original_file(db); diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 853760cb1..f12e4ca3f 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -43,8 +43,8 @@ pub use crate::{ code_model::{ src::HasSource, Adt, AssocItem, AttrDef, Const, Container, Crate, CrateDependency, DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, GenericParam, - HasAttrs, ImplBlock, Import, Local, MacroDef, Module, ModuleDef, ModuleSource, ScopeDef, - Static, Struct, StructField, Trait, Type, TypeAlias, Union, VariantDef, + HasAttrs, ImplBlock, Import, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, + StructField, Trait, Type, TypeAlias, Union, VariantDef, }, from_source::FromSource, source_binder::{PathResolution, ScopeEntryWithSyntax, SourceAnalyzer}, @@ -59,6 +59,7 @@ pub use hir_def::{ body::scope::ExprScopes, builtin_type::BuiltinType, docs::Documentation, + nameres::ModuleSource, path::{Path, PathKind}, type_ref::Mutability, }; diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 28d41b647..db0451059 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -14,6 +14,7 @@ use hir_def::{ BodySourceMap, }, expr::{ExprId, PatId}, + nameres::ModuleSource, path::known, resolver::{self, resolver_for_scope, HasResolver, Resolver, TypeNs, ValueNs}, AssocItemId, DefWithBodyId, @@ -46,7 +47,7 @@ fn try_get_resolver_for_node(db: &impl HirDatabase, node: InFile<&SyntaxNode>) - Some(crate::Module::from_declaration(db, src)?.id.resolver(db)) }, ast::SourceFile(it) => { - let src = node.with_value(crate::ModuleSource::SourceFile(it)); + let src = node.with_value(ModuleSource::SourceFile(it)); Some(crate::Module::from_definition(db, src)?.id.resolver(db)) }, ast::StructDef(it) => { -- cgit v1.2.3 From 5c5f90ba57c83499a44af33bf8b91b24254fb685 Mon Sep 17 00:00:00 2001 From: ice1000 Date: Tue, 3 Dec 2019 15:28:40 -0500 Subject: Confluent `ModuleSource` usage --- crates/ra_hir/src/code_model/src.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 083946729..d9bccd902 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -26,11 +26,7 @@ impl Module { /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. pub fn definition_source(self, db: &impl DefDatabase) -> InFile { let def_map = db.crate_def_map(self.id.krate); - let src = def_map[self.id.local_id].definition_source(db); - src.map(|it| match it { - Either::Left(it) => ModuleSource::SourceFile(it), - Either::Right(it) => ModuleSource::Module(it), - }) + def_map[self.id.local_id].definition_source(db) } /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. -- cgit v1.2.3 From 032eb3d68e07f087ac531d48f956a79948baa4b9 Mon Sep 17 00:00:00 2001 From: ice1000 Date: Tue, 3 Dec 2019 15:58:38 -0500 Subject: Remove almost unused `ModuleSource::new` --- crates/ra_hir/src/from_source.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 94a5e0b0d..67b127ba5 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -238,7 +238,7 @@ impl Module { _ => { let src_parent = InFile { file_id: src.file_id, - value: ModuleSource::new(db, Some(src.file_id.original_file(db)), None), + value: ModuleSource::from_file_id(db, src.file_id.original_file(db)), }; Module::from_definition(db, src_parent) } -- cgit v1.2.3 From 088f50c0ab351d5ac072547a47c1ce7eeae029f3 Mon Sep 17 00:00:00 2001 From: ice1000 Date: Wed, 4 Dec 2019 13:35:24 -0500 Subject: No block at the moment --- crates/ra_hir/src/from_source.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 67b127ba5..a46bba4f2 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -257,7 +257,7 @@ impl Module { InFile { file_id: src.file_id, value: module.clone() }, ); } - ModuleSource::SourceFile(_) | ModuleSource::Block(_) => (), + ModuleSource::SourceFile(_) => (), }; let original_file = src.file_id.original_file(db); -- cgit v1.2.3 From 7702f690a9592605be71104ec9d0b732af940fcc Mon Sep 17 00:00:00 2001 From: ice1000 Date: Thu, 5 Dec 2019 08:28:31 -0500 Subject: One pub function less is good! --- crates/ra_hir/src/from_source.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index a46bba4f2..18d87f6d7 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -235,11 +235,10 @@ impl Module { let src_parent = InFile { file_id: src.file_id, value: parent_declaration }; Module::from_declaration(db, src_parent) } - _ => { - let src_parent = InFile { - file_id: src.file_id, - value: ModuleSource::from_file_id(db, src.file_id.original_file(db)), - }; + None => { + let source_file = db.parse(src.file_id.original_file(db)).tree(); + let src_parent = + InFile { file_id: src.file_id, value: ModuleSource::SourceFile(source_file) }; Module::from_definition(db, src_parent) } }?; -- cgit v1.2.3 From 0c0ce1ae418a2f3f4fc125bd701cdb327f607002 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 5 Dec 2019 15:16:59 +0100 Subject: Introduce ChildFromSource --- crates/ra_hir/src/from_source.rs | 141 +++++++++++---------------------------- 1 file changed, 40 insertions(+), 101 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 18d87f6d7..58203c721 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -1,17 +1,20 @@ //! FIXME: write short doc here +use either::Either; -use hir_def::{nameres::ModuleSource, AstItemDef, LocationCtx, ModuleId}; +use hir_def::{ + child_from_source::ChildFromSource, nameres::ModuleSource, AstItemDef, EnumVariantId, + LocationCtx, ModuleId, VariantId, +}; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; use ra_syntax::{ ast::{self, AstNode, NameOwner}, - match_ast, AstPtr, SyntaxNode, + match_ast, SyntaxNode, }; use crate::{ db::{AstDatabase, DefDatabase, HirDatabase}, - AssocItem, Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, HasSource, ImplBlock, - InFile, Local, MacroDef, Module, ModuleDef, Static, Struct, StructField, Trait, TypeAlias, - Union, VariantDef, + Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, ImplBlock, InFile, Local, + MacroDef, Module, Static, Struct, StructField, Trait, TypeAlias, Union, }; pub trait FromSource: Sized { @@ -50,98 +53,45 @@ impl FromSource for Trait { impl FromSource for Function { type Ast = ast::FnDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let items = match Container::find(db, src.as_ref().map(|it| it.syntax()))? { - Container::Trait(it) => it.items(db), - Container::ImplBlock(it) => it.items(db), - Container::Module(m) => { - return m - .declarations(db) - .into_iter() - .filter_map(|it| match it { - ModuleDef::Function(it) => Some(it), - _ => None, - }) - .find(|it| same_source(&it.source(db), &src)) - } - }; - items - .into_iter() - .filter_map(|it| match it { - AssocItem::Function(it) => Some(it), - _ => None, - }) - .find(|it| same_source(&it.source(db), &src)) + match Container::find(db, src.as_ref().map(|it| it.syntax()))? { + Container::Trait(it) => it.id.child_from_source(db, src), + Container::ImplBlock(it) => it.id.child_from_source(db, src), + Container::Module(it) => it.id.child_from_source(db, src), + } + .map(Function::from) } } impl FromSource for Const { type Ast = ast::ConstDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let items = match Container::find(db, src.as_ref().map(|it| it.syntax()))? { - Container::Trait(it) => it.items(db), - Container::ImplBlock(it) => it.items(db), - Container::Module(m) => { - return m - .declarations(db) - .into_iter() - .filter_map(|it| match it { - ModuleDef::Const(it) => Some(it), - _ => None, - }) - .find(|it| same_source(&it.source(db), &src)) - } - }; - items - .into_iter() - .filter_map(|it| match it { - AssocItem::Const(it) => Some(it), - _ => None, - }) - .find(|it| same_source(&it.source(db), &src)) + match Container::find(db, src.as_ref().map(|it| it.syntax()))? { + Container::Trait(it) => it.id.child_from_source(db, src), + Container::ImplBlock(it) => it.id.child_from_source(db, src), + Container::Module(it) => it.id.child_from_source(db, src), + } + .map(Const::from) } } impl FromSource for Static { type Ast = ast::StaticDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let module = match Container::find(db, src.as_ref().map(|it| it.syntax()))? { - Container::Module(it) => it, - Container::Trait(_) | Container::ImplBlock(_) => return None, - }; - module - .declarations(db) - .into_iter() - .filter_map(|it| match it { - ModuleDef::Static(it) => Some(it), - _ => None, - }) - .find(|it| same_source(&it.source(db), &src)) + match Container::find(db, src.as_ref().map(|it| it.syntax()))? { + Container::Module(it) => it.id.child_from_source(db, src).map(Static::from), + Container::Trait(_) | Container::ImplBlock(_) => None, + } } } impl FromSource for TypeAlias { type Ast = ast::TypeAliasDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let items = match Container::find(db, src.as_ref().map(|it| it.syntax()))? { - Container::Trait(it) => it.items(db), - Container::ImplBlock(it) => it.items(db), - Container::Module(m) => { - return m - .declarations(db) - .into_iter() - .filter_map(|it| match it { - ModuleDef::TypeAlias(it) => Some(it), - _ => None, - }) - .find(|it| same_source(&it.source(db), &src)) - } - }; - items - .into_iter() - .filter_map(|it| match it { - AssocItem::TypeAlias(it) => Some(it), - _ => None, - }) - .find(|it| same_source(&it.source(db), &src)) + match Container::find(db, src.as_ref().map(|it| it.syntax()))? { + Container::Trait(it) => it.id.child_from_source(db, src), + Container::ImplBlock(it) => it.id.child_from_source(db, src), + Container::Module(it) => it.id.child_from_source(db, src), + } + .map(TypeAlias::from) } } @@ -174,34 +124,33 @@ impl FromSource for EnumVariant { fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { let parent_enum = src.value.parent_enum(); let src_enum = InFile { file_id: src.file_id, value: parent_enum }; - let variants = Enum::from_source(db, src_enum)?.variants(db); - variants.into_iter().find(|v| same_source(&v.source(db), &src)) + let parent_enum = Enum::from_source(db, src_enum)?; + parent_enum.id.child_from_source(db, src).map(EnumVariant::from) } } impl FromSource for StructField { type Ast = FieldSource; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let variant_def: VariantDef = match src.value { + let variant_id: VariantId = match src.value { FieldSource::Named(ref field) => { let value = field.syntax().ancestors().find_map(ast::StructDef::cast)?; let src = InFile { file_id: src.file_id, value }; let def = Struct::from_source(db, src)?; - VariantDef::from(def) + def.id.into() } FieldSource::Pos(ref field) => { let value = field.syntax().ancestors().find_map(ast::EnumVariant::cast)?; let src = InFile { file_id: src.file_id, value }; let def = EnumVariant::from_source(db, src)?; - VariantDef::from(def) + EnumVariantId::from(def).into() } }; - variant_def - .variant_data(db) - .fields() - .iter() - .map(|(id, _)| StructField { parent: variant_def, id }) - .find(|f| f.source(db) == src) + let src = src.map(|field_source| match field_source { + FieldSource::Pos(it) => Either::Left(it), + FieldSource::Named(it) => Either::Right(it), + }); + variant_id.child_from_source(db, src).map(StructField::from) } } @@ -314,13 +263,3 @@ impl Container { Some(Container::Module(c)) } } - -/// XXX: AST Nodes and SyntaxNodes have identity equality semantics: nodes are -/// equal if they point to exactly the same object. -/// -/// In general, we do not guarantee that we have exactly one instance of a -/// syntax tree for each file. We probably should add such guarantee, but, for -/// the time being, we will use identity-less AstPtr comparison. -fn same_source(s1: &InFile, s2: &InFile) -> bool { - s1.as_ref().map(AstPtr::new) == s2.as_ref().map(AstPtr::new) -} -- cgit v1.2.3 From 1a567f5ca28b40c1cd744c9123a59695fab351de Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 5 Dec 2019 16:53:17 +0100 Subject: Reduce copy-paste --- crates/ra_hir/src/from_source.rs | 50 ++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 20 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 58203c721..6fa947759 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -2,8 +2,8 @@ use either::Either; use hir_def::{ - child_from_source::ChildFromSource, nameres::ModuleSource, AstItemDef, EnumVariantId, - LocationCtx, ModuleId, VariantId, + child_from_source::ChildFromSource, nameres::ModuleSource, AstItemDef, EnumVariantId, ImplId, + LocationCtx, ModuleId, TraitId, VariantId, }; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; use ra_syntax::{ @@ -53,24 +53,18 @@ impl FromSource for Trait { impl FromSource for Function { type Ast = ast::FnDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - match Container::find(db, src.as_ref().map(|it| it.syntax()))? { - Container::Trait(it) => it.id.child_from_source(db, src), - Container::ImplBlock(it) => it.id.child_from_source(db, src), - Container::Module(it) => it.id.child_from_source(db, src), - } - .map(Function::from) + Container::find(db, src.as_ref().map(|it| it.syntax()))? + .child_from_source(db, src) + .map(Function::from) } } impl FromSource for Const { type Ast = ast::ConstDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - match Container::find(db, src.as_ref().map(|it| it.syntax()))? { - Container::Trait(it) => it.id.child_from_source(db, src), - Container::ImplBlock(it) => it.id.child_from_source(db, src), - Container::Module(it) => it.id.child_from_source(db, src), - } - .map(Const::from) + Container::find(db, src.as_ref().map(|it| it.syntax()))? + .child_from_source(db, src) + .map(Const::from) } } impl FromSource for Static { @@ -86,12 +80,9 @@ impl FromSource for Static { impl FromSource for TypeAlias { type Ast = ast::TypeAliasDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - match Container::find(db, src.as_ref().map(|it| it.syntax()))? { - Container::Trait(it) => it.id.child_from_source(db, src), - Container::ImplBlock(it) => it.id.child_from_source(db, src), - Container::Module(it) => it.id.child_from_source(db, src), - } - .map(TypeAlias::from) + Container::find(db, src.as_ref().map(|it| it.syntax()))? + .child_from_source(db, src) + .map(TypeAlias::from) } } @@ -263,3 +254,22 @@ impl Container { Some(Container::Module(c)) } } + +impl ChildFromSource for Container +where + TraitId: ChildFromSource, + ImplId: ChildFromSource, + ModuleId: ChildFromSource, +{ + fn child_from_source( + &self, + db: &impl DefDatabase, + child_source: InFile, + ) -> Option { + match self { + Container::Trait(it) => it.id.child_from_source(db, child_source), + Container::ImplBlock(it) => it.id.child_from_source(db, child_source), + Container::Module(it) => it.id.child_from_source(db, child_source), + } + } +} -- cgit v1.2.3 From 18f6a995d0fc1f45099f3cc810a5d55d5401b41b Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Thu, 5 Dec 2019 15:10:33 +0100 Subject: Add expansion infrastructure for derive macros --- crates/ra_hir/src/code_model/src.rs | 5 ++++- crates/ra_hir/src/from_source.rs | 4 ++-- crates/ra_hir/src/source_binder.rs | 5 +++-- 3 files changed, 9 insertions(+), 5 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index d9bccd902..78a454082 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -105,7 +105,10 @@ impl HasSource for TypeAlias { impl HasSource for MacroDef { type Ast = ast::MacroCall; fn source(self, db: &impl DefDatabase) -> InFile { - InFile { file_id: self.id.ast_id.file_id, value: self.id.ast_id.to_node(db) } + InFile { + file_id: self.id.ast_id.expect("MacroDef without ast_id").file_id, + value: self.id.ast_id.expect("MacroDef without ast_id").to_node(db), + } } } impl HasSource for ImplBlock { diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 18d87f6d7..0d3ecbc77 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -152,9 +152,9 @@ impl FromSource for MacroDef { let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax())); let module = Module::from_definition(db, InFile::new(src.file_id, module_src))?; - let krate = module.krate().crate_id(); + let krate = Some(module.krate().crate_id()); - let ast_id = AstId::new(src.file_id, db.ast_id_map(src.file_id).ast_id(&src.value)); + let ast_id = Some(AstId::new(src.file_id, db.ast_id_map(src.file_id).ast_id(&src.value))); let id: MacroDefId = MacroDefId { krate, ast_id, kind }; Some(MacroDef { id }) diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index db0451059..42c392513 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -20,7 +20,8 @@ use hir_def::{ AssocItemId, DefWithBodyId, }; use hir_expand::{ - hygiene::Hygiene, name::AsName, AstId, HirFileId, InFile, MacroCallId, MacroFileKind, + hygiene::Hygiene, name::AsName, AstId, HirFileId, InFile, MacroCallId, MacroCallKind, + MacroFileKind, }; use ra_syntax::{ ast::{self, AstNode}, @@ -456,7 +457,7 @@ impl SourceAnalyzer { db.ast_id_map(macro_call.file_id).ast_id(macro_call.value), ); Some(Expansion { - macro_call_id: def.as_call_id(db, ast_id), + macro_call_id: def.as_call_id(db, MacroCallKind::FnLike(ast_id)), macro_file_kind: to_macro_file_kind(macro_call.value), }) } -- cgit v1.2.3 From a565072ddeac519eea3b415a57e9fd208e20e562 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 6 Dec 2019 19:30:15 +0100 Subject: Try to make go to definition work in format! SourceAnalyzer didn't work properly within expression macro expansions because it didn't find the enclosing function. Fix this by going up the expansion chain to find ancestors. This makes the test work, but apparently in real usage it's still not working. --- crates/ra_hir/src/source_binder.rs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 42c392513..cb4345ca1 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -76,18 +76,30 @@ fn def_with_body_from_child_node( db: &impl HirDatabase, child: InFile<&SyntaxNode>, ) -> Option { - child.value.ancestors().find_map(|node| { + ancestors_with_macros(db, child).find_map(|node| { + let n = &node.value; match_ast! { - match node { - ast::FnDef(def) => { return Function::from_source(db, child.with_value(def)).map(DefWithBody::from); }, - ast::ConstDef(def) => { return Const::from_source(db, child.with_value(def)).map(DefWithBody::from); }, - ast::StaticDef(def) => { return Static::from_source(db, child.with_value(def)).map(DefWithBody::from); }, + match n { + ast::FnDef(def) => { return Function::from_source(db, node.with_value(def)).map(DefWithBody::from); }, + ast::ConstDef(def) => { return Const::from_source(db, node.with_value(def)).map(DefWithBody::from); }, + ast::StaticDef(def) => { return Static::from_source(db, node.with_value(def)).map(DefWithBody::from); }, _ => { None }, } } }) } +fn ancestors_with_macros<'a>( + db: &'a (impl HirDatabase), + node: InFile<&SyntaxNode>, +) -> impl Iterator> + 'a { + let file = node.with_value(()); // keep just the file id for borrow checker purposes + let parent_node = node.file_id.call_node(db); + let parent_ancestors: Box>> = + Box::new(parent_node.into_iter().flat_map(move |n| ancestors_with_macros(db, n.as_ref()))); + node.value.ancestors().map(move |n| file.with_value(n)).chain(parent_ancestors) +} + /// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of /// original source files. It should not be used inside the HIR itself. #[derive(Debug)] @@ -135,6 +147,7 @@ pub struct ReferenceDescriptor { pub name: String, } +#[derive(Debug)] pub struct Expansion { macro_file_kind: MacroFileKind, macro_call_id: MacroCallId, -- cgit v1.2.3 From 8c86963d47953045f2f33ee6620d305a6589641e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 5 Dec 2019 23:34:12 +0100 Subject: DynMap This might, or might not help us to reduce boilerplate associated with plumbing values from analysis to the IDE layer --- crates/ra_hir/src/from_source.rs | 74 +++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 36 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 5cb222bd3..437f800c1 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -1,9 +1,7 @@ //! FIXME: write short doc here -use either::Either; - use hir_def::{ - child_from_source::ChildFromSource, nameres::ModuleSource, AstItemDef, EnumVariantId, ImplId, - LocationCtx, ModuleId, TraitId, VariantId, + child_by_source::ChildBySource, dyn_map::DynMap, keys, nameres::ModuleSource, AstItemDef, + EnumVariantId, LocationCtx, ModuleId, VariantId, }; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; use ra_syntax::{ @@ -53,8 +51,9 @@ impl FromSource for Trait { impl FromSource for Function { type Ast = ast::FnDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - Container::find(db, src.as_ref().map(|it| it.syntax()))? - .child_from_source(db, src) + Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db)[keys::FUNCTION] + .get(&src) + .copied() .map(Function::from) } } @@ -62,26 +61,29 @@ impl FromSource for Function { impl FromSource for Const { type Ast = ast::ConstDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - Container::find(db, src.as_ref().map(|it| it.syntax()))? - .child_from_source(db, src) + Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db)[keys::CONST] + .get(&src) + .copied() .map(Const::from) } } impl FromSource for Static { type Ast = ast::StaticDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - match Container::find(db, src.as_ref().map(|it| it.syntax()))? { - Container::Module(it) => it.id.child_from_source(db, src).map(Static::from), - Container::Trait(_) | Container::ImplBlock(_) => None, - } + Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db)[keys::STATIC] + .get(&src) + .copied() + .map(Static::from) } } impl FromSource for TypeAlias { type Ast = ast::TypeAliasDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - Container::find(db, src.as_ref().map(|it| it.syntax()))? - .child_from_source(db, src) + Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db) + [keys::TYPE_ALIAS] + .get(&src) + .copied() .map(TypeAlias::from) } } @@ -116,32 +118,41 @@ impl FromSource for EnumVariant { let parent_enum = src.value.parent_enum(); let src_enum = InFile { file_id: src.file_id, value: parent_enum }; let parent_enum = Enum::from_source(db, src_enum)?; - parent_enum.id.child_from_source(db, src).map(EnumVariant::from) + parent_enum.id.child_by_source(db)[keys::ENUM_VARIANT] + .get(&src) + .copied() + .map(EnumVariant::from) } } impl FromSource for StructField { type Ast = FieldSource; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { + let src = src.as_ref(); + + // FIXME this is buggy let variant_id: VariantId = match src.value { - FieldSource::Named(ref field) => { + FieldSource::Named(field) => { let value = field.syntax().ancestors().find_map(ast::StructDef::cast)?; let src = InFile { file_id: src.file_id, value }; let def = Struct::from_source(db, src)?; def.id.into() } - FieldSource::Pos(ref field) => { + FieldSource::Pos(field) => { let value = field.syntax().ancestors().find_map(ast::EnumVariant::cast)?; let src = InFile { file_id: src.file_id, value }; let def = EnumVariant::from_source(db, src)?; EnumVariantId::from(def).into() } }; - let src = src.map(|field_source| match field_source { - FieldSource::Pos(it) => Either::Left(it), - FieldSource::Named(it) => Either::Right(it), - }); - variant_id.child_from_source(db, src).map(StructField::from) + + let dyn_map = variant_id.child_by_source(db); + match src.value { + FieldSource::Pos(it) => dyn_map[keys::TUPLE_FIELD].get(&src.with_value(it.clone())), + FieldSource::Named(it) => dyn_map[keys::RECORD_FIELD].get(&src.with_value(it.clone())), + } + .copied() + .map(StructField::from) } } @@ -255,21 +266,12 @@ impl Container { } } -impl ChildFromSource for Container -where - TraitId: ChildFromSource, - ImplId: ChildFromSource, - ModuleId: ChildFromSource, -{ - fn child_from_source( - &self, - db: &impl DefDatabase, - child_source: InFile, - ) -> Option { +impl ChildBySource for Container { + fn child_by_source(&self, db: &impl DefDatabase) -> DynMap { match self { - Container::Trait(it) => it.id.child_from_source(db, child_source), - Container::ImplBlock(it) => it.id.child_from_source(db, child_source), - Container::Module(it) => it.id.child_from_source(db, child_source), + Container::Trait(it) => it.id.child_by_source(db), + Container::ImplBlock(it) => it.id.child_by_source(db), + Container::Module(it) => it.id.child_by_source(db), } } } -- cgit v1.2.3 From b2c01f446edcbc12b5dd870064cbfc6c1a47eb8b Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 6 Dec 2019 21:46:18 +0100 Subject: Implement ancestors_with_macros in a better way --- crates/ra_hir/src/source_binder.rs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index cb4345ca1..0e136b904 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -76,7 +76,7 @@ fn def_with_body_from_child_node( db: &impl HirDatabase, child: InFile<&SyntaxNode>, ) -> Option { - ancestors_with_macros(db, child).find_map(|node| { + child.cloned().ancestors_with_macros(db).find_map(|node| { let n = &node.value; match_ast! { match n { @@ -89,17 +89,6 @@ fn def_with_body_from_child_node( }) } -fn ancestors_with_macros<'a>( - db: &'a (impl HirDatabase), - node: InFile<&SyntaxNode>, -) -> impl Iterator> + 'a { - let file = node.with_value(()); // keep just the file id for borrow checker purposes - let parent_node = node.file_id.call_node(db); - let parent_ancestors: Box>> = - Box::new(parent_node.into_iter().flat_map(move |n| ancestors_with_macros(db, n.as_ref()))); - node.value.ancestors().map(move |n| file.with_value(n)).chain(parent_ancestors) -} - /// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of /// original source files. It should not be used inside the HIR itself. #[derive(Debug)] -- cgit v1.2.3 From 8e9837df21942ca12a5aece0a868ea46eb405742 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 7 Dec 2019 11:50:36 +0100 Subject: Remove idx and parent generics from generics This makes `hir_def::GenericParams` flatter. The logic for re-numbering the params is moved to hir instead. --- crates/ra_hir/src/code_model.rs | 5 ++--- crates/ra_hir/src/source_binder.rs | 10 ++-------- 2 files changed, 4 insertions(+), 11 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 7706399ae..29ace8479 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -15,7 +15,7 @@ use hir_def::{ per_ns::PerNs, resolver::HasResolver, type_ref::{Mutability, TypeRef}, - AdtId, AstItemDef, ConstId, ContainerId, DefWithBodyId, EnumId, FunctionId, GenericDefId, + AdtId, AstItemDef, ConstId, ContainerId, DefWithBodyId, EnumId, FunctionId, GenericParamId, HasModule, ImplId, LocalEnumVariantId, LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, UnionId, }; @@ -857,8 +857,7 @@ impl Local { #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] pub struct GenericParam { - pub(crate) parent: GenericDefId, - pub(crate) idx: u32, + pub(crate) id: GenericParamId, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 0e136b904..8c4b635d2 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -262,10 +262,7 @@ impl SourceAnalyzer { ) -> Option { let types = self.resolver.resolve_path_in_type_ns_fully(db, &path).map(|ty| match ty { TypeNs::SelfType(it) => PathResolution::SelfType(it.into()), - TypeNs::GenericParam(idx) => PathResolution::GenericParam(GenericParam { - parent: self.resolver.generic_def().unwrap(), - idx, - }), + TypeNs::GenericParam(id) => PathResolution::GenericParam(GenericParam { id }), TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => { PathResolution::Def(Adt::from(it).into()) } @@ -337,10 +334,7 @@ impl SourceAnalyzer { resolver::ScopeDef::PerNs(it) => it.into(), resolver::ScopeDef::ImplSelfType(it) => ScopeDef::ImplSelfType(it.into()), resolver::ScopeDef::AdtSelfType(it) => ScopeDef::AdtSelfType(it.into()), - resolver::ScopeDef::GenericParam(idx) => { - let parent = self.resolver.generic_def().unwrap(); - ScopeDef::GenericParam(GenericParam { parent, idx }) - } + resolver::ScopeDef::GenericParam(id) => ScopeDef::GenericParam(GenericParam { id }), resolver::ScopeDef::Local(pat_id) => { let parent = self.resolver.body_owner().unwrap().into(); ScopeDef::Local(Local { parent, pat_id }) -- cgit v1.2.3 From dda9587e75f4fd1740d16531038023ff582ef43f Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 7 Dec 2019 18:24:52 +0100 Subject: Track source of type parameters --- crates/ra_hir/src/code_model/src.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 78a454082..8f04ebd23 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -9,8 +9,8 @@ use hir_def::{ use ra_syntax::ast; use crate::{ - db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, Import, MacroDef, - Module, Static, Struct, StructField, Trait, TypeAlias, Union, + db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, GenericParam, ImplBlock, + Import, MacroDef, Module, Static, Struct, StructField, Trait, TypeAlias, Union, }; pub use hir_expand::InFile; @@ -129,3 +129,11 @@ impl HasSource for Import { src.with_value(ptr.map_left(|it| it.to_node(&root)).map_right(|it| it.to_node(&root))) } } + +impl HasSource for GenericParam { + type Ast = Either; + fn source(self, db: &impl DefDatabase) -> InFile { + let child_source = self.id.parent.child_source(db); + child_source.map(|it| it[self.id.local_id].clone()) + } +} -- cgit v1.2.3 From 1692f07393dba4f5c122df1a609d5b18751bf406 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 7 Dec 2019 18:48:35 +0100 Subject: ToNav for GenericParam --- crates/ra_hir/src/code_model.rs | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 29ace8479..8833750c8 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -860,6 +860,13 @@ pub struct GenericParam { pub(crate) id: GenericParamId, } +impl GenericParam { + pub fn name(self, db: &impl HirDatabase) -> Name { + let params = db.generic_params(self.id.parent); + params.params[self.id.local_id].name.clone() + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct ImplBlock { pub(crate) id: ImplId, -- cgit v1.2.3 From 7d2080a0311cab62388f416beeb360695dbc5ded Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 7 Dec 2019 19:52:09 +0100 Subject: Classify name works for TypeParams --- crates/ra_hir/src/code_model.rs | 4 ++++ crates/ra_hir/src/from_source.rs | 23 ++++++++++++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 8833750c8..0295eb948 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -865,6 +865,10 @@ impl GenericParam { let params = db.generic_params(self.id.parent); params.params[self.id.local_id].name.clone() } + + pub fn module(self, db: &impl HirDatabase) -> Module { + self.id.parent.module(db).into() + } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 437f800c1..686ab1d79 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -1,7 +1,7 @@ //! FIXME: write short doc here use hir_def::{ child_by_source::ChildBySource, dyn_map::DynMap, keys, nameres::ModuleSource, AstItemDef, - EnumVariantId, LocationCtx, ModuleId, VariantId, + EnumVariantId, GenericDefId, LocationCtx, ModuleId, VariantId, }; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; use ra_syntax::{ @@ -11,8 +11,8 @@ use ra_syntax::{ use crate::{ db::{AstDatabase, DefDatabase, HirDatabase}, - Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, ImplBlock, InFile, Local, - MacroDef, Module, Static, Struct, StructField, Trait, TypeAlias, Union, + Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, GenericParam, ImplBlock, InFile, + Local, MacroDef, Module, Static, Struct, StructField, Trait, TypeAlias, Union, }; pub trait FromSource: Sized { @@ -177,6 +177,23 @@ impl Local { } } +impl GenericParam { + pub fn from_source(db: &impl HirDatabase, src: InFile) -> Option { + let file_id = src.file_id; + let parent: GenericDefId = src.value.syntax().ancestors().find_map(|it| { + let res = match_ast! { + match it { + ast::FnDef(value) => { Function::from_source(db, InFile { value, file_id})?.id.into() }, + _ => return None, + } + }; + Some(res) + })?; + let &id = parent.child_by_source(db)[keys::TYPE_PARAM].get(&src)?; + Some(GenericParam { id }) + } +} + impl Module { pub fn from_declaration(db: &impl DefDatabase, src: InFile) -> Option { let parent_declaration = src.value.syntax().ancestors().skip(1).find_map(ast::Module::cast); -- cgit v1.2.3 From f4f8b8147426b0096d4b5126e487caaa13d13c27 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 7 Dec 2019 20:05:08 +0100 Subject: Get the right analyzer for impls --- crates/ra_hir/src/source_binder.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 8c4b635d2..2957e496c 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -37,7 +37,7 @@ use crate::{ InEnvironment, TraitEnvironment, Ty, }, Adt, AssocItem, Const, DefWithBody, Enum, EnumVariant, FromSource, Function, GenericParam, - Local, MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, + ImplBlock, Local, MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, }; fn try_get_resolver_for_node(db: &impl HirDatabase, node: InFile<&SyntaxNode>) -> Option { @@ -59,6 +59,10 @@ fn try_get_resolver_for_node(db: &impl HirDatabase, node: InFile<&SyntaxNode>) - let src = node.with_value(it); Some(Enum::from_source(db, src)?.id.resolver(db)) }, + ast::ImplBlock(it) => { + let src = node.with_value(it); + Some(ImplBlock::from_source(db, src)?.id.resolver(db)) + }, _ => match node.value.kind() { FN_DEF | CONST_DEF | STATIC_DEF => { let def = def_with_body_from_child_node(db, node)?; -- cgit v1.2.3 From 88c5b1282a5770097c6c768b24bedfc3a6944e08 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 7 Dec 2019 20:09:53 +0100 Subject: Rename GenericParam -> TypeParam We don't have LifetimeParam yet, but they are planned! --- crates/ra_hir/src/code_model.rs | 16 ++++++++-------- crates/ra_hir/src/code_model/src.rs | 6 +++--- crates/ra_hir/src/from_source.rs | 8 ++++---- crates/ra_hir/src/lib.rs | 6 +++--- crates/ra_hir/src/source_binder.rs | 10 +++++----- 5 files changed, 23 insertions(+), 23 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 0295eb948..4578a0ba8 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -15,9 +15,9 @@ use hir_def::{ per_ns::PerNs, resolver::HasResolver, type_ref::{Mutability, TypeRef}, - AdtId, AstItemDef, ConstId, ContainerId, DefWithBodyId, EnumId, FunctionId, GenericParamId, - HasModule, ImplId, LocalEnumVariantId, LocalImportId, LocalModuleId, LocalStructFieldId, - Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, UnionId, + AdtId, AstItemDef, ConstId, ContainerId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, + LocalEnumVariantId, LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, + StaticId, StructId, TraitId, TypeAliasId, TypeParamId, UnionId, }; use hir_expand::{ diagnostics::DiagnosticSink, @@ -856,14 +856,14 @@ impl Local { } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -pub struct GenericParam { - pub(crate) id: GenericParamId, +pub struct TypeParam { + pub(crate) id: TypeParamId, } -impl GenericParam { +impl TypeParam { pub fn name(self, db: &impl HirDatabase) -> Name { let params = db.generic_params(self.id.parent); - params.params[self.id.local_id].name.clone() + params.types[self.id.local_id].name.clone() } pub fn module(self, db: &impl HirDatabase) -> Module { @@ -1111,7 +1111,7 @@ impl HirDisplay for Type { pub enum ScopeDef { ModuleDef(ModuleDef), MacroDef(MacroDef), - GenericParam(GenericParam), + GenericParam(TypeParam), ImplSelfType(ImplBlock), AdtSelfType(Adt), Local(Local), diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 8f04ebd23..b09582f93 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -9,8 +9,8 @@ use hir_def::{ use ra_syntax::ast; use crate::{ - db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, GenericParam, ImplBlock, - Import, MacroDef, Module, Static, Struct, StructField, Trait, TypeAlias, Union, + db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, Import, MacroDef, + Module, Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union, }; pub use hir_expand::InFile; @@ -130,7 +130,7 @@ impl HasSource for Import { } } -impl HasSource for GenericParam { +impl HasSource for TypeParam { type Ast = Either; fn source(self, db: &impl DefDatabase) -> InFile { let child_source = self.id.parent.child_source(db); diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 686ab1d79..68e59fc1e 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -11,8 +11,8 @@ use ra_syntax::{ use crate::{ db::{AstDatabase, DefDatabase, HirDatabase}, - Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, GenericParam, ImplBlock, InFile, - Local, MacroDef, Module, Static, Struct, StructField, Trait, TypeAlias, Union, + Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, ImplBlock, InFile, Local, + MacroDef, Module, Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union, }; pub trait FromSource: Sized { @@ -177,7 +177,7 @@ impl Local { } } -impl GenericParam { +impl TypeParam { pub fn from_source(db: &impl HirDatabase, src: InFile) -> Option { let file_id = src.file_id; let parent: GenericDefId = src.value.syntax().ancestors().find_map(|it| { @@ -190,7 +190,7 @@ impl GenericParam { Some(res) })?; let &id = parent.child_by_source(db)[keys::TYPE_PARAM].get(&src)?; - Some(GenericParam { id }) + Some(TypeParam { id }) } } diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index f12e4ca3f..9eb34b5dc 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -42,9 +42,9 @@ pub mod from_source; pub use crate::{ code_model::{ src::HasSource, Adt, AssocItem, AttrDef, Const, Container, Crate, CrateDependency, - DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, GenericParam, - HasAttrs, ImplBlock, Import, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, - StructField, Trait, Type, TypeAlias, Union, VariantDef, + DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, HasAttrs, + ImplBlock, Import, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, + StructField, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, }, from_source::FromSource, source_binder::{PathResolution, ScopeEntryWithSyntax, SourceAnalyzer}, diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 2957e496c..b80aaeb90 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -36,8 +36,8 @@ use crate::{ method_resolution::{self, implements_trait}, InEnvironment, TraitEnvironment, Ty, }, - Adt, AssocItem, Const, DefWithBody, Enum, EnumVariant, FromSource, Function, GenericParam, - ImplBlock, Local, MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, + Adt, AssocItem, Const, DefWithBody, Enum, EnumVariant, FromSource, Function, ImplBlock, Local, + MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, TypeParam, }; fn try_get_resolver_for_node(db: &impl HirDatabase, node: InFile<&SyntaxNode>) -> Option { @@ -112,7 +112,7 @@ pub enum PathResolution { /// A local binding (only value namespace) Local(Local), /// A generic parameter - GenericParam(GenericParam), + TypeParam(TypeParam), SelfType(crate::ImplBlock), Macro(MacroDef), AssocItem(crate::AssocItem), @@ -266,7 +266,7 @@ impl SourceAnalyzer { ) -> Option { let types = self.resolver.resolve_path_in_type_ns_fully(db, &path).map(|ty| match ty { TypeNs::SelfType(it) => PathResolution::SelfType(it.into()), - TypeNs::GenericParam(id) => PathResolution::GenericParam(GenericParam { id }), + TypeNs::GenericParam(id) => PathResolution::TypeParam(TypeParam { id }), TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => { PathResolution::Def(Adt::from(it).into()) } @@ -338,7 +338,7 @@ impl SourceAnalyzer { resolver::ScopeDef::PerNs(it) => it.into(), resolver::ScopeDef::ImplSelfType(it) => ScopeDef::ImplSelfType(it.into()), resolver::ScopeDef::AdtSelfType(it) => ScopeDef::AdtSelfType(it.into()), - resolver::ScopeDef::GenericParam(id) => ScopeDef::GenericParam(GenericParam { id }), + resolver::ScopeDef::GenericParam(id) => ScopeDef::GenericParam(TypeParam { id }), resolver::ScopeDef::Local(pat_id) => { let parent = self.resolver.body_owner().unwrap().into(); ScopeDef::Local(Local { parent, pat_id }) -- cgit v1.2.3 From 6e2e60cbc9226dd3f43cf2b83ff6f5a0cf39e639 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 7 Dec 2019 21:55:02 +0100 Subject: Discover type parameters in more cases --- crates/ra_hir/src/from_source.rs | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 68e59fc1e..4acc038e4 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -184,6 +184,11 @@ impl TypeParam { let res = match_ast! { match it { ast::FnDef(value) => { Function::from_source(db, InFile { value, file_id})?.id.into() }, + ast::StructDef(value) => { Struct::from_source(db, InFile { value, file_id})?.id.into() }, + ast::EnumDef(value) => { Enum::from_source(db, InFile { value, file_id})?.id.into() }, + ast::TraitDef(value) => { Trait::from_source(db, InFile { value, file_id})?.id.into() }, + ast::TypeAliasDef(value) => { TypeAlias::from_source(db, InFile { value, file_id})?.id.into() }, + ast::ImplBlock(value) => { ImplBlock::from_source(db, InFile { value, file_id})?.id.into() }, _ => return None, } }; -- cgit v1.2.3 From 509fedd9d2f228c6dca762cbf06c31af34ac0c75 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sun, 8 Dec 2019 16:16:52 +0800 Subject: Remove MacroFileKind --- crates/ra_hir/src/source_binder.rs | 41 ++------------------------------------ 1 file changed, 2 insertions(+), 39 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index b80aaeb90..c5a920688 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -21,7 +21,6 @@ use hir_def::{ }; use hir_expand::{ hygiene::Hygiene, name::AsName, AstId, HirFileId, InFile, MacroCallId, MacroCallKind, - MacroFileKind, }; use ra_syntax::{ ast::{self, AstNode}, @@ -142,7 +141,6 @@ pub struct ReferenceDescriptor { #[derive(Debug)] pub struct Expansion { - macro_file_kind: MacroFileKind, macro_call_id: MacroCallId, } @@ -157,7 +155,7 @@ impl Expansion { } pub fn file_id(&self) -> HirFileId { - self.macro_call_id.as_file(self.macro_file_kind) + self.macro_call_id.as_file() } } @@ -456,10 +454,7 @@ impl SourceAnalyzer { macro_call.file_id, db.ast_id_map(macro_call.file_id).ast_id(macro_call.value), ); - Some(Expansion { - macro_call_id: def.as_call_id(db, MacroCallKind::FnLike(ast_id)), - macro_file_kind: to_macro_file_kind(macro_call.value), - }) + Some(Expansion { macro_call_id: def.as_call_id(db, MacroCallKind::FnLike(ast_id)) }) } } @@ -543,35 +538,3 @@ fn adjust( }) .map(|(_ptr, scope)| *scope) } - -/// Given a `ast::MacroCall`, return what `MacroKindFile` it belongs to. -/// FIXME: Not completed -fn to_macro_file_kind(macro_call: &ast::MacroCall) -> MacroFileKind { - let syn = macro_call.syntax(); - let parent = match syn.parent() { - Some(it) => it, - None => { - // FIXME: - // If it is root, which means the parent HirFile - // MacroKindFile must be non-items - // return expr now. - return MacroFileKind::Expr; - } - }; - - match parent.kind() { - MACRO_ITEMS | SOURCE_FILE => MacroFileKind::Items, - LET_STMT => { - // FIXME: Handle Pattern - MacroFileKind::Expr - } - EXPR_STMT => MacroFileKind::Statements, - BLOCK => MacroFileKind::Statements, - ARG_LIST => MacroFileKind::Expr, - TRY_EXPR => MacroFileKind::Expr, - _ => { - // Unknown , Just guess it is `Items` - MacroFileKind::Items - } - } -} -- cgit v1.2.3 From 08d3166c8b23b5a342f32e088f7e0d6e032ec17b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 12:01:45 +0100 Subject: Cleanup Crate API --- crates/ra_hir/src/code_model.rs | 48 ++++++++++++++++++++++++++-------------- crates/ra_hir/src/debug.rs | 4 ++-- crates/ra_hir/src/from_id.rs | 4 ++-- crates/ra_hir/src/from_source.rs | 2 +- 4 files changed, 36 insertions(+), 22 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 4578a0ba8..3695115e4 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -25,7 +25,7 @@ use hir_expand::{ MacroDefId, }; use hir_ty::expr::ExprValidator; -use ra_db::{CrateId, Edition}; +use ra_db::{CrateId, Edition, FileId}; use ra_syntax::ast; use crate::{ @@ -40,7 +40,7 @@ use crate::{ /// root module. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct Crate { - pub(crate) crate_id: CrateId, + pub(crate) id: CrateId, } #[derive(Debug)] @@ -50,33 +50,47 @@ pub struct CrateDependency { } impl Crate { - pub fn crate_id(self) -> CrateId { - self.crate_id - } - pub fn dependencies(self, db: &impl DefDatabase) -> Vec { db.crate_graph() - .dependencies(self.crate_id) + .dependencies(self.id) .map(|dep| { - let krate = Crate { crate_id: dep.crate_id() }; + let krate = Crate { id: dep.crate_id() }; let name = dep.as_name(); CrateDependency { krate, name } }) .collect() } + // FIXME: add `transitive_reverse_dependencies`. + pub fn reverse_dependencies(self, db: &impl DefDatabase) -> Vec { + let crate_graph = db.crate_graph(); + crate_graph + .iter() + .filter(|&krate| crate_graph.dependencies(krate).any(|it| it.crate_id == self.id)) + .map(|id| Crate { id }) + .collect() + } + pub fn root_module(self, db: &impl DefDatabase) -> Option { - let module_id = db.crate_def_map(self.crate_id).root; + let module_id = db.crate_def_map(self.id).root; Some(Module::new(self, module_id)) } + pub fn root_file(self, db: &impl DefDatabase) -> FileId { + db.crate_graph().crate_root(self.id) + } + pub fn edition(self, db: &impl DefDatabase) -> Edition { let crate_graph = db.crate_graph(); - crate_graph.edition(self.crate_id) + crate_graph.edition(self.id) } pub fn all(db: &impl DefDatabase) -> Vec { - db.crate_graph().iter().map(|crate_id| Crate { crate_id }).collect() + db.crate_graph().iter().map(|id| Crate { id }).collect() + } + + pub fn crate_id(self) -> CrateId { + self.id } } @@ -115,7 +129,7 @@ pub use hir_def::attr::Attrs; impl Module { pub(crate) fn new(krate: Crate, crate_module_id: LocalModuleId) -> Module { - Module { id: ModuleId { krate: krate.crate_id, local_id: crate_module_id } } + Module { id: ModuleId { krate: krate.id, local_id: crate_module_id } } } /// Name of this module. @@ -133,7 +147,7 @@ impl Module { /// Returns the crate this module is part of. pub fn krate(self) -> Crate { - Crate { crate_id: self.id.krate } + Crate { id: self.id.krate } } /// Topmost parent of this module. Every module has a `crate_root`, but some @@ -878,11 +892,11 @@ pub struct ImplBlock { impl ImplBlock { pub fn all_in_crate(db: &impl HirDatabase, krate: Crate) -> Vec { - let impls = db.impls_in_crate(krate.crate_id); + let impls = db.impls_in_crate(krate.id); impls.all_impls().map(Self::from).collect() } pub fn for_trait(db: &impl HirDatabase, krate: Crate, trait_: Trait) -> Vec { - let impls = db.impls_in_crate(krate.crate_id); + let impls = db.impls_in_crate(krate.id); impls.lookup_impl_blocks_for_trait(trait_.id).map(Self::from).collect() } @@ -915,7 +929,7 @@ impl ImplBlock { } pub fn krate(&self, db: &impl DefDatabase) -> Crate { - Crate { crate_id: self.module(db).id.krate } + Crate { id: self.module(db).id.krate } } } @@ -1053,7 +1067,7 @@ impl Type { krate: Crate, mut callback: impl FnMut(AssocItem) -> Option, ) -> Option { - for krate in self.ty.value.def_crates(db, krate.crate_id)? { + for krate in self.ty.value.def_crates(db, krate.id)? { let impls = db.impls_in_crate(krate); for impl_block in impls.lookup_impl_blocks(&self.ty.value) { diff --git a/crates/ra_hir/src/debug.rs b/crates/ra_hir/src/debug.rs index 7a2810f71..6cd5c8cb9 100644 --- a/crates/ra_hir/src/debug.rs +++ b/crates/ra_hir/src/debug.rs @@ -57,9 +57,9 @@ pub trait HirDebugDatabase { impl HirDebugDatabase for DB { fn debug_crate(&self, krate: Crate, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { let mut builder = fmt.debug_tuple("Crate"); - match self.crate_name(krate.crate_id) { + match self.crate_name(krate.id) { Some(name) => builder.field(&name), - None => builder.field(&krate.crate_id), + None => builder.field(&krate.id), } .finish() } diff --git a/crates/ra_hir/src/from_id.rs b/crates/ra_hir/src/from_id.rs index e96a18d12..0398d0ee6 100644 --- a/crates/ra_hir/src/from_id.rs +++ b/crates/ra_hir/src/from_id.rs @@ -14,8 +14,8 @@ use crate::{ }; impl From for Crate { - fn from(crate_id: ra_db::CrateId) -> Self { - Crate { crate_id } + fn from(id: ra_db::CrateId) -> Self { + Crate { id } } } diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 4acc038e4..071ca2e5a 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -95,7 +95,7 @@ impl FromSource for MacroDef { let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax())); let module = Module::from_definition(db, InFile::new(src.file_id, module_src))?; - let krate = Some(module.krate().crate_id()); + let krate = Some(module.krate().id); let ast_id = Some(AstId::new(src.file_id, db.ast_id_map(src.file_id).ast_id(&src.value))); -- cgit v1.2.3 From 200bda3daf66f338e9bb1d833146f06fb81f829e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 12:16:57 +0100 Subject: Cleanup Field ty --- crates/ra_hir/src/code_model.rs | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 3695115e4..e854b22bf 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -265,8 +265,10 @@ impl StructField { self.parent.variant_data(db).fields()[self.id].name.clone() } - pub fn ty(&self, db: &impl HirDatabase) -> Ty { - db.field_types(self.parent.into())[self.id].clone() + pub fn ty(&self, db: &impl HirDatabase) -> Type { + let var_id = self.parent.into(); + let ty = db.field_types(var_id)[self.id].clone(); + Type::new(db, self.parent.module(db).id.krate.into(), var_id, ty) } pub fn parent_def(&self, _db: &impl HirDatabase) -> VariantDef { @@ -940,15 +942,19 @@ pub struct Type { } impl Type { + fn new(db: &impl HirDatabase, krate: CrateId, lexical_env: impl HasResolver, ty: Ty) -> Type { + let resolver = lexical_env.resolver(db); + let environment = TraitEnvironment::lower(db, &resolver); + Type { krate, ty: InEnvironment { value: ty, environment } } + } + fn from_def( db: &impl HirDatabase, krate: CrateId, def: impl HasResolver + Into, ) -> Type { - let resolver = def.resolver(db); - let environment = TraitEnvironment::lower(db, &resolver); let ty = db.ty(def.into()); - Type { krate, ty: InEnvironment { value: ty, environment } } + Type::new(db, krate, def, ty) } pub fn is_bool(&self) -> bool { @@ -1039,11 +1045,16 @@ impl Type { ) -> Vec<(StructField, Type)> { // FIXME: check that ty and def match match &self.ty.value { - Ty::Apply(a_ty) => def - .fields(db) - .into_iter() - .map(|it| (it, self.derived(it.ty(db).subst(&a_ty.parameters)))) - .collect(), + Ty::Apply(a_ty) => { + let field_types = db.field_types(def.into()); + def.fields(db) + .into_iter() + .map(|it| { + let ty = field_types[it.id].clone().subst(&a_ty.parameters); + (it, self.derived(ty)) + }) + .collect() + } _ => Vec::new(), } } -- cgit v1.2.3 From 7aacf9a19739f53a45840df2d08b5f3cca761192 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 12:20:59 +0100 Subject: Drop some unused methods --- crates/ra_hir/src/code_model.rs | 48 +--------------------------------------- crates/ra_hir/src/from_source.rs | 6 +++-- 2 files changed, 5 insertions(+), 49 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index e854b22bf..9cbea024a 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -158,13 +158,6 @@ impl Module { self.with_module_id(def_map.root) } - /// Finds a child module with the specified name. - pub fn child(self, db: &impl DefDatabase, name: &Name) -> Option { - let def_map = db.crate_def_map(self.id.krate); - let child_id = def_map[self.id.local_id].children.get(name)?; - Some(self.with_module_id(*child_id)) - } - /// Iterates over all child modules. pub fn children(self, db: &impl DefDatabase) -> impl Iterator { let def_map = db.crate_def_map(self.id.krate); @@ -238,7 +231,7 @@ impl Module { def_map[self.id.local_id].impls.iter().copied().map(ImplBlock::from).collect() } - fn with_module_id(self, module_id: LocalModuleId) -> Module { + pub(crate) fn with_module_id(self, module_id: LocalModuleId) -> Module { Module::new(self.krate(), module_id) } } @@ -303,23 +296,10 @@ impl Struct { .collect() } - pub fn field(self, db: &impl HirDatabase, name: &Name) -> Option { - db.struct_data(self.id.into()) - .variant_data - .fields() - .iter() - .find(|(_id, data)| data.name == *name) - .map(|(id, _)| StructField { parent: self.into(), id }) - } - pub fn ty(self, db: &impl HirDatabase) -> Type { Type::from_def(db, self.id.module(db).krate, self.id) } - pub fn constructor_ty(self, db: &impl HirDatabase) -> Ty { - db.value_ty(self.id.into()) - } - fn variant_data(self, db: &impl DefDatabase) -> Arc { db.struct_data(self.id.into()).variant_data.clone() } @@ -352,15 +332,6 @@ impl Union { .collect() } - pub fn field(self, db: &impl HirDatabase, name: &Name) -> Option { - db.union_data(self.id) - .variant_data - .fields() - .iter() - .find(|(_id, data)| data.name == *name) - .map(|(id, _)| StructField { parent: self.into(), id }) - } - fn variant_data(self, db: &impl DefDatabase) -> Arc { db.union_data(self.id).variant_data.clone() } @@ -392,11 +363,6 @@ impl Enum { .collect() } - pub fn variant(self, db: &impl DefDatabase, name: &Name) -> Option { - let id = db.enum_data(self.id).variant(name)?; - Some(EnumVariant { parent: self, id }) - } - pub fn ty(self, db: &impl HirDatabase) -> Type { Type::from_def(db, self.id.module(db).krate, self.id) } @@ -428,14 +394,6 @@ impl EnumVariant { .collect() } - pub fn field(self, db: &impl HirDatabase, name: &Name) -> Option { - self.variant_data(db) - .fields() - .iter() - .find(|(_id, data)| data.name == *name) - .map(|(id, _)| StructField { parent: self.into(), id }) - } - pub(crate) fn variant_data(self, db: &impl DefDatabase) -> Arc { db.enum_data(self.parent.id).variants[self.id].variant_data.clone() } @@ -561,10 +519,6 @@ impl Function { db.body(self.id.into()) } - pub fn ty(self, db: &impl HirDatabase) -> Ty { - db.value_ty(self.id.into()) - } - pub fn infer(self, db: &impl HirDatabase) -> Arc { db.infer(self.id.into()) } diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 071ca2e5a..307f3d5bf 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -216,8 +216,10 @@ impl Module { } }?; - let child_name = src.value.name()?; - parent_module.child(db, &child_name.as_name()) + let child_name = src.value.name()?.as_name(); + let def_map = db.crate_def_map(parent_module.id.krate); + let child_id = def_map[parent_module.id.local_id].children.get(&child_name)?; + Some(parent_module.with_module_id(*child_id)) } pub fn from_definition(db: &impl DefDatabase, src: InFile) -> Option { -- cgit v1.2.3 From b017bae8370e166034ac569c357b662358d45f19 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 12:26:53 +0100 Subject: remove `infer` method from CodeModel --- crates/ra_hir/src/code_model.rs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 9cbea024a..0100ac91c 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -31,7 +31,7 @@ use ra_syntax::ast; use crate::{ db::{DefDatabase, HirDatabase}, ty::display::HirFormatter, - ty::{self, InEnvironment, InferenceResult, TraitEnvironment, Ty, TyDefId, TypeCtor, TypeWalk}, + ty::{self, InEnvironment, TraitEnvironment, Ty, TyDefId, TypeCtor, TypeWalk}, CallableDef, HirDisplay, InFile, Name, }; @@ -519,10 +519,6 @@ impl Function { db.body(self.id.into()) } - pub fn infer(self, db: &impl HirDatabase) -> Arc { - db.infer(self.id.into()) - } - /// The containing impl block, if this is a method. pub fn impl_block(self, db: &impl DefDatabase) -> Option { match self.container(db) { @@ -548,7 +544,7 @@ impl Function { } pub fn diagnostics(self, db: &impl HirDatabase, sink: &mut DiagnosticSink) { - let infer = self.infer(db); + let infer = db.infer(self.id.into()); infer.add_diagnostics(db, self.id, sink); let mut validator = ExprValidator::new(self.id, infer, sink); validator.validate_body(db); @@ -573,10 +569,6 @@ impl Const { db.const_data(self.id).name.clone() } - pub fn infer(self, db: &impl HirDatabase) -> Arc { - db.infer(self.id.into()) - } - /// The containing impl block, if this is a type alias. pub fn impl_block(self, db: &impl DefDatabase) -> Option { match self.container(db) { @@ -615,10 +607,6 @@ impl Static { pub fn krate(self, db: &impl DefDatabase) -> Option { Some(self.module(db).krate()) } - - pub fn infer(self, db: &impl HirDatabase) -> Arc { - db.infer(self.id.into()) - } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -- cgit v1.2.3 From b77d7c24aa929e53a2bc2a0ffa319de9bf1ab1fa Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 12:27:21 +0100 Subject: Remove bodies from code_model --- crates/ra_hir/src/code_model.rs | 9 --------- 1 file changed, 9 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 0100ac91c..906716dfc 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -7,7 +7,6 @@ use std::sync::Arc; use either::Either; use hir_def::{ adt::VariantData, - body::{Body, BodySourceMap}, builtin_type::BuiltinType, docs::Documentation, expr::{BindingAnnotation, Pat, PatId}, @@ -511,14 +510,6 @@ impl Function { db.function_data(self.id).params.clone() } - pub fn body_source_map(self, db: &impl HirDatabase) -> Arc { - db.body_with_source_map(self.id.into()).1 - } - - pub fn body(self, db: &impl HirDatabase) -> Arc { - db.body(self.id.into()) - } - /// The containing impl block, if this is a method. pub fn impl_block(self, db: &impl DefDatabase) -> Option { match self.container(db) { -- cgit v1.2.3 From b37c6a746b6c7cf85dc1ec6e40ac41455b8f2ec0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 12:44:14 +0100 Subject: Remove ty from code_model --- crates/ra_hir/src/code_model.rs | 36 ++++++++++++++++-------------------- crates/ra_hir/src/from_id.rs | 14 +++++++------- crates/ra_hir/src/lib.rs | 7 +------ crates/ra_hir/src/source_binder.rs | 24 ++++++++++++------------ crates/ra_hir/src/ty.rs | 4 ---- 5 files changed, 36 insertions(+), 49 deletions(-) delete mode 100644 crates/ra_hir/src/ty.rs (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 906716dfc..3d956afa7 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -23,14 +23,15 @@ use hir_expand::{ name::{self, AsName}, MacroDefId, }; -use hir_ty::expr::ExprValidator; +use hir_ty::{ + autoderef, display::HirFormatter, expr::ExprValidator, ApplicationTy, Canonical, InEnvironment, + TraitEnvironment, Ty, TyDefId, TypeCtor, TypeWalk, +}; use ra_db::{CrateId, Edition, FileId}; use ra_syntax::ast; use crate::{ db::{DefDatabase, HirDatabase}, - ty::display::HirFormatter, - ty::{self, InEnvironment, TraitEnvironment, Ty, TyDefId, TypeCtor, TypeWalk}, CallableDef, HirDisplay, InFile, Name, }; @@ -87,10 +88,6 @@ impl Crate { pub fn all(db: &impl DefDatabase) -> Vec { db.crate_graph().iter().map(|id| Crate { id }).collect() } - - pub fn crate_id(self) -> CrateId { - self.id - } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -937,7 +934,7 @@ impl Type { pub fn fields(&self, db: &impl HirDatabase) -> Vec<(StructField, Type)> { if let Ty::Apply(a_ty) = &self.ty.value { match a_ty.ctor { - ty::TypeCtor::Adt(AdtId::StructId(s)) => { + TypeCtor::Adt(AdtId::StructId(s)) => { let var_def = s.into(); return db .field_types(var_def) @@ -959,7 +956,7 @@ impl Type { let mut res = Vec::new(); if let Ty::Apply(a_ty) = &self.ty.value { match a_ty.ctor { - ty::TypeCtor::Tuple { .. } => { + TypeCtor::Tuple { .. } => { for ty in a_ty.parameters.iter() { let ty = ty.clone().subst(&a_ty.parameters); res.push(self.derived(ty)); @@ -995,10 +992,10 @@ impl Type { pub fn autoderef<'a>(&'a self, db: &'a impl HirDatabase) -> impl Iterator + 'a { // There should be no inference vars in types passed here // FIXME check that? - let canonical = crate::ty::Canonical { value: self.ty.value.clone(), num_vars: 0 }; + let canonical = Canonical { value: self.ty.value.clone(), num_vars: 0 }; let environment = self.ty.environment.clone(); let ty = InEnvironment { value: canonical, environment: environment.clone() }; - ty::autoderef(db, Some(self.krate), ty) + autoderef(db, Some(self.krate), ty) .map(|canonical| canonical.value) .map(move |ty| self.derived(ty)) } @@ -1038,15 +1035,14 @@ impl Type { // FIXME: provide required accessors such that it becomes implementable from outside. pub fn is_equal_for_find_impls(&self, other: &Type) -> bool { match (&self.ty.value, &other.ty.value) { - (Ty::Apply(a_original_ty), Ty::Apply(ty::ApplicationTy { ctor, parameters })) => { - match ctor { - TypeCtor::Ref(..) => match parameters.as_single() { - Ty::Apply(a_ty) => a_original_ty.ctor == a_ty.ctor, - _ => false, - }, - _ => a_original_ty.ctor == *ctor, - } - } + (Ty::Apply(a_original_ty), Ty::Apply(ApplicationTy { ctor, parameters })) => match ctor + { + TypeCtor::Ref(..) => match parameters.as_single() { + Ty::Apply(a_ty) => a_original_ty.ctor == a_ty.ctor, + _ => false, + }, + _ => a_original_ty.ctor == *ctor, + }, _ => false, } } diff --git a/crates/ra_hir/src/from_id.rs b/crates/ra_hir/src/from_id.rs index 0398d0ee6..75a1a7772 100644 --- a/crates/ra_hir/src/from_id.rs +++ b/crates/ra_hir/src/from_id.rs @@ -9,16 +9,10 @@ use hir_def::{ }; use crate::{ - Adt, AssocItem, AttrDef, Crate, DefWithBody, EnumVariant, GenericDef, ModuleDef, StructField, + Adt, AssocItem, AttrDef, DefWithBody, EnumVariant, GenericDef, ModuleDef, StructField, VariantDef, }; -impl From for Crate { - fn from(id: ra_db::CrateId) -> Self { - Crate { id } - } -} - macro_rules! from_id { ($(($id:path, $ty:path)),*) => {$( impl From<$id> for $ty { @@ -26,10 +20,16 @@ macro_rules! from_id { $ty { id } } } + impl From<$ty> for $id { + fn from(ty: $ty) -> $id { + ty.id + } + } )*} } from_id![ + (ra_db::CrateId, crate::Crate), (hir_def::ModuleId, crate::Module), (hir_def::StructId, crate::Struct), (hir_def::UnionId, crate::Union), diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 9eb34b5dc..bb22882b1 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -31,7 +31,6 @@ pub mod debug; pub mod db; pub mod source_binder; -mod ty; pub mod diagnostics; mod from_id; @@ -48,11 +47,6 @@ pub use crate::{ }, from_source::FromSource, source_binder::{PathResolution, ScopeEntryWithSyntax, SourceAnalyzer}, - ty::{ - display::HirDisplay, - primitive::{FloatBitness, FloatTy, IntBitness, IntTy, Signedness, Uncertain}, - ApplicationTy, CallableDef, Substs, TraitRef, Ty, TypeCtor, TypeWalk, - }, }; pub use hir_def::{ @@ -66,3 +60,4 @@ pub use hir_def::{ pub use hir_expand::{ name::Name, HirFileId, InFile, MacroCallId, MacroCallLoc, MacroDefId, MacroFile, }; +pub use hir_ty::{display::HirDisplay, CallableDef}; diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index c5a920688..9efd0477c 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -22,6 +22,10 @@ use hir_def::{ use hir_expand::{ hygiene::Hygiene, name::AsName, AstId, HirFileId, InFile, MacroCallId, MacroCallKind, }; +use hir_ty::{ + method_resolution::{self, implements_trait}, + Canonical, InEnvironment, InferenceResult, TraitEnvironment, Ty, +}; use ra_syntax::{ ast::{self, AstNode}, match_ast, AstPtr, @@ -30,13 +34,9 @@ use ra_syntax::{ }; use crate::{ - db::HirDatabase, - ty::{ - method_resolution::{self, implements_trait}, - InEnvironment, TraitEnvironment, Ty, - }, - Adt, AssocItem, Const, DefWithBody, Enum, EnumVariant, FromSource, Function, ImplBlock, Local, - MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, TypeParam, + db::HirDatabase, Adt, AssocItem, Const, DefWithBody, Enum, EnumVariant, FromSource, Function, + ImplBlock, Local, MacroDef, Name, Path, ScopeDef, Static, Struct, Trait, Type, TypeAlias, + TypeParam, }; fn try_get_resolver_for_node(db: &impl HirDatabase, node: InFile<&SyntaxNode>) -> Option { @@ -100,7 +100,7 @@ pub struct SourceAnalyzer { resolver: Resolver, body_owner: Option, body_source_map: Option>, - infer: Option>, + infer: Option>, scopes: Option>, } @@ -376,7 +376,7 @@ impl SourceAnalyzer { // There should be no inference vars in types passed here // FIXME check that? // FIXME replace Unknown by bound vars here - let canonical = crate::ty::Canonical { value: ty.ty.value.clone(), num_vars: 0 }; + let canonical = Canonical { value: ty.ty.value.clone(), num_vars: 0 }; method_resolution::iterate_method_candidates( &canonical, db, @@ -400,7 +400,7 @@ impl SourceAnalyzer { // There should be no inference vars in types passed here // FIXME check that? // FIXME replace Unknown by bound vars here - let canonical = crate::ty::Canonical { value: ty.ty.value.clone(), num_vars: 0 }; + let canonical = Canonical { value: ty.ty.value.clone(), num_vars: 0 }; method_resolution::iterate_method_candidates( &canonical, db, @@ -418,7 +418,7 @@ impl SourceAnalyzer { // ) -> impl Iterator + 'a { // // There should be no inference vars in types passed here // // FIXME check that? - // let canonical = crate::ty::Canonical { value: ty, num_vars: 0 }; + // let canonical = Canonical { value: ty, num_vars: 0 }; // let krate = self.resolver.krate(); // let environment = TraitEnvironment::lower(db, &self.resolver); // let ty = crate::ty::InEnvironment { value: canonical, environment }; @@ -440,7 +440,7 @@ impl SourceAnalyzer { _ => return false, }; - let canonical_ty = crate::ty::Canonical { value: ty, num_vars: 0 }; + let canonical_ty = Canonical { value: ty, num_vars: 0 }; implements_trait(&canonical_ty, db, &self.resolver, krate.into(), std_future_trait) } diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs deleted file mode 100644 index 4ed69c00d..000000000 --- a/crates/ra_hir/src/ty.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! The type system. We currently use this to infer types for completion, hover -//! information and various assists. - -pub use hir_ty::*; -- cgit v1.2.3 From e2cc55207619f987fd5cc274628b8e49e15ec856 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 12:51:25 +0100 Subject: Remove dead code --- crates/ra_hir/src/code_model.rs | 33 --------------------------------- 1 file changed, 33 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 3d956afa7..7ac1bf461 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -507,30 +507,6 @@ impl Function { db.function_data(self.id).params.clone() } - /// The containing impl block, if this is a method. - pub fn impl_block(self, db: &impl DefDatabase) -> Option { - match self.container(db) { - Some(Container::ImplBlock(it)) => Some(it), - _ => None, - } - } - - /// The containing trait, if this is a trait method definition. - pub fn parent_trait(self, db: &impl DefDatabase) -> Option { - match self.container(db) { - Some(Container::Trait(it)) => Some(it), - _ => None, - } - } - - pub fn container(self, db: &impl DefDatabase) -> Option { - match self.id.lookup(db).container { - ContainerId::TraitId(it) => Some(Container::Trait(it.into())), - ContainerId::ImplId(it) => Some(Container::ImplBlock(it.into())), - ContainerId::ModuleId(_) => None, - } - } - pub fn diagnostics(self, db: &impl HirDatabase, sink: &mut DiagnosticSink) { let infer = db.infer(self.id.into()); infer.add_diagnostics(db, self.id, sink); @@ -709,15 +685,6 @@ impl AssocItem { AssocItem::TypeAlias(t) => t.module(db), } } - - pub fn container(self, db: &impl DefDatabase) -> Container { - match self { - AssocItem::Function(f) => f.container(db), - AssocItem::Const(c) => c.container(db), - AssocItem::TypeAlias(t) => t.container(db), - } - .expect("AssocItem without container") - } } #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] -- cgit v1.2.3 From 6805bb01e203e7a1cbc145382a16c0069a5de6d5 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 12:57:13 +0100 Subject: Cleanup module structure --- crates/ra_hir/src/code_model.rs | 3 - crates/ra_hir/src/code_model/src.rs | 139 ------------------------------------ crates/ra_hir/src/has_source.rs | 139 ++++++++++++++++++++++++++++++++++++ crates/ra_hir/src/lib.rs | 12 ++-- 4 files changed, 146 insertions(+), 147 deletions(-) delete mode 100644 crates/ra_hir/src/code_model/src.rs create mode 100644 crates/ra_hir/src/has_source.rs (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 7ac1bf461..fd30971b0 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -1,7 +1,4 @@ //! FIXME: write short doc here - -pub(crate) mod src; - use std::sync::Arc; use either::Either; diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs deleted file mode 100644 index b09582f93..000000000 --- a/crates/ra_hir/src/code_model/src.rs +++ /dev/null @@ -1,139 +0,0 @@ -//! FIXME: write short doc here - -use either::Either; -use hir_def::{ - nameres::ModuleSource, - src::{HasChildSource, HasSource as _}, - AstItemDef, Lookup, VariantId, -}; -use ra_syntax::ast; - -use crate::{ - db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, Import, MacroDef, - Module, Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union, -}; - -pub use hir_expand::InFile; - -pub trait HasSource { - type Ast; - fn source(self, db: &impl DefDatabase) -> InFile; -} - -/// NB: Module is !HasSource, because it has two source nodes at the same time: -/// definition and declaration. -impl Module { - /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. - pub fn definition_source(self, db: &impl DefDatabase) -> InFile { - let def_map = db.crate_def_map(self.id.krate); - def_map[self.id.local_id].definition_source(db) - } - - /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. - /// `None` for the crate root. - pub fn declaration_source(self, db: &impl DefDatabase) -> Option> { - let def_map = db.crate_def_map(self.id.krate); - def_map[self.id.local_id].declaration_source(db) - } -} - -impl HasSource for StructField { - type Ast = FieldSource; - fn source(self, db: &impl DefDatabase) -> InFile { - let var = VariantId::from(self.parent); - let src = var.child_source(db); - src.map(|it| match it[self.id].clone() { - Either::Left(it) => FieldSource::Pos(it), - Either::Right(it) => FieldSource::Named(it), - }) - } -} -impl HasSource for Struct { - type Ast = ast::StructDef; - fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(db) - } -} -impl HasSource for Union { - type Ast = ast::UnionDef; - fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(db) - } -} -impl HasSource for Enum { - type Ast = ast::EnumDef; - fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(db) - } -} -impl HasSource for EnumVariant { - type Ast = ast::EnumVariant; - fn source(self, db: &impl DefDatabase) -> InFile { - self.parent.id.child_source(db).map(|map| map[self.id].clone()) - } -} -impl HasSource for Function { - type Ast = ast::FnDef; - fn source(self, db: &impl DefDatabase) -> InFile { - self.id.lookup(db).source(db) - } -} -impl HasSource for Const { - type Ast = ast::ConstDef; - fn source(self, db: &impl DefDatabase) -> InFile { - self.id.lookup(db).source(db) - } -} -impl HasSource for Static { - type Ast = ast::StaticDef; - fn source(self, db: &impl DefDatabase) -> InFile { - self.id.lookup(db).source(db) - } -} -impl HasSource for Trait { - type Ast = ast::TraitDef; - fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(db) - } -} -impl HasSource for TypeAlias { - type Ast = ast::TypeAliasDef; - fn source(self, db: &impl DefDatabase) -> InFile { - self.id.lookup(db).source(db) - } -} -impl HasSource for MacroDef { - type Ast = ast::MacroCall; - fn source(self, db: &impl DefDatabase) -> InFile { - InFile { - file_id: self.id.ast_id.expect("MacroDef without ast_id").file_id, - value: self.id.ast_id.expect("MacroDef without ast_id").to_node(db), - } - } -} -impl HasSource for ImplBlock { - type Ast = ast::ImplBlock; - fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(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) -> InFile { - 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; - fn source(self, db: &impl DefDatabase) -> InFile { - let child_source = self.id.parent.child_source(db); - child_source.map(|it| it[self.id.local_id].clone()) - } -} diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs new file mode 100644 index 000000000..b09582f93 --- /dev/null +++ b/crates/ra_hir/src/has_source.rs @@ -0,0 +1,139 @@ +//! FIXME: write short doc here + +use either::Either; +use hir_def::{ + nameres::ModuleSource, + src::{HasChildSource, HasSource as _}, + AstItemDef, Lookup, VariantId, +}; +use ra_syntax::ast; + +use crate::{ + db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, Import, MacroDef, + Module, Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union, +}; + +pub use hir_expand::InFile; + +pub trait HasSource { + type Ast; + fn source(self, db: &impl DefDatabase) -> InFile; +} + +/// NB: Module is !HasSource, because it has two source nodes at the same time: +/// definition and declaration. +impl Module { + /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. + pub fn definition_source(self, db: &impl DefDatabase) -> InFile { + let def_map = db.crate_def_map(self.id.krate); + def_map[self.id.local_id].definition_source(db) + } + + /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. + /// `None` for the crate root. + pub fn declaration_source(self, db: &impl DefDatabase) -> Option> { + let def_map = db.crate_def_map(self.id.krate); + def_map[self.id.local_id].declaration_source(db) + } +} + +impl HasSource for StructField { + type Ast = FieldSource; + fn source(self, db: &impl DefDatabase) -> InFile { + let var = VariantId::from(self.parent); + let src = var.child_source(db); + src.map(|it| match it[self.id].clone() { + Either::Left(it) => FieldSource::Pos(it), + Either::Right(it) => FieldSource::Named(it), + }) + } +} +impl HasSource for Struct { + type Ast = ast::StructDef; + fn source(self, db: &impl DefDatabase) -> InFile { + self.id.source(db) + } +} +impl HasSource for Union { + type Ast = ast::UnionDef; + fn source(self, db: &impl DefDatabase) -> InFile { + self.id.source(db) + } +} +impl HasSource for Enum { + type Ast = ast::EnumDef; + fn source(self, db: &impl DefDatabase) -> InFile { + self.id.source(db) + } +} +impl HasSource for EnumVariant { + type Ast = ast::EnumVariant; + fn source(self, db: &impl DefDatabase) -> InFile { + self.parent.id.child_source(db).map(|map| map[self.id].clone()) + } +} +impl HasSource for Function { + type Ast = ast::FnDef; + fn source(self, db: &impl DefDatabase) -> InFile { + self.id.lookup(db).source(db) + } +} +impl HasSource for Const { + type Ast = ast::ConstDef; + fn source(self, db: &impl DefDatabase) -> InFile { + self.id.lookup(db).source(db) + } +} +impl HasSource for Static { + type Ast = ast::StaticDef; + fn source(self, db: &impl DefDatabase) -> InFile { + self.id.lookup(db).source(db) + } +} +impl HasSource for Trait { + type Ast = ast::TraitDef; + fn source(self, db: &impl DefDatabase) -> InFile { + self.id.source(db) + } +} +impl HasSource for TypeAlias { + type Ast = ast::TypeAliasDef; + fn source(self, db: &impl DefDatabase) -> InFile { + self.id.lookup(db).source(db) + } +} +impl HasSource for MacroDef { + type Ast = ast::MacroCall; + fn source(self, db: &impl DefDatabase) -> InFile { + InFile { + file_id: self.id.ast_id.expect("MacroDef without ast_id").file_id, + value: self.id.ast_id.expect("MacroDef without ast_id").to_node(db), + } + } +} +impl HasSource for ImplBlock { + type Ast = ast::ImplBlock; + fn source(self, db: &impl DefDatabase) -> InFile { + self.id.source(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) -> InFile { + 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; + fn source(self, db: &impl DefDatabase) -> InFile { + let child_source = self.id.parent.child_source(db); + child_source.map(|it| it[self.id.local_id].clone()) + } +} diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index bb22882b1..946299ba0 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -36,16 +36,18 @@ pub mod diagnostics; mod from_id; mod code_model; -pub mod from_source; +mod has_source; +mod from_source; pub use crate::{ code_model::{ - src::HasSource, Adt, AssocItem, AttrDef, Const, Container, Crate, CrateDependency, - DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, HasAttrs, - ImplBlock, Import, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, - StructField, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, + Adt, AssocItem, AttrDef, Const, Container, Crate, CrateDependency, DefWithBody, Docs, Enum, + EnumVariant, FieldSource, Function, GenericDef, HasAttrs, ImplBlock, Import, Local, + MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias, + TypeParam, Union, VariantDef, }, from_source::FromSource, + has_source::HasSource, source_binder::{PathResolution, ScopeEntryWithSyntax, SourceAnalyzer}, }; -- cgit v1.2.3 From a1639d0d1ef201b2b9a425eddecfb41a25f10931 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 12:58:43 +0100 Subject: Remove more dead code --- crates/ra_hir/src/debug.rs | 94 ---------------------------------------------- crates/ra_hir/src/lib.rs | 2 - 2 files changed, 96 deletions(-) delete mode 100644 crates/ra_hir/src/debug.rs (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/debug.rs b/crates/ra_hir/src/debug.rs deleted file mode 100644 index 6cd5c8cb9..000000000 --- a/crates/ra_hir/src/debug.rs +++ /dev/null @@ -1,94 +0,0 @@ -//! XXX: This does not work at the moment. -//! -//! printf debugging infrastructure for rust-analyzer. -//! -//! When you print a hir type, like a module, using `eprintln!("{:?}", module)`, -//! you usually get back a numeric ID, which doesn't tell you much: -//! `Module(92)`. -//! -//! This module adds convenience `debug` methods to various types, which resolve -//! the id to a human-readable location info: -//! -//! ```not_rust -//! eprintln!("{:?}", module.debug(db)); -//! => -//! Module { name: collections, path: "liballoc/collections/mod.rs" } -//! ``` -//! -//! Note that to get this info, we might need to execute queries! So -//! -//! * don't use the `debug` methods for logging -//! * when debugging, be aware that interference is possible. - -use std::fmt; - -use hir_expand::HirFileId; -use ra_db::{CrateId, FileId}; - -use crate::{db::HirDatabase, Crate, Module, Name}; - -impl Crate { - pub fn debug(self, db: &impl HirDebugDatabase) -> impl fmt::Debug + '_ { - debug_fn(move |fmt| db.debug_crate(self, fmt)) - } -} - -impl Module { - pub fn debug(self, db: &impl HirDebugDatabase) -> impl fmt::Debug + '_ { - debug_fn(move |fmt| db.debug_module(self, fmt)) - } -} - -pub trait HirDebugHelper: HirDatabase { - fn crate_name(&self, _krate: CrateId) -> Option { - None - } - fn file_path(&self, _file_id: FileId) -> Option { - None - } -} - -pub trait HirDebugDatabase { - fn debug_crate(&self, krate: Crate, fmt: &mut fmt::Formatter<'_>) -> fmt::Result; - fn debug_module(&self, module: Module, fmt: &mut fmt::Formatter<'_>) -> fmt::Result; - fn debug_hir_file_id(&self, file_id: HirFileId, fmt: &mut fmt::Formatter<'_>) -> fmt::Result; -} - -impl HirDebugDatabase for DB { - fn debug_crate(&self, krate: Crate, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - let mut builder = fmt.debug_tuple("Crate"); - match self.crate_name(krate.id) { - Some(name) => builder.field(&name), - None => builder.field(&krate.id), - } - .finish() - } - - fn debug_module(&self, module: Module, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - let file_id = module.definition_source(self).file_id.original_file(self); - let path = self.file_path(file_id).unwrap_or_else(|| "N/A".to_string()); - fmt.debug_struct("Module") - .field("name", &module.name(self).unwrap_or_else(Name::missing)) - .field("path", &path) - .finish() - } - - fn debug_hir_file_id(&self, file_id: HirFileId, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - let original = file_id.original_file(self); - let path = self.file_path(original).unwrap_or_else(|| "N/A".to_string()); - let is_macro = file_id != original.into(); - fmt.debug_struct("HirFileId").field("path", &path).field("macro", &is_macro).finish() - } -} - -fn debug_fn(f: impl Fn(&mut fmt::Formatter<'_>) -> fmt::Result) -> impl fmt::Debug { - struct DebugFn(F); - - impl) -> fmt::Result> fmt::Debug for DebugFn { - fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - (&self.0)(fmt) - } - } - - DebugFn(f) -} diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 946299ba0..e7602ee30 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -26,8 +26,6 @@ macro_rules! impl_froms { } } -pub mod debug; - pub mod db; pub mod source_binder; -- cgit v1.2.3 From 61c3887b70820283cb759127e3aecf7cbdbdc8c1 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 8 Dec 2019 17:50:43 +0100 Subject: Remove one more Ty --- crates/ra_hir/src/code_model.rs | 5 ----- crates/ra_hir/src/source_binder.rs | 4 ++-- 2 files changed, 2 insertions(+), 7 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index fd30971b0..c013ff99b 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -986,11 +986,6 @@ impl Type { None } - // FIXME: remove - pub fn into_ty(self) -> Ty { - self.ty.value - } - pub fn as_adt(&self) -> Option { let (adt, _subst) = self.ty.value.as_adt()?; Some(adt.into()) diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 9efd0477c..44d185003 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -427,7 +427,7 @@ impl SourceAnalyzer { /// Checks that particular type `ty` implements `std::future::Future`. /// This function is used in `.await` syntax completion. - pub fn impls_future(&self, db: &impl HirDatabase, ty: Ty) -> bool { + pub fn impls_future(&self, db: &impl HirDatabase, ty: Type) -> bool { let std_future_path = known::std_future_future(); let std_future_trait = match self.resolver.resolve_known_trait(db, &std_future_path) { @@ -440,7 +440,7 @@ impl SourceAnalyzer { _ => return false, }; - let canonical_ty = Canonical { value: ty, num_vars: 0 }; + let canonical_ty = Canonical { value: ty.ty.value, num_vars: 0 }; implements_trait(&canonical_ty, db, &self.resolver, krate.into(), std_future_trait) } -- cgit v1.2.3 From d89996fd5bf9ca8111f6a45ff59a0f43b3b9836a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 10 Dec 2019 13:52:04 +0100 Subject: Build correct SourceAnalyzer for traits --- crates/ra_hir/src/source_binder.rs | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 44d185003..d3cc5c423 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -62,6 +62,10 @@ fn try_get_resolver_for_node(db: &impl HirDatabase, node: InFile<&SyntaxNode>) - let src = node.with_value(it); Some(ImplBlock::from_source(db, src)?.id.resolver(db)) }, + ast::TraitDef(it) => { + let src = node.with_value(it); + Some(Trait::from_source(db, src)?.id.resolver(db)) + }, _ => match node.value.kind() { FN_DEF | CONST_DEF | STATIC_DEF => { let def = def_with_body_from_child_node(db, node)?; @@ -411,20 +415,6 @@ impl SourceAnalyzer { ) } - // pub fn autoderef<'a>( - // &'a self, - // db: &'a impl HirDatabase, - // ty: Ty, - // ) -> impl Iterator + 'a { - // // There should be no inference vars in types passed here - // // FIXME check that? - // let canonical = Canonical { value: ty, num_vars: 0 }; - // let krate = self.resolver.krate(); - // let environment = TraitEnvironment::lower(db, &self.resolver); - // let ty = crate::ty::InEnvironment { value: canonical, environment }; - // crate::ty::autoderef(db, krate, ty).map(|canonical| canonical.value) - // } - /// Checks that particular type `ty` implements `std::future::Future`. /// This function is used in `.await` syntax completion. pub fn impls_future(&self, db: &impl HirDatabase, ty: Type) -> bool { -- cgit v1.2.3 From 7b0644d81e52d00a7a6795b187f356213ff68225 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 12 Dec 2019 14:09:13 +0100 Subject: Switch to the new location for impls --- crates/ra_hir/src/code_model.rs | 7 +++++-- crates/ra_hir/src/from_source.rs | 6 ++++-- crates/ra_hir/src/has_source.rs | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index c013ff99b..117ca2fe3 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -809,7 +809,10 @@ impl ImplBlock { let resolver = self.id.resolver(db); let environment = TraitEnvironment::lower(db, &resolver); let ty = Ty::from_hir(db, &resolver, &impl_data.target_type); - Type { krate: self.id.module(db).krate, ty: InEnvironment { value: ty, environment } } + Type { + krate: self.id.lookup(db).container.krate, + ty: InEnvironment { value: ty, environment }, + } } pub fn items(&self, db: &impl DefDatabase) -> Vec { @@ -821,7 +824,7 @@ impl ImplBlock { } pub fn module(&self, db: &impl DefDatabase) -> Module { - self.id.module(db).into() + self.id.lookup(db).container.into() } pub fn krate(&self, db: &impl DefDatabase) -> Crate { diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 307f3d5bf..b35188a21 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -107,8 +107,10 @@ impl FromSource for MacroDef { impl FromSource for ImplBlock { type Ast = ast::ImplBlock; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let id = from_source(db, src)?; - Some(ImplBlock { id }) + // XXX: use `.parent()` to avoid finding ourselves + let parent = src.value.syntax().parent()?; + let container = Container::find(db, src.with_value(parent).as_ref())?; + container.child_by_source(db)[keys::IMPL].get(&src).copied().map(ImplBlock::from) } } diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs index b09582f93..a888fe995 100644 --- a/crates/ra_hir/src/has_source.rs +++ b/crates/ra_hir/src/has_source.rs @@ -114,7 +114,7 @@ impl HasSource for MacroDef { impl HasSource for ImplBlock { type Ast = ast::ImplBlock; fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(db) + self.id.lookup(db).source(db) } } impl HasSource for Import { -- cgit v1.2.3 From 82e9b245587046d2a1ed432225b19023adbe3245 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 12 Dec 2019 14:34:03 +0100 Subject: Move traits to the new loc --- crates/ra_hir/src/code_model.rs | 2 +- crates/ra_hir/src/from_source.rs | 6 ++++-- crates/ra_hir/src/has_source.rs | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 117ca2fe3..78c7792bf 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -577,7 +577,7 @@ pub struct Trait { impl Trait { pub fn module(self, db: &impl DefDatabase) -> Module { - Module { id: self.id.module(db) } + Module { id: self.id.lookup(db).container } } pub fn name(self, db: &impl DefDatabase) -> Name { diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index b35188a21..0cf4bcae1 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -44,8 +44,10 @@ impl FromSource for Enum { impl FromSource for Trait { type Ast = ast::TraitDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let id = from_source(db, src)?; - Some(Trait { id }) + // XXX: use `.parent()` to avoid finding ourselves + let parent = src.value.syntax().parent()?; + let container = Container::find(db, src.with_value(parent).as_ref())?; + container.child_by_source(db)[keys::TRAIT].get(&src).copied().map(Trait::from) } } impl FromSource for Function { diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs index a888fe995..c4c6d66b7 100644 --- a/crates/ra_hir/src/has_source.rs +++ b/crates/ra_hir/src/has_source.rs @@ -93,7 +93,7 @@ impl HasSource for Static { impl HasSource for Trait { type Ast = ast::TraitDef; fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(db) + self.id.lookup(db).source(db) } } impl HasSource for TypeAlias { -- cgit v1.2.3 From 63c192b34a54e826afebc735ca6225b44a876eab Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 12 Dec 2019 14:48:33 +0100 Subject: Simplify from_source --- crates/ra_hir/src/from_source.rs | 83 ++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 49 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 0cf4bcae1..091349d49 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -44,16 +44,16 @@ impl FromSource for Enum { impl FromSource for Trait { type Ast = ast::TraitDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - // XXX: use `.parent()` to avoid finding ourselves - let parent = src.value.syntax().parent()?; - let container = Container::find(db, src.with_value(parent).as_ref())?; - container.child_by_source(db)[keys::TRAIT].get(&src).copied().map(Trait::from) + analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::TRAIT] + .get(&src) + .copied() + .map(Trait::from) } } impl FromSource for Function { type Ast = ast::FnDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db)[keys::FUNCTION] + analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::FUNCTION] .get(&src) .copied() .map(Function::from) @@ -63,7 +63,7 @@ impl FromSource for Function { impl FromSource for Const { type Ast = ast::ConstDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db)[keys::CONST] + analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::CONST] .get(&src) .copied() .map(Const::from) @@ -72,7 +72,7 @@ impl FromSource for Const { impl FromSource for Static { type Ast = ast::StaticDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db)[keys::STATIC] + analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::STATIC] .get(&src) .copied() .map(Static::from) @@ -82,8 +82,7 @@ impl FromSource for Static { impl FromSource for TypeAlias { type Ast = ast::TypeAliasDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - Container::find(db, src.as_ref().map(|it| it.syntax()))?.child_by_source(db) - [keys::TYPE_ALIAS] + analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::TYPE_ALIAS] .get(&src) .copied() .map(TypeAlias::from) @@ -109,10 +108,10 @@ impl FromSource for MacroDef { impl FromSource for ImplBlock { type Ast = ast::ImplBlock; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - // XXX: use `.parent()` to avoid finding ourselves - let parent = src.value.syntax().parent()?; - let container = Container::find(db, src.with_value(parent).as_ref())?; - container.child_by_source(db)[keys::IMPL].get(&src).copied().map(ImplBlock::from) + analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::IMPL] + .get(&src) + .copied() + .map(ImplBlock::from) } } @@ -262,44 +261,30 @@ where Some(DEF::from_ast_id(ctx, item_id)) } -enum Container { - Trait(Trait), - ImplBlock(ImplBlock), - Module(Module), +fn analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> DynMap { + _analyze_container(db, src).unwrap_or_default() } -impl Container { - fn find(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option { - // FIXME: this doesn't try to handle nested declarations - for container in src.value.ancestors() { - let res = match_ast! { - match container { - ast::TraitDef(it) => { - let c = Trait::from_source(db, src.with_value(it))?; - Container::Trait(c) - }, - ast::ImplBlock(it) => { - let c = ImplBlock::from_source(db, src.with_value(it))?; - Container::ImplBlock(c) - }, - _ => { continue }, - } - }; - return Some(res); - } - - let module_source = ModuleSource::from_child_node(db, src); - let c = Module::from_definition(db, src.with_value(module_source))?; - Some(Container::Module(c)) +fn _analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option { + // FIXME: this doesn't try to handle nested declarations + for container in src.value.ancestors().skip(1) { + let res = match_ast! { + match container { + ast::TraitDef(it) => { + let c = Trait::from_source(db, src.with_value(it))?; + c.id.child_by_source(db) + }, + ast::ImplBlock(it) => { + let c = ImplBlock::from_source(db, src.with_value(it))?; + c.id.child_by_source(db) + }, + _ => { continue }, + } + }; + return Some(res); } -} -impl ChildBySource for Container { - fn child_by_source(&self, db: &impl DefDatabase) -> DynMap { - match self { - Container::Trait(it) => it.id.child_by_source(db), - Container::ImplBlock(it) => it.id.child_by_source(db), - Container::Module(it) => it.id.child_by_source(db), - } - } + let module_source = ModuleSource::from_child_node(db, src); + let c = Module::from_definition(db, src.with_value(module_source))?; + Some(c.id.child_by_source(db)) } -- cgit v1.2.3 From f135a8ea55c0a46c67713fb3b79b5f62ada430c1 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 12 Dec 2019 14:58:04 +0100 Subject: Move structs to new loc --- crates/ra_hir/src/code_model.rs | 4 ++-- crates/ra_hir/src/from_source.rs | 6 ++++-- crates/ra_hir/src/has_source.rs | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 78c7792bf..8588aa5a3 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -269,7 +269,7 @@ pub struct Struct { impl Struct { pub fn module(self, db: &impl DefDatabase) -> Module { - Module { id: self.id.module(db) } + Module { id: self.id.lookup(db).container } } pub fn krate(self, db: &impl DefDatabase) -> Option { @@ -290,7 +290,7 @@ impl Struct { } pub fn ty(self, db: &impl HirDatabase) -> Type { - Type::from_def(db, self.id.module(db).krate, self.id) + Type::from_def(db, self.id.lookup(db).container.krate, self.id) } fn variant_data(self, db: &impl DefDatabase) -> Arc { diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 091349d49..978326c74 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -23,8 +23,10 @@ pub trait FromSource: Sized { impl FromSource for Struct { type Ast = ast::StructDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let id = from_source(db, src)?; - Some(Struct { id }) + analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::STRUCT] + .get(&src) + .copied() + .map(Struct::from) } } impl FromSource for Union { diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs index c4c6d66b7..8f35a3fbb 100644 --- a/crates/ra_hir/src/has_source.rs +++ b/crates/ra_hir/src/has_source.rs @@ -51,7 +51,7 @@ impl HasSource for StructField { impl HasSource for Struct { type Ast = ast::StructDef; fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(db) + self.id.lookup(db).source(db) } } impl HasSource for Union { -- cgit v1.2.3 From 56710f119b7114efac237ac36ea21730b8bd5311 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 12 Dec 2019 15:11:57 +0100 Subject: Move enum&union to new loc --- crates/ra_hir/src/code_model.rs | 10 +++++----- crates/ra_hir/src/from_source.rs | 29 ++++++++++------------------- crates/ra_hir/src/has_source.rs | 6 +++--- 3 files changed, 18 insertions(+), 27 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 8588aa5a3..c705d1630 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -11,7 +11,7 @@ use hir_def::{ per_ns::PerNs, resolver::HasResolver, type_ref::{Mutability, TypeRef}, - AdtId, AstItemDef, ConstId, ContainerId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, + AdtId, ConstId, ContainerId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, LocalEnumVariantId, LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, TypeParamId, UnionId, }; @@ -309,11 +309,11 @@ impl Union { } pub fn module(self, db: &impl DefDatabase) -> Module { - Module { id: self.id.module(db) } + Module { id: self.id.lookup(db).container } } pub fn ty(self, db: &impl HirDatabase) -> Type { - Type::from_def(db, self.id.module(db).krate, self.id) + Type::from_def(db, self.id.lookup(db).container.krate, self.id) } pub fn fields(self, db: &impl HirDatabase) -> Vec { @@ -337,7 +337,7 @@ pub struct Enum { impl Enum { pub fn module(self, db: &impl DefDatabase) -> Module { - Module { id: self.id.module(db) } + Module { id: self.id.lookup(db).container } } pub fn krate(self, db: &impl DefDatabase) -> Option { @@ -357,7 +357,7 @@ impl Enum { } pub fn ty(self, db: &impl HirDatabase) -> Type { - Type::from_def(db, self.id.module(db).krate, self.id) + Type::from_def(db, self.id.lookup(db).container.krate, self.id) } } diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 978326c74..f7411c5cf 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -1,7 +1,7 @@ //! FIXME: write short doc here use hir_def::{ - child_by_source::ChildBySource, dyn_map::DynMap, keys, nameres::ModuleSource, AstItemDef, - EnumVariantId, GenericDefId, LocationCtx, ModuleId, VariantId, + child_by_source::ChildBySource, dyn_map::DynMap, keys, nameres::ModuleSource, EnumVariantId, + GenericDefId, ModuleId, VariantId, }; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; use ra_syntax::{ @@ -32,15 +32,19 @@ impl FromSource for Struct { impl FromSource for Union { type Ast = ast::UnionDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let id = from_source(db, src)?; - Some(Union { id }) + analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::UNION] + .get(&src) + .copied() + .map(Union::from) } } impl FromSource for Enum { type Ast = ast::EnumDef; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - let id = from_source(db, src)?; - Some(Enum { id }) + analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::ENUM] + .get(&src) + .copied() + .map(Enum::from) } } impl FromSource for Trait { @@ -250,19 +254,6 @@ impl Module { } } -fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option -where - N: AstNode, - DEF: AstItemDef, -{ - let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax())); - let module = Module::from_definition(db, InFile::new(src.file_id, module_src))?; - let ctx = LocationCtx::new(db, module.id, src.file_id); - let items = db.ast_id_map(src.file_id); - let item_id = items.ast_id(&src.value); - Some(DEF::from_ast_id(ctx, item_id)) -} - fn analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> DynMap { _analyze_container(db, src).unwrap_or_default() } diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs index 8f35a3fbb..72afecf26 100644 --- a/crates/ra_hir/src/has_source.rs +++ b/crates/ra_hir/src/has_source.rs @@ -4,7 +4,7 @@ use either::Either; use hir_def::{ nameres::ModuleSource, src::{HasChildSource, HasSource as _}, - AstItemDef, Lookup, VariantId, + Lookup, VariantId, }; use ra_syntax::ast; @@ -57,13 +57,13 @@ impl HasSource for Struct { impl HasSource for Union { type Ast = ast::UnionDef; fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(db) + self.id.lookup(db).source(db) } } impl HasSource for Enum { type Ast = ast::EnumDef; fn source(self, db: &impl DefDatabase) -> InFile { - self.id.source(db) + self.id.lookup(db).source(db) } } impl HasSource for EnumVariant { -- cgit v1.2.3 From 8e65b773874909985b6ffc9247ea9dfbaac6a02b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 12 Dec 2019 15:50:16 +0100 Subject: Dedupe from_source impls --- crates/ra_hir/src/from_source.rs | 111 ++++++++++++--------------------------- 1 file changed, 34 insertions(+), 77 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index f7411c5cf..7abb4bd75 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -1,7 +1,8 @@ //! FIXME: write short doc here use hir_def::{ - child_by_source::ChildBySource, dyn_map::DynMap, keys, nameres::ModuleSource, EnumVariantId, - GenericDefId, ModuleId, VariantId, + child_by_source::ChildBySource, dyn_map::DynMap, keys, keys::Key, nameres::ModuleSource, + ConstId, EnumId, EnumVariantId, FunctionId, GenericDefId, ImplId, ModuleId, StaticId, StructId, + TraitId, TypeAliasId, UnionId, VariantId, }; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; use ra_syntax::{ @@ -20,81 +21,47 @@ pub trait FromSource: Sized { fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option; } -impl FromSource for Struct { - type Ast = ast::StructDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::STRUCT] - .get(&src) - .copied() - .map(Struct::from) - } -} -impl FromSource for Union { - type Ast = ast::UnionDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::UNION] - .get(&src) - .copied() - .map(Union::from) - } -} -impl FromSource for Enum { - type Ast = ast::EnumDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::ENUM] - .get(&src) - .copied() - .map(Enum::from) - } -} -impl FromSource for Trait { - type Ast = ast::TraitDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::TRAIT] - .get(&src) - .copied() - .map(Trait::from) - } -} -impl FromSource for Function { - type Ast = ast::FnDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::FUNCTION] - .get(&src) - .copied() - .map(Function::from) - } +pub trait FromSourceByContainer: Sized { + type Ast: AstNode + 'static; + type Id: Copy + 'static; + const KEY: Key; } -impl FromSource for Const { - type Ast = ast::ConstDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::CONST] - .get(&src) - .copied() - .map(Const::from) - } -} -impl FromSource for Static { - type Ast = ast::StaticDef; +impl FromSource for T +where + T: From<::Id>, +{ + type Ast = ::Ast; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::STATIC] + analyze_container(db, src.as_ref().map(|it| it.syntax()))[T::KEY] .get(&src) .copied() - .map(Static::from) + .map(Self::from) } } -impl FromSource for TypeAlias { - type Ast = ast::TypeAliasDef; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::TYPE_ALIAS] - .get(&src) - .copied() - .map(TypeAlias::from) - } +macro_rules! from_source_by_container_impls { + ($(($hir:ident, $id:ident, $ast:path, $key:path)),* ,) => {$( + impl FromSourceByContainer for $hir { + type Ast = $ast; + type Id = $id; + const KEY: Key = $key; + } + )*} } +from_source_by_container_impls![ + (Struct, StructId, ast::StructDef, keys::STRUCT), + (Union, UnionId, ast::UnionDef, keys::UNION), + (Enum, EnumId, ast::EnumDef, keys::ENUM), + (Trait, TraitId, ast::TraitDef, keys::TRAIT), + (Function, FunctionId, ast::FnDef, keys::FUNCTION), + (Static, StaticId, ast::StaticDef, keys::STATIC), + (Const, ConstId, ast::ConstDef, keys::CONST), + (TypeAlias, TypeAliasId, ast::TypeAliasDef, keys::TYPE_ALIAS), + (ImplBlock, ImplId, ast::ImplBlock, keys::IMPL), +]; + impl FromSource for MacroDef { type Ast = ast::MacroCall; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { @@ -111,16 +78,6 @@ impl FromSource for MacroDef { } } -impl FromSource for ImplBlock { - type Ast = ast::ImplBlock; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { - analyze_container(db, src.as_ref().map(|it| it.syntax()))[keys::IMPL] - .get(&src) - .copied() - .map(ImplBlock::from) - } -} - impl FromSource for EnumVariant { type Ast = ast::EnumVariant; fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { -- cgit v1.2.3 From 259c42f00e2e85594c7373166bc8467ce375a045 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 13 Dec 2019 21:43:53 +0100 Subject: Add macros for known names and paths --- crates/ra_hir/src/code_model.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index c705d1630..d1153fa62 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -17,7 +17,7 @@ use hir_def::{ }; use hir_expand::{ diagnostics::DiagnosticSink, - name::{self, AsName}, + name::{AsName, N}, MacroDefId, }; use hir_ty::{ @@ -723,7 +723,7 @@ impl Local { } pub fn is_self(self, db: &impl HirDatabase) -> bool { - self.name(db) == Some(name::SELF_PARAM) + self.name(db) == Some(N![self]) } pub fn is_mut(self, db: &impl HirDatabase) -> bool { -- cgit v1.2.3 From 6911bc89a784ce72b4dfd8e0ba72bd22ce898395 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 13 Dec 2019 22:01:06 +0100 Subject: Rename N! to name! --- crates/ra_hir/src/code_model.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index d1153fa62..7850ea9a7 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -17,7 +17,7 @@ use hir_def::{ }; use hir_expand::{ diagnostics::DiagnosticSink, - name::{AsName, N}, + name::{name, AsName}, MacroDefId, }; use hir_ty::{ @@ -723,7 +723,7 @@ impl Local { } pub fn is_self(self, db: &impl HirDatabase) -> bool { - self.name(db) == Some(N![self]) + self.name(db) == Some(name![self]) } pub fn is_mut(self, db: &impl HirDatabase) -> bool { -- cgit v1.2.3 From f02fcc16444fcd18ccd51b43fa01bf0233e044fa Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 13 Dec 2019 22:32:44 +0100 Subject: Use path macro --- crates/ra_hir/src/source_binder.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index d3cc5c423..f82242c3a 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -15,7 +15,7 @@ use hir_def::{ }, expr::{ExprId, PatId}, nameres::ModuleSource, - path::known, + path::path, resolver::{self, resolver_for_scope, HasResolver, Resolver, TypeNs, ValueNs}, AssocItemId, DefWithBodyId, }; @@ -418,7 +418,7 @@ impl SourceAnalyzer { /// Checks that particular type `ty` implements `std::future::Future`. /// This function is used in `.await` syntax completion. pub fn impls_future(&self, db: &impl HirDatabase, ty: Type) -> bool { - let std_future_path = known::std_future_future(); + let std_future_path = path![std::future::Future]; let std_future_trait = match self.resolver.resolve_known_trait(db, &std_future_path) { Some(it) => it.into(), -- cgit v1.2.3 From 61360fdfec981eadef1eefb595c8b32c951771e8 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sun, 15 Dec 2019 01:20:07 +0800 Subject: Fix original_source find order --- crates/ra_hir/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index e7602ee30..2bf729b6d 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -58,6 +58,7 @@ pub use hir_def::{ type_ref::Mutability, }; pub use hir_expand::{ - name::Name, HirFileId, InFile, MacroCallId, MacroCallLoc, MacroDefId, MacroFile, + name::Name, ExpansionOrigin, HirFileId, InFile, MacroCallId, MacroCallLoc, MacroDefId, + MacroFile, }; pub use hir_ty::{display::HirDisplay, CallableDef}; -- cgit v1.2.3 From b53587c7bdd67c63bd33a745fdaeb22a847b6c2f Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sun, 15 Dec 2019 01:46:39 +0800 Subject: Re-export Origin to replace ExpansionOrigin --- crates/ra_hir/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 2bf729b6d..8b9562722 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -58,7 +58,6 @@ pub use hir_def::{ type_ref::Mutability, }; pub use hir_expand::{ - name::Name, ExpansionOrigin, HirFileId, InFile, MacroCallId, MacroCallLoc, MacroDefId, - MacroFile, + name::Name, HirFileId, InFile, MacroCallId, MacroCallLoc, MacroDefId, MacroFile, Origin, }; pub use hir_ty::{display::HirDisplay, CallableDef}; -- cgit v1.2.3 From 2619950b3b405324ab1c1745876165c834b3b4b9 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 13 Dec 2019 12:12:36 +0100 Subject: Use different types for path with and without generics --- crates/ra_hir/src/lib.rs | 2 +- crates/ra_hir/src/source_binder.rs | 56 ++++++++++++++++++++------------------ 2 files changed, 30 insertions(+), 28 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index e7602ee30..451b227a6 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -54,7 +54,7 @@ pub use hir_def::{ builtin_type::BuiltinType, docs::Documentation, nameres::ModuleSource, - path::{Path, PathKind}, + path::{ModPath, Path, PathKind}, type_ref::Mutability, }; pub use hir_expand::{ diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index f82242c3a..d326169b3 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -258,7 +258,7 @@ impl SourceAnalyzer { ) -> Option { let hygiene = Hygiene::new(db, macro_call.file_id); let path = macro_call.value.path().and_then(|ast| Path::from_src(ast, &hygiene))?; - self.resolver.resolve_path_as_macro(db, &path).map(|it| it.into()) + self.resolver.resolve_path_as_macro(db, path.mod_path()).map(|it| it.into()) } pub fn resolve_hir_path( @@ -266,40 +266,42 @@ impl SourceAnalyzer { db: &impl HirDatabase, path: &crate::Path, ) -> Option { - let types = self.resolver.resolve_path_in_type_ns_fully(db, &path).map(|ty| match ty { - TypeNs::SelfType(it) => PathResolution::SelfType(it.into()), - TypeNs::GenericParam(id) => PathResolution::TypeParam(TypeParam { id }), - TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => { - PathResolution::Def(Adt::from(it).into()) - } - TypeNs::EnumVariantId(it) => PathResolution::Def(EnumVariant::from(it).into()), - TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()), - TypeNs::BuiltinType(it) => PathResolution::Def(it.into()), - TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()), - }); - let values = self.resolver.resolve_path_in_value_ns_fully(db, &path).and_then(|val| { - let res = match val { - ValueNs::LocalBinding(pat_id) => { - let var = Local { parent: self.body_owner?, pat_id }; - PathResolution::Local(var) + let types = + self.resolver.resolve_path_in_type_ns_fully(db, path.mod_path()).map(|ty| match ty { + TypeNs::SelfType(it) => PathResolution::SelfType(it.into()), + TypeNs::GenericParam(id) => PathResolution::TypeParam(TypeParam { id }), + TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => { + PathResolution::Def(Adt::from(it).into()) } - ValueNs::FunctionId(it) => PathResolution::Def(Function::from(it).into()), - ValueNs::ConstId(it) => PathResolution::Def(Const::from(it).into()), - ValueNs::StaticId(it) => PathResolution::Def(Static::from(it).into()), - ValueNs::StructId(it) => PathResolution::Def(Struct::from(it).into()), - ValueNs::EnumVariantId(it) => PathResolution::Def(EnumVariant::from(it).into()), - }; - Some(res) - }); + TypeNs::EnumVariantId(it) => PathResolution::Def(EnumVariant::from(it).into()), + TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()), + TypeNs::BuiltinType(it) => PathResolution::Def(it.into()), + TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()), + }); + let values = + self.resolver.resolve_path_in_value_ns_fully(db, path.mod_path()).and_then(|val| { + let res = match val { + ValueNs::LocalBinding(pat_id) => { + let var = Local { parent: self.body_owner?, pat_id }; + PathResolution::Local(var) + } + ValueNs::FunctionId(it) => PathResolution::Def(Function::from(it).into()), + ValueNs::ConstId(it) => PathResolution::Def(Const::from(it).into()), + ValueNs::StaticId(it) => PathResolution::Def(Static::from(it).into()), + ValueNs::StructId(it) => PathResolution::Def(Struct::from(it).into()), + ValueNs::EnumVariantId(it) => PathResolution::Def(EnumVariant::from(it).into()), + }; + Some(res) + }); let items = self .resolver - .resolve_module_path_in_items(db, &path) + .resolve_module_path_in_items(db, path.mod_path()) .take_types() .map(|it| PathResolution::Def(it.into())); types.or(values).or(items).or_else(|| { self.resolver - .resolve_path_as_macro(db, &path) + .resolve_path_as_macro(db, path.mod_path()) .map(|def| PathResolution::Macro(def.into())) }) } -- cgit v1.2.3 From b2731ab78acc7a2d38e02cd477f4a5132c1ac98b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 19 Dec 2019 18:07:39 +0100 Subject: Drop dead code --- crates/ra_hir/src/code_model.rs | 62 ++--------------------------------------- crates/ra_hir/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 60 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 7850ea9a7..8dbc0d667 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -11,9 +11,9 @@ use hir_def::{ per_ns::PerNs, resolver::HasResolver, type_ref::{Mutability, TypeRef}, - AdtId, ConstId, ContainerId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, - LocalEnumVariantId, LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, - StaticId, StructId, TraitId, TypeAliasId, TypeParamId, UnionId, + AdtId, ConstId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, LocalEnumVariantId, + LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, StaticId, StructId, + TraitId, TypeAliasId, TypeParamId, UnionId, }; use hir_expand::{ diagnostics::DiagnosticSink, @@ -529,30 +529,6 @@ impl Const { pub fn name(self, db: &impl HirDatabase) -> Option { db.const_data(self.id).name.clone() } - - /// The containing impl block, if this is a type alias. - pub fn impl_block(self, db: &impl DefDatabase) -> Option { - match self.container(db) { - Some(Container::ImplBlock(it)) => Some(it), - _ => None, - } - } - - /// The containing trait, if this is a trait type alias definition. - pub fn parent_trait(self, db: &impl DefDatabase) -> Option { - match self.container(db) { - Some(Container::Trait(it)) => Some(it), - _ => None, - } - } - - pub fn container(self, db: &impl DefDatabase) -> Option { - match self.id.lookup(db).container { - ContainerId::TraitId(it) => Some(Container::Trait(it.into())), - ContainerId::ImplId(it) => Some(Container::ImplBlock(it.into())), - ContainerId::ModuleId(_) => None, - } - } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -612,30 +588,6 @@ impl TypeAlias { Some(self.module(db).krate()) } - /// The containing impl block, if this is a type alias. - pub fn impl_block(self, db: &impl DefDatabase) -> Option { - match self.container(db) { - Some(Container::ImplBlock(it)) => Some(it), - _ => None, - } - } - - /// The containing trait, if this is a trait type alias definition. - pub fn parent_trait(self, db: &impl DefDatabase) -> Option { - match self.container(db) { - Some(Container::Trait(it)) => Some(it), - _ => None, - } - } - - pub fn container(self, db: &impl DefDatabase) -> Option { - match self.id.lookup(db).container { - ContainerId::TraitId(it) => Some(Container::Trait(it.into())), - ContainerId::ImplId(it) => Some(Container::ImplBlock(it.into())), - ContainerId::ModuleId(_) => None, - } - } - pub fn type_ref(self, db: &impl DefDatabase) -> Option { db.type_alias_data(self.id).type_ref.clone() } @@ -654,14 +606,6 @@ pub struct MacroDef { pub(crate) id: MacroDefId, } -impl MacroDef {} - -pub enum Container { - Trait(Trait), - ImplBlock(ImplBlock), -} -impl_froms!(Container: Trait, ImplBlock); - #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum AssocItem { Function(Function), diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 2e52a1f5c..7f9aef770 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -39,7 +39,7 @@ mod from_source; pub use crate::{ code_model::{ - Adt, AssocItem, AttrDef, Const, Container, Crate, CrateDependency, DefWithBody, Docs, Enum, + Adt, AssocItem, AttrDef, Const, Crate, CrateDependency, DefWithBody, Docs, Enum, EnumVariant, FieldSource, Function, GenericDef, HasAttrs, ImplBlock, Import, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, -- cgit v1.2.3 From a04177f135be89ddbf1788c6f747c26812e90438 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 20 Dec 2019 11:19:09 +0100 Subject: Add local functions to bodies --- crates/ra_hir/src/from_source.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 7abb4bd75..b3ed88b6b 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -1,8 +1,8 @@ //! FIXME: write short doc here use hir_def::{ child_by_source::ChildBySource, dyn_map::DynMap, keys, keys::Key, nameres::ModuleSource, - ConstId, EnumId, EnumVariantId, FunctionId, GenericDefId, ImplId, ModuleId, StaticId, StructId, - TraitId, TypeAliasId, UnionId, VariantId, + ConstId, DefWithBodyId, EnumId, EnumVariantId, FunctionId, GenericDefId, ImplId, ModuleId, + StaticId, StructId, TraitId, TypeAliasId, UnionId, VariantId, }; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; use ra_syntax::{ @@ -227,7 +227,12 @@ fn _analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option ast::ImplBlock(it) => { let c = ImplBlock::from_source(db, src.with_value(it))?; c.id.child_by_source(db) - }, + }, + ast::FnDef(it) => { + let f = Function::from_source(db, src.with_value(it))?; + DefWithBodyId::from(f.id) + .child_by_source(db) + }, _ => { continue }, } }; -- cgit v1.2.3 From d316ba9a136833c64ba066feb62cf553dd4b3a58 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 20 Dec 2019 11:24:23 +0100 Subject: Handle nested declrations in from_source --- crates/ra_hir/src/from_source.rs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index b3ed88b6b..4fd7c7573 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -216,21 +216,30 @@ fn analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> DynMap } fn _analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option { - // FIXME: this doesn't try to handle nested declarations for container in src.value.ancestors().skip(1) { let res = match_ast! { match container { ast::TraitDef(it) => { - let c = Trait::from_source(db, src.with_value(it))?; - c.id.child_by_source(db) + let def = Trait::from_source(db, src.with_value(it))?; + def.id.child_by_source(db) }, ast::ImplBlock(it) => { - let c = ImplBlock::from_source(db, src.with_value(it))?; - c.id.child_by_source(db) + let def = ImplBlock::from_source(db, src.with_value(it))?; + def.id.child_by_source(db) }, ast::FnDef(it) => { - let f = Function::from_source(db, src.with_value(it))?; - DefWithBodyId::from(f.id) + let def = Function::from_source(db, src.with_value(it))?; + DefWithBodyId::from(def.id) + .child_by_source(db) + }, + ast::StaticDef(it) => { + let def = Static::from_source(db, src.with_value(it))?; + DefWithBodyId::from(def.id) + .child_by_source(db) + }, + ast::ConstDef(it) => { + let def = Const::from_source(db, src.with_value(it))?; + DefWithBodyId::from(def.id) .child_by_source(db) }, _ => { continue }, -- cgit v1.2.3 From 67c2aea182c375108ebb8b923f5679e4f7fef1df Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 20 Dec 2019 11:30:22 +0100 Subject: Rebuild ra_lsp_server and nest helper function. Completion now works again, so there's no need not to nest --- crates/ra_hir/src/from_source.rs | 74 ++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 37 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 4fd7c7573..3b6454a1d 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -212,43 +212,43 @@ impl Module { } fn analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> DynMap { - _analyze_container(db, src).unwrap_or_default() -} + return child_by_source(db, src).unwrap_or_default(); -fn _analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option { - for container in src.value.ancestors().skip(1) { - let res = match_ast! { - match container { - ast::TraitDef(it) => { - let def = Trait::from_source(db, src.with_value(it))?; - def.id.child_by_source(db) - }, - ast::ImplBlock(it) => { - let def = ImplBlock::from_source(db, src.with_value(it))?; - def.id.child_by_source(db) - }, - ast::FnDef(it) => { - let def = Function::from_source(db, src.with_value(it))?; - DefWithBodyId::from(def.id) - .child_by_source(db) - }, - ast::StaticDef(it) => { - let def = Static::from_source(db, src.with_value(it))?; - DefWithBodyId::from(def.id) - .child_by_source(db) - }, - ast::ConstDef(it) => { - let def = Const::from_source(db, src.with_value(it))?; - DefWithBodyId::from(def.id) - .child_by_source(db) - }, - _ => { continue }, - } - }; - return Some(res); - } + fn child_by_source(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option { + for container in src.value.ancestors().skip(1) { + let res = match_ast! { + match container { + ast::TraitDef(it) => { + let def = Trait::from_source(db, src.with_value(it))?; + def.id.child_by_source(db) + }, + ast::ImplBlock(it) => { + let def = ImplBlock::from_source(db, src.with_value(it))?; + def.id.child_by_source(db) + }, + ast::FnDef(it) => { + let def = Function::from_source(db, src.with_value(it))?; + DefWithBodyId::from(def.id) + .child_by_source(db) + }, + ast::StaticDef(it) => { + let def = Static::from_source(db, src.with_value(it))?; + DefWithBodyId::from(def.id) + .child_by_source(db) + }, + ast::ConstDef(it) => { + let def = Const::from_source(db, src.with_value(it))?; + DefWithBodyId::from(def.id) + .child_by_source(db) + }, + _ => { continue }, + } + }; + return Some(res); + } - let module_source = ModuleSource::from_child_node(db, src); - let c = Module::from_definition(db, src.with_value(module_source))?; - Some(c.id.child_by_source(db)) + let module_source = ModuleSource::from_child_node(db, src); + let c = Module::from_definition(db, src.with_value(module_source))?; + Some(c.id.child_by_source(db)) + } } -- cgit v1.2.3 From ac5a3f611b05dbedd286169539335ae9f0fbb7b0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 20 Dec 2019 12:20:49 +0100 Subject: Support for nested ADT --- crates/ra_hir/src/code_model.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 8dbc0d667..d20e9de63 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -269,7 +269,7 @@ pub struct Struct { impl Struct { pub fn module(self, db: &impl DefDatabase) -> Module { - Module { id: self.id.lookup(db).container } + Module { id: self.id.lookup(db).container.module(db) } } pub fn krate(self, db: &impl DefDatabase) -> Option { @@ -290,7 +290,7 @@ impl Struct { } pub fn ty(self, db: &impl HirDatabase) -> Type { - Type::from_def(db, self.id.lookup(db).container.krate, self.id) + Type::from_def(db, self.id.lookup(db).container.module(db).krate, self.id) } fn variant_data(self, db: &impl DefDatabase) -> Arc { @@ -309,11 +309,11 @@ impl Union { } pub fn module(self, db: &impl DefDatabase) -> Module { - Module { id: self.id.lookup(db).container } + Module { id: self.id.lookup(db).container.module(db) } } pub fn ty(self, db: &impl HirDatabase) -> Type { - Type::from_def(db, self.id.lookup(db).container.krate, self.id) + Type::from_def(db, self.id.lookup(db).container.module(db).krate, self.id) } pub fn fields(self, db: &impl HirDatabase) -> Vec { @@ -337,7 +337,7 @@ pub struct Enum { impl Enum { pub fn module(self, db: &impl DefDatabase) -> Module { - Module { id: self.id.lookup(db).container } + Module { id: self.id.lookup(db).container.module(db) } } pub fn krate(self, db: &impl DefDatabase) -> Option { @@ -357,7 +357,7 @@ impl Enum { } pub fn ty(self, db: &impl HirDatabase) -> Type { - Type::from_def(db, self.id.lookup(db).container.krate, self.id) + Type::from_def(db, self.id.lookup(db).container.module(db).krate, self.id) } } -- cgit v1.2.3 From f42697e54b9d0a040011cb04c266d51710e249f1 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 20 Dec 2019 12:29:25 +0100 Subject: Support for nested traits --- crates/ra_hir/src/code_model.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index d20e9de63..35e1f752b 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -553,7 +553,7 @@ pub struct Trait { impl Trait { pub fn module(self, db: &impl DefDatabase) -> Module { - Module { id: self.id.lookup(db).container } + Module { id: self.id.lookup(db).container.module(db) } } pub fn name(self, db: &impl DefDatabase) -> Name { -- cgit v1.2.3 From 1234dda9ee60a19a83a9664c2e1208247566b49b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 20 Dec 2019 13:47:44 +0100 Subject: Use generic ItemLoc for impls --- crates/ra_hir/src/code_model.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 35e1f752b..ecf883272 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -754,7 +754,7 @@ impl ImplBlock { let environment = TraitEnvironment::lower(db, &resolver); let ty = Ty::from_hir(db, &resolver, &impl_data.target_type); Type { - krate: self.id.lookup(db).container.krate, + krate: self.id.lookup(db).container.module(db).krate, ty: InEnvironment { value: ty, environment }, } } @@ -768,7 +768,7 @@ impl ImplBlock { } pub fn module(&self, db: &impl DefDatabase) -> Module { - self.id.lookup(db).container.into() + self.id.lookup(db).container.module(db).into() } pub fn krate(&self, db: &impl DefDatabase) -> Crate { -- cgit v1.2.3 From 3d4b48e481da35f19366514c0e22ed42fef037a0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 20 Dec 2019 14:47:01 +0100 Subject: Fix resolve for field init shorthand --- crates/ra_hir/src/from_source.rs | 16 +++++++++------- crates/ra_hir/src/source_binder.rs | 8 +++++++- 2 files changed, 16 insertions(+), 8 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 3b6454a1d..42ca55fe7 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -1,4 +1,6 @@ -//! FIXME: write short doc here +//! Finds a corresponding hir data structure for a syntax node in a specific +//! file. + use hir_def::{ child_by_source::ChildBySource, dyn_map::DynMap, keys, keys::Key, nameres::ModuleSource, ConstId, DefWithBodyId, EnumId, EnumVariantId, FunctionId, GenericDefId, ImplId, ModuleId, @@ -11,14 +13,14 @@ use ra_syntax::{ }; use crate::{ - db::{AstDatabase, DefDatabase, HirDatabase}, + db::{DefDatabase, HirDatabase}, Const, DefWithBody, Enum, EnumVariant, FieldSource, Function, ImplBlock, InFile, Local, MacroDef, Module, Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union, }; pub trait FromSource: Sized { type Ast; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option; + fn from_source(db: &impl DefDatabase, src: InFile) -> Option; } pub trait FromSourceByContainer: Sized { @@ -32,7 +34,7 @@ where T: From<::Id>, { type Ast = ::Ast; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { + fn from_source(db: &impl DefDatabase, src: InFile) -> Option { analyze_container(db, src.as_ref().map(|it| it.syntax()))[T::KEY] .get(&src) .copied() @@ -64,7 +66,7 @@ from_source_by_container_impls![ impl FromSource for MacroDef { type Ast = ast::MacroCall; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { + fn from_source(db: &impl DefDatabase, src: InFile) -> Option { let kind = MacroDefKind::Declarative; let module_src = ModuleSource::from_child_node(db, src.as_ref().map(|it| it.syntax())); @@ -80,7 +82,7 @@ impl FromSource for MacroDef { impl FromSource for EnumVariant { type Ast = ast::EnumVariant; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { + fn from_source(db: &impl DefDatabase, src: InFile) -> Option { let parent_enum = src.value.parent_enum(); let src_enum = InFile { file_id: src.file_id, value: parent_enum }; let parent_enum = Enum::from_source(db, src_enum)?; @@ -93,7 +95,7 @@ impl FromSource for EnumVariant { impl FromSource for StructField { type Ast = FieldSource; - fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile) -> Option { + fn from_source(db: &impl DefDatabase, src: InFile) -> Option { let src = src.as_ref(); // FIXME this is buggy diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index d326169b3..b60a6b87e 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -237,7 +237,13 @@ impl SourceAnalyzer { } pub fn resolve_record_field(&self, field: &ast::RecordField) -> Option { - let expr_id = self.expr_id(&field.expr()?)?; + let expr_id = match field.expr() { + Some(it) => self.expr_id(&it)?, + None => { + let src = InFile { file_id: self.file_id, value: field }; + self.body_source_map.as_ref()?.field_init_shorthand_expr(src)? + } + }; self.infer.as_ref()?.record_field_resolution(expr_id).map(|it| it.into()) } -- cgit v1.2.3 From 1b8ce5b37b597679796b3ebc57afd55af49449b0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 20 Dec 2019 15:58:20 +0100 Subject: Move impls to ItemScope --- crates/ra_hir/src/code_model.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index ecf883272..fca3a2950 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -221,7 +221,7 @@ impl Module { pub fn impl_blocks(self, db: &impl DefDatabase) -> Vec { let def_map = db.crate_def_map(self.id.krate); - def_map[self.id.local_id].impls.iter().copied().map(ImplBlock::from).collect() + def_map[self.id.local_id].scope.impls().map(ImplBlock::from).collect() } pub(crate) fn with_module_id(self, module_id: LocalModuleId) -> Module { -- cgit v1.2.3 From 67ba9072fad8698af4e96b38b8b4acfdd801f7f7 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 21 Dec 2019 12:15:56 +0100 Subject: Remove hir for imports --- crates/ra_hir/src/code_model.rs | 18 ++++++++---------- crates/ra_hir/src/has_source.rs | 16 ++-------------- crates/ra_hir/src/lib.rs | 4 ++-- 3 files changed, 12 insertions(+), 26 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index fca3a2950..e6768ea0b 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -12,8 +12,8 @@ use hir_def::{ resolver::HasResolver, type_ref::{Mutability, TypeRef}, AdtId, ConstId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, LocalEnumVariantId, - LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, StaticId, StructId, - TraitId, TypeAliasId, TypeParamId, UnionId, + LocalModuleId, LocalStructFieldId, Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, + TypeParamId, UnionId, }; use hir_expand::{ diagnostics::DiagnosticSink, @@ -180,13 +180,11 @@ 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)> { db.crate_def_map(self.id.krate)[self.id.local_id] .scope .entries() - .map(|(name, res)| { - (name.clone(), res.def.into(), res.import.map(|id| Import { parent: self, id })) - }) + .map(|(name, res)| (name.clone(), res.def.into())) .collect() } @@ -229,10 +227,10 @@ impl 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 { diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs index 72afecf26..5541266e2 100644 --- a/crates/ra_hir/src/has_source.rs +++ b/crates/ra_hir/src/has_source.rs @@ -9,8 +9,8 @@ use hir_def::{ use ra_syntax::ast; use crate::{ - db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, Import, MacroDef, - Module, Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union, + db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, MacroDef, Module, + Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union, }; pub use hir_expand::InFile; @@ -117,18 +117,6 @@ impl HasSource for ImplBlock { self.id.lookup(db).source(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) -> InFile { - 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; diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 7f9aef770..0008a8858 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -40,8 +40,8 @@ mod from_source; pub use crate::{ code_model::{ Adt, AssocItem, AttrDef, Const, Crate, CrateDependency, DefWithBody, Docs, Enum, - EnumVariant, FieldSource, Function, GenericDef, HasAttrs, ImplBlock, Import, Local, - MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias, + EnumVariant, FieldSource, Function, GenericDef, HasAttrs, ImplBlock, Local, MacroDef, + Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, }, from_source::FromSource, -- cgit v1.2.3 From d3353118939d5ab77a63218db6ef542843256aac Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 21 Dec 2019 12:44:28 +0100 Subject: Remove import source map --- crates/ra_hir/src/db.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index bfae3660b..f5ffd64fa 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs @@ -4,8 +4,8 @@ pub use hir_def::db::{ BodyQuery, BodyWithSourceMapQuery, ConstDataQuery, CrateDefMapQuery, CrateLangItemsQuery, DefDatabase, DefDatabaseStorage, DocumentationQuery, EnumDataQuery, ExprScopesQuery, FunctionDataQuery, GenericParamsQuery, ImplDataQuery, InternDatabase, InternDatabaseStorage, - LangItemQuery, ModuleLangItemsQuery, RawItemsQuery, RawItemsWithSourceMapQuery, - StaticDataQuery, StructDataQuery, TraitDataQuery, TypeAliasDataQuery, + LangItemQuery, ModuleLangItemsQuery, RawItemsQuery, StaticDataQuery, StructDataQuery, + TraitDataQuery, TypeAliasDataQuery, }; pub use hir_expand::db::{ AstDatabase, AstDatabaseStorage, AstIdMapQuery, MacroArgQuery, MacroDefQuery, MacroExpandQuery, -- cgit v1.2.3 From 973b5cf7e20842711d59a810b268796b26241382 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 21 Dec 2019 15:04:33 +0100 Subject: Revert "Merge #2629" This reverts commit cdc9d682b066b110e0a44e5f8f1c574b38c16ba9, reversing changes made to 90ef070db3dce0a7acb9cd11d0b0d72de13c9d79. --- crates/ra_hir/src/code_model.rs | 18 ++++++++++-------- crates/ra_hir/src/db.rs | 4 ++-- crates/ra_hir/src/has_source.rs | 16 ++++++++++++++-- crates/ra_hir/src/lib.rs | 4 ++-- 4 files changed, 28 insertions(+), 14 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index e6768ea0b..fca3a2950 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -12,8 +12,8 @@ use hir_def::{ 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 @@ impl 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)> { 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 @@ impl 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 { diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index f5ffd64fa..bfae3660b 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs @@ -4,8 +4,8 @@ pub use hir_def::db::{ 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, diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs index 5541266e2..72afecf26 100644 --- a/crates/ra_hir/src/has_source.rs +++ b/crates/ra_hir/src/has_source.rs @@ -9,8 +9,8 @@ use hir_def::{ 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 @@ impl HasSource for ImplBlock { self.id.lookup(db).source(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) -> InFile { + 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; diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 0008a8858..7f9aef770 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -40,8 +40,8 @@ mod from_source; 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, -- cgit v1.2.3 From 4e0168ec14b74003e8388b72b64c2ca78b580274 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 21 Dec 2019 15:17:10 +0100 Subject: Remove imports from hir --- crates/ra_hir/src/code_model.rs | 15 ++++----------- crates/ra_hir/src/has_source.rs | 16 ++-------------- crates/ra_hir/src/lib.rs | 4 ++-- 3 files changed, 8 insertions(+), 27 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index fca3a2950..4cd28eb4e 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -12,8 +12,8 @@ use hir_def::{ resolver::HasResolver, type_ref::{Mutability, TypeRef}, AdtId, ConstId, DefWithBodyId, EnumId, FunctionId, HasModule, ImplId, LocalEnumVariantId, - LocalImportId, LocalModuleId, LocalStructFieldId, Lookup, ModuleId, StaticId, StructId, - TraitId, TypeAliasId, TypeParamId, UnionId, + LocalModuleId, LocalStructFieldId, Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, + TypeParamId, UnionId, }; use hir_expand::{ diagnostics::DiagnosticSink, @@ -180,13 +180,11 @@ 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)> { db.crate_def_map(self.id.krate)[self.id.local_id] .scope .entries() - .map(|(name, res)| { - (name.clone(), res.def.into(), res.import.map(|id| Import { parent: self, id })) - }) + .map(|(name, res)| (name.clone(), res.def.into())) .collect() } @@ -229,11 +227,6 @@ impl Module { } } -pub struct Import { - pub(crate) parent: Module, - pub(crate) id: LocalImportId, -} - #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct StructField { pub(crate) parent: VariantDef, diff --git a/crates/ra_hir/src/has_source.rs b/crates/ra_hir/src/has_source.rs index 72afecf26..5541266e2 100644 --- a/crates/ra_hir/src/has_source.rs +++ b/crates/ra_hir/src/has_source.rs @@ -9,8 +9,8 @@ use hir_def::{ use ra_syntax::ast; use crate::{ - db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, Import, MacroDef, - Module, Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union, + db::DefDatabase, Const, Enum, EnumVariant, FieldSource, Function, ImplBlock, MacroDef, Module, + Static, Struct, StructField, Trait, TypeAlias, TypeParam, Union, }; pub use hir_expand::InFile; @@ -117,18 +117,6 @@ impl HasSource for ImplBlock { self.id.lookup(db).source(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) -> InFile { - 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; diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 7f9aef770..0008a8858 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -40,8 +40,8 @@ mod from_source; pub use crate::{ code_model::{ Adt, AssocItem, AttrDef, Const, Crate, CrateDependency, DefWithBody, Docs, Enum, - EnumVariant, FieldSource, Function, GenericDef, HasAttrs, ImplBlock, Import, Local, - MacroDef, Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias, + EnumVariant, FieldSource, Function, GenericDef, HasAttrs, ImplBlock, Local, MacroDef, + Module, ModuleDef, ScopeDef, Static, Struct, StructField, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, }, from_source::FromSource, -- cgit v1.2.3 From 02f79e37ca1c4a617a46b85bf897dffbf4abed9e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 21 Dec 2019 17:26:05 +0100 Subject: Remove import source map --- crates/ra_hir/src/db.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index bfae3660b..f5ffd64fa 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs @@ -4,8 +4,8 @@ pub use hir_def::db::{ BodyQuery, BodyWithSourceMapQuery, ConstDataQuery, CrateDefMapQuery, CrateLangItemsQuery, DefDatabase, DefDatabaseStorage, DocumentationQuery, EnumDataQuery, ExprScopesQuery, FunctionDataQuery, GenericParamsQuery, ImplDataQuery, InternDatabase, InternDatabaseStorage, - LangItemQuery, ModuleLangItemsQuery, RawItemsQuery, RawItemsWithSourceMapQuery, - StaticDataQuery, StructDataQuery, TraitDataQuery, TypeAliasDataQuery, + LangItemQuery, ModuleLangItemsQuery, RawItemsQuery, StaticDataQuery, StructDataQuery, + TraitDataQuery, TypeAliasDataQuery, }; pub use hir_expand::db::{ AstDatabase, AstDatabaseStorage, AstIdMapQuery, MacroArgQuery, MacroDefQuery, MacroExpandQuery, -- cgit v1.2.3 From d4b135f38c8c0050768c50e62043ddca5f09079a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 21 Dec 2019 18:45:46 +0100 Subject: Optimize and profile --- crates/ra_hir/Cargo.toml | 1 + crates/ra_hir/src/from_source.rs | 4 ++++ crates/ra_hir/src/source_binder.rs | 3 +++ 3 files changed, 8 insertions(+) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/Cargo.toml b/crates/ra_hir/Cargo.toml index 6ca9cc2e7..7dc31ad3c 100644 --- a/crates/ra_hir/Cargo.toml +++ b/crates/ra_hir/Cargo.toml @@ -14,6 +14,7 @@ either = "1.5" ra_syntax = { path = "../ra_syntax" } ra_db = { path = "../ra_db" } +ra_prof = { path = "../ra_prof" } hir_expand = { path = "../ra_hir_expand", package = "ra_hir_expand" } hir_def = { path = "../ra_hir_def", package = "ra_hir_def" } hir_ty = { path = "../ra_hir_ty", package = "ra_hir_ty" } diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index 42ca55fe7..ebd9ee2a8 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -7,6 +7,7 @@ use hir_def::{ StaticId, StructId, TraitId, TypeAliasId, UnionId, VariantId, }; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; +use ra_prof::profile; use ra_syntax::{ ast::{self, AstNode, NameOwner}, match_ast, SyntaxNode, @@ -169,6 +170,7 @@ impl TypeParam { impl Module { pub fn from_declaration(db: &impl DefDatabase, src: InFile) -> Option { + let _p = profile("Module::from_declaration"); let parent_declaration = src.value.syntax().ancestors().skip(1).find_map(ast::Module::cast); let parent_module = match parent_declaration { @@ -191,6 +193,7 @@ impl Module { } pub fn from_definition(db: &impl DefDatabase, src: InFile) -> Option { + let _p = profile("Module::from_definition"); match src.value { ModuleSource::Module(ref module) => { assert!(!module.has_semi()); @@ -214,6 +217,7 @@ impl Module { } fn analyze_container(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> DynMap { + let _p = profile("analyze_container"); return child_by_source(db, src).unwrap_or_default(); fn child_by_source(db: &impl DefDatabase, src: InFile<&SyntaxNode>) -> Option { diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index b60a6b87e..85b378483 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -26,6 +26,7 @@ use hir_ty::{ method_resolution::{self, implements_trait}, Canonical, InEnvironment, InferenceResult, TraitEnvironment, Ty, }; +use ra_prof::profile; use ra_syntax::{ ast::{self, AstNode}, match_ast, AstPtr, @@ -83,6 +84,7 @@ fn def_with_body_from_child_node( db: &impl HirDatabase, child: InFile<&SyntaxNode>, ) -> Option { + let _p = profile("def_with_body_from_child_node"); child.cloned().ancestors_with_macros(db).find_map(|node| { let n = &node.value; match_ast! { @@ -169,6 +171,7 @@ impl SourceAnalyzer { node: InFile<&SyntaxNode>, offset: Option, ) -> SourceAnalyzer { + let _p = profile("SourceAnalyzer::new"); let def_with_body = def_with_body_from_child_node(db, node); if let Some(def) = def_with_body { let (_body, source_map) = db.body_with_source_map(def.into()); -- cgit v1.2.3 From e903f58d29662b5509fb20c74d7c4131271bfbf0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 21 Dec 2019 19:40:20 +0100 Subject: More profiling --- crates/ra_hir/src/from_source.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/from_source.rs b/crates/ra_hir/src/from_source.rs index ebd9ee2a8..6314be8d4 100644 --- a/crates/ra_hir/src/from_source.rs +++ b/crates/ra_hir/src/from_source.rs @@ -7,6 +7,7 @@ use hir_def::{ StaticId, StructId, TraitId, TypeAliasId, UnionId, VariantId, }; use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind}; +use ra_db::FileId; use ra_prof::profile; use ra_syntax::{ ast::{self, AstNode, NameOwner}, @@ -206,10 +207,14 @@ impl Module { }; let original_file = src.file_id.original_file(db); + Module::from_file(db, original_file) + } - let (krate, local_id) = db.relevant_crates(original_file).iter().find_map(|&crate_id| { + fn from_file(db: &impl DefDatabase, file: FileId) -> Option { + let _p = profile("Module::from_file"); + let (krate, local_id) = db.relevant_crates(file).iter().find_map(|&crate_id| { let crate_def_map = db.crate_def_map(crate_id); - let local_id = crate_def_map.modules_for_file(original_file).next()?; + let local_id = crate_def_map.modules_for_file(file).next()?; Some((crate_id, local_id)) })?; Some(Module { id: ModuleId { krate, local_id } }) -- cgit v1.2.3 From 6c3ddcfa501060cff3a7f81c179f712ef072c808 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 22 Dec 2019 15:37:07 +0100 Subject: Simplify --- crates/ra_hir/src/code_model.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 4cd28eb4e..bcfc0d03e 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -184,7 +184,7 @@ impl Module { db.crate_def_map(self.id.krate)[self.id.local_id] .scope .entries() - .map(|(name, res)| (name.clone(), res.def.into())) + .map(|(name, def)| (name.clone(), def.into())) .collect() } -- cgit v1.2.3