Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22329 from ChayimFriedman2/intern-ref
Encode the name instead of index in `EnumVariantId`
Lukas Wirth 3 weeks ago
parent 7c28934 · parent 470a37f · commit 8d1edc4
-rw-r--r--crates/base-db/src/lib.rs1
-rw-r--r--crates/hir-def/src/db.rs7
-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.rs21
-rw-r--r--crates/hir-def/src/nameres.rs2
-rw-r--r--crates/hir-def/src/nameres/assoc.rs4
-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.rs52
-rw-r--r--crates/hir-expand/src/db.rs12
-rw-r--r--crates/hir-expand/src/lib.rs63
-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/opaques.rs2
-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.rs44
-rw-r--r--crates/hir/src/semantics.rs4
-rw-r--r--crates/hir/src/semantics/child_by_source.rs2
-rw-r--r--crates/hir/src/symbols.rs2
-rw-r--r--crates/ide/src/navigation_target.rs2
35 files changed, 156 insertions, 164 deletions
diff --git a/crates/base-db/src/lib.rs b/crates/base-db/src/lib.rs
index a209a0e631..fd47403ec4 100644
--- a/crates/base-db/src/lib.rs
+++ b/crates/base-db/src/lib.rs
@@ -49,6 +49,7 @@ macro_rules! impl_intern_key {
#[salsa_macros::interned(no_lifetime, revisions = usize::MAX)]
#[derive(PartialOrd, Ord)]
pub struct $id {
+ #[returns(ref)]
pub loc: $loc,
}
diff --git a/crates/hir-def/src/db.rs b/crates/hir-def/src/db.rs
index 11e5c54246..6301eb7901 100644
--- a/crates/hir-def/src/db.rs
+++ b/crates/hir-def/src/db.rs
@@ -7,8 +7,7 @@ use hir_expand::{
use triomphe::Arc;
use crate::{
- AssocItemId, AttrDefId, Macro2Loc, MacroExpander, MacroId, MacroRulesLoc, MacroRulesLocFlags,
- TraitId,
+ AssocItemId, AttrDefId, MacroExpander, MacroId, MacroRulesLocFlags, TraitId,
attrs::AttrFlags,
item_tree::{ItemTree, file_item_tree},
nameres::crate_def_map,
@@ -81,7 +80,7 @@ fn macro_def(db: &dyn DefDatabase, id: MacroId) -> MacroDefId {
match id {
MacroId::Macro2Id(it) => {
- let loc: Macro2Loc = it.lookup(db);
+ let loc = it.lookup(db);
MacroDefId {
krate: loc.container.krate(db),
@@ -92,7 +91,7 @@ fn macro_def(db: &dyn DefDatabase, id: MacroId) -> MacroDefId {
}
}
MacroId::MacroRulesId(it) => {
- let loc: MacroRulesLoc = it.lookup(db);
+ let loc = it.lookup(db);
MacroDefId {
krate: loc.container.krate(db),
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..7b7d046581 100644
--- a/crates/hir-def/src/lib.rs
+++ b/crates/hir-def/src/lib.rs
@@ -298,7 +298,7 @@ impl EnumId {
pub fn enum_variants_with_diagnostics(
self,
db: &dyn DefDatabase,
- ) -> &(EnumVariants, Option<ThinVec<InactiveEnumVariantCode>>) {
+ ) -> &(EnumVariants, ThinVec<InactiveEnumVariantCode>) {
EnumVariants::of(db, self)
}
}
@@ -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.rs b/crates/hir-def/src/nameres.rs
index 88e3408a33..ef7fb0888f 100644
--- a/crates/hir-def/src/nameres.rs
+++ b/crates/hir-def/src/nameres.rs
@@ -427,7 +427,7 @@ pub(crate) fn crate_local_def_map(db: &dyn DefDatabase, crate_id: Crate) -> DefM
#[salsa_macros::tracked(returns(ref))]
pub fn block_def_map(db: &dyn DefDatabase, block_id: BlockId) -> DefMap {
- let BlockLoc { ast_id, module } = block_id.lookup(db);
+ let BlockLoc { ast_id, module } = *block_id.lookup(db);
let visibility = Visibility::Module(module, VisibilityExplicitness::Implicit);
let module_data =
diff --git a/crates/hir-def/src/nameres/assoc.rs b/crates/hir-def/src/nameres/assoc.rs
index b1d554738f..7b5b39cb08 100644
--- a/crates/hir-def/src/nameres/assoc.rs
+++ b/crates/hir-def/src/nameres/assoc.rs
@@ -50,7 +50,7 @@ impl TraitItems {
db: &dyn DefDatabase,
tr: TraitId,
) -> (TraitItems, DefDiagnostics) {
- let ItemLoc { container: module_id, id: ast_id } = tr.lookup(db);
+ let ItemLoc { container: module_id, id: ast_id } = *tr.lookup(db);
let ast_id_map = db.ast_id_map(ast_id.file_id);
let source = ast_id.with_value(ast_id_map.get(ast_id.value)).to_node(db);
if source.eq_token().is_some() {
@@ -115,7 +115,7 @@ impl ImplItems {
#[salsa::tracked(returns(ref))]
pub fn of(db: &dyn DefDatabase, id: ImplId) -> (ImplItems, DefDiagnostics) {
let _p = tracing::info_span!("impl_items_with_diagnostics_query").entered();
- let ItemLoc { container: module_id, id: ast_id } = id.lookup(db);
+ let ItemLoc { container: module_id, id: ast_id } = *id.lookup(db);
let collector =
AssocItemCollector::new(db, module_id, ItemContainerId::ImplId(id), ast_id.file_id);
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..e9307a1255 100644
--- a/crates/hir-def/src/signatures.rs
+++ b/crates/hir-def/src/signatures.rs
@@ -1,6 +1,6 @@
//! Item signature IR definitions
-use std::{cell::LazyCell, ops::Not as _};
+use std::cell::LazyCell;
use bitflags::bitflags;
use cfg::{CfgExpr, CfgOptions};
@@ -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]
@@ -1064,30 +1065,31 @@ impl EnumVariants {
pub(crate) fn of(
db: &dyn DefDatabase,
e: EnumId,
- ) -> (EnumVariants, Option<ThinVec<InactiveEnumVariantCode>>) {
+ ) -> (EnumVariants, ThinVec<InactiveEnumVariantCode>) {
let loc = e.lookup(db);
let source = loc.source(db);
let ast_id_map = db.ast_id_map(source.file_id);
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() }, ThinVec::new());
};
- 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,34 +1101,38 @@ impl EnumVariants {
}
}
})
- .collect();
+ .collect::<FxIndexMap<_, _>>();
+ variants.shrink_to_fit();
+ diagnostics.shrink_to_fit();
- (EnumVariants { variants }, diagnostics.is_empty().not().then_some(diagnostics))
+ (EnumVariants { variants }, diagnostics)
}
}
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-expand/src/db.rs b/crates/hir-expand/src/db.rs
index beae6e843e..b09f69a295 100644
--- a/crates/hir-expand/src/db.rs
+++ b/crates/hir-expand/src/db.rs
@@ -149,8 +149,8 @@ fn syntax_context(db: &dyn ExpandDatabase, file: HirFileId, edition: Edition) ->
match file {
HirFileId::FileId(_) => SyntaxContext::root(edition),
HirFileId::MacroFile(m) => {
- let kind = m.loc(db).kind;
- db.macro_arg_considering_derives(m, &kind).2.ctx
+ let kind = &m.loc(db).kind;
+ db.macro_arg_considering_derives(m, kind).2.ctx
}
}
}
@@ -542,11 +542,11 @@ impl<'db> TokenExpander<'db> {
}
}
-fn macro_expand(
- db: &dyn ExpandDatabase,
+fn macro_expand<'db>(
+ db: &'db dyn ExpandDatabase,
macro_call_id: MacroCallId,
- loc: MacroCallLoc,
-) -> ExpandResult<(Cow<'_, tt::TopSubtree>, MatchedArmIndex)> {
+ loc: &MacroCallLoc,
+) -> ExpandResult<(Cow<'db, tt::TopSubtree>, MatchedArmIndex)> {
let _p = tracing::info_span!("macro_expand").entered();
let (ExpandResult { value: (tt, matched_arm), err }, span) = match loc.def.kind {
diff --git a/crates/hir-expand/src/lib.rs b/crates/hir-expand/src/lib.rs
index 0850d6156d..c98d072784 100644
--- a/crates/hir-expand/src/lib.rs
+++ b/crates/hir-expand/src/lib.rs
@@ -81,7 +81,7 @@ macro_rules! impl_intern_lookup {
impl $crate::Lookup for $id {
type Database = dyn $db;
type Data = $loc;
- fn lookup(&self, db: &Self::Database) -> Self::Data {
+ fn lookup<'db>(&self, db: &'db Self::Database) -> &'db Self::Data {
self.loc(db)
}
}
@@ -98,7 +98,7 @@ pub trait Intern {
pub trait Lookup {
type Database: ?Sized;
type Data;
- fn lookup(&self, db: &Self::Database) -> Self::Data;
+ fn lookup<'db>(&self, db: &'db Self::Database) -> &'db Self::Data;
}
impl_intern_lookup!(ExpandDatabase, MacroCallId, MacroCallLoc);
@@ -714,24 +714,27 @@ impl MacroCallKind {
/// - fn_like! {}, it spans the path and token tree
/// - #\[derive], it spans the `#[derive(...)]` attribute and the annotated item
/// - #\[attr], it spans the `#[attr(...)]` attribute and the annotated item
- pub fn original_call_range_with_input(self, db: &dyn ExpandDatabase) -> FileRange {
- let mut kind = self;
+ pub fn original_call_range_with_input(&self, db: &dyn ExpandDatabase) -> FileRange {
+ let get_range = |kind: &_| match kind {
+ MacroCallKind::FnLike { ast_id, .. } => ast_id.erase(),
+ MacroCallKind::Derive { ast_id, .. } => ast_id.erase(),
+ MacroCallKind::Attr { ast_id, .. } => ast_id.erase(),
+ };
+
+ let mut ast_id = get_range(self);
+ let mut file_id = self.file_id();
let file_id = loop {
- match kind.file_id() {
+ match file_id {
HirFileId::MacroFile(file) => {
- kind = file.loc(db).kind;
+ let kind = &file.loc(db).kind;
+ ast_id = get_range(kind);
+ file_id = kind.file_id();
}
HirFileId::FileId(file_id) => break file_id,
}
};
- let range = match kind {
- MacroCallKind::FnLike { ast_id, .. } => ast_id.to_ptr(db).text_range(),
- MacroCallKind::Derive { ast_id, .. } => ast_id.to_ptr(db).text_range(),
- MacroCallKind::Attr { ast_id, .. } => ast_id.to_ptr(db).text_range(),
- };
-
- FileRange { range, file_id }
+ FileRange { range: ast_id.to_ptr(db).text_range(), file_id }
}
/// Returns the original file range that best describes the location of this macro call.
@@ -739,18 +742,8 @@ impl MacroCallKind {
/// Here we try to roughly match what rustc does to improve diagnostics: fn-like macros
/// get the macro path (rustc shows the whole `ast::MacroCall`), attribute macros get the
/// attribute's range, and derives get only the specific derive that is being referred to.
- pub fn original_call_range(self, db: &dyn ExpandDatabase, krate: Crate) -> FileRange {
- let mut kind = self;
- let file_id = loop {
- match kind.file_id() {
- HirFileId::MacroFile(file) => {
- kind = file.loc(db).kind;
- }
- HirFileId::FileId(file_id) => break file_id,
- }
- };
-
- let range = match kind {
+ pub fn original_call_range(&self, db: &dyn ExpandDatabase, krate: Crate) -> FileRange {
+ let get_range = |kind: &_| match kind {
MacroCallKind::FnLike { ast_id, .. } => {
let node = ast_id.to_node(db);
node.path()
@@ -761,11 +754,24 @@ impl MacroCallKind {
}
MacroCallKind::Derive { ast_id, derive_attr_index, .. } => {
// FIXME: should be the range of the macro name, not the whole derive
- derive_attr_index.find_attr_range(db, krate, ast_id).1.syntax().text_range()
+ derive_attr_index.find_attr_range(db, krate, *ast_id).1.syntax().text_range()
}
// FIXME: handle `cfg_attr`
MacroCallKind::Attr { ast_id, censored_attr_ids: attr_ids, .. } => {
- attr_ids.invoc_attr().find_attr_range(db, krate, ast_id).1.syntax().text_range()
+ attr_ids.invoc_attr().find_attr_range(db, krate, *ast_id).1.syntax().text_range()
+ }
+ };
+
+ let mut range = get_range(self);
+ let mut file_id = self.file_id();
+ let file_id = loop {
+ match file_id {
+ HirFileId::MacroFile(file) => {
+ let kind = &file.loc(db).kind;
+ range = get_range(kind);
+ file_id = kind.file_id();
+ }
+ HirFileId::FileId(file_id) => break file_id,
}
};
@@ -797,7 +803,7 @@ pub struct ExpansionInfo<'db> {
arg: InFile<Option<SyntaxNode>>,
exp_map: &'db ExpansionSpanMap,
arg_map: SpanMap<'db>,
- loc: MacroCallLoc,
+ loc: &'db MacroCallLoc,
}
impl<'db> ExpansionInfo<'db> {
@@ -1056,6 +1062,7 @@ intern::impl_internable!(ModPath);
#[salsa_macros::interned(no_lifetime, debug, revisions = usize::MAX)]
#[doc(alias = "MacroFileId")]
pub struct MacroCallId {
+ #[returns(ref)]
pub loc: MacroCallLoc,
}
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/opaques.rs b/crates/hir-ty/src/opaques.rs
index 4244b1bac4..79d2fa0c2d 100644
--- a/crates/hir-ty/src/opaques.rs
+++ b/crates/hir-ty/src/opaques.rs
@@ -132,7 +132,7 @@ pub(crate) fn tait_hidden_types(
let param_env =
db.trait_environment(ExpressionStoreOwnerId::from(GenericDefId::from(type_alias)));
- let defining_bodies = tait_defining_bodies(db, &loc);
+ let defining_bodies = tait_defining_bodies(db, loc);
let mut result = ArenaMap::with_capacity(taits_count);
for defining_body in defining_bodies {
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 ac9adf592d..f9d28ea3b4 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -781,22 +781,20 @@ impl Module {
let (variants, diagnostics) = e.id.enum_variants_with_diagnostics(db);
let file = e.id.lookup(db).id.file_id;
let ast_id_map = db.ast_id_map(file);
- if let Some(diagnostics) = &diagnostics {
- for diag in diagnostics.iter() {
- acc.push(
- InactiveCode {
- node: InFile::new(
- file,
- ast_id_map.get(diag.ast_id).syntax_node_ptr(),
- ),
- cfg: diag.cfg.clone(),
- opts: diag.opts.clone(),
- }
- .into(),
- );
- }
+ for diag in diagnostics {
+ acc.push(
+ InactiveCode {
+ node: InFile::new(
+ file,
+ ast_id_map.get(diag.ast_id).syntax_node_ptr(),
+ ),
+ cfg: diag.cfg.clone(),
+ opts: diag.opts.clone(),
+ }
+ .into(),
+ );
}
- 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 +1642,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 +1761,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 +1796,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 +5690,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())]
@@ -7467,11 +7463,11 @@ fn body_param_env_from_has_crate<'db>(
// FIXME: We probably don't want to expose this.
pub trait MacroCallIdExt {
- fn loc(self, db: &dyn HirDatabase) -> hir_expand::MacroCallLoc;
+ fn loc(self, db: &dyn HirDatabase) -> &hir_expand::MacroCallLoc;
}
impl MacroCallIdExt for span::MacroCallId {
#[inline]
- fn loc(self, db: &dyn HirDatabase) -> hir_expand::MacroCallLoc {
+ fn loc(self, db: &dyn HirDatabase) -> &hir_expand::MacroCallLoc {
hir_expand::MacroCallId::from(self).loc(db)
}
}
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index a1bbe47188..d0202c1054 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -1323,7 +1323,7 @@ impl<'db> SemanticsImpl<'db> {
.map(|(call_id, item)| {
let item_range = item.syntax().text_range();
let loc = call_id.loc(db);
- let text_range = match loc.kind {
+ let text_range = match &loc.kind {
hir_expand::MacroCallKind::Attr {
censored_attr_ids: attr_ids,
..
@@ -2436,7 +2436,7 @@ impl<'db> SemanticsImpl<'db> {
AnyImplId::ImplId(id) => id,
AnyImplId::BuiltinDeriveImplId(id) => return Some(id.loc(self.db).adt.into()),
};
- let source = hir_def::src::HasSource::ast_ptr(&id.loc(self.db), self.db);
+ let source = hir_def::src::HasSource::ast_ptr(id.loc(self.db), self.db);
let mut file_id = source.file_id;
let adt_ast_id = loop {
let macro_call = file_id.macro_file()?;
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);
}
});
diff --git a/crates/ide/src/navigation_target.rs b/crates/ide/src/navigation_target.rs
index f70bb3353f..b8c14dc09f 100644
--- a/crates/ide/src/navigation_target.rs
+++ b/crates/ide/src/navigation_target.rs
@@ -964,7 +964,7 @@ pub(crate) fn orig_range_with_focus_r(
// *should* contain the name
_ => {
let call = call();
- let kind = call.kind;
+ let kind = &call.kind;
let range = kind.clone().original_call_range_with_input(db);
//If the focus range is in the attribute/derive body, we
// need to point the call site to the entire body, if not, fall back