From 4f94af3c4aaa57ebb4cb01f7e4edfb3a0821b09b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov 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; + + fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + 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 { - 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) { - self.id.source(db) + pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + 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