aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/code_model.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-09-12 22:10:16 +0100
committerAleksey Kladov <[email protected]>2019-09-12 22:10:16 +0100
commit45117c63884366ee82102a782a62a09fefff746b (patch)
treeb66d9ca105e39b96b78bf7f3659d1858577a2c8c /crates/ra_hir/src/code_model.rs
parentd8b621cf26b59ff5ae9379b50fc822590b6a3a4e (diff)
make various enums "inherit" from AdtDef
Diffstat (limited to 'crates/ra_hir/src/code_model.rs')
-rw-r--r--crates/ra_hir/src/code_model.rs61
1 files changed, 55 insertions, 6 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 2bac6122b..026753c9f 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -127,9 +127,7 @@ impl BuiltinType {
127pub enum ModuleDef { 127pub enum ModuleDef {
128 Module(Module), 128 Module(Module),
129 Function(Function), 129 Function(Function),
130 Struct(Struct), 130 AdtDef(AdtDef),
131 Union(Union),
132 Enum(Enum),
133 // Can't be directly declared, but can be imported. 131 // Can't be directly declared, but can be imported.
134 EnumVariant(EnumVariant), 132 EnumVariant(EnumVariant),
135 Const(Const), 133 Const(Const),
@@ -141,9 +139,7 @@ pub enum ModuleDef {
141impl_froms!( 139impl_froms!(
142 ModuleDef: Module, 140 ModuleDef: Module,
143 Function, 141 Function,
144 Struct, 142 AdtDef,
145 Union,
146 Enum,
147 EnumVariant, 143 EnumVariant,
148 Const, 144 Const,
149 Static, 145 Static,
@@ -152,6 +148,24 @@ impl_froms!(
152 BuiltinType 148 BuiltinType
153); 149);
154 150
151impl From<Struct> for ModuleDef {
152 fn from(it: Struct) -> ModuleDef {
153 ModuleDef::AdtDef(AdtDef::Struct(it))
154 }
155}
156
157impl From<Enum> for ModuleDef {
158 fn from(it: Enum) -> ModuleDef {
159 ModuleDef::AdtDef(AdtDef::Enum(it))
160 }
161}
162
163impl From<Union> for ModuleDef {
164 fn from(it: Union) -> ModuleDef {
165 ModuleDef::AdtDef(AdtDef::Union(it))
166 }
167}
168
155pub enum ModuleSource { 169pub enum ModuleSource {
156 SourceFile(ast::SourceFile), 170 SourceFile(ast::SourceFile),
157 Module(ast::Module), 171 Module(ast::Module),
@@ -500,6 +514,41 @@ impl EnumVariant {
500 } 514 }
501} 515}
502 516
517#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
518pub enum AdtDef {
519 Struct(Struct),
520 Union(Union),
521 Enum(Enum),
522}
523impl_froms!(AdtDef: Struct, Union, Enum);
524
525impl AdtDef {
526 pub fn ty(self, db: &impl HirDatabase) -> Ty {
527 match self {
528 AdtDef::Struct(it) => it.ty(db),
529 AdtDef::Union(it) => it.ty(db),
530 AdtDef::Enum(it) => it.ty(db),
531 }
532 }
533
534 pub(crate) fn krate(self, db: &impl HirDatabase) -> Option<Crate> {
535 match self {
536 AdtDef::Struct(s) => s.module(db),
537 AdtDef::Union(s) => s.module(db),
538 AdtDef::Enum(e) => e.module(db),
539 }
540 .krate(db)
541 }
542
543 pub(crate) fn resolver(self, db: &impl HirDatabase) -> Resolver {
544 match self {
545 AdtDef::Struct(it) => it.resolver(db),
546 AdtDef::Union(it) => it.resolver(db),
547 AdtDef::Enum(it) => it.resolver(db),
548 }
549 }
550}
551
503/// The defs which have a body. 552/// The defs which have a body.
504#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 553#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
505pub enum DefWithBody { 554pub enum DefWithBody {