diff options
author | Aleksey Kladov <[email protected]> | 2019-09-12 22:10:16 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-09-12 22:10:16 +0100 |
commit | 45117c63884366ee82102a782a62a09fefff746b (patch) | |
tree | b66d9ca105e39b96b78bf7f3659d1858577a2c8c /crates/ra_hir/src/code_model.rs | |
parent | d8b621cf26b59ff5ae9379b50fc822590b6a3a4e (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.rs | 61 |
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 { | |||
127 | pub enum ModuleDef { | 127 | pub 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 { | |||
141 | impl_froms!( | 139 | impl_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 | ||
151 | impl From<Struct> for ModuleDef { | ||
152 | fn from(it: Struct) -> ModuleDef { | ||
153 | ModuleDef::AdtDef(AdtDef::Struct(it)) | ||
154 | } | ||
155 | } | ||
156 | |||
157 | impl From<Enum> for ModuleDef { | ||
158 | fn from(it: Enum) -> ModuleDef { | ||
159 | ModuleDef::AdtDef(AdtDef::Enum(it)) | ||
160 | } | ||
161 | } | ||
162 | |||
163 | impl From<Union> for ModuleDef { | ||
164 | fn from(it: Union) -> ModuleDef { | ||
165 | ModuleDef::AdtDef(AdtDef::Union(it)) | ||
166 | } | ||
167 | } | ||
168 | |||
155 | pub enum ModuleSource { | 169 | pub 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)] | ||
518 | pub enum AdtDef { | ||
519 | Struct(Struct), | ||
520 | Union(Union), | ||
521 | Enum(Enum), | ||
522 | } | ||
523 | impl_froms!(AdtDef: Struct, Union, Enum); | ||
524 | |||
525 | impl 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)] |
505 | pub enum DefWithBody { | 554 | pub enum DefWithBody { |