Skip to content

Commit ecd1204

Browse files
bors[bot]matklad
andauthored
Merge #2403
2403: Fixme for union fields r=matklad a=matklad Co-authored-by: Aleksey Kladov <[email protected]>
2 parents be00d74 + 1455663 commit ecd1204

File tree

27 files changed

+190
-98
lines changed

27 files changed

+190
-98
lines changed

crates/ra_assists/src/assists/add_new.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ pub(crate) fn add_new(ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
3535
let strukt = ctx.find_node_at_offset::<ast::StructDef>()?;
3636

3737
// We want to only apply this to non-union structs with named fields
38-
let field_list = match (strukt.kind(), strukt.is_union()) {
39-
(StructKind::Record(named), false) => named,
38+
let field_list = match strukt.kind() {
39+
StructKind::Record(named) => named,
4040
_ => return None,
4141
};
4242

crates/ra_hir/src/code_model.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ pub struct Struct {
320320

321321
impl Struct {
322322
pub fn module(self, db: &impl DefDatabase) -> Module {
323-
Module { id: self.id.0.module(db) }
323+
Module { id: self.id.module(db) }
324324
}
325325

326326
pub fn krate(self, db: &impl DefDatabase) -> Option<Crate> {
@@ -369,11 +369,11 @@ pub struct Union {
369369

370370
impl Union {
371371
pub fn name(self, db: &impl DefDatabase) -> Option<Name> {
372-
db.struct_data(self.id.into()).name.clone()
372+
db.union_data(self.id).name.clone()
373373
}
374374

375375
pub fn module(self, db: &impl DefDatabase) -> Module {
376-
Module { id: self.id.0.module(db) }
376+
Module { id: self.id.module(db) }
377377
}
378378

379379
pub fn ty(self, db: &impl HirDatabase) -> Ty {

crates/ra_hir/src/code_model/src.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ impl HasSource for StructField {
5151
impl HasSource for Struct {
5252
type Ast = ast::StructDef;
5353
fn source(self, db: &impl DefDatabase) -> Source<ast::StructDef> {
54-
self.id.0.source(db)
54+
self.id.source(db)
5555
}
5656
}
5757
impl HasSource for Union {
58-
type Ast = ast::StructDef;
59-
fn source(self, db: &impl DefDatabase) -> Source<ast::StructDef> {
60-
self.id.0.source(db)
58+
type Ast = ast::UnionDef;
59+
fn source(self, db: &impl DefDatabase) -> Source<ast::UnionDef> {
60+
self.id.source(db)
6161
}
6262
}
6363
impl HasSource for Enum {

crates/ra_hir/src/from_source.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! FIXME: write short doc here
22
3-
use hir_def::{AstItemDef, LocationCtx, ModuleId, StructId, StructOrUnionId, UnionId};
3+
use hir_def::{AstItemDef, LocationCtx, ModuleId};
44
use hir_expand::{name::AsName, AstId, MacroDefId, MacroDefKind};
55
use ra_syntax::{
66
ast::{self, AstNode, NameOwner},
@@ -19,19 +19,18 @@ pub trait FromSource: Sized {
1919
fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self>;
2020
}
2121

22-
// FIXIME: these two impls are wrong, `ast::StructDef` might produce either a struct or a union
2322
impl FromSource for Struct {
2423
type Ast = ast::StructDef;
2524
fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self> {
26-
let id: StructOrUnionId = from_source(db, src)?;
27-
Some(Struct { id: StructId(id) })
25+
let id = from_source(db, src)?;
26+
Some(Struct { id })
2827
}
2928
}
3029
impl FromSource for Union {
31-
type Ast = ast::StructDef;
30+
type Ast = ast::UnionDef;
3231
fn from_source(db: &(impl DefDatabase + AstDatabase), src: Source<Self::Ast>) -> Option<Self> {
33-
let id: StructOrUnionId = from_source(db, src)?;
34-
Some(Union { id: UnionId(id) })
32+
let id = from_source(db, src)?;
33+
Some(Union { id })
3534
}
3635
}
3736
impl FromSource for Enum {

crates/ra_hir/src/ty.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ impl HirDisplay for ApplicationTy {
858858
let name = match def {
859859
CallableDef::FunctionId(ff) => f.db.function_data(ff).name.clone(),
860860
CallableDef::StructId(s) => {
861-
f.db.struct_data(s.0).name.clone().unwrap_or_else(Name::missing)
861+
f.db.struct_data(s).name.clone().unwrap_or_else(Name::missing)
862862
}
863863
CallableDef::EnumVariantId(e) => {
864864
let enum_data = f.db.enum_data(e.parent);

crates/ra_hir/src/ty/infer/coerce.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
246246
ty_app!(TypeCtor::Adt(Adt::Struct(struct2)), st2),
247247
) if struct1 == struct2 => {
248248
let field_tys = self.db.field_types(struct1.id.into());
249-
let struct_data = self.db.struct_data(struct1.id.0);
249+
let struct_data = self.db.struct_data(struct1.id);
250250

251251
let mut fields = struct_data.variant_data.fields().iter();
252252
let (last_field_id, _data) = fields.next_back()?;

crates/ra_hir/src/ty/infer/expr.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
263263
.clone()
264264
.subst(&a_ty.parameters)
265265
}),
266+
// FIXME:
267+
TypeCtor::Adt(Adt::Union(_)) => None,
266268
_ => None,
267269
},
268270
_ => None,

crates/ra_hir/src/ty/lower.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,8 @@ pub(crate) fn field_types_query(
560560
variant_id: VariantId,
561561
) -> Arc<ArenaMap<LocalStructFieldId, Ty>> {
562562
let (resolver, var_data) = match variant_id {
563-
VariantId::StructId(it) => (it.resolver(db), db.struct_data(it.0).variant_data.clone()),
563+
VariantId::StructId(it) => (it.resolver(db), db.struct_data(it).variant_data.clone()),
564+
VariantId::UnionId(it) => (it.resolver(db), db.union_data(it).variant_data.clone()),
564565
VariantId::EnumVariantId(it) => (
565566
it.parent.resolver(db),
566567
db.enum_data(it.parent).variants[it.local_id].variant_data.clone(),
@@ -818,7 +819,7 @@ impl CallableDef {
818819
pub fn krate(self, db: &impl HirDatabase) -> CrateId {
819820
match self {
820821
CallableDef::FunctionId(f) => f.lookup(db).module(db).krate,
821-
CallableDef::StructId(s) => s.0.module(db).krate,
822+
CallableDef::StructId(s) => s.module(db).krate,
822823
CallableDef::EnumVariantId(e) => e.parent.module(db).krate,
823824
}
824825
}

crates/ra_hir_def/src/adt.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner};
1212

1313
use crate::{
1414
db::DefDatabase, trace::Trace, type_ref::TypeRef, AstItemDef, EnumId, HasChildSource,
15-
LocalEnumVariantId, LocalStructFieldId, StructOrUnionId, VariantId,
15+
LocalEnumVariantId, LocalStructFieldId, StructId, UnionId, VariantId,
1616
};
1717

1818
/// Note that we use `StructData` for unions as well!
@@ -49,13 +49,25 @@ pub struct StructFieldData {
4949
}
5050

5151
impl StructData {
52-
pub(crate) fn struct_data_query(db: &impl DefDatabase, id: StructOrUnionId) -> Arc<StructData> {
52+
pub(crate) fn struct_data_query(db: &impl DefDatabase, id: StructId) -> Arc<StructData> {
5353
let src = id.source(db);
5454
let name = src.value.name().map(|n| n.as_name());
5555
let variant_data = VariantData::new(src.value.kind());
5656
let variant_data = Arc::new(variant_data);
5757
Arc::new(StructData { name, variant_data })
5858
}
59+
pub(crate) fn union_data_query(db: &impl DefDatabase, id: UnionId) -> Arc<StructData> {
60+
let src = id.source(db);
61+
let name = src.value.name().map(|n| n.as_name());
62+
let variant_data = VariantData::new(
63+
src.value
64+
.record_field_def_list()
65+
.map(ast::StructKind::Record)
66+
.unwrap_or(ast::StructKind::Unit),
67+
);
68+
let variant_data = Arc::new(variant_data);
69+
Arc::new(StructData { name, variant_data })
70+
}
5971
}
6072

6173
impl EnumData {
@@ -137,7 +149,12 @@ impl HasChildSource for VariantId {
137149
let src = it.parent.child_source(db);
138150
src.map(|map| map[it.local_id].kind())
139151
}
140-
VariantId::StructId(it) => it.0.source(db).map(|it| it.kind()),
152+
VariantId::StructId(it) => it.source(db).map(|it| it.kind()),
153+
VariantId::UnionId(it) => it.source(db).map(|it| {
154+
it.record_field_def_list()
155+
.map(ast::StructKind::Record)
156+
.unwrap_or(ast::StructKind::Unit)
157+
}),
141158
};
142159
let mut trace = Trace::new_for_map();
143160
lower_struct(&mut trace, &src.value);

crates/ra_hir_def/src/attr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ impl Attrs {
5454
Attrs::from_attrs_owner(db, src.map(|it| it as &dyn AttrsOwner))
5555
}
5656
AttrDefId::AdtId(it) => match it {
57-
AdtId::StructId(it) => attrs_from_ast(it.0.lookup_intern(db).ast_id, db),
57+
AdtId::StructId(it) => attrs_from_ast(it.lookup_intern(db).ast_id, db),
5858
AdtId::EnumId(it) => attrs_from_ast(it.lookup_intern(db).ast_id, db),
59-
AdtId::UnionId(it) => attrs_from_ast(it.0.lookup_intern(db).ast_id, db),
59+
AdtId::UnionId(it) => attrs_from_ast(it.lookup_intern(db).ast_id, db),
6060
},
6161
AttrDefId::TraitId(it) => attrs_from_ast(it.lookup_intern(db).ast_id, db),
6262
AttrDefId::MacroDefId(it) => attrs_from_ast(it.ast_id, db),

0 commit comments

Comments
 (0)