From 91c120ccea4f0cfef20fd4d918154c8152f83816 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 02:34:34 +0300 Subject: introduce Source struct --- crates/ra_hir/src/adt.rs | 9 ++++----- crates/ra_hir/src/code_model.rs | 18 +++++++++++++----- crates/ra_hir/src/docs.rs | 2 +- crates/ra_hir/src/generics.rs | 2 +- 4 files changed, 19 insertions(+), 12 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs index 38ff1d6f6..36679e99b 100644 --- a/crates/ra_hir/src/adt.rs +++ b/crates/ra_hir/src/adt.rs @@ -59,8 +59,8 @@ impl StructData { db: &(impl DefDatabase + AstDatabase), struct_: Struct, ) -> Arc<StructData> { - let (_, struct_def) = struct_.source(db); - Arc::new(StructData::new(&*struct_def)) + let src = struct_.source(db); + Arc::new(StructData::new(&*src.ast)) } } @@ -211,9 +211,8 @@ impl StructField { let es; let (file_id, struct_kind) = match self.parent { VariantDef::Struct(s) => { - let (file_id, source) = s.source(db); - ss = source; - (file_id, ss.kind()) + ss = s.source(db); + (ss.file_id, ss.ast.kind()) } VariantDef::EnumVariant(e) => { let (file_id, source) = e.source(db); diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 27850028b..3469da18a 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -20,6 +20,17 @@ use crate::{ type_ref::Mutability, }; +pub struct Source<T> { + pub file_id: HirFileId, + pub ast: T, +} + +impl<T> From<(HirFileId, T)> for Source<T> { + fn from((file_id, ast): (HirFileId, T)) -> Self { + Source { file_id, ast } + } +} + /// hir::Crate describes a single crate. It's the main interface with which /// a crate's dependencies interact. Mostly, it should be just a proxy for the /// root module. @@ -354,11 +365,8 @@ pub struct Struct { } impl Struct { - pub fn source( - self, - db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::StructDef>) { - self.id.source(db) + pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { + self.id.source(db).into() } pub fn module(self, db: &impl HirDatabase) -> Module { diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index 1b0f84de5..edd937901 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -76,7 +76,7 @@ pub(crate) fn documentation_query( FieldSource::Named(named) => docs_from_ast(&*named), FieldSource::Pos(..) => return None, }, - DocDef::Struct(it) => docs_from_ast(&*it.source(db).1), + DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast), DocDef::Enum(it) => docs_from_ast(&*it.source(db).1), DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).1), DocDef::Static(it) => docs_from_ast(&*it.source(db).1), diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index b6c5e18d3..294a00721 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -69,7 +69,7 @@ impl GenericParams { let start = generics.parent_params.as_ref().map(|p| p.params.len()).unwrap_or(0) as u32; match def { GenericDef::Function(it) => generics.fill(&*it.source(db).1, start), - GenericDef::Struct(it) => generics.fill(&*it.source(db).1, start), + GenericDef::Struct(it) => generics.fill(&*it.source(db).ast, start), GenericDef::Union(it) => generics.fill(&*it.source(db).1, start), GenericDef::Enum(it) => generics.fill(&*it.source(db).1, start), GenericDef::Trait(it) => { -- cgit v1.2.3 From 2a1fe26b6d354dbbd1b3843d288d56e74fa00557 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 03:17:29 +0300 Subject: use Source more --- crates/ra_hir/src/adt.rs | 21 ++++++++++----------- crates/ra_hir/src/code_model.rs | 9 +++------ crates/ra_hir/src/docs.rs | 4 ++-- crates/ra_hir/src/generics.rs | 2 +- crates/ra_hir/src/lib.rs | 2 +- 5 files changed, 17 insertions(+), 21 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs index 36679e99b..2b372333f 100644 --- a/crates/ra_hir/src/adt.rs +++ b/crates/ra_hir/src/adt.rs @@ -11,7 +11,7 @@ use ra_syntax::{ use crate::{ Name, AsName, Struct, Union, Enum, EnumVariant, Crate, AstDatabase, - HirDatabase, HirFileId, StructField, FieldSource, + HirDatabase, HirFileId, StructField, FieldSource, Source, type_ref::TypeRef, DefDatabase, }; @@ -72,15 +72,15 @@ impl EnumVariant { pub(crate) fn source_impl( &self, db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::EnumVariant>) { - let (file_id, enum_def) = self.parent.source(db); - let var = variants(&*enum_def) + ) -> Source<TreeArc<ast::EnumVariant>> { + let src = self.parent.source(db); + let ast = variants(&*src.ast) .zip(db.enum_data(self.parent).variants.iter()) .find(|(_syntax, (id, _))| *id == self.id) .unwrap() .0 .to_owned(); - (file_id, var) + Source { file_id: src.file_id, ast } } pub(crate) fn variant_data(&self, db: &impl DefDatabase) -> Arc<VariantData> { db.enum_data(self.parent).variants[self.id].variant_data.clone() @@ -95,9 +95,9 @@ pub struct EnumData { impl EnumData { pub(crate) fn enum_data_query(db: &(impl DefDatabase + AstDatabase), e: Enum) -> Arc<EnumData> { - let (_file_id, enum_def) = e.source(db); - let name = enum_def.name().map(|n| n.as_name()); - let variants = variants(&*enum_def) + let src = e.source(db); + let name = src.ast.name().map(|n| n.as_name()); + let variants = variants(&*src.ast) .map(|var| EnumVariantData { name: var.name().map(|it| it.as_name()), variant_data: Arc::new(VariantData::new(var.kind())), @@ -215,9 +215,8 @@ impl StructField { (ss.file_id, ss.ast.kind()) } VariantDef::EnumVariant(e) => { - let (file_id, source) = e.source(db); - es = source; - (file_id, es.kind()) + es = e.source(db); + (es.file_id, es.ast.kind()) } }; diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 3469da18a..63fdca55e 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -456,11 +456,8 @@ pub struct Enum { } impl Enum { - pub fn source( - self, - db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::EnumDef>) { - self.id.source(db) + pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> { + self.id.source(db).into() } pub fn module(self, db: &impl HirDatabase) -> Module { @@ -509,7 +506,7 @@ impl EnumVariant { pub fn source( &self, db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::EnumVariant>) { + ) -> Source<TreeArc<ast::EnumVariant>> { self.source_impl(db) } pub fn module(&self, db: &impl HirDatabase) -> Module { diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index edd937901..70b9d13b2 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -77,8 +77,8 @@ pub(crate) fn documentation_query( FieldSource::Pos(..) => return None, }, DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast), - DocDef::Enum(it) => docs_from_ast(&*it.source(db).1), - DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).1), + DocDef::Enum(it) => docs_from_ast(&*it.source(db).ast), + DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast), DocDef::Static(it) => docs_from_ast(&*it.source(db).1), DocDef::Const(it) => docs_from_ast(&*it.source(db).1), DocDef::Function(it) => docs_from_ast(&*it.source(db).1), diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index 294a00721..2a92d5945 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -71,7 +71,7 @@ impl GenericParams { GenericDef::Function(it) => generics.fill(&*it.source(db).1, start), GenericDef::Struct(it) => generics.fill(&*it.source(db).ast, start), GenericDef::Union(it) => generics.fill(&*it.source(db).1, start), - GenericDef::Enum(it) => generics.fill(&*it.source(db).1, start), + GenericDef::Enum(it) => generics.fill(&*it.source(db).ast, start), GenericDef::Trait(it) => { // traits get the Self type as an implicit first type parameter generics.params.push(GenericParam { diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 0e4aaf678..90e3f1275 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -81,5 +81,5 @@ pub use self::code_model::{ StructField, FieldSource, Static, Const, ConstSignature, Trait, TypeAlias, MacroDef, Container, - BuiltinType, + BuiltinType, Source, }; -- cgit v1.2.3 From 36865adcb946d5567fb61d3547b78fc71df58b20 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 16:40:49 +0300 Subject: Introduce HasSource trait --- crates/ra_hir/src/code_model.rs | 26 ++++++++++++++++++++++++++ crates/ra_hir/src/lib.rs | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 63fdca55e..765850488 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -31,6 +31,11 @@ impl<T> From<(HirFileId, T)> for Source<T> { } } +pub trait HasSource { + type Ast; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<Self::Ast>; +} + /// hir::Crate describes a single crate. It's the main interface with which /// a crate's dependencies interact. Mostly, it should be just a proxy for the /// root module. @@ -364,6 +369,13 @@ pub struct Struct { pub(crate) id: StructId, } +impl HasSource for Struct { + type Ast = TreeArc<ast::StructDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { + self.id.source(db).into() + } +} + impl Struct { pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { self.id.source(db).into() @@ -422,6 +434,13 @@ pub struct Union { pub(crate) id: StructId, } +impl HasSource for Union { + type Ast = TreeArc<ast::StructDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { + self.id.source(db).into() + } +} + impl Union { pub fn source( self, @@ -455,6 +474,13 @@ pub struct Enum { pub(crate) id: EnumId, } +impl HasSource for Enum { + type Ast = TreeArc<ast::EnumDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> { + self.id.source(db).into() + } +} + impl Enum { pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> { self.id.source(db).into() diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 90e3f1275..02f5f7f40 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -81,5 +81,5 @@ pub use self::code_model::{ StructField, FieldSource, Static, Const, ConstSignature, Trait, TypeAlias, MacroDef, Container, - BuiltinType, Source, + BuiltinType, Source, HasSource, }; -- cgit v1.2.3 From 4f94af3c4aaa57ebb4cb01f7e4edfb3a0821b09b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 16:49:56 +0300 Subject: use Source for Function --- crates/ra_hir/src/code_model.rs | 20 ++++++++++++++------ crates/ra_hir/src/docs.rs | 2 +- crates/ra_hir/src/expr.rs | 6 +++--- crates/ra_hir/src/expr/validation.rs | 2 +- crates/ra_hir/src/generics.rs | 2 +- crates/ra_hir/src/ty/infer.rs | 2 +- 6 files changed, 21 insertions(+), 13 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 765850488..aa6eb741b 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -603,6 +603,14 @@ pub struct Function { pub(crate) id: FunctionId, } +impl HasSource for Function { + type Ast = TreeArc<ast::FnDef>; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> { + self.id.source(db).into() + } +} + /// The declared signature of a function. #[derive(Debug, Clone, PartialEq, Eq)] pub struct FnSignature { @@ -619,11 +627,11 @@ impl FnSignature { db: &(impl DefDatabase + AstDatabase), func: Function, ) -> Arc<FnSignature> { - let (_, node) = func.source(db); - let name = node.name().map(|n| n.as_name()).unwrap_or_else(Name::missing); + let src = func.source(db); + let name = src.ast.name().map(|n| n.as_name()).unwrap_or_else(Name::missing); let mut params = Vec::new(); let mut has_self_param = false; - if let Some(param_list) = node.param_list() { + if let Some(param_list) = src.ast.param_list() { if let Some(self_param) = param_list.self_param() { let self_type = if let Some(type_ref) = self_param.ascribed_type() { TypeRef::from_ast(type_ref) @@ -647,7 +655,7 @@ impl FnSignature { params.push(type_ref); } } - let ret_type = if let Some(type_ref) = node.ret_type().and_then(|rt| rt.type_ref()) { + let ret_type = if let Some(type_ref) = src.ast.ret_type().and_then(|rt| rt.type_ref()) { TypeRef::from_ast(type_ref) } else { TypeRef::unit() @@ -676,8 +684,8 @@ impl FnSignature { } impl Function { - pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> (HirFileId, TreeArc<ast::FnDef>) { - self.id.source(db) + pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> { + self.id.source(db).into() } pub fn module(self, db: &impl DefDatabase) -> Module { diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index 70b9d13b2..8d7a5255f 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -81,7 +81,7 @@ pub(crate) fn documentation_query( DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast), DocDef::Static(it) => docs_from_ast(&*it.source(db).1), DocDef::Const(it) => docs_from_ast(&*it.source(db).1), - DocDef::Function(it) => docs_from_ast(&*it.source(db).1), + DocDef::Function(it) => docs_from_ast(&*it.source(db).ast), DocDef::Union(it) => docs_from_ast(&*it.source(db).1), DocDef::Trait(it) => docs_from_ast(&*it.source(db).1), DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).1), diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs index 012f374ec..46d51e0db 100644 --- a/crates/ra_hir/src/expr.rs +++ b/crates/ra_hir/src/expr.rs @@ -1023,9 +1023,9 @@ pub(crate) fn body_with_source_map_query( collector.collect_const_body(&src) } DefWithBody::Function(ref f) => { - let (file_id, src) = f.source(db); - collector = ExprCollector::new(def, file_id, def.resolver(db), db); - collector.collect_fn_body(&src) + let src = f.source(db); + collector = ExprCollector::new(def, src.file_id, def.resolver(db), db); + collector.collect_fn_body(&src.ast) } DefWithBody::Static(ref s) => { let (file_id, src) = s.source(db); diff --git a/crates/ra_hir/src/expr/validation.rs b/crates/ra_hir/src/expr/validation.rs index a1b2641da..ff5e5f68e 100644 --- a/crates/ra_hir/src/expr/validation.rs +++ b/crates/ra_hir/src/expr/validation.rs @@ -71,7 +71,7 @@ impl<'a, 'b> ExprValidator<'a, 'b> { return; } let source_map = self.func.body_source_map(db); - let file_id = self.func.source(db).0; + let file_id = self.func.source(db).file_id; let source_file = db.parse(file_id.original_file(db)).tree; if let Some(field_list_node) = source_map .expr_syntax(id) diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index 2a92d5945..fcccd67c8 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -68,7 +68,7 @@ impl GenericParams { generics.parent_params = parent.map(|p| db.generic_params(p)); let start = generics.parent_params.as_ref().map(|p| p.params.len()).unwrap_or(0) as u32; match def { - GenericDef::Function(it) => generics.fill(&*it.source(db).1, start), + GenericDef::Function(it) => generics.fill(&*it.source(db).ast, start), GenericDef::Struct(it) => generics.fill(&*it.source(db).ast, start), GenericDef::Union(it) => generics.fill(&*it.source(db).1, start), GenericDef::Enum(it) => generics.fill(&*it.source(db).ast, start), diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index 6aa727ea1..a534c2336 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs @@ -1432,7 +1432,7 @@ mod diagnostics { ) { match self { InferenceDiagnostic::NoSuchField { expr, field } => { - let (file, _) = owner.source(db); + let file = owner.source(db).file_id; let field = owner.body_source_map(db).field_syntax(*expr, *field); sink.push(NoSuchField { file, field }) } -- cgit v1.2.3 From 46bc8675edd403ffcd8963e4f26447b283e9d09e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 17:13:20 +0300 Subject: use Source for statics and consts --- crates/ra_hir/src/code_model.rs | 34 ++++++++++++++++++++++------------ crates/ra_hir/src/docs.rs | 4 ++-- crates/ra_hir/src/expr.rs | 12 ++++++------ 3 files changed, 30 insertions(+), 20 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index aa6eb741b..a8a0875e0 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -761,12 +761,17 @@ pub struct Const { pub(crate) id: ConstId, } +impl HasSource for Const { + type Ast = TreeArc<ast::ConstDef>; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> { + self.id.source(db).into() + } +} + impl Const { - pub fn source( - self, - db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::ConstDef>) { - self.id.source(db) + pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> { + self.id.source(db).into() } pub fn module(self, db: &impl DefDatabase) -> Module { @@ -819,7 +824,7 @@ impl ConstSignature { db: &(impl DefDatabase + AstDatabase), konst: Const, ) -> Arc<ConstSignature> { - let (_, node) = konst.source(db); + let node = konst.source(db).ast; const_signature_for(&*node) } @@ -827,7 +832,7 @@ impl ConstSignature { db: &(impl DefDatabase + AstDatabase), konst: Static, ) -> Arc<ConstSignature> { - let (_, node) = konst.source(db); + let node = konst.source(db).ast; const_signature_for(&*node) } } @@ -844,12 +849,17 @@ pub struct Static { pub(crate) id: StaticId, } +impl HasSource for Static { + type Ast = TreeArc<ast::StaticDef>; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> { + self.id.source(db).into() + } +} + impl Static { - pub fn source( - self, - db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::StaticDef>) { - self.id.source(db) + pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> { + self.id.source(db).into() } pub fn module(self, db: &impl DefDatabase) -> Module { diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index 8d7a5255f..86ca981f4 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -79,8 +79,8 @@ pub(crate) fn documentation_query( DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast), DocDef::Enum(it) => docs_from_ast(&*it.source(db).ast), DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast), - DocDef::Static(it) => docs_from_ast(&*it.source(db).1), - DocDef::Const(it) => docs_from_ast(&*it.source(db).1), + DocDef::Static(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Const(it) => docs_from_ast(&*it.source(db).ast), DocDef::Function(it) => docs_from_ast(&*it.source(db).ast), DocDef::Union(it) => docs_from_ast(&*it.source(db).1), DocDef::Trait(it) => docs_from_ast(&*it.source(db).1), diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs index 46d51e0db..48e597519 100644 --- a/crates/ra_hir/src/expr.rs +++ b/crates/ra_hir/src/expr.rs @@ -1018,9 +1018,9 @@ pub(crate) fn body_with_source_map_query( match def { DefWithBody::Const(ref c) => { - let (file_id, src) = c.source(db); - collector = ExprCollector::new(def, file_id, def.resolver(db), db); - collector.collect_const_body(&src) + let src = c.source(db); + collector = ExprCollector::new(def, src.file_id, def.resolver(db), db); + collector.collect_const_body(&src.ast) } DefWithBody::Function(ref f) => { let src = f.source(db); @@ -1028,9 +1028,9 @@ pub(crate) fn body_with_source_map_query( collector.collect_fn_body(&src.ast) } DefWithBody::Static(ref s) => { - let (file_id, src) = s.source(db); - collector = ExprCollector::new(def, file_id, def.resolver(db), db); - collector.collect_static_body(&src) + let src = s.source(db); + collector = ExprCollector::new(def, src.file_id, def.resolver(db), db); + collector.collect_static_body(&src.ast) } } -- cgit v1.2.3 From f2ccc54468348af96d6167da5971749ef0f4ab5e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 17:25:55 +0300 Subject: use Source for TypeAlias --- crates/ra_hir/src/code_model.rs | 11 +++++++++-- crates/ra_hir/src/docs.rs | 2 +- crates/ra_hir/src/generics.rs | 2 +- crates/ra_hir/src/type_alias.rs | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index a8a0875e0..20a8d7d80 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -932,12 +932,19 @@ pub struct TypeAlias { pub(crate) id: TypeAliasId, } +impl HasSource for TypeAlias { + type Ast = TreeArc<ast::TypeAliasDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TypeAliasDef>> { + self.id.source(db).into() + } +} + impl TypeAlias { pub fn source( self, db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::TypeAliasDef>) { - self.id.source(db) + ) -> Source<TreeArc<ast::TypeAliasDef>> { + self.id.source(db).into() } pub fn module(self, db: &impl DefDatabase) -> Module { diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index 86ca981f4..1c6b4f205 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -84,7 +84,7 @@ pub(crate) fn documentation_query( DocDef::Function(it) => docs_from_ast(&*it.source(db).ast), DocDef::Union(it) => docs_from_ast(&*it.source(db).1), DocDef::Trait(it) => docs_from_ast(&*it.source(db).1), - DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).1), + DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast), DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).1), } } diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index fcccd67c8..b7e255c17 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -81,7 +81,7 @@ impl GenericParams { }); generics.fill(&*it.source(db).1, start + 1); } - GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).1, start), + GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).ast, start), GenericDef::ImplBlock(it) => generics.fill(&*it.source(db).1, start), } diff --git a/crates/ra_hir/src/type_alias.rs b/crates/ra_hir/src/type_alias.rs index 970468e3c..c449d7346 100644 --- a/crates/ra_hir/src/type_alias.rs +++ b/crates/ra_hir/src/type_alias.rs @@ -8,6 +8,6 @@ pub(crate) fn type_alias_ref_query( db: &(impl DefDatabase + AstDatabase), typ: TypeAlias, ) -> Arc<TypeRef> { - let (_, node) = typ.source(db); + let node = typ.source(db).ast; Arc::new(TypeRef::from_ast_opt(node.type_ref())) } -- cgit v1.2.3 From f411c2988d40bbdebc5c9a63ce4bfb883a2fbca1 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 17:34:01 +0300 Subject: use Source for Trait --- crates/ra_hir/src/code_model.rs | 21 ++++++++++++++++----- crates/ra_hir/src/docs.rs | 2 +- crates/ra_hir/src/generics.rs | 2 +- crates/ra_hir/src/traits.rs | 10 +++++----- 4 files changed, 23 insertions(+), 12 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 20a8d7d80..0a750b590 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -528,6 +528,13 @@ pub struct EnumVariant { pub(crate) id: EnumVariantId, } +impl HasSource for EnumVariant { + type Ast = TreeArc<ast::EnumVariant>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumVariant>> { + self.source_impl(db) + } +} + impl EnumVariant { pub fn source( &self, @@ -886,12 +893,16 @@ pub struct Trait { pub(crate) id: TraitId, } +impl HasSource for Trait { + type Ast = TreeArc<ast::TraitDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> { + self.id.source(db).into() + } +} + impl Trait { - pub fn source( - self, - db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::TraitDef>) { - self.id.source(db) + pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> { + self.id.source(db).into() } pub fn module(self, db: &impl DefDatabase) -> Module { diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index 1c6b4f205..0cb0c0db8 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -83,7 +83,7 @@ pub(crate) fn documentation_query( DocDef::Const(it) => docs_from_ast(&*it.source(db).ast), DocDef::Function(it) => docs_from_ast(&*it.source(db).ast), DocDef::Union(it) => docs_from_ast(&*it.source(db).1), - DocDef::Trait(it) => docs_from_ast(&*it.source(db).1), + DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast), DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast), DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).1), } diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index b7e255c17..08d711754 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -79,7 +79,7 @@ impl GenericParams { name: Name::self_type(), default: None, }); - generics.fill(&*it.source(db).1, start + 1); + generics.fill(&*it.source(db).ast, start + 1); } GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).ast, start), GenericDef::ImplBlock(it) => generics.fill(&*it.source(db).1, start), diff --git a/crates/ra_hir/src/traits.rs b/crates/ra_hir/src/traits.rs index 967654e97..86dceb2e0 100644 --- a/crates/ra_hir/src/traits.rs +++ b/crates/ra_hir/src/traits.rs @@ -22,12 +22,12 @@ impl TraitData { db: &(impl DefDatabase + AstDatabase), tr: Trait, ) -> Arc<TraitData> { - let (file_id, node) = tr.source(db); - let name = node.name().map(|n| n.as_name()); + let src = tr.source(db); + let name = src.ast.name().map(|n| n.as_name()); let module = tr.module(db); - let ctx = LocationCtx::new(db, module, file_id); - let auto = node.is_auto(); - let items = if let Some(item_list) = node.item_list() { + let ctx = LocationCtx::new(db, module, src.file_id); + let auto = src.ast.is_auto(); + let items = if let Some(item_list) = src.ast.item_list() { item_list .impl_items() .map(|item_node| match item_node.kind() { -- cgit v1.2.3 From a6e339e822bcba4d81f1ab3912ca9612be9b6a0a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 17:36:52 +0300 Subject: use Source for impl block --- crates/ra_hir/src/code_model.rs | 7 ++----- crates/ra_hir/src/docs.rs | 2 +- crates/ra_hir/src/generics.rs | 4 ++-- crates/ra_hir/src/impl_block.rs | 18 ++++++++++++------ 4 files changed, 17 insertions(+), 14 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 0a750b590..5b56f890e 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -442,11 +442,8 @@ impl HasSource for Union { } impl Union { - pub fn source( - self, - db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::StructDef>) { - self.id.source(db) + pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { + self.id.source(db).into() } pub fn name(self, db: &impl DefDatabase) -> Option<Name> { diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index 0cb0c0db8..f736f3875 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -82,7 +82,7 @@ pub(crate) fn documentation_query( DocDef::Static(it) => docs_from_ast(&*it.source(db).ast), DocDef::Const(it) => docs_from_ast(&*it.source(db).ast), DocDef::Function(it) => docs_from_ast(&*it.source(db).ast), - DocDef::Union(it) => docs_from_ast(&*it.source(db).1), + DocDef::Union(it) => docs_from_ast(&*it.source(db).ast), DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast), DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast), DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).1), diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index 08d711754..0b8bd5700 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -70,7 +70,7 @@ impl GenericParams { match def { GenericDef::Function(it) => generics.fill(&*it.source(db).ast, start), GenericDef::Struct(it) => generics.fill(&*it.source(db).ast, start), - GenericDef::Union(it) => generics.fill(&*it.source(db).1, start), + GenericDef::Union(it) => generics.fill(&*it.source(db).ast, start), GenericDef::Enum(it) => generics.fill(&*it.source(db).ast, start), GenericDef::Trait(it) => { // traits get the Self type as an implicit first type parameter @@ -82,7 +82,7 @@ impl GenericParams { generics.fill(&*it.source(db).ast, start + 1); } GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).ast, start), - GenericDef::ImplBlock(it) => generics.fill(&*it.source(db).1, start), + GenericDef::ImplBlock(it) => generics.fill(&*it.source(db).ast, start), } Arc::new(generics) diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs index a0d3b33fe..8194f38d4 100644 --- a/crates/ra_hir/src/impl_block.rs +++ b/crates/ra_hir/src/impl_block.rs @@ -8,7 +8,7 @@ use ra_syntax::{ }; use crate::{ - Const, TypeAlias, Function, HirFileId, AstDatabase, + Const, TypeAlias, Function, HirFileId, AstDatabase, HasSource, Source, HirDatabase, DefDatabase, TraitRef, type_ref::TypeRef, ids::LocationCtx, @@ -44,6 +44,15 @@ pub struct ImplBlock { impl_id: ImplId, } +impl HasSource for ImplBlock { + type Ast = TreeArc<ast::ImplBlock>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> { + let source_map = db.impls_in_module_with_source_map(self.module).1; + let (file_id, source) = self.module.definition_source(db); + (file_id, source_map.get(&source, self.impl_id)).into() + } +} + impl ImplBlock { pub(crate) fn containing( module_impl_blocks: Arc<ModuleImplBlocks>, @@ -58,13 +67,10 @@ impl ImplBlock { } /// Returns the syntax of the impl block - pub fn source( - &self, - db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::ImplBlock>) { + pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> { let source_map = db.impls_in_module_with_source_map(self.module).1; let (file_id, source) = self.module.definition_source(db); - (file_id, source_map.get(&source, self.impl_id)) + (file_id, source_map.get(&source, self.impl_id)).into() } pub fn id(&self) -> ImplId { -- cgit v1.2.3 From 8b94b429e5a76a0518b07111f8faf0dca7457948 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 17:40:18 +0300 Subject: use Source for MacroDef --- crates/ra_hir/src/code_model.rs | 15 ++++++++++----- crates/ra_hir/src/docs.rs | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 5b56f890e..adb61a804 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -1003,12 +1003,17 @@ pub struct MacroDef { pub(crate) id: MacroDefId, } +impl HasSource for MacroDef { + type Ast = TreeArc<ast::MacroCall>; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> { + (self.id.0.file_id(), self.id.0.to_node(db)).into() + } +} + impl MacroDef { - pub fn source( - &self, - db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, TreeArc<ast::MacroCall>) { - (self.id.0.file_id(), self.id.0.to_node(db)) + pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> { + (self.id.0.file_id(), self.id.0.to_node(db)).into() } } diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index f736f3875..cbf7ae10b 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -85,7 +85,7 @@ pub(crate) fn documentation_query( DocDef::Union(it) => docs_from_ast(&*it.source(db).ast), DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast), DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast), - DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).1), + DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).ast), } } -- cgit v1.2.3 From 178d8e96b5c810f40e7dd282ab06bb25d1fc8a2a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 17:43:36 +0300 Subject: use Source for StructField --- crates/ra_hir/src/code_model.rs | 11 +++++++++-- crates/ra_hir/src/docs.rs | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index adb61a804..4c121503e 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -346,13 +346,20 @@ pub enum FieldSource { Pos(TreeArc<ast::PosFieldDef>), } +impl HasSource for StructField { + type Ast = FieldSource; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> { + self.source_impl(db).into() + } +} + impl StructField { pub fn name(&self, db: &impl HirDatabase) -> Name { self.parent.variant_data(db).fields().unwrap()[self.id].name.clone() } - pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> (HirFileId, FieldSource) { - self.source_impl(db) + pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> { + self.source_impl(db).into() } pub fn ty(&self, db: &impl HirDatabase) -> Ty { diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index cbf7ae10b..ae82d55a5 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -72,7 +72,7 @@ pub(crate) fn documentation_query( ) -> Option<Documentation> { match def { DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.1), - DocDef::StructField(it) => match it.source(db).1 { + DocDef::StructField(it) => match it.source(db).ast { FieldSource::Named(named) => docs_from_ast(&*named), FieldSource::Pos(..) => return None, }, -- cgit v1.2.3 From 0145d06515d990f8b7bf45e261674c265c52d858 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 17:47:24 +0300 Subject: use Source for module, part 1 --- crates/ra_hir/src/code_model.rs | 13 +++++-------- crates/ra_hir/src/impl_block.rs | 14 +++++++------- crates/ra_hir/src/lang_item.rs | 2 +- crates/ra_hir/src/source_binder.rs | 6 +++--- 4 files changed, 16 insertions(+), 19 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 4c121503e..e920256e5 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -196,16 +196,13 @@ 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 + AstDatabase), - ) -> (HirFileId, ModuleSource) { + pub fn definition_source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<ModuleSource> { let def_map = db.crate_def_map(self.krate); let decl_id = def_map[self.module_id].declaration; let file_id = def_map[self.module_id].definition; let module_source = ModuleSource::new(db, file_id, decl_id); let file_id = file_id.map(HirFileId::from).unwrap_or_else(|| decl_id.unwrap().file_id()); - (file_id, module_source) + (file_id, module_source).into() } /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. @@ -226,9 +223,9 @@ impl Module { db: &impl HirDatabase, import: ImportId, ) -> Either<TreeArc<ast::UseTree>, TreeArc<ast::ExternCrateItem>> { - let (file_id, source) = self.definition_source(db); - let (_, source_map) = db.raw_items_with_source_map(file_id); - source_map.get(&source, import) + let src = self.definition_source(db); + let (_, source_map) = db.raw_items_with_source_map(src.file_id); + source_map.get(&src.ast, import) } /// Returns the crate this module is part of. diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs index 8194f38d4..646b603d3 100644 --- a/crates/ra_hir/src/impl_block.rs +++ b/crates/ra_hir/src/impl_block.rs @@ -48,8 +48,8 @@ impl HasSource for ImplBlock { type Ast = TreeArc<ast::ImplBlock>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> { let source_map = db.impls_in_module_with_source_map(self.module).1; - let (file_id, source) = self.module.definition_source(db); - (file_id, source_map.get(&source, self.impl_id)).into() + let src = self.module.definition_source(db); + (src.file_id, source_map.get(&src.ast, self.impl_id)).into() } } @@ -69,8 +69,8 @@ impl ImplBlock { /// Returns the syntax of the impl block pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> { let source_map = db.impls_in_module_with_source_map(self.module).1; - let (file_id, source) = self.module.definition_source(db); - (file_id, source_map.get(&source, self.impl_id)).into() + let src = self.module.definition_source(db); + (src.file_id, source_map.get(&src.ast, self.impl_id)).into() } pub fn id(&self) -> ImplId { @@ -207,8 +207,8 @@ impl ModuleImplBlocks { impls_by_def: FxHashMap::default(), }; - let (file_id, module_source) = m.module.definition_source(db); - let node = match &module_source { + let src = m.module.definition_source(db); + let node = match &src.ast { ModuleSource::SourceFile(node) => node.syntax(), ModuleSource::Module(node) => { node.item_list().expect("inline module should have item list").syntax() @@ -216,7 +216,7 @@ impl ModuleImplBlocks { }; for impl_block_ast in node.children().filter_map(ast::ImplBlock::cast) { - let impl_block = ImplData::from_ast(db, file_id, m.module, impl_block_ast); + let impl_block = ImplData::from_ast(db, src.file_id, m.module, impl_block_ast); let id = m.impls.alloc(impl_block); for &impl_item in &m.impls[id].items { m.impls_by_def.insert(impl_item, id); diff --git a/crates/ra_hir/src/lang_item.rs b/crates/ra_hir/src/lang_item.rs index 684fbc068..cdc9182d6 100644 --- a/crates/ra_hir/src/lang_item.rs +++ b/crates/ra_hir/src/lang_item.rs @@ -84,7 +84,7 @@ impl LangItems { ) { // Look for impl targets let (impl_blocks, source_map) = db.impls_in_module_with_source_map(module.clone()); - let source = module.definition_source(db).1; + let source = module.definition_source(db).ast; for (impl_id, _) in impl_blocks.impls.iter() { let impl_block = source_map.get(&source, impl_id); let lang_item_name = impl_block diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 876ebe0e3..4f9e8c5a9 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -97,13 +97,13 @@ pub fn struct_from_module( module: Module, struct_def: &ast::StructDef, ) -> Struct { - let (file_id, _) = module.definition_source(db); + let file_id = module.definition_source(db).file_id; let ctx = LocationCtx::new(db, module, file_id); Struct { id: ctx.to_def(struct_def) } } pub fn enum_from_module(db: &impl HirDatabase, module: Module, enum_def: &ast::EnumDef) -> Enum { - let (file_id, _) = module.definition_source(db); + let file_id = module.definition_source(db).file_id; let ctx = LocationCtx::new(db, module, file_id); Enum { id: ctx.to_def(enum_def) } } @@ -113,7 +113,7 @@ pub fn trait_from_module( module: Module, trait_def: &ast::TraitDef, ) -> Trait { - let (file_id, _) = module.definition_source(db); + let file_id = module.definition_source(db).file_id; let ctx = LocationCtx::new(db, module, file_id); Trait { id: ctx.to_def(trait_def) } } -- cgit v1.2.3 From dd63f17027d5c873a5782dcbb08e9b068fc8ee00 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 17:48:27 +0300 Subject: use Source for module, part 2 --- crates/ra_hir/src/code_model.rs | 4 ++-- crates/ra_hir/src/docs.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index e920256e5..1a33127fa 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -210,11 +210,11 @@ impl Module { pub fn declaration_source( self, db: &(impl DefDatabase + AstDatabase), - ) -> Option<(HirFileId, TreeArc<ast::Module>)> { + ) -> Option<Source<TreeArc<ast::Module>>> { let def_map = db.crate_def_map(self.krate); let decl = def_map[self.module_id].declaration?; let ast = decl.to_node(db); - Some((decl.file_id(), ast)) + Some((decl.file_id(), ast).into()) } /// Returns the syntax of the last path segment corresponding to this import diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index ae82d55a5..4db066c43 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -71,7 +71,7 @@ pub(crate) fn documentation_query( def: DocDef, ) -> Option<Documentation> { match def { - DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.1), + DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.ast), DocDef::StructField(it) => match it.source(db).ast { FieldSource::Named(named) => docs_from_ast(&*named), FieldSource::Pos(..) => return None, -- cgit v1.2.3 From c4512fadb1b332b13bb41b0aa8a28aa964664842 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 17:54:51 +0300 Subject: remove inherent source impls --- crates/ra_hir/src/adt.rs | 2 +- crates/ra_hir/src/code_model.rs | 51 +----------------------------------- crates/ra_hir/src/docs.rs | 2 +- crates/ra_hir/src/expr.rs | 1 + crates/ra_hir/src/expr/validation.rs | 2 +- crates/ra_hir/src/generics.rs | 4 ++- crates/ra_hir/src/traits.rs | 2 +- crates/ra_hir/src/ty/infer.rs | 2 +- crates/ra_hir/src/type_alias.rs | 2 +- 9 files changed, 11 insertions(+), 57 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs index 2b372333f..6b8604b3e 100644 --- a/crates/ra_hir/src/adt.rs +++ b/crates/ra_hir/src/adt.rs @@ -11,7 +11,7 @@ use ra_syntax::{ use crate::{ Name, AsName, Struct, Union, Enum, EnumVariant, Crate, AstDatabase, - HirDatabase, HirFileId, StructField, FieldSource, Source, + HirDatabase, HirFileId, StructField, FieldSource, Source, HasSource, type_ref::TypeRef, DefDatabase, }; diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 1a33127fa..282bd15de 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -355,10 +355,6 @@ impl StructField { self.parent.variant_data(db).fields().unwrap()[self.id].name.clone() } - pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> { - self.source_impl(db).into() - } - pub fn ty(&self, db: &impl HirDatabase) -> Ty { db.type_for_field(*self) } @@ -381,10 +377,6 @@ impl HasSource for Struct { } impl Struct { - pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { - self.id.source(db).into() - } - pub fn module(self, db: &impl HirDatabase) -> Module { self.id.module(db) } @@ -446,10 +438,6 @@ impl HasSource for Union { } impl Union { - pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { - self.id.source(db).into() - } - pub fn name(self, db: &impl DefDatabase) -> Option<Name> { db.struct_data(Struct { id: self.id }).name.clone() } @@ -483,10 +471,6 @@ impl HasSource for Enum { } impl Enum { - pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> { - self.id.source(db).into() - } - pub fn module(self, db: &impl HirDatabase) -> Module { self.id.module(db) } @@ -537,12 +521,6 @@ impl HasSource for EnumVariant { } impl EnumVariant { - pub fn source( - &self, - db: &(impl DefDatabase + AstDatabase), - ) -> Source<TreeArc<ast::EnumVariant>> { - self.source_impl(db) - } pub fn module(&self, db: &impl HirDatabase) -> Module { self.parent.module(db) } @@ -692,10 +670,6 @@ impl FnSignature { } impl Function { - pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> { - self.id.source(db).into() - } - pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) } @@ -778,10 +752,6 @@ impl HasSource for Const { } impl Const { - pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> { - self.id.source(db).into() - } - pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) } @@ -866,10 +836,6 @@ impl HasSource for Static { } impl Static { - pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> { - self.id.source(db).into() - } - pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) } @@ -902,10 +868,6 @@ impl HasSource for Trait { } impl Trait { - pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> { - self.id.source(db).into() - } - pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) } @@ -952,13 +914,6 @@ impl HasSource for TypeAlias { } impl TypeAlias { - pub fn source( - self, - db: &(impl DefDatabase + AstDatabase), - ) -> Source<TreeArc<ast::TypeAliasDef>> { - self.id.source(db).into() - } - pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) } @@ -1015,11 +970,7 @@ impl HasSource for MacroDef { } } -impl MacroDef { - pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> { - (self.id.0.file_id(), self.id.0.to_node(db)).into() - } -} +impl MacroDef {} pub enum Container { Trait(Trait), diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs index 4db066c43..da2b9b854 100644 --- a/crates/ra_hir/src/docs.rs +++ b/crates/ra_hir/src/docs.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use ra_syntax::ast; use crate::{ - HirDatabase, DefDatabase, AstDatabase, + HirDatabase, DefDatabase, AstDatabase, HasSource, Module, StructField, Struct, Enum, EnumVariant, Static, Const, Function, Union, Trait, TypeAlias, FieldSource, MacroDef, }; diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs index 48e597519..b1973d19d 100644 --- a/crates/ra_hir/src/expr.rs +++ b/crates/ra_hir/src/expr.rs @@ -11,6 +11,7 @@ use ra_syntax::{ use crate::{ Path, Name, HirDatabase, Resolver,DefWithBody, Either, HirFileId, MacroCallLoc, MacroFileKind, + HasSource, name::AsName, type_ref::{Mutability, TypeRef}, }; diff --git a/crates/ra_hir/src/expr/validation.rs b/crates/ra_hir/src/expr/validation.rs index ff5e5f68e..534fd482b 100644 --- a/crates/ra_hir/src/expr/validation.rs +++ b/crates/ra_hir/src/expr/validation.rs @@ -5,7 +5,7 @@ use ra_syntax::ast::{AstNode, StructLit}; use crate::{ expr::AstPtr, - HirDatabase, Function, Name, + HirDatabase, Function, Name, HasSource, diagnostics::{DiagnosticSink, MissingFields}, adt::AdtDef, Path, diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index 0b8bd5700..462b136b7 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -8,8 +8,10 @@ use std::sync::Arc; use ra_syntax::ast::{self, NameOwner, TypeParamsOwner, TypeBoundsOwner, DefaultTypeParamOwner}; use crate::{ + HasSource, + Name, AsName, Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock, Container, AdtDef, db::{HirDatabase, DefDatabase, AstDatabase}, - Name, AsName, Function, Struct, Union, Enum, Trait, TypeAlias, ImplBlock, Container, path::Path, type_ref::TypeRef, AdtDef + path::Path, type_ref::TypeRef, }; /// Data about a generic parameter (to a function, struct, impl, ...). diff --git a/crates/ra_hir/src/traits.rs b/crates/ra_hir/src/traits.rs index 86dceb2e0..f2950e1b2 100644 --- a/crates/ra_hir/src/traits.rs +++ b/crates/ra_hir/src/traits.rs @@ -6,7 +6,7 @@ use rustc_hash::FxHashMap; use ra_syntax::ast::{self, NameOwner}; use crate::{ - Function, Const, TypeAlias, Name, DefDatabase, Trait, AstDatabase, Module, + Function, Const, TypeAlias, Name, DefDatabase, Trait, AstDatabase, Module, HasSource, ids::LocationCtx, name::AsName, }; diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index a534c2336..fef0f1d24 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs @@ -1415,7 +1415,7 @@ mod diagnostics { use crate::{ expr::ExprId, diagnostics::{DiagnosticSink, NoSuchField}, - HirDatabase, Function, + HirDatabase, Function, HasSource, }; #[derive(Debug, PartialEq, Eq, Clone)] diff --git a/crates/ra_hir/src/type_alias.rs b/crates/ra_hir/src/type_alias.rs index c449d7346..87b9caa8a 100644 --- a/crates/ra_hir/src/type_alias.rs +++ b/crates/ra_hir/src/type_alias.rs @@ -2,7 +2,7 @@ use std::sync::Arc; -use crate::{TypeAlias, DefDatabase, AstDatabase, type_ref::TypeRef}; +use crate::{TypeAlias, DefDatabase, AstDatabase, HasSource, type_ref::TypeRef}; pub(crate) fn type_alias_ref_query( db: &(impl DefDatabase + AstDatabase), -- cgit v1.2.3 From 0dcaded439ae4bd4670bc6a2fbf739cd4fce60af Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 18:00:08 +0300 Subject: move source to a seaparate file --- crates/ra_hir/src/code_model.rs | 123 +----------------------------------- crates/ra_hir/src/code_model/src.rs | 120 +++++++++++++++++++++++++++++++++++ crates/ra_hir/src/lib.rs | 3 +- 3 files changed, 125 insertions(+), 121 deletions(-) create mode 100644 crates/ra_hir/src/code_model/src.rs (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 282bd15de..0cfab27dc 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -1,10 +1,12 @@ +pub(crate) mod src; + use std::sync::Arc; use ra_db::{CrateId, SourceRootId, Edition, FileId}; use ra_syntax::{ast::{self, NameOwner, TypeAscriptionOwner}, TreeArc}; use crate::{ - Name, AsName, AstId, Ty, HirFileId, Either, KnownName, + Name, AsName, AstId, Ty, Either, KnownName, HasSource, HirDatabase, DefDatabase, AstDatabase, type_ref::TypeRef, nameres::{ModuleScope, Namespace, ImportId, CrateModuleId}, @@ -20,22 +22,6 @@ use crate::{ type_ref::Mutability, }; -pub struct Source<T> { - pub file_id: HirFileId, - pub ast: T, -} - -impl<T> From<(HirFileId, T)> for Source<T> { - fn from((file_id, ast): (HirFileId, T)) -> Self { - Source { file_id, ast } - } -} - -pub trait HasSource { - type Ast; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<Self::Ast>; -} - /// hir::Crate describes a single crate. It's the main interface with which /// a crate's dependencies interact. Mostly, it should be just a proxy for the /// root module. @@ -195,28 +181,6 @@ 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 + AstDatabase)) -> Source<ModuleSource> { - let def_map = db.crate_def_map(self.krate); - let decl_id = def_map[self.module_id].declaration; - let file_id = def_map[self.module_id].definition; - let module_source = ModuleSource::new(db, file_id, decl_id); - let file_id = file_id.map(HirFileId::from).unwrap_or_else(|| decl_id.unwrap().file_id()); - (file_id, module_source).into() - } - - /// 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 + AstDatabase), - ) -> Option<Source<TreeArc<ast::Module>>> { - let def_map = db.crate_def_map(self.krate); - let decl = def_map[self.module_id].declaration?; - let ast = decl.to_node(db); - Some((decl.file_id(), ast).into()) - } - /// Returns the syntax of the last path segment corresponding to this import pub fn import_source( self, @@ -343,13 +307,6 @@ pub enum FieldSource { Pos(TreeArc<ast::PosFieldDef>), } -impl HasSource for StructField { - type Ast = FieldSource; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> { - self.source_impl(db).into() - } -} - impl StructField { pub fn name(&self, db: &impl HirDatabase) -> Name { self.parent.variant_data(db).fields().unwrap()[self.id].name.clone() @@ -369,13 +326,6 @@ pub struct Struct { pub(crate) id: StructId, } -impl HasSource for Struct { - type Ast = TreeArc<ast::StructDef>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { - self.id.source(db).into() - } -} - impl Struct { pub fn module(self, db: &impl HirDatabase) -> Module { self.id.module(db) @@ -430,13 +380,6 @@ pub struct Union { pub(crate) id: StructId, } -impl HasSource for Union { - type Ast = TreeArc<ast::StructDef>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { - self.id.source(db).into() - } -} - impl Union { pub fn name(self, db: &impl DefDatabase) -> Option<Name> { db.struct_data(Struct { id: self.id }).name.clone() @@ -463,13 +406,6 @@ pub struct Enum { pub(crate) id: EnumId, } -impl HasSource for Enum { - type Ast = TreeArc<ast::EnumDef>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> { - self.id.source(db).into() - } -} - impl Enum { pub fn module(self, db: &impl HirDatabase) -> Module { self.id.module(db) @@ -513,13 +449,6 @@ pub struct EnumVariant { pub(crate) id: EnumVariantId, } -impl HasSource for EnumVariant { - type Ast = TreeArc<ast::EnumVariant>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumVariant>> { - self.source_impl(db) - } -} - impl EnumVariant { pub fn module(&self, db: &impl HirDatabase) -> Module { self.parent.module(db) @@ -589,14 +518,6 @@ pub struct Function { pub(crate) id: FunctionId, } -impl HasSource for Function { - type Ast = TreeArc<ast::FnDef>; - - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> { - self.id.source(db).into() - } -} - /// The declared signature of a function. #[derive(Debug, Clone, PartialEq, Eq)] pub struct FnSignature { @@ -743,14 +664,6 @@ pub struct Const { pub(crate) id: ConstId, } -impl HasSource for Const { - type Ast = TreeArc<ast::ConstDef>; - - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> { - self.id.source(db).into() - } -} - impl Const { pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) @@ -827,14 +740,6 @@ pub struct Static { pub(crate) id: StaticId, } -impl HasSource for Static { - type Ast = TreeArc<ast::StaticDef>; - - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> { - self.id.source(db).into() - } -} - impl Static { pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) @@ -860,13 +765,6 @@ pub struct Trait { pub(crate) id: TraitId, } -impl HasSource for Trait { - type Ast = TreeArc<ast::TraitDef>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> { - self.id.source(db).into() - } -} - impl Trait { pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) @@ -906,13 +804,6 @@ pub struct TypeAlias { pub(crate) id: TypeAliasId, } -impl HasSource for TypeAlias { - type Ast = TreeArc<ast::TypeAliasDef>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TypeAliasDef>> { - self.id.source(db).into() - } -} - impl TypeAlias { pub fn module(self, db: &impl DefDatabase) -> Module { self.id.module(db) @@ -962,14 +853,6 @@ pub struct MacroDef { pub(crate) id: MacroDefId, } -impl HasSource for MacroDef { - type Ast = TreeArc<ast::MacroCall>; - - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> { - (self.id.0.file_id(), self.id.0.to_node(db)).into() - } -} - impl MacroDef {} pub enum Container { diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs new file mode 100644 index 000000000..7484faf04 --- /dev/null +++ b/crates/ra_hir/src/code_model/src.rs @@ -0,0 +1,120 @@ +use ra_syntax::{TreeArc, ast}; + +use crate::{ + HirFileId, DefDatabase, AstDatabase, Module, ModuleSource, + StructField, Struct, Enum, Union, EnumVariant, Function, Static, Trait, Const, TypeAlias, + FieldSource, MacroDef, ids::AstItemDef, +}; + +pub struct Source<T> { + pub file_id: HirFileId, + pub ast: T, +} + +impl<T> From<(HirFileId, T)> for Source<T> { + fn from((file_id, ast): (HirFileId, T)) -> Self { + Source { file_id, ast } + } +} + +pub trait HasSource { + type Ast; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<Self::Ast>; +} + +/// NB: Module is !HasSource, becase 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 + AstDatabase)) -> Source<ModuleSource> { + let def_map = db.crate_def_map(self.krate); + let decl_id = def_map[self.module_id].declaration; + let file_id = def_map[self.module_id].definition; + let module_source = ModuleSource::new(db, file_id, decl_id); + let file_id = file_id.map(HirFileId::from).unwrap_or_else(|| decl_id.unwrap().file_id()); + (file_id, module_source).into() + } + + /// 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 + AstDatabase), + ) -> Option<Source<TreeArc<ast::Module>>> { + let def_map = db.crate_def_map(self.krate); + let decl = def_map[self.module_id].declaration?; + let ast = decl.to_node(db); + Some((decl.file_id(), ast).into()) + } +} + +impl HasSource for StructField { + type Ast = FieldSource; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> { + self.source_impl(db).into() + } +} +impl HasSource for Struct { + type Ast = TreeArc<ast::StructDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { + self.id.source(db).into() + } +} +impl HasSource for Union { + type Ast = TreeArc<ast::StructDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { + self.id.source(db).into() + } +} +impl HasSource for Enum { + type Ast = TreeArc<ast::EnumDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> { + self.id.source(db).into() + } +} +impl HasSource for EnumVariant { + type Ast = TreeArc<ast::EnumVariant>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumVariant>> { + self.source_impl(db) + } +} +impl HasSource for Function { + type Ast = TreeArc<ast::FnDef>; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> { + self.id.source(db).into() + } +} +impl HasSource for Const { + type Ast = TreeArc<ast::ConstDef>; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> { + self.id.source(db).into() + } +} +impl HasSource for Static { + type Ast = TreeArc<ast::StaticDef>; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> { + self.id.source(db).into() + } +} +impl HasSource for Trait { + type Ast = TreeArc<ast::TraitDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> { + self.id.source(db).into() + } +} +impl HasSource for TypeAlias { + type Ast = TreeArc<ast::TypeAliasDef>; + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TypeAliasDef>> { + self.id.source(db).into() + } +} +impl HasSource for MacroDef { + type Ast = TreeArc<ast::MacroCall>; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> { + (self.id.0.file_id(), self.id.0.to_node(db)).into() + } +} diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 02f5f7f40..1690296e5 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -81,5 +81,6 @@ pub use self::code_model::{ StructField, FieldSource, Static, Const, ConstSignature, Trait, TypeAlias, MacroDef, Container, - BuiltinType, Source, HasSource, + BuiltinType, + src::{Source, HasSource}, }; -- cgit v1.2.3 From 26753f0e4931e2980f008015cbd709a77d71c0f3 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 18:07:42 +0300 Subject: remove unneded From(..) impl --- crates/ra_hir/src/adt.rs | 11 ++++------- crates/ra_hir/src/code_model/src.rs | 32 +++++++++++++------------------- crates/ra_hir/src/ids.rs | 6 +++--- crates/ra_hir/src/impl_block.rs | 9 +-------- 4 files changed, 21 insertions(+), 37 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs index 6b8604b3e..b3843b35c 100644 --- a/crates/ra_hir/src/adt.rs +++ b/crates/ra_hir/src/adt.rs @@ -11,7 +11,7 @@ use ra_syntax::{ use crate::{ Name, AsName, Struct, Union, Enum, EnumVariant, Crate, AstDatabase, - HirDatabase, HirFileId, StructField, FieldSource, Source, HasSource, + HirDatabase, StructField, FieldSource, Source, HasSource, type_ref::TypeRef, DefDatabase, }; @@ -201,10 +201,7 @@ impl VariantDef { } impl StructField { - pub(crate) fn source_impl( - &self, - db: &(impl DefDatabase + AstDatabase), - ) -> (HirFileId, FieldSource) { + pub(crate) fn source_impl(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> { let var_data = self.parent.variant_data(db); let fields = var_data.fields().unwrap(); let ss; @@ -229,12 +226,12 @@ impl StructField { } ast::StructKind::Unit => Vec::new(), }; - let field = field_sources + let ast = field_sources .into_iter() .zip(fields.iter()) .find(|(_syntax, (id, _))| *id == self.id) .unwrap() .0; - (file_id, field) + Source { file_id, ast } } } diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 7484faf04..7d8abb39e 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -11,12 +11,6 @@ pub struct Source<T> { pub ast: T, } -impl<T> From<(HirFileId, T)> for Source<T> { - fn from((file_id, ast): (HirFileId, T)) -> Self { - Source { file_id, ast } - } -} - pub trait HasSource { type Ast; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<Self::Ast>; @@ -30,9 +24,9 @@ impl Module { let def_map = db.crate_def_map(self.krate); let decl_id = def_map[self.module_id].declaration; let file_id = def_map[self.module_id].definition; - let module_source = ModuleSource::new(db, file_id, decl_id); + let ast = ModuleSource::new(db, file_id, decl_id); let file_id = file_id.map(HirFileId::from).unwrap_or_else(|| decl_id.unwrap().file_id()); - (file_id, module_source).into() + Source { file_id, ast } } /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. @@ -44,32 +38,32 @@ impl Module { let def_map = db.crate_def_map(self.krate); let decl = def_map[self.module_id].declaration?; let ast = decl.to_node(db); - Some((decl.file_id(), ast).into()) + Some(Source { file_id: decl.file_id(), ast }) } } impl HasSource for StructField { type Ast = FieldSource; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<FieldSource> { - self.source_impl(db).into() + self.source_impl(db) } } impl HasSource for Struct { type Ast = TreeArc<ast::StructDef>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { - self.id.source(db).into() + self.id.source(db) } } impl HasSource for Union { type Ast = TreeArc<ast::StructDef>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StructDef>> { - self.id.source(db).into() + self.id.source(db) } } impl HasSource for Enum { type Ast = TreeArc<ast::EnumDef>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::EnumDef>> { - self.id.source(db).into() + self.id.source(db) } } impl HasSource for EnumVariant { @@ -82,39 +76,39 @@ impl HasSource for Function { type Ast = TreeArc<ast::FnDef>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> { - self.id.source(db).into() + self.id.source(db) } } impl HasSource for Const { type Ast = TreeArc<ast::ConstDef>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> { - self.id.source(db).into() + self.id.source(db) } } impl HasSource for Static { type Ast = TreeArc<ast::StaticDef>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> { - self.id.source(db).into() + self.id.source(db) } } impl HasSource for Trait { type Ast = TreeArc<ast::TraitDef>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TraitDef>> { - self.id.source(db).into() + self.id.source(db) } } impl HasSource for TypeAlias { type Ast = TreeArc<ast::TypeAliasDef>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::TypeAliasDef>> { - self.id.source(db).into() + self.id.source(db) } } impl HasSource for MacroDef { type Ast = TreeArc<ast::MacroCall>; fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> { - (self.id.0.file_id(), self.id.0.to_node(db)).into() + Source { file_id: self.id.0.file_id(), ast: self.id.0.to_node(db) } } } diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs index a95561812..352f9ffd9 100644 --- a/crates/ra_hir/src/ids.rs +++ b/crates/ra_hir/src/ids.rs @@ -9,7 +9,7 @@ use ra_prof::profile; use mbe::MacroRules; use crate::{ - Module, DefDatabase, AstId, FileAstId, AstDatabase, + Module, DefDatabase, AstId, FileAstId, AstDatabase, Source, }; /// hir makes heavy use of ids: integer (u32) handlers to various things. You @@ -265,10 +265,10 @@ pub(crate) trait AstItemDef<N: AstNode>: salsa::InternKey + Clone { let loc = ItemLoc { module: ctx.module, ast_id: ast_id.with_file_id(ctx.file_id) }; Self::intern(ctx.db, loc) } - fn source(self, db: &(impl AstDatabase + DefDatabase)) -> (HirFileId, TreeArc<N>) { + fn source(self, db: &(impl AstDatabase + DefDatabase)) -> Source<TreeArc<N>> { let loc = self.lookup_intern(db); let ast = loc.ast_id.to_node(db); - (loc.ast_id.file_id(), ast) + Source { file_id: loc.ast_id.file_id(), ast } } fn module(self, db: &impl DefDatabase) -> Module { let loc = self.lookup_intern(db); diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs index 646b603d3..fb9daf1bf 100644 --- a/crates/ra_hir/src/impl_block.rs +++ b/crates/ra_hir/src/impl_block.rs @@ -49,7 +49,7 @@ impl HasSource for ImplBlock { fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> { let source_map = db.impls_in_module_with_source_map(self.module).1; let src = self.module.definition_source(db); - (src.file_id, source_map.get(&src.ast, self.impl_id)).into() + Source { file_id: src.file_id, ast: source_map.get(&src.ast, self.impl_id) } } } @@ -66,13 +66,6 @@ impl ImplBlock { ImplBlock { module, impl_id } } - /// Returns the syntax of the impl block - pub fn source(&self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ImplBlock>> { - let source_map = db.impls_in_module_with_source_map(self.module).1; - let src = self.module.definition_source(db); - (src.file_id, source_map.get(&src.ast, self.impl_id)).into() - } - pub fn id(&self) -> ImplId { self.impl_id } -- cgit v1.2.3 From 14b1f8763486fe7bc4a468c70fce827ae34d3d74 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 18:09:39 +0300 Subject: minor formatting --- crates/ra_hir/src/code_model/src.rs | 4 ---- 1 file changed, 4 deletions(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 7d8abb39e..76adc7869 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -74,21 +74,18 @@ impl HasSource for EnumVariant { } impl HasSource for Function { type Ast = TreeArc<ast::FnDef>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::FnDef>> { self.id.source(db) } } impl HasSource for Const { type Ast = TreeArc<ast::ConstDef>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::ConstDef>> { self.id.source(db) } } impl HasSource for Static { type Ast = TreeArc<ast::StaticDef>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::StaticDef>> { self.id.source(db) } @@ -107,7 +104,6 @@ impl HasSource for TypeAlias { } impl HasSource for MacroDef { type Ast = TreeArc<ast::MacroCall>; - fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<TreeArc<ast::MacroCall>> { Source { file_id: self.id.0.file_id(), ast: self.id.0.to_node(db) } } -- cgit v1.2.3 From f6c227babdeb2d6b6888b36ddcbd8eb220240fa2 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 18:11:17 +0300 Subject: fix compilation --- crates/ra_hir/src/code_model/src.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 76adc7869..5785d3b26 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs @@ -16,7 +16,7 @@ pub trait HasSource { fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source<Self::Ast>; } -/// NB: Module is !HasSource, becase it has two source nodes at the same time: +/// 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. -- cgit v1.2.3 From ff6f6b3a5223ddab81c7357a3c59bdb09936a552 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov <aleksey.kladov@gmail.com> Date: Tue, 11 Jun 2019 18:14:27 +0300 Subject: move docs under code model --- crates/ra_hir/src/code_model.rs | 1 + crates/ra_hir/src/code_model/docs.rs | 96 ++++++++++++++++++++++++++++++++++++ crates/ra_hir/src/db.rs | 4 +- crates/ra_hir/src/docs.rs | 96 ------------------------------------ crates/ra_hir/src/lib.rs | 3 +- 5 files changed, 100 insertions(+), 100 deletions(-) create mode 100644 crates/ra_hir/src/code_model/docs.rs delete mode 100644 crates/ra_hir/src/docs.rs (limited to 'crates/ra_hir/src') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 0cfab27dc..830aea1f3 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -1,4 +1,5 @@ pub(crate) mod src; +pub(crate) mod docs; use std::sync::Arc; diff --git a/crates/ra_hir/src/code_model/docs.rs b/crates/ra_hir/src/code_model/docs.rs new file mode 100644 index 000000000..da2b9b854 --- /dev/null +++ b/crates/ra_hir/src/code_model/docs.rs @@ -0,0 +1,96 @@ +use std::sync::Arc; + +use ra_syntax::ast; + +use crate::{ + HirDatabase, DefDatabase, AstDatabase, HasSource, + Module, StructField, Struct, Enum, EnumVariant, Static, Const, Function, Union, Trait, TypeAlias, FieldSource, MacroDef, +}; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum DocDef { + Module(Module), + StructField(StructField), + Struct(Struct), + Enum(Enum), + EnumVariant(EnumVariant), + Static(Static), + Const(Const), + Function(Function), + Union(Union), + Trait(Trait), + TypeAlias(TypeAlias), + MacroDef(MacroDef), +} + +impl_froms!( + DocDef: Module, + StructField, + Struct, + Enum, + EnumVariant, + Static, + Const, + Function, + Union, + Trait, + TypeAlias, + MacroDef +); + +/// Holds documentation +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Documentation(Arc<str>); + +impl Documentation { + fn new(s: &str) -> Documentation { + Documentation(s.into()) + } + + pub fn as_str(&self) -> &str { + &*self.0 + } +} + +impl Into<String> for Documentation { + fn into(self) -> String { + self.as_str().to_owned() + } +} + +pub trait Docs { + fn docs(&self, db: &impl HirDatabase) -> Option<Documentation>; +} + +pub(crate) fn docs_from_ast(node: &impl ast::DocCommentsOwner) -> Option<Documentation> { + node.doc_comment_text().map(|it| Documentation::new(&it)) +} + +pub(crate) fn documentation_query( + db: &(impl DefDatabase + AstDatabase), + def: DocDef, +) -> Option<Documentation> { + match def { + DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.ast), + DocDef::StructField(it) => match it.source(db).ast { + FieldSource::Named(named) => docs_from_ast(&*named), + FieldSource::Pos(..) => return None, + }, + DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Enum(it) => docs_from_ast(&*it.source(db).ast), + DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Static(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Const(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Function(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Union(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast), + DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast), + DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).ast), + } +} + +impl<T: Into<DocDef> + Copy> Docs for T { + fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> { + db.documentation((*self).into()) + } +} diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index d2a372f3b..d2d6f95b7 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs @@ -128,8 +128,8 @@ pub trait DefDatabase: SourceDatabase { #[salsa::invoke(crate::lang_item::LangItems::lang_item_query)] fn lang_item(&self, start_crate: Crate, item: SmolStr) -> Option<LangItemTarget>; - #[salsa::invoke(crate::docs::documentation_query)] - fn documentation(&self, def: crate::docs::DocDef) -> Option<crate::docs::Documentation>; + #[salsa::invoke(crate::code_model::docs::documentation_query)] + fn documentation(&self, def: crate::DocDef) -> Option<crate::Documentation>; } #[salsa::query_group(HirDatabaseStorage)] diff --git a/crates/ra_hir/src/docs.rs b/crates/ra_hir/src/docs.rs deleted file mode 100644 index da2b9b854..000000000 --- a/crates/ra_hir/src/docs.rs +++ /dev/null @@ -1,96 +0,0 @@ -use std::sync::Arc; - -use ra_syntax::ast; - -use crate::{ - HirDatabase, DefDatabase, AstDatabase, HasSource, - Module, StructField, Struct, Enum, EnumVariant, Static, Const, Function, Union, Trait, TypeAlias, FieldSource, MacroDef, -}; - -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -pub enum DocDef { - Module(Module), - StructField(StructField), - Struct(Struct), - Enum(Enum), - EnumVariant(EnumVariant), - Static(Static), - Const(Const), - Function(Function), - Union(Union), - Trait(Trait), - TypeAlias(TypeAlias), - MacroDef(MacroDef), -} - -impl_froms!( - DocDef: Module, - StructField, - Struct, - Enum, - EnumVariant, - Static, - Const, - Function, - Union, - Trait, - TypeAlias, - MacroDef -); - -/// Holds documentation -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct Documentation(Arc<str>); - -impl Documentation { - fn new(s: &str) -> Documentation { - Documentation(s.into()) - } - - pub fn as_str(&self) -> &str { - &*self.0 - } -} - -impl Into<String> for Documentation { - fn into(self) -> String { - self.as_str().to_owned() - } -} - -pub trait Docs { - fn docs(&self, db: &impl HirDatabase) -> Option<Documentation>; -} - -pub(crate) fn docs_from_ast(node: &impl ast::DocCommentsOwner) -> Option<Documentation> { - node.doc_comment_text().map(|it| Documentation::new(&it)) -} - -pub(crate) fn documentation_query( - db: &(impl DefDatabase + AstDatabase), - def: DocDef, -) -> Option<Documentation> { - match def { - DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.ast), - DocDef::StructField(it) => match it.source(db).ast { - FieldSource::Named(named) => docs_from_ast(&*named), - FieldSource::Pos(..) => return None, - }, - DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast), - DocDef::Enum(it) => docs_from_ast(&*it.source(db).ast), - DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast), - DocDef::Static(it) => docs_from_ast(&*it.source(db).ast), - DocDef::Const(it) => docs_from_ast(&*it.source(db).ast), - DocDef::Function(it) => docs_from_ast(&*it.source(db).ast), - DocDef::Union(it) => docs_from_ast(&*it.source(db).ast), - DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast), - DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast), - DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).ast), - } -} - -impl<T: Into<DocDef> + Copy> Docs for T { - fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> { - db.documentation((*self).into()) - } -} diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 1690296e5..2e99bdac8 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -38,7 +38,6 @@ mod impl_block; mod expr; mod lang_item; mod generics; -mod docs; mod resolve; pub mod diagnostics; @@ -64,7 +63,6 @@ pub use self::{ nameres::{PerNs, Namespace, ImportId}, ty::{Ty, ApplicationTy, TypeCtor, TraitRef, Substs, display::HirDisplay, CallableDef}, impl_block::{ImplBlock, ImplItem}, - docs::{Docs, Documentation}, adt::AdtDef, expr::ExprScopes, resolve::Resolution, @@ -83,4 +81,5 @@ pub use self::code_model::{ Trait, TypeAlias, MacroDef, Container, BuiltinType, src::{Source, HasSource}, + docs::{Docs, Documentation, DocDef}, }; -- cgit v1.2.3