From 4497e1d3eae0a72ee1e52be6ab547c67d31279c6 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sun, 14 Apr 2019 11:15:11 +0200 Subject: Add Container enum to handle both kinds of container (impl/trait) --- crates/ra_hir/src/generics.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'crates/ra_hir/src/generics.rs') diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index 51c846e91..f92b146ef 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -9,7 +9,7 @@ use ra_syntax::ast::{self, NameOwner, TypeParamsOwner}; use crate::{ db::DefDatabase, - Name, AsName, Function, Struct, Enum, Trait, TypeAlias, ImplBlock + Name, AsName, Function, Struct, Enum, Trait, TypeAlias, ImplBlock, Container }; /// Data about a generic parameter (to a function, struct, impl, ...). @@ -27,6 +27,7 @@ pub struct GenericParams { pub(crate) params: Vec, } +// FIXME: consts can have type parameters from their parents (i.e. associated consts of traits) #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] pub enum GenericDef { Function(Function), @@ -45,12 +46,8 @@ impl GenericParams { ) -> Arc { let mut generics = GenericParams::default(); let parent = match def { - // FIXME abstract over containers (trait/impl) - GenericDef::Function(it) => it - .impl_block(db) - .map(GenericDef::from) - .or_else(|| it.parent_trait(db).map(GenericDef::from)), - GenericDef::TypeAlias(it) => it.impl_block(db).map(GenericDef::from), + GenericDef::Function(it) => it.container(db).map(GenericDef::from), + GenericDef::TypeAlias(it) => it.container(db).map(GenericDef::from), GenericDef::Struct(_) | GenericDef::Enum(_) | GenericDef::Trait(_) => None, GenericDef::ImplBlock(_) => None, }; @@ -112,3 +109,12 @@ impl GenericParams { vec } } + +impl From for GenericDef { + fn from(c: Container) -> Self { + match c { + Container::Trait(trait_) => trait_.into(), + Container::ImplBlock(impl_block) => impl_block.into(), + } + } +} -- cgit v1.2.3