diff options
| author | austaras <austaras@outlook.com> | 2023-12-18 22:31:58 +0800 |
|---|---|---|
| committer | austaras <austaras@outlook.com> | 2023-12-18 22:31:58 +0800 |
| commit | bd61888b8db35965cca9ff46119615cbc73448a0 (patch) | |
| tree | 13d043e8de3685743a9a63c3bb474e4d5a718565 | |
| parent | cfc959d73a9259f0eb3b1813df7e9db8108945b7 (diff) | |
| download | rust-bd61888b8db35965cca9ff46119615cbc73448a0.tar.gz rust-bd61888b8db35965cca9ff46119615cbc73448a0.zip | |
fix: resolve alias before resolve variant
| -rw-r--r-- | crates/hir-ty/src/infer.rs | 6 | ||||
| -rw-r--r-- | crates/hir-ty/src/tests/patterns.rs | 34 |
2 files changed, 40 insertions, 0 deletions
diff --git a/crates/hir-ty/src/infer.rs b/crates/hir-ty/src/infer.rs index 6f724e45874..e295dd8d4e1 100644 --- a/crates/hir-ty/src/infer.rs +++ b/crates/hir-ty/src/infer.rs @@ -1200,6 +1200,12 @@ impl<'a> InferenceContext<'a> { path: &ModPath, ) -> (Ty, Option<VariantId>) { let remaining = unresolved.map(|it| path.segments()[it..].len()).filter(|it| it > &0); + let ty = match ty.kind(Interner) { + TyKind::Alias(AliasTy::Projection(proj_ty)) => { + self.db.normalize_projection(proj_ty.clone(), self.table.trait_env.clone()) + } + _ => ty, + }; match remaining { None => { let variant = ty.as_adt().and_then(|(adt_id, _)| match adt_id { diff --git a/crates/hir-ty/src/tests/patterns.rs b/crates/hir-ty/src/tests/patterns.rs index 7234af2d683..548f782f4f2 100644 --- a/crates/hir-ty/src/tests/patterns.rs +++ b/crates/hir-ty/src/tests/patterns.rs @@ -1155,6 +1155,40 @@ fn main() { } #[test] +fn generic_alias_with_qualified_path() { + check_types( + r#" +type Wrap<T> = T; + +struct S; + +trait Schematic { + type Props; +} + +impl Schematic for S { + type Props = X; +} + +enum X { + A { cool: u32, stuff: u32 }, + B, +} + +fn main() { + let wrapped = Wrap::<<S as Schematic>::Props>::A { + cool: 100, + stuff: 100, + }; + + if let Wrap::<<S as Schematic>::Props>::A { cool, ..} = &wrapped {} + //^^^^ &u32 +} +"#, + ); +} + +#[test] fn type_mismatch_pat_const_reference() { check_no_mismatches( r#" |
