diff options
| -rw-r--r-- | crates/hir/src/semantics.rs | 12 | ||||
| -rw-r--r-- | crates/ide/src/goto_type_definition.rs | 12 |
2 files changed, 24 insertions, 0 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 62500602a71..38bd376bc08 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -196,6 +196,10 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { self.imp.resolve_label(lifetime) } + pub fn resolve_type(&self, ty: &ast::Type) -> Option<Type> { + self.imp.resolve_type(ty) + } + pub fn type_of_expr(&self, expr: &ast::Expr) -> Option<Type> { self.imp.type_of_expr(expr) } @@ -476,6 +480,14 @@ impl<'db> SemanticsImpl<'db> { ToDef::to_def(self, src) } + fn resolve_type(&self, ty: &ast::Type) -> Option<Type> { + let scope = self.scope(ty.syntax()); + let ctx = body::LowerCtx::new(self.db.upcast(), scope.file_id); + let ty = hir_ty::TyLoweringContext::new(self.db, &scope.resolver) + .lower_ty(&crate::TypeRef::from_ast(&ctx, ty.clone())); + Type::new_with_resolver(self.db, &scope.resolver, ty) + } + fn type_of_expr(&self, expr: &ast::Expr) -> Option<Type> { self.analyze(expr.syntax()).type_of_expr(self.db, expr) } diff --git a/crates/ide/src/goto_type_definition.rs b/crates/ide/src/goto_type_definition.rs index 9d34b109b21..f3284bb96a7 100644 --- a/crates/ide/src/goto_type_definition.rs +++ b/crates/ide/src/goto_type_definition.rs @@ -30,6 +30,7 @@ pub(crate) fn goto_type_definition( ast::Expr(it) => sema.type_of_expr(&it)?, ast::Pat(it) => sema.type_of_pat(&it)?, ast::SelfParam(it) => sema.type_of_self(&it)?, + ast::Type(it) => sema.resolve_type(&it)?, _ => return None, } }; @@ -149,4 +150,15 @@ impl Foo { "#, ) } + + #[test] + fn goto_def_for_type_fallback() { + check( + r#" +struct Foo; + //^^^ +impl Foo$0 {} +"#, + ) + } } |
