mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-01 07:48:45 +00:00
Auto merge of #13745 - Veykril:ty-hint-variant-field, r=Veykril
Show type info on hover of enum variant fields Small addition to https://github.com/rust-lang/rust-analyzer/pull/13490
This commit is contained in:
commit
a0296c2b39
5 changed files with 43 additions and 15 deletions
|
@ -3,8 +3,13 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use chalk_ir::{AdtId, TyKind};
|
use chalk_ir::{AdtId, TyKind};
|
||||||
pub(self) use hir_def::layout::*;
|
use hir_def::{
|
||||||
use hir_def::LocalFieldId;
|
layout::{
|
||||||
|
Abi, FieldsShape, Integer, Layout, LayoutCalculator, LayoutError, Primitive, ReprOptions,
|
||||||
|
RustcEnumVariantIdx, Scalar, Size, StructKind, TargetDataLayout, Variants, WrappingRange,
|
||||||
|
},
|
||||||
|
LocalFieldId,
|
||||||
|
};
|
||||||
use stdx::never;
|
use stdx::never;
|
||||||
|
|
||||||
use crate::{db::HirDatabase, Interner, Substitution, Ty};
|
use crate::{db::HirDatabase, Interner, Substitution, Ty};
|
||||||
|
|
|
@ -8,7 +8,7 @@ use hir_def::{
|
||||||
AdtId, EnumVariantId, LocalEnumVariantId, VariantId,
|
AdtId, EnumVariantId, LocalEnumVariantId, VariantId,
|
||||||
};
|
};
|
||||||
use la_arena::RawIdx;
|
use la_arena::RawIdx;
|
||||||
use rustc_index::vec::IndexVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
use crate::{db::HirDatabase, lang_items::is_unsafe_cell, layout::field_ty, Substitution};
|
use crate::{db::HirDatabase, lang_items::is_unsafe_cell, layout::field_ty, Substitution};
|
||||||
|
|
||||||
|
@ -34,13 +34,13 @@ pub fn layout_of_adt_query(
|
||||||
let (variants, is_enum, is_union, repr) = match def {
|
let (variants, is_enum, is_union, repr) = match def {
|
||||||
AdtId::StructId(s) => {
|
AdtId::StructId(s) => {
|
||||||
let data = db.struct_data(s);
|
let data = db.struct_data(s);
|
||||||
let mut r = IndexVec::new();
|
let mut r = SmallVec::<[_; 1]>::new();
|
||||||
r.push(handle_variant(s.into(), &data.variant_data)?);
|
r.push(handle_variant(s.into(), &data.variant_data)?);
|
||||||
(r, false, false, data.repr.unwrap_or_default())
|
(r, false, false, data.repr.unwrap_or_default())
|
||||||
}
|
}
|
||||||
AdtId::UnionId(id) => {
|
AdtId::UnionId(id) => {
|
||||||
let data = db.union_data(id);
|
let data = db.union_data(id);
|
||||||
let mut r = IndexVec::new();
|
let mut r = SmallVec::new();
|
||||||
r.push(handle_variant(id.into(), &data.variant_data)?);
|
r.push(handle_variant(id.into(), &data.variant_data)?);
|
||||||
(r, false, true, data.repr.unwrap_or_default())
|
(r, false, true, data.repr.unwrap_or_default())
|
||||||
}
|
}
|
||||||
|
@ -55,11 +55,12 @@ pub fn layout_of_adt_query(
|
||||||
&v.variant_data,
|
&v.variant_data,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect::<Result<IndexVec<RustcEnumVariantIdx, _>, _>>()?;
|
.collect::<Result<SmallVec<_>, _>>()?;
|
||||||
(r, true, false, data.repr.unwrap_or_default())
|
(r, true, false, data.repr.unwrap_or_default())
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let variants = variants.iter().map(|x| x.iter().collect::<Vec<_>>()).collect::<Vec<_>>();
|
let variants =
|
||||||
|
variants.iter().map(|x| x.iter().collect::<Vec<_>>()).collect::<SmallVec<[_; 1]>>();
|
||||||
let variants = variants.iter().map(|x| x.iter().collect()).collect();
|
let variants = variants.iter().map(|x| x.iter().collect()).collect();
|
||||||
if is_union {
|
if is_union {
|
||||||
cx.layout_of_union(&repr, &variants).ok_or(LayoutError::Unknown)
|
cx.layout_of_union(&repr, &variants).ok_or(LayoutError::Unknown)
|
||||||
|
|
|
@ -6,7 +6,7 @@ use hir_def::layout::TargetDataLayout;
|
||||||
|
|
||||||
use crate::db::HirDatabase;
|
use crate::db::HirDatabase;
|
||||||
|
|
||||||
use super::{AbiAndPrefAlign, AddressSpace, Align, Endian, Integer, Size};
|
use hir_def::layout::{AbiAndPrefAlign, AddressSpace, Align, Endian, Integer, Size};
|
||||||
|
|
||||||
pub fn current_target_data_layout_query(db: &dyn HirDatabase) -> Arc<TargetDataLayout> {
|
pub fn current_target_data_layout_query(db: &dyn HirDatabase) -> Arc<TargetDataLayout> {
|
||||||
let crate_graph = db.crate_graph();
|
let crate_graph = db.crate_graph();
|
||||||
|
|
|
@ -395,17 +395,17 @@ pub(super) fn definition(
|
||||||
let id = it.index();
|
let id = it.index();
|
||||||
let layout = it.layout(db).ok()?;
|
let layout = it.layout(db).ok()?;
|
||||||
let offset = match var_def {
|
let offset = match var_def {
|
||||||
hir::VariantDef::Struct(s) => {
|
hir::VariantDef::Struct(s) => Adt::from(s)
|
||||||
let layout = Adt::from(s).layout(db).ok()?;
|
.layout(db)
|
||||||
layout.fields.offset(id)
|
.ok()
|
||||||
}
|
.map(|layout| format!(", offset = {}", layout.fields.offset(id).bytes())),
|
||||||
_ => return None,
|
_ => None,
|
||||||
};
|
};
|
||||||
Some(format!(
|
Some(format!(
|
||||||
"size = {}, align = {}, offset = {}",
|
"size = {}, align = {}{}",
|
||||||
layout.size.bytes(),
|
layout.size.bytes(),
|
||||||
layout.align.abi.bytes(),
|
layout.align.abi.bytes(),
|
||||||
offset.bytes()
|
offset.as_deref().unwrap_or_default()
|
||||||
))
|
))
|
||||||
}),
|
}),
|
||||||
Definition::Module(it) => label_and_docs(db, it),
|
Definition::Module(it) => label_and_docs(db, it),
|
||||||
|
|
|
@ -5176,6 +5176,28 @@ enum Enum {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hover_record_variant_field() {
|
||||||
|
check(
|
||||||
|
r#"
|
||||||
|
enum Enum {
|
||||||
|
RecordV { field$0: u32 }
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
expect![[r#"
|
||||||
|
*field*
|
||||||
|
|
||||||
|
```rust
|
||||||
|
test::RecordV
|
||||||
|
```
|
||||||
|
|
||||||
|
```rust
|
||||||
|
field: u32 // size = 4, align = 4
|
||||||
|
```
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn hover_trait_impl_assoc_item_def_doc_forwarding() {
|
fn hover_trait_impl_assoc_item_def_doc_forwarding() {
|
||||||
check(
|
check(
|
||||||
|
|
Loading…
Reference in a new issue