aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-05-23 18:23:17 +0100
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-05-23 18:23:17 +0100
commit1dc9adc6e27d603f05f794adda91bca8b6dec8ac (patch)
treec2ebe02614abf66618ed3975f7108cd03689416a /crates/ra_hir/src/nameres
parentef00b5af1c7a7a7cac685eff661a10252825d84a (diff)
parent5d54aa678153d0af0edc8b4dd2d74709d10ca66c (diff)
Merge #1290
1290: Add Union to code_model r=matklad a=matklad @flodiebold I am conflicted about two possible implementation approaches: * we can add a separate `struct Union` to code model * we can add `fn is_union(&self)` to existing `Struct` This PR goes with the former approach, because it seems like Unions are sufficiently different in semantics to warrant a separate types. Which is in contrast to Syntax Tree, where both structs and unions share the same node kind, because their syntax is the same. What would be the right thing to do here? Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/nameres')
-rw-r--r--crates/ra_hir/src/nameres/collector.rs6
-rw-r--r--crates/ra_hir/src/nameres/raw.rs19
2 files changed, 15 insertions, 10 deletions
diff --git a/crates/ra_hir/src/nameres/collector.rs b/crates/ra_hir/src/nameres/collector.rs
index c615d80c3..621236551 100644
--- a/crates/ra_hir/src/nameres/collector.rs
+++ b/crates/ra_hir/src/nameres/collector.rs
@@ -6,7 +6,7 @@ use ra_db::FileId;
6use ra_syntax::ast; 6use ra_syntax::ast;
7 7
8use crate::{ 8use crate::{
9 Function, Module, Struct, Enum, Const, Static, Trait, TypeAlias, 9 Function, Module, Struct, Union, Enum, Const, Static, Trait, TypeAlias,
10 DefDatabase, HirFileId, Name, Path, 10 DefDatabase, HirFileId, Name, Path,
11 KnownName, 11 KnownName,
12 nameres::{ 12 nameres::{
@@ -495,6 +495,10 @@ where
495 let s = def!(Struct, ast_id); 495 let s = def!(Struct, ast_id);
496 PerNs::both(s, s) 496 PerNs::both(s, s)
497 } 497 }
498 raw::DefKind::Union(ast_id) => {
499 let s = def!(Union, ast_id);
500 PerNs::both(s, s)
501 }
498 raw::DefKind::Enum(ast_id) => PerNs::types(def!(Enum, ast_id)), 502 raw::DefKind::Enum(ast_id) => PerNs::types(def!(Enum, ast_id)),
499 raw::DefKind::Const(ast_id) => PerNs::values(def!(Const, ast_id)), 503 raw::DefKind::Const(ast_id) => PerNs::values(def!(Const, ast_id)),
500 raw::DefKind::Static(ast_id) => PerNs::values(def!(Static, ast_id)), 504 raw::DefKind::Static(ast_id) => PerNs::values(def!(Static, ast_id)),
diff --git a/crates/ra_hir/src/nameres/raw.rs b/crates/ra_hir/src/nameres/raw.rs
index bd32b264b..1b4dcbb7a 100644
--- a/crates/ra_hir/src/nameres/raw.rs
+++ b/crates/ra_hir/src/nameres/raw.rs
@@ -1,7 +1,4 @@
1use std::{ 1use std::{sync::Arc, ops::Index};
2 sync::Arc,
3 ops::Index,
4};
5 2
6use test_utils::tested_by; 3use test_utils::tested_by;
7use ra_arena::{Arena, impl_arena_id, RawId, map::ArenaMap}; 4use ra_arena::{Arena, impl_arena_id, RawId, map::ArenaMap};
@@ -10,10 +7,7 @@ use ra_syntax::{
10 ast::{self, NameOwner, AttrsOwner}, 7 ast::{self, NameOwner, AttrsOwner},
11}; 8};
12 9
13use crate::{ 10use crate::{DefDatabase, Name, AsName, Path, HirFileId, ModuleSource, AstIdMap, FileAstId, Either};
14 DefDatabase, Name, AsName, Path, HirFileId, ModuleSource,
15 AstIdMap, FileAstId, Either,
16};
17 11
18/// `RawItems` is a set of top-level items in a file (except for impls). 12/// `RawItems` is a set of top-level items in a file (except for impls).
19/// 13///
@@ -161,6 +155,7 @@ pub(super) struct DefData {
161pub(super) enum DefKind { 155pub(super) enum DefKind {
162 Function(FileAstId<ast::FnDef>), 156 Function(FileAstId<ast::FnDef>),
163 Struct(FileAstId<ast::StructDef>), 157 Struct(FileAstId<ast::StructDef>),
158 Union(FileAstId<ast::StructDef>),
164 Enum(FileAstId<ast::EnumDef>), 159 Enum(FileAstId<ast::EnumDef>),
165 Const(FileAstId<ast::ConstDef>), 160 Const(FileAstId<ast::ConstDef>),
166 Static(FileAstId<ast::StaticDef>), 161 Static(FileAstId<ast::StaticDef>),
@@ -215,7 +210,13 @@ impl RawItemsCollector {
215 return; 210 return;
216 } 211 }
217 ast::ModuleItemKind::StructDef(it) => { 212 ast::ModuleItemKind::StructDef(it) => {
218 (DefKind::Struct(self.source_ast_id_map.ast_id(it)), it.name()) 213 let id = self.source_ast_id_map.ast_id(it);
214 let name = it.name();
215 if it.is_union() {
216 (DefKind::Union(id), name)
217 } else {
218 (DefKind::Struct(id), name)
219 }
219 } 220 }
220 ast::ModuleItemKind::EnumDef(it) => { 221 ast::ModuleItemKind::EnumDef(it) => {
221 (DefKind::Enum(self.source_ast_id_map.ast_id(it)), it.name()) 222 (DefKind::Enum(self.source_ast_id_map.ast_id(it)), it.name())