Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #16152 - Austaras:alias, r=Veykril
fix: resolve alias before resolve variant Closes #15943 (again)
bors 2023-12-18
parent ae2c322 · parent bd61888 · commit f663521
-rw-r--r--crates/hir-ty/src/infer.rs6
-rw-r--r--crates/hir-ty/src/tests/patterns.rs34
2 files changed, 40 insertions, 0 deletions
diff --git a/crates/hir-ty/src/infer.rs b/crates/hir-ty/src/infer.rs
index 6f724e4587..e295dd8d4e 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 7234af2d68..548f782f4f 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#"