Skip to content

Commit e0a161b

Browse files
committed
fix: treat enum variants as generic item on their own
1 parent 7556f74 commit e0a161b

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

crates/hir-ty/src/builder.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,7 @@ impl TyBuilder<()> {
192192
parent_subst: Option<Substitution>,
193193
) -> TyBuilder<()> {
194194
let generics = generics(db.upcast(), def.into());
195-
// FIXME: this assertion should hold but some adjustment around
196-
// `ValueTyDefId::EnumVariantId` is needed.
197-
// assert!(generics.parent_generics().is_some() == parent_subst.is_some());
195+
assert!(generics.parent_generics().is_some() == parent_subst.is_some());
198196
let params = generics
199197
.iter_self()
200198
.map(|(id, data)| match data {

crates/hir-ty/src/lower.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -653,22 +653,26 @@ impl<'a> TyLoweringContext<'a> {
653653
infer_args: bool,
654654
) -> Substitution {
655655
let last = path.segments().last().expect("path should have at least one segment");
656-
let generic_def = resolved.to_generic_def_id();
657-
let segment = match resolved {
658-
ValueTyDefId::EnumVariantId(_) => {
656+
let (segment, generic_def) = match resolved {
657+
ValueTyDefId::FunctionId(it) => (last, Some(it.into())),
658+
ValueTyDefId::StructId(it) => (last, Some(it.into())),
659+
ValueTyDefId::UnionId(it) => (last, Some(it.into())),
660+
ValueTyDefId::ConstId(it) => (last, Some(it.into())),
661+
ValueTyDefId::StaticId(_) => (last, None),
662+
ValueTyDefId::EnumVariantId(var) => {
659663
// the generic args for an enum variant may be either specified
660664
// on the segment referring to the enum, or on the segment
661665
// referring to the variant. So `Option::<T>::None` and
662666
// `Option::None::<T>` are both allowed (though the former is
663667
// preferred). See also `def_ids_for_path_segments` in rustc.
664668
let len = path.segments().len();
665669
let penultimate = len.checked_sub(2).and_then(|idx| path.segments().get(idx));
666-
match penultimate {
670+
let segment = match penultimate {
667671
Some(segment) if segment.args_and_bindings.is_some() => segment,
668672
_ => last,
669-
}
673+
};
674+
(segment, Some(var.parent.into()))
670675
}
671-
_ => last,
672676
};
673677
self.substs_from_path_segment(segment, generic_def, infer_args, None)
674678
}
@@ -1660,7 +1664,7 @@ impl ValueTyDefId {
16601664
Self::FunctionId(id) => Some(id.into()),
16611665
Self::StructId(id) => Some(id.into()),
16621666
Self::UnionId(id) => Some(id.into()),
1663-
Self::EnumVariantId(var) => Some(var.parent.into()),
1667+
Self::EnumVariantId(var) => Some(var.into()),
16641668
Self::ConstId(id) => Some(id.into()),
16651669
Self::StaticId(_) => None,
16661670
}

0 commit comments

Comments
 (0)