use Source for impl block

This commit is contained in:
Aleksey Kladov 2019-06-11 17:36:52 +03:00
parent f411c2988d
commit a6e339e822
5 changed files with 20 additions and 17 deletions

View file

@ -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> {

View file

@ -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),

View file

@ -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)

View file

@ -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 {

View file

@ -228,12 +228,12 @@ impl NavigationTarget {
db: &RootDatabase,
impl_block: hir::ImplBlock,
) -> NavigationTarget {
let (file_id, node) = impl_block.source(db);
let src = impl_block.source(db);
NavigationTarget::from_syntax(
file_id.as_original_file(),
src.file_id.as_original_file(),
"impl".into(),
None,
node.syntax(),
src.ast.syntax(),
None,
None,
)