From 1455663ea15ecbfbe87b4b5be6919aa35dd0b260 Mon Sep 17 00:00:00 2001
From: Aleksey Kladov <aleksey.kladov@gmail.com>
Date: Mon, 25 Nov 2019 17:34:15 +0300
Subject: [PATCH] Fixme for union fields

---
 crates/ra_hir/src/ty/infer/expr.rs | 2 ++
 crates/ra_hir/src/ty/lower.rs      | 1 +
 crates/ra_hir_def/src/adt.rs       | 5 +++++
 crates/ra_hir_def/src/lib.rs       | 1 +
 4 files changed, 9 insertions(+)

diff --git a/crates/ra_hir/src/ty/infer/expr.rs b/crates/ra_hir/src/ty/infer/expr.rs
index 1d6df2b7ad5..994a6d7e950 100644
--- a/crates/ra_hir/src/ty/infer/expr.rs
+++ b/crates/ra_hir/src/ty/infer/expr.rs
@@ -263,6 +263,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
                                 .clone()
                                 .subst(&a_ty.parameters)
                         }),
+                        // FIXME:
+                        TypeCtor::Adt(Adt::Union(_)) => None,
                         _ => None,
                     },
                     _ => None,
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs
index 89bc4b9aebb..eb51d31bd06 100644
--- a/crates/ra_hir/src/ty/lower.rs
+++ b/crates/ra_hir/src/ty/lower.rs
@@ -561,6 +561,7 @@ pub(crate) fn field_types_query(
 ) -> Arc<ArenaMap<LocalStructFieldId, Ty>> {
     let (resolver, var_data) = match variant_id {
         VariantId::StructId(it) => (it.resolver(db), db.struct_data(it).variant_data.clone()),
+        VariantId::UnionId(it) => (it.resolver(db), db.union_data(it).variant_data.clone()),
         VariantId::EnumVariantId(it) => (
             it.parent.resolver(db),
             db.enum_data(it.parent).variants[it.local_id].variant_data.clone(),
diff --git a/crates/ra_hir_def/src/adt.rs b/crates/ra_hir_def/src/adt.rs
index 71014826ef7..0091bfbc336 100644
--- a/crates/ra_hir_def/src/adt.rs
+++ b/crates/ra_hir_def/src/adt.rs
@@ -150,6 +150,11 @@ impl HasChildSource for VariantId {
                 src.map(|map| map[it.local_id].kind())
             }
             VariantId::StructId(it) => it.source(db).map(|it| it.kind()),
+            VariantId::UnionId(it) => it.source(db).map(|it| {
+                it.record_field_def_list()
+                    .map(ast::StructKind::Record)
+                    .unwrap_or(ast::StructKind::Unit)
+            }),
         };
         let mut trace = Trace::new_for_map();
         lower_struct(&mut trace, &src.value);
diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs
index 5f11be1143a..a88a78b38f5 100644
--- a/crates/ra_hir_def/src/lib.rs
+++ b/crates/ra_hir_def/src/lib.rs
@@ -431,6 +431,7 @@ impl_froms!(
 pub enum VariantId {
     EnumVariantId(EnumVariantId),
     StructId(StructId),
+    UnionId(UnionId),
 }
 impl_froms!(VariantId: EnumVariantId, StructId);