From 7900d99e3ebd1ff8a3ddb8a668769aff99c6deb4 Mon Sep 17 00:00:00 2001 From: bitgaoshu Date: Wed, 27 Apr 2022 23:34:08 +0800 Subject: [PATCH] #11986 Aliases break resolution of qualified variants in patterns --- crates/hir_ty/src/infer.rs | 3 ++- crates/hir_ty/src/tests/simple.rs | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/crates/hir_ty/src/infer.rs b/crates/hir_ty/src/infer.rs index 1892e30a425b..7f5ad415096d 100644 --- a/crates/hir_ty/src/infer.rs +++ b/crates/hir_ty/src/infer.rs @@ -735,7 +735,8 @@ impl<'a> InferenceContext<'a> { unresolved: Option, path: &Path, ) -> (Ty, Option) { - match unresolved { + let remaining = unresolved.map(|x| path.segments().skip(x).len()).filter(|x| x > &0); + match remaining { None => { let variant = ty.as_adt().and_then(|(adt_id, _)| match adt_id { AdtId::StructId(s) => Some(VariantId::StructId(s)), diff --git a/crates/hir_ty/src/tests/simple.rs b/crates/hir_ty/src/tests/simple.rs index baed34ce2388..d4d61c2167cd 100644 --- a/crates/hir_ty/src/tests/simple.rs +++ b/crates/hir_ty/src/tests/simple.rs @@ -1588,6 +1588,16 @@ fn infer_type_alias() { z.x; z.y; } + mod m { + pub enum Enum { + Foo(u8), + } + pub type Alias = Enum; + } + fn f() { + let e = m::Alias::Foo(0); + let m::Alias::Foo(x) = &e; + } "#, expect![[r#" 115..116 'x': A @@ -1606,6 +1616,15 @@ fn infer_type_alias() { 195..198 'z.x': u8 204..205 'z': A 204..207 'z.y': i8 + 298..362 '{ ... &e; }': () + 308..309 'e': Enum + 312..325 'm::Alias::Foo': Foo(u8) -> Enum + 312..328 'm::Ali...Foo(0)': Enum + 326..327 '0': u8 + 338..354 'm::Ali...Foo(x)': Enum + 352..353 'x': &u8 + 357..359 '&e': &Enum + 358..359 'e': Enum "#]], ) }