From 91c120ccea4f0cfef20fd4d918154c8152f83816 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov 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 +- crates/ra_ide_api/src/display/navigation_target.rs | 20 ++++++++++---------- crates/ra_ide_api/src/hover.rs | 11 +++++++---- 6 files changed, 36 insertions(+), 26 deletions(-) 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 { - 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 { + pub file_id: HirFileId, + pub ast: T, +} + +impl From<(HirFileId, T)> for Source { + 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) { - self.id.source(db) + pub fn source(self, db: &(impl DefDatabase + AstDatabase)) -> Source> { + 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) => { diff --git a/crates/ra_ide_api/src/display/navigation_target.rs b/crates/ra_ide_api/src/display/navigation_target.rs index cfd3f5478..c02bc005b 100644 --- a/crates/ra_ide_api/src/display/navigation_target.rs +++ b/crates/ra_ide_api/src/display/navigation_target.rs @@ -189,12 +189,12 @@ impl NavigationTarget { pub(crate) fn from_adt_def(db: &RootDatabase, adt_def: hir::AdtDef) -> NavigationTarget { match adt_def { hir::AdtDef::Struct(s) => { - let (file_id, node) = s.source(db); + let src = s.source(db); NavigationTarget::from_named( - file_id.original_file(db), - &*node, - node.doc_comment_text(), - node.short_label(), + src.file_id.original_file(db), + &*src.ast, + src.ast.doc_comment_text(), + src.ast.short_label(), ) } hir::AdtDef::Union(s) => { @@ -226,12 +226,12 @@ impl NavigationTarget { hir::ModuleDef::Module(module) => NavigationTarget::from_module(db, module), hir::ModuleDef::Function(func) => NavigationTarget::from_function(db, func), hir::ModuleDef::Struct(s) => { - let (file_id, node) = s.source(db); + let src = s.source(db); NavigationTarget::from_named( - file_id.original_file(db), - &*node, - node.doc_comment_text(), - node.short_label(), + src.file_id.original_file(db), + &*src.ast, + src.ast.doc_comment_text(), + src.ast.short_label(), ) } hir::ModuleDef::Union(s) => { diff --git a/crates/ra_ide_api/src/hover.rs b/crates/ra_ide_api/src/hover.rs index fbabeb194..80445761c 100644 --- a/crates/ra_ide_api/src/hover.rs +++ b/crates/ra_ide_api/src/hover.rs @@ -136,8 +136,8 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option { - let it = it.source(db).1; - res.extend(hover_text(it.doc_comment_text(), it.short_label())) + let src = it.source(db); + res.extend(hover_text(src.ast.doc_comment_text(), src.ast.short_label())) } hir::ModuleDef::Union(it) => { let it = it.source(db).1; @@ -176,8 +176,11 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Option { - let it = it.source(db).1; - res.extend(hover_text(it.doc_comment_text(), it.short_label())) + let src = it.source(db); + res.extend(hover_text( + src.ast.doc_comment_text(), + src.ast.short_label(), + )) } hir::AdtDef::Union(it) => { let it = it.source(db).1; -- cgit v1.2.3