]> git.lizzy.rs Git - rust.git/commitdiff
Favor types for Record in name resolution
authorEdwin Cheng <edwin0cheng@gmail.com>
Mon, 4 May 2020 16:17:22 +0000 (00:17 +0800)
committerEdwin Cheng <edwin0cheng@gmail.com>
Mon, 4 May 2020 16:17:22 +0000 (00:17 +0800)
crates/ra_hir_def/src/body/lower.rs
crates/ra_hir_def/src/item_scope.rs
crates/ra_hir_def/src/nameres/collector.rs
crates/ra_hir_def/src/nameres/raw.rs

index 687216dc35ea90a72d43f0c0f57d08d580dcd1e6..49f5420d14d5d075e1dd0e8ac4692c1304dfd0a4 100644 (file)
@@ -18,7 +18,7 @@
 use test_utils::tested_by;
 
 use crate::{
-    adt::StructKind,
+    adt::{self, StructKind},
     body::{Body, BodySourceMap, Expander, PatPtr, SyntheticSyntax},
     builtin_type::{BuiltinFloat, BuiltinInt},
     db::DefDatabase,
@@ -575,9 +575,16 @@ fn collect_block_items(&mut self, block: &ast::BlockExpr) {
             self.body.item_scope.define_def(def);
             if let Some(name) = name {
                 let vis = crate::visibility::Visibility::Public; // FIXME determine correctly
-                self.body
-                    .item_scope
-                    .push_res(name.as_name(), crate::per_ns::PerNs::from_def(def, vis));
+                let favor_types = match def {
+                    ModuleDefId::AdtId(AdtId::StructId(s)) => {
+                        self.db.struct_data(s).variant_data.kind() == adt::StructKind::Record
+                    }
+                    _ => false,
+                };
+                self.body.item_scope.push_res(
+                    name.as_name(),
+                    crate::per_ns::PerNs::from_def(def, vis, favor_types),
+                );
             }
         }
     }
index 259b9ff035d1b994ff63d5a97fd3a2f5e5ff3fc7..6d8d1f8a3852079bbf07568c2be48fbd96aa066e 100644 (file)
@@ -151,13 +151,20 @@ pub(crate) fn collect_legacy_macros(&self) -> FxHashMap<Name, MacroDefId> {
 }
 
 impl PerNs {
-    pub(crate) fn from_def(def: ModuleDefId, v: Visibility) -> PerNs {
+    pub(crate) fn from_def(def: ModuleDefId, v: Visibility, favor_types: bool) -> PerNs {
         match def {
             ModuleDefId::ModuleId(_) => PerNs::types(def, v),
             ModuleDefId::FunctionId(_) => PerNs::values(def, v),
             ModuleDefId::AdtId(adt) => match adt {
-                AdtId::StructId(_) | AdtId::UnionId(_) => PerNs::both(def, def, v),
+                AdtId::UnionId(_) => PerNs::both(def, def, v),
                 AdtId::EnumId(_) => PerNs::types(def, v),
+                AdtId::StructId(_) => {
+                    if favor_types {
+                        PerNs::types(def, v)
+                    } else {
+                        PerNs::both(def, def, v)
+                    }
+                }
             },
             ModuleDefId::EnumVariantId(_) => PerNs::both(def, def, v),
             ModuleDefId::ConstId(_) | ModuleDefId::StaticId(_) => PerNs::values(def, v),
index bf3968bd62ac04366ff86f2080bc2c5a7ac7111d..49b33ca94239422bb0b9a1b9d97bc77c15e02d6a 100644 (file)
@@ -830,7 +830,7 @@ fn push_child_module(
         let module = ModuleId { krate: self.def_collector.def_map.krate, local_id: res };
         let def: ModuleDefId = module.into();
         self.def_collector.def_map.modules[self.module_id].scope.define_def(def);
-        self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis))], vis);
+        self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis, false))], vis);
         res
     }
 
@@ -844,6 +844,8 @@ fn define_def(&mut self, def: &raw::DefData, attrs: &Attrs) {
         let name = def.name.clone();
         let container = ContainerId::ModuleId(module);
         let vis = &def.visibility;
+        let mut favor_types = false;
+
         let def: ModuleDefId = match def.kind {
             raw::DefKind::Function(ast_id) => FunctionLoc {
                 container: container.into(),
@@ -851,7 +853,8 @@ fn define_def(&mut self, def: &raw::DefData, attrs: &Attrs) {
             }
             .intern(self.def_collector.db)
             .into(),
-            raw::DefKind::Struct(ast_id) => {
+            raw::DefKind::Struct(ast_id, mode) => {
+                favor_types = mode == raw::StructDefKind::Record;
                 StructLoc { container, ast_id: AstId::new(self.file_id, ast_id) }
                     .intern(self.def_collector.db)
                     .into()
@@ -894,7 +897,11 @@ fn define_def(&mut self, def: &raw::DefData, attrs: &Attrs) {
             .def_map
             .resolve_visibility(self.def_collector.db, self.module_id, vis)
             .unwrap_or(Visibility::Public);
-        self.def_collector.update(self.module_id, &[(name, PerNs::from_def(def, vis))], vis)
+        self.def_collector.update(
+            self.module_id,
+            &[(name, PerNs::from_def(def, vis, favor_types))],
+            vis,
+        )
     }
 
     fn collect_derives(&mut self, attrs: &Attrs, def: &raw::DefData) {
index a71503c76ecdfa3aec10bc4d22dff4994f6ccd56..f2716a2950b1fbf2075189fc16134996eac0660f 100644 (file)
@@ -155,10 +155,17 @@ pub(super) struct DefData {
     pub(super) visibility: RawVisibility,
 }
 
+#[derive(Debug, PartialEq, Eq, Clone, Copy)]
+pub(super) enum StructDefKind {
+    Record,
+    Tuple,
+    Unit,
+}
+
 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
 pub(super) enum DefKind {
     Function(FileAstId<ast::FnDef>),
-    Struct(FileAstId<ast::StructDef>),
+    Struct(FileAstId<ast::StructDef>, StructDefKind),
     Union(FileAstId<ast::UnionDef>),
     Enum(FileAstId<ast::EnumDef>),
     Const(FileAstId<ast::ConstDef>),
@@ -171,7 +178,7 @@ impl DefKind {
     pub fn ast_id(&self) -> FileAstId<ast::ModuleItem> {
         match self {
             DefKind::Function(it) => it.upcast(),
-            DefKind::Struct(it) => it.upcast(),
+            DefKind::Struct(it, _) => it.upcast(),
             DefKind::Union(it) => it.upcast(),
             DefKind::Enum(it) => it.upcast(),
             DefKind::Const(it) => it.upcast(),
@@ -236,9 +243,14 @@ fn add_item(&mut self, current_module: Option<Idx<ModuleData>>, item: ast::Modul
                 return;
             }
             ast::ModuleItem::StructDef(it) => {
+                let kind = match it.kind() {
+                    ast::StructKind::Record(_) => StructDefKind::Record,
+                    ast::StructKind::Tuple(_) => StructDefKind::Tuple,
+                    ast::StructKind::Unit => StructDefKind::Unit,
+                };
                 let id = self.source_ast_id_map.ast_id(&it);
                 let name = it.name();
-                (DefKind::Struct(id), name)
+                (DefKind::Struct(id, kind), name)
             }
             ast::ModuleItem::UnionDef(it) => {
                 let id = self.source_ast_id_map.ast_id(&it);