From 6bad638928ab880bfbad868f07f0690ace2f2c30 Mon Sep 17 00:00:00 2001 From: ice1000 Date: Fri, 27 Sep 2019 00:19:52 -0400 Subject: Support inferring `Self` type in enum definitions Signed-off-by: ice1000 --- crates/ra_hir/src/ty/infer.rs | 3 +++ crates/ra_hir/src/ty/lower.rs | 1 + crates/ra_hir/src/ty/tests.rs | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+) (limited to 'crates/ra_hir/src/ty') diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index ca9aefc42..9e5d42509 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs @@ -559,6 +559,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { match resolver.resolve_path_in_type_ns_fully(self.db, &path) { Some(TypeNs::Adt(Adt::Struct(it))) => it.into(), Some(TypeNs::Adt(Adt::Union(it))) => it.into(), + Some(TypeNs::AdtSelfType(Adt::Struct(it))) => it.into(), + Some(TypeNs::AdtSelfType(Adt::Union(it))) => it.into(), + Some(TypeNs::AdtSelfType(Adt::Enum(it))) => it.into(), Some(TypeNs::EnumVariant(it)) => it.into(), Some(TypeNs::TypeAlias(it)) => it.into(), diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index 4b67c82e7..a604c02e2 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs @@ -175,6 +175,7 @@ impl Ty { Ty::Param { idx, name } } TypeNs::SelfType(impl_block) => impl_block.target_ty(db), + TypeNs::AdtSelfType(adt) => adt.ty(db), TypeNs::Adt(it) => Ty::from_hir_path_inner(db, resolver, resolved_segment, it.into()), TypeNs::BuiltinType(it) => { diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index 25dad81eb..03b30adcd 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs @@ -134,6 +134,25 @@ mod boxed { assert_eq!("(Box, Box>, Box<&i32>, Box<[i32;_]>)", type_at_pos(&db, pos)); } +#[test] +fn infer_adt_self() { + let (db, pos) = MockDatabase::with_position( + r#" +//- /main.rs +enum Nat { Succ(Self), Demo(Nat), Zero } + +fn test() { + let foo: Nat = Nat::Zero; + if let Nat::Succ(x) = foo { + x<|> + } +} + +"#, + ); + assert_eq!("Nat", type_at_pos(&db, pos)); +} + #[test] fn infer_try() { let (mut db, pos) = MockDatabase::with_position( -- cgit v1.2.3