Unnamed repository; edit this file 'description' to name the repository.
Encode the name instead of index in `EnumVariantId`
The most important reason is incrementality. While not a lot of things depend on the stability of `EnumVariantId`, it's still useful to have them stable. However it turns out that many things actually do want the name, more than those that want the index.
Chayim Refael Friedman 4 weeks ago
parent d50be28 · commit 81a8316
-rw-r--r--crates/hir-def/src/find_path.rs4
-rw-r--r--crates/hir-def/src/lang_item.rs2
-rw-r--r--crates/hir-def/src/lib.rs19
-rw-r--r--crates/hir-def/src/nameres/collector.rs2
-rw-r--r--crates/hir-def/src/nameres/path_resolution.rs11
-rw-r--r--crates/hir-def/src/signatures.rs45
-rw-r--r--crates/hir-ty/src/builtin_derive.rs2
-rw-r--r--crates/hir-ty/src/consteval.rs6
-rw-r--r--crates/hir-ty/src/diagnostics/decl_check.rs6
-rw-r--r--crates/hir-ty/src/diagnostics/match_check.rs8
-rw-r--r--crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs5
-rw-r--r--crates/hir-ty/src/display.rs16
-rw-r--r--crates/hir-ty/src/drop.rs4
-rw-r--r--crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs2
-rw-r--r--crates/hir-ty/src/inhabitedness.rs2
-rw-r--r--crates/hir-ty/src/layout/adt.rs4
-rw-r--r--crates/hir-ty/src/mir/eval.rs5
-rw-r--r--crates/hir-ty/src/mir/lower.rs5
-rw-r--r--crates/hir-ty/src/mir/pretty.rs4
-rw-r--r--crates/hir-ty/src/next_solver/interner.rs4
-rw-r--r--crates/hir-ty/src/representability.rs4
-rw-r--r--crates/hir-ty/src/tests.rs4
-rw-r--r--crates/hir-ty/src/variance.rs2
-rw-r--r--crates/hir/src/lib.rs14
-rw-r--r--crates/hir/src/semantics/child_by_source.rs2
-rw-r--r--crates/hir/src/symbols.rs2
26 files changed, 85 insertions, 99 deletions
diff --git a/crates/hir-def/src/find_path.rs b/crates/hir-def/src/find_path.rs
index 2a1b7f7cb0..6aaf8a674e 100644
--- a/crates/hir-def/src/find_path.rs
+++ b/crates/hir-def/src/find_path.rs
@@ -142,9 +142,7 @@ fn find_path_inner(ctx: &FindPathCtx<'_>, item: ItemInNs, max_len: usize) -> Opt
// - if the item is an enum variant, refer to it via the enum
let loc = variant.lookup(ctx.db);
if let Some(mut path) = find_path_inner(ctx, ItemInNs::Types(loc.parent.into()), max_len) {
- path.push_segment(
- loc.parent.enum_variants(ctx.db).variants[loc.index as usize].1.clone(),
- );
+ path.push_segment(loc.name.clone());
return Some(path);
}
// If this doesn't work, it seems we have no way of referring to the
diff --git a/crates/hir-def/src/lang_item.rs b/crates/hir-def/src/lang_item.rs
index c2cbb9eda7..483c3f16c6 100644
--- a/crates/hir-def/src/lang_item.rs
+++ b/crates/hir-def/src/lang_item.rs
@@ -74,7 +74,7 @@ pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangIt
}
ModuleDefId::AdtId(AdtId::EnumId(e)) => {
lang_items.collect_lang_item(db, e);
- e.enum_variants(db).variants.iter().for_each(|&(id, _, _)| {
+ e.enum_variants(db).variants.values().for_each(|&(id, _)| {
lang_items.collect_lang_item(db, id);
});
}
diff --git a/crates/hir-def/src/lib.rs b/crates/hir-def/src/lib.rs
index 3aaf89102f..bf265cd42e 100644
--- a/crates/hir-def/src/lib.rs
+++ b/crates/hir-def/src/lib.rs
@@ -367,20 +367,35 @@ impl ExternBlockId {
}
}
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct EnumVariantLoc {
pub id: AstId<ast::Variant>,
pub parent: EnumId,
- pub index: u32,
+ pub name: Name,
}
impl_intern!(EnumVariantId, EnumVariantLoc);
impl_loc!(EnumVariantLoc, id: Variant, parent: EnumId);
+impl EnumVariantLoc {
+ pub fn index(&self, db: &dyn DefDatabase) -> usize {
+ self.parent
+ .enum_variants(db)
+ .variants
+ .get_full(&self.name)
+ .expect("parent enum should include this variant")
+ .0
+ }
+}
+
impl EnumVariantId {
pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
VariantFields::of(db, self.into())
}
+ pub fn index(self, db: &dyn DefDatabase) -> usize {
+ self.loc(db).index(db)
+ }
+
pub fn fields_with_source_map(
self,
db: &dyn DefDatabase,
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index 5ef51dbb2c..8e16c5ece6 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -1027,7 +1027,7 @@ impl<'db> DefCollector<'db> {
.enum_variants(self.db)
.variants
.iter()
- .map(|&(variant, ref name, _)| {
+ .map(|(name, &(variant, _))| {
let res = PerNs::both(variant.into(), variant.into(), vis, None);
(Some(name.clone()), res)
})
diff --git a/crates/hir-def/src/nameres/path_resolution.rs b/crates/hir-def/src/nameres/path_resolution.rs
index cf33cecf5f..54fd30fe6b 100644
--- a/crates/hir-def/src/nameres/path_resolution.rs
+++ b/crates/hir-def/src/nameres/path_resolution.rs
@@ -519,12 +519,8 @@ impl DefMap {
// enum variant
cov_mark::hit!(can_import_enum_variant);
- let res = e
- .enum_variants(db)
- .variants
- .iter()
- .find(|(_, name, _)| name == segment)
- .map(|&(variant, _, shape)| match shape {
+ let res = e.enum_variants(db).variants.get(segment).map(|&(variant, shape)| {
+ match shape {
FieldsShape::Record => {
PerNs::types(variant.into(), Visibility::Public, None)
}
@@ -534,7 +530,8 @@ impl DefMap {
Visibility::Public,
None,
),
- });
+ }
+ });
// FIXME: Need to filter visibility here and below? Not sure.
return match res {
Some(res) => {
diff --git a/crates/hir-def/src/signatures.rs b/crates/hir-def/src/signatures.rs
index e58befae20..463fc9ceff 100644
--- a/crates/hir-def/src/signatures.rs
+++ b/crates/hir-def/src/signatures.rs
@@ -19,8 +19,9 @@ use thin_vec::ThinVec;
use triomphe::Arc;
use crate::{
- ConstId, EnumId, EnumVariantId, EnumVariantLoc, ExternBlockId, FunctionId, HasModule, ImplId,
- ItemContainerId, ModuleId, StaticId, StructId, TraitId, TypeAliasId, UnionId, VariantId,
+ ConstId, EnumId, EnumVariantId, EnumVariantLoc, ExternBlockId, FunctionId, FxIndexMap,
+ HasModule, ImplId, ItemContainerId, ModuleId, StaticId, StructId, TraitId, TypeAliasId,
+ UnionId, VariantId,
attrs::AttrFlags,
db::DefDatabase,
expr_store::{
@@ -1055,7 +1056,7 @@ pub struct InactiveEnumVariantCode {
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EnumVariants {
- pub variants: Box<[(EnumVariantId, Name, FieldsShape)]>,
+ pub variants: FxIndexMap<Name, (EnumVariantId, FieldsShape)>,
}
#[salsa::tracked]
@@ -1071,23 +1072,24 @@ impl EnumVariants {
let mut diagnostics = ThinVec::new();
let cfg_options = loc.container.krate(db).cfg_options(db);
- let mut index = 0;
let Some(variants) = source.value.variant_list() else {
- return (EnumVariants { variants: Box::default() }, None);
+ return (EnumVariants { variants: FxIndexMap::default() }, None);
};
- let variants = variants
+ let mut variants = variants
.variants()
.filter_map(|variant| {
let ast_id = ast_id_map.ast_id(&variant);
match AttrFlags::is_cfg_enabled_for(&variant, cfg_options) {
Ok(()) => {
- let enum_variant =
- EnumVariantLoc { id: source.with_value(ast_id), parent: e, index }
- .intern(db);
- index += 1;
let name = as_name_opt(variant.name());
+ let enum_variant = EnumVariantLoc {
+ id: source.with_value(ast_id),
+ parent: e,
+ name: name.clone(),
+ }
+ .intern(db);
let shape = adt_shape(variant.kind());
- Some((enum_variant, name, shape))
+ Some((name, (enum_variant, shape)))
}
Err(cfg) => {
diagnostics.push(InactiveEnumVariantCode {
@@ -1099,7 +1101,8 @@ impl EnumVariants {
}
}
})
- .collect();
+ .collect::<FxIndexMap<_, _>>();
+ variants.shrink_to_fit();
(EnumVariants { variants }, diagnostics.is_empty().not().then_some(diagnostics))
}
@@ -1107,26 +1110,28 @@ impl EnumVariants {
impl EnumVariants {
pub fn variant(&self, name: &Name) -> Option<EnumVariantId> {
- self.variants.iter().find_map(|(v, n, _)| if n == name { Some(*v) } else { None })
+ self.variants.get(name).map(|&(id, _)| id)
}
pub fn variant_name_by_id(&self, variant_id: EnumVariantId) -> Option<Name> {
self.variants
.iter()
- .find_map(|(id, name, _)| if *id == variant_id { Some(name.clone()) } else { None })
+ .find_map(|(name, (id, _))| if *id == variant_id { Some(name.clone()) } else { None })
}
// [Adopted from rustc](https://github.com/rust-lang/rust/blob/bd53aa3bf7a24a70d763182303bd75e5fc51a9af/compiler/rustc_middle/src/ty/adt.rs#L446-L448)
pub fn is_payload_free(&self, db: &dyn DefDatabase) -> bool {
- self.variants.iter().all(|&(v, _, _)| {
+ self.variants.values().all(|&(v, shape)| {
// The condition check order is slightly modified from rustc
// to improve performance by early returning with relatively fast checks
- let variant = v.fields(db);
- if !variant.fields().is_empty() {
- return false;
- }
+
// The outer if condition is whether this variant has const ctor or not
- if !matches!(variant.shape, FieldsShape::Unit) {
+ if !matches!(shape, FieldsShape::Unit) {
+ let variant = v.fields(db);
+ if !variant.fields().is_empty() {
+ return false;
+ }
+
let body = Body::of(db, v.into());
// A variant with explicit discriminant
if !matches!(body[body.root_expr()], crate::hir::Expr::Missing) {
diff --git a/crates/hir-ty/src/builtin_derive.rs b/crates/hir-ty/src/builtin_derive.rs
index 4e19fb8067..928e3da6e8 100644
--- a/crates/hir-ty/src/builtin_derive.rs
+++ b/crates/hir-ty/src/builtin_derive.rs
@@ -305,7 +305,7 @@ fn simple_trait_predicates<'db>(
loc.trait_,
),
AdtId::EnumId(id) => {
- for &(variant_id, _, _) in &id.enum_variants(interner.db).variants {
+ for &(variant_id, _) in id.enum_variants(interner.db).variants.values() {
extend_assoc_type_bounds(
interner,
&mut assoc_type_bounds,
diff --git a/crates/hir-ty/src/consteval.rs b/crates/hir-ty/src/consteval.rs
index e1d6cec594..9a6e2a87f2 100644
--- a/crates/hir-ty/src/consteval.rs
+++ b/crates/hir-ty/src/consteval.rs
@@ -400,12 +400,10 @@ pub(crate) fn const_eval_discriminant_variant(
let body = Body::of(db, def);
let loc = variant_id.lookup(db);
if matches!(body[body.root_expr()], Expr::Missing) {
- let prev_idx = loc.index.checked_sub(1);
+ let prev_idx = loc.index(db).checked_sub(1);
let value = match prev_idx {
Some(prev_idx) => {
- 1 + db.const_eval_discriminant(
- loc.parent.enum_variants(db).variants[prev_idx as usize].0,
- )?
+ 1 + db.const_eval_discriminant(loc.parent.enum_variants(db).variants[prev_idx].0)?
}
_ => 0,
};
diff --git a/crates/hir-ty/src/diagnostics/decl_check.rs b/crates/hir-ty/src/diagnostics/decl_check.rs
index 76fbb66b06..ace3616339 100644
--- a/crates/hir-ty/src/diagnostics/decl_check.rs
+++ b/crates/hir-ty/src/diagnostics/decl_check.rs
@@ -504,15 +504,15 @@ impl<'a> DeclValidator<'a> {
fn validate_enum_variants(&mut self, enum_id: EnumId) {
let data = enum_id.enum_variants(self.db);
- for (variant_id, _, _) in data.variants.iter() {
+ for (variant_id, _) in data.variants.values() {
self.validate_enum_variant_fields(*variant_id);
}
let edition = self.edition(enum_id);
let mut enum_variants_replacements = data
.variants
- .iter()
- .filter_map(|(_, name, _)| {
+ .keys()
+ .filter_map(|name| {
to_camel_case(&name.display_no_db(edition).to_smolstr()).map(|new_name| {
Replacement {
current_name: name.clone(),
diff --git a/crates/hir-ty/src/diagnostics/match_check.rs b/crates/hir-ty/src/diagnostics/match_check.rs
index 8356329d96..14bff65220 100644
--- a/crates/hir-ty/src/diagnostics/match_check.rs
+++ b/crates/hir-ty/src/diagnostics/match_check.rs
@@ -330,13 +330,7 @@ impl<'db> HirDisplay<'db> for Pat<'db> {
match variant {
VariantId::EnumVariantId(v) => {
let loc = v.lookup(f.db);
- write!(
- f,
- "{}",
- loc.parent.enum_variants(f.db).variants[loc.index as usize]
- .1
- .display(f.db, f.edition())
- )?;
+ write!(f, "{}", loc.name.display(f.db, f.edition()))?;
}
VariantId::StructId(s) => write!(
f,
diff --git a/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs b/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
index 46959aaa5a..984ac1abfb 100644
--- a/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
+++ b/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
@@ -49,8 +49,7 @@ pub(crate) struct EnumVariantContiguousIndex(usize);
impl EnumVariantContiguousIndex {
fn from_enum_variant_id(db: &dyn HirDatabase, target_evid: EnumVariantId) -> Self {
// Find the index of this variant in the list of variants.
- use hir_def::Lookup;
- let i = target_evid.lookup(db).index as usize;
+ let i = target_evid.index(db);
EnumVariantContiguousIndex(i)
}
@@ -438,7 +437,7 @@ impl<'a, 'db> PatCx for MatchCheckCtx<'a, 'db> {
ConstructorSet::NoConstructors
} else {
let mut variants = IndexVec::with_capacity(enum_data.variants.len());
- for &(variant, _, _) in enum_data.variants.iter() {
+ for &(variant, _) in enum_data.variants.values() {
let is_uninhabited = is_enum_variant_uninhabited_from(
cx.infcx, variant, subst, cx.module, self.env,
);
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs
index 326f920b11..03d0e15fec 100644
--- a/crates/hir-ty/src/display.rs
+++ b/crates/hir-ty/src/display.rs
@@ -990,13 +990,7 @@ fn render_const_scalar_inner<'db>(
return f.write_str("<failed-to-detect-variant>");
};
let loc = var_id.lookup(f.db);
- write!(
- f,
- "{}",
- loc.parent.enum_variants(f.db).variants[loc.index as usize]
- .1
- .display(f.db, f.edition())
- )?;
+ write!(f, "{}", loc.name.display(f.db, f.edition()))?;
let field_types = f.db.field_types(var_id.into());
render_variant_after_name(
var_id.fields(f.db),
@@ -1362,13 +1356,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> {
}
CallableDefId::EnumVariantId(e) => {
let loc = e.lookup(db);
- write!(
- f,
- "{}",
- loc.parent.enum_variants(db).variants[loc.index as usize]
- .1
- .display(db, f.edition())
- )?
+ write!(f, "{}", loc.name.display(db, f.edition()))?
}
};
f.end_location_link();
diff --git a/crates/hir-ty/src/drop.rs b/crates/hir-ty/src/drop.rs
index 61e6720a29..726b862fe1 100644
--- a/crates/hir-ty/src/drop.rs
+++ b/crates/hir-ty/src/drop.rs
@@ -100,8 +100,8 @@ fn has_drop_glue_impl<'db>(
AdtId::EnumId(id) => id
.enum_variants(db)
.variants
- .iter()
- .map(|&(variant, _, _)| {
+ .values()
+ .map(|&(variant, _)| {
db.field_types(variant.into())
.iter()
.map(|(_, field_ty)| {
diff --git a/crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs b/crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs
index deafff6b43..e7e97df48e 100644
--- a/crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs
+++ b/crates/hir-ty/src/infer/closure/analysis/expr_use_visitor.rs
@@ -1473,7 +1473,7 @@ impl<'db, D: Delegate<'db>> ExprUseVisitor<'_, '_, 'db, D> {
fn variant_index_for_adt(&self, pat_id: PatId) -> Result<(u32, VariantId)> {
let variant = self.cx.result.variant_resolution_for_pat(pat_id).ok_or(ErrorGuaranteed)?;
let variant_idx = match variant {
- VariantId::EnumVariantId(variant) => variant.loc(self.cx.db).index,
+ VariantId::EnumVariantId(variant) => variant.index(self.cx.db) as u32,
VariantId::StructId(_) | VariantId::UnionId(_) => 0,
};
Ok((variant_idx, variant))
diff --git a/crates/hir-ty/src/inhabitedness.rs b/crates/hir-ty/src/inhabitedness.rs
index 0070d14f37..26253fbabf 100644
--- a/crates/hir-ty/src/inhabitedness.rs
+++ b/crates/hir-ty/src/inhabitedness.rs
@@ -125,7 +125,7 @@ impl<'a, 'db> UninhabitedFrom<'a, 'db> {
AdtId::EnumId(e) => {
let enum_data = e.enum_variants(self.db());
- for &(variant, _, _) in enum_data.variants.iter() {
+ for &(variant, _) in enum_data.variants.values() {
let variant_inhabitedness = self.visit_variant(variant.into(), subst);
match variant_inhabitedness {
Break(VisiblyUninhabited) => (),
diff --git a/crates/hir-ty/src/layout/adt.rs b/crates/hir-ty/src/layout/adt.rs
index b7e1697059..22dd53ca2d 100644
--- a/crates/hir-ty/src/layout/adt.rs
+++ b/crates/hir-ty/src/layout/adt.rs
@@ -60,8 +60,8 @@ pub fn layout_of_adt_query(
let variants = e.enum_variants(db);
let r = variants
.variants
- .iter()
- .map(|&(v, _, _)| handle_variant(v.into(), v.fields(db)))
+ .values()
+ .map(|&(v, _)| handle_variant(v.into(), v.fields(db)))
.collect::<Result<SmallVec<_>, _>>()?;
(r, AttrFlags::repr(db, e.into()).unwrap_or_default(), false)
}
diff --git a/crates/hir-ty/src/mir/eval.rs b/crates/hir-ty/src/mir/eval.rs
index 3372f6ec2e..e080d3d713 100644
--- a/crates/hir-ty/src/mir/eval.rs
+++ b/crates/hir-ty/src/mir/eval.rs
@@ -844,7 +844,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
Variants::Multiple { variants, .. } => {
&variants[match f.parent {
hir_def::VariantId::EnumVariantId(it) => {
- RustcEnumVariantIdx(it.lookup(self.db).index as usize)
+ RustcEnumVariantIdx(it.index(self.db))
}
_ => {
return Err(MirEvalError::InternalError(
@@ -1837,8 +1837,7 @@ impl<'a, 'db: 'a> Evaluator<'a, 'db> {
_ => not_supported!("multi variant layout for non-enums"),
};
let mut discriminant = self.const_eval_discriminant(enum_variant_id)?;
- let lookup = enum_variant_id.lookup(self.db);
- let rustc_enum_variant_idx = RustcEnumVariantIdx(lookup.index as usize);
+ let rustc_enum_variant_idx = RustcEnumVariantIdx(enum_variant_id.index(self.db));
let variant_layout = variants[rustc_enum_variant_idx].clone();
let have_tag = match tag_encoding {
TagEncoding::Direct => true,
diff --git a/crates/hir-ty/src/mir/lower.rs b/crates/hir-ty/src/mir/lower.rs
index 3852db909e..27efc5cfd5 100644
--- a/crates/hir-ty/src/mir/lower.rs
+++ b/crates/hir-ty/src/mir/lower.rs
@@ -2309,10 +2309,7 @@ pub fn mir_body_query<'db>(db: &'db dyn HirDatabase, def: InferBodyId) -> Result
.to_string(),
InferBodyId::DefWithBodyId(DefWithBodyId::VariantId(it)) => {
let loc = it.lookup(db);
- loc.parent.enum_variants(db).variants[loc.index as usize]
- .1
- .display(db, edition)
- .to_string()
+ loc.name.display(db, edition).to_string()
}
InferBodyId::AnonConstId(_) => "{const}".to_owned(),
};
diff --git a/crates/hir-ty/src/mir/pretty.rs b/crates/hir-ty/src/mir/pretty.rs
index 777cf170bc..a534e50997 100644
--- a/crates/hir-ty/src/mir/pretty.rs
+++ b/crates/hir-ty/src/mir/pretty.rs
@@ -341,9 +341,7 @@ impl<'a, 'db> MirPrettyCtx<'a, 'db> {
w!(
this,
" as {}).{}",
- loc.parent.enum_variants(this.db).variants[loc.index as usize]
- .1
- .display(this.db, this.display_target.edition),
+ loc.name.display(this.db, this.display_target.edition),
name.display(this.db, this.display_target.edition)
);
}
diff --git a/crates/hir-ty/src/next_solver/interner.rs b/crates/hir-ty/src/next_solver/interner.rs
index 9871042e61..5ca0e67d29 100644
--- a/crates/hir-ty/src/next_solver/interner.rs
+++ b/crates/hir-ty/src/next_solver/interner.rs
@@ -608,8 +608,8 @@ impl<'db> inherent::AdtDef<DbInterner<'db>> for AdtDef {
hir_def::AdtId::EnumId(id) => id
.enum_variants(db)
.variants
- .iter()
- .flat_map(|&(variant_id, _, _)| field_tys(variant_id.into()))
+ .values()
+ .flat_map(|&(variant_id, _)| field_tys(variant_id.into()))
.collect(),
};
diff --git a/crates/hir-ty/src/representability.rs b/crates/hir-ty/src/representability.rs
index 0b7dc4d309..0ea8003e55 100644
--- a/crates/hir-ty/src/representability.rs
+++ b/crates/hir-ty/src/representability.rs
@@ -29,7 +29,7 @@ pub(crate) fn representability(db: &dyn HirDatabase, id: AdtId) -> Representabil
AdtId::StructId(id) => variant_representability(db, id.into()),
AdtId::UnionId(id) => variant_representability(db, id.into()),
AdtId::EnumId(id) => {
- for &(variant, ..) in &id.enum_variants(db).variants {
+ for &(variant, ..) in id.enum_variants(db).variants.values() {
rtry!(variant_representability(db, variant.into()));
}
Representability::Representable
@@ -105,7 +105,7 @@ fn params_in_repr(db: &dyn HirDatabase, def_id: AdtId) -> Box<[bool]> {
AdtId::StructId(def_id) => handle_variant(def_id.into()),
AdtId::UnionId(def_id) => handle_variant(def_id.into()),
AdtId::EnumId(def_id) => {
- for &(variant, ..) in &def_id.enum_variants(db).variants {
+ for &(variant, ..) in def_id.enum_variants(db).variants.values() {
handle_variant(variant.into());
}
}
diff --git a/crates/hir-ty/src/tests.rs b/crates/hir-ty/src/tests.rs
index d259ce7963..ce4eff701c 100644
--- a/crates/hir-ty/src/tests.rs
+++ b/crates/hir-ty/src/tests.rs
@@ -460,7 +460,7 @@ fn infer_with_mismatches(content: &str, include_mismatches: bool) -> String {
AdtId::EnumId(id) => variants.extend(
id.enum_variants(&db)
.variants
- .iter()
+ .values()
.map(|&(variant, ..)| (variant.into(), krate)),
),
}
@@ -600,7 +600,7 @@ pub(crate) fn visit_module(
visit_body(db, body, cb);
}
ModuleDefId::AdtId(AdtId::EnumId(it)) => {
- it.enum_variants(db).variants.iter().for_each(|&(it, _, _)| {
+ it.enum_variants(db).variants.values().for_each(|&(it, _)| {
let body = Body::of(db, it.into());
cb(it.into());
visit_body(db, body, cb);
diff --git a/crates/hir-ty/src/variance.rs b/crates/hir-ty/src/variance.rs
index 7eee78b8c4..39d51dcee0 100644
--- a/crates/hir-ty/src/variance.rs
+++ b/crates/hir-ty/src/variance.rs
@@ -135,7 +135,7 @@ impl<'db> Context<'db> {
AdtId::StructId(s) => add_constraints_from_variant(VariantId::StructId(s)),
AdtId::UnionId(u) => add_constraints_from_variant(VariantId::UnionId(u)),
AdtId::EnumId(e) => {
- e.enum_variants(db).variants.iter().for_each(|&(variant, _, _)| {
+ e.enum_variants(db).variants.values().for_each(|&(variant, _)| {
add_constraints_from_variant(VariantId::EnumVariantId(variant))
});
}
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index 894bfe91b5..633fe1f86b 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -796,7 +796,7 @@ impl Module {
);
}
}
- for &(v, _, _) in &variants.variants {
+ for &(v, _) in variants.variants.values() {
let source_map = &v.fields_with_source_map(db).1;
push_ty_diagnostics(
db,
@@ -1644,7 +1644,7 @@ impl Enum {
}
pub fn variants(self, db: &dyn HirDatabase) -> Vec<EnumVariant> {
- self.id.enum_variants(db).variants.iter().map(|&(id, _, _)| EnumVariant { id }).collect()
+ self.id.enum_variants(db).variants.values().map(|&(id, _)| EnumVariant { id }).collect()
}
pub fn num_variants(self, db: &dyn HirDatabase) -> usize {
@@ -1763,9 +1763,7 @@ impl EnumVariant {
}
pub fn name(self, db: &dyn HirDatabase) -> Name {
- let lookup = self.id.lookup(db);
- let enum_ = lookup.parent;
- enum_.enum_variants(db).variants[lookup.index as usize].1.clone()
+ self.id.lookup(db).name.clone()
}
pub fn fields(self, db: &dyn HirDatabase) -> Vec<Field> {
@@ -1800,7 +1798,7 @@ impl EnumVariant {
layout::Variants::Multiple { variants, .. } => Layout(
{
let lookup = self.id.lookup(db);
- let rustc_enum_variant_idx = RustcEnumVariantIdx(lookup.index as usize);
+ let rustc_enum_variant_idx = RustcEnumVariantIdx(lookup.index(db));
Arc::new(variants[rustc_enum_variant_idx].clone())
},
db.target_data_layout(parent_enum.krate(db).into()).unwrap(),
@@ -5694,8 +5692,8 @@ impl<'db> Type<'db> {
AdtId::EnumId(id) => id
.enum_variants(self.interner.db())
.variants
- .iter()
- .map(|&(variant_id, _, _)| variant_id_to_fields(variant_id.into()))
+ .values()
+ .map(|&(variant_id, _)| variant_id_to_fields(variant_id.into()))
.collect(),
AdtId::UnionId(id) => {
vec![variant_id_to_fields(id.into())]
diff --git a/crates/hir/src/semantics/child_by_source.rs b/crates/hir/src/semantics/child_by_source.rs
index babeb35913..97c5a451ab 100644
--- a/crates/hir/src/semantics/child_by_source.rs
+++ b/crates/hir/src/semantics/child_by_source.rs
@@ -202,7 +202,7 @@ impl ChildBySource for EnumId {
let ast_id_map = db.ast_id_map(loc.id.file_id);
- self.enum_variants(db).variants.iter().for_each(|&(variant, _, _)| {
+ self.enum_variants(db).variants.values().for_each(|&(variant, _)| {
res[keys::ENUM_VARIANT].insert(ast_id_map.get(variant.lookup(db).id.value), variant);
});
let (_, source_map) = EnumSignature::with_source_map(db, *self);
diff --git a/crates/hir/src/symbols.rs b/crates/hir/src/symbols.rs
index ff56544d82..e9cfb63a12 100644
--- a/crates/hir/src/symbols.rs
+++ b/crates/hir/src/symbols.rs
@@ -190,7 +190,7 @@ impl<'a> SymbolCollector<'a> {
let enum_name = Symbol::intern(EnumSignature::of(this.db, id).name.as_str());
this.with_container_name(Some(enum_name), |this| {
let variants = id.enum_variants(this.db);
- for (variant_id, variant_name, _) in &variants.variants {
+ for (variant_name, (variant_id, _)) in &variants.variants {
this.push_decl(*variant_id, variant_name, true, None);
}
});