From 50bbf9eb09dc34781cc34e10bfba5f154e833123 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sun, 5 May 2019 14:21:00 +0200 Subject: Handle where clauses in trait solving --- crates/ra_hir/src/generics.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 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 2e52c5871..826117ba5 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use ra_syntax::ast::{self, NameOwner, TypeParamsOwner, TypeBoundsOwner}; use crate::{ - db::DefDatabase, + db::{ HirDatabase, DefDatabase}, Name, AsName, Function, Struct, Enum, Trait, TypeAlias, ImplBlock, Container, path::Path, type_ref::TypeRef, AdtDef }; @@ -32,8 +32,8 @@ pub struct GenericParams { /// where clauses like `where T: Foo + Bar` are turned into multiple of these. #[derive(Clone, PartialEq, Eq, Debug)] pub struct WherePredicate { - type_ref: TypeRef, - trait_ref: Path, + pub(crate) type_ref: TypeRef, + pub(crate) trait_ref: Path, } // FIXME: consts can have type parameters from their parents (i.e. associated consts of traits) @@ -148,6 +148,19 @@ impl GenericParams { } } +impl GenericDef { + pub(crate) fn resolver(&self, db: &impl HirDatabase) -> crate::Resolver { + match self { + GenericDef::Function(inner) => inner.resolver(db), + GenericDef::Struct(inner) => inner.resolver(db), + GenericDef::Enum(inner) => inner.resolver(db), + GenericDef::Trait(inner) => inner.resolver(db), + GenericDef::TypeAlias(inner) => inner.resolver(db), + GenericDef::ImplBlock(inner) => inner.resolver(db), + } + } +} + impl From for GenericDef { fn from(c: Container) -> Self { match c { -- cgit v1.2.3