diff options
| author | bors <bors@rust-lang.org> | 2022-10-03 15:34:32 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-10-03 15:34:32 +0000 |
| commit | 974caaff8fa76fdf41e990ce3754b39bd2db5a50 (patch) | |
| tree | 27bf7bf5053bda2f52a552c1cff0d58c0b3b093f | |
| parent | 5bd98e36bc2102643cc6a93c2b894dd6a74be1c2 (diff) | |
| parent | e0a161b2e3a9345fd92fd3617e49648ee43ada86 (diff) | |
| download | rust-974caaff8fa76fdf41e990ce3754b39bd2db5a50.tar.gz rust-974caaff8fa76fdf41e990ce3754b39bd2db5a50.zip | |
Auto merge of #13339 - lowr:patch/change-generic-param-order, r=Veykril
fix: treat enum variants as generic item on their own Fixup for #13335 It turns out I tried to merge two procedures into one utility function without noticing the incompatibility. This time I *did* run analysis-stats on the four crates and confirmed it doesn't crash and this patch doesn't cause regression.
| -rw-r--r-- | crates/hir-ty/src/builder.rs | 4 | ||||
| -rw-r--r-- | crates/hir-ty/src/lower.rs | 18 |
2 files changed, 12 insertions, 10 deletions
diff --git a/crates/hir-ty/src/builder.rs b/crates/hir-ty/src/builder.rs index c0052258ee0..9ae752556d8 100644 --- a/crates/hir-ty/src/builder.rs +++ b/crates/hir-ty/src/builder.rs @@ -192,9 +192,7 @@ impl TyBuilder<()> { parent_subst: Option<Substitution>, ) -> TyBuilder<()> { let generics = generics(db.upcast(), def.into()); - // FIXME: this assertion should hold but some adjustment around - // `ValueTyDefId::EnumVariantId` is needed. - // assert!(generics.parent_generics().is_some() == parent_subst.is_some()); + assert!(generics.parent_generics().is_some() == parent_subst.is_some()); let params = generics .iter_self() .map(|(id, data)| match data { diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs index 0a4b1dfda10..a77dd910ff7 100644 --- a/crates/hir-ty/src/lower.rs +++ b/crates/hir-ty/src/lower.rs @@ -653,9 +653,13 @@ impl<'a> TyLoweringContext<'a> { infer_args: bool, ) -> Substitution { let last = path.segments().last().expect("path should have at least one segment"); - let generic_def = resolved.to_generic_def_id(); - let segment = match resolved { - ValueTyDefId::EnumVariantId(_) => { + let (segment, generic_def) = match resolved { + ValueTyDefId::FunctionId(it) => (last, Some(it.into())), + ValueTyDefId::StructId(it) => (last, Some(it.into())), + ValueTyDefId::UnionId(it) => (last, Some(it.into())), + ValueTyDefId::ConstId(it) => (last, Some(it.into())), + ValueTyDefId::StaticId(_) => (last, None), + ValueTyDefId::EnumVariantId(var) => { // the generic args for an enum variant may be either specified // on the segment referring to the enum, or on the segment // referring to the variant. So `Option::<T>::None` and @@ -663,12 +667,12 @@ impl<'a> TyLoweringContext<'a> { // preferred). See also `def_ids_for_path_segments` in rustc. let len = path.segments().len(); let penultimate = len.checked_sub(2).and_then(|idx| path.segments().get(idx)); - match penultimate { + let segment = match penultimate { Some(segment) if segment.args_and_bindings.is_some() => segment, _ => last, - } + }; + (segment, Some(var.parent.into())) } - _ => last, }; self.substs_from_path_segment(segment, generic_def, infer_args, None) } @@ -1660,7 +1664,7 @@ impl ValueTyDefId { Self::FunctionId(id) => Some(id.into()), Self::StructId(id) => Some(id.into()), Self::UnionId(id) => Some(id.into()), - Self::EnumVariantId(var) => Some(var.parent.into()), + Self::EnumVariantId(var) => Some(var.into()), Self::ConstId(id) => Some(id.into()), Self::StaticId(_) => None, } |
