aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/adt.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/adt.rs')
-rw-r--r--crates/ra_hir/src/adt.rs43
1 files changed, 19 insertions, 24 deletions
diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs
index 6cdaa1888..e839a5a90 100644
--- a/crates/ra_hir/src/adt.rs
+++ b/crates/ra_hir/src/adt.rs
@@ -1,10 +1,10 @@
1use std::sync::Arc; 1use std::sync::Arc;
2 2
3use ra_syntax::{SmolStr, ast::{self, NameOwner, StructFlavor}}; 3use ra_syntax::ast::{self, NameOwner, StructFlavor};
4 4
5use crate::{ 5use crate::{
6 DefId, Cancelable, 6 DefId, Cancelable, Name, AsName,
7 db::{HirDatabase}, 7 db::HirDatabase,
8 type_ref::TypeRef, 8 type_ref::TypeRef,
9}; 9};
10 10
@@ -29,26 +29,26 @@ impl Struct {
29 Ok(db.struct_data(self.def_id)?) 29 Ok(db.struct_data(self.def_id)?)
30 } 30 }
31 31
32 pub fn name(&self, db: &impl HirDatabase) -> Cancelable<Option<SmolStr>> { 32 pub fn name(&self, db: &impl HirDatabase) -> Cancelable<Option<Name>> {
33 Ok(db.struct_data(self.def_id)?.name.clone()) 33 Ok(db.struct_data(self.def_id)?.name.clone())
34 } 34 }
35} 35}
36 36
37#[derive(Debug, Clone, PartialEq, Eq)] 37#[derive(Debug, Clone, PartialEq, Eq)]
38pub struct StructData { 38pub struct StructData {
39 name: Option<SmolStr>, 39 name: Option<Name>,
40 variant_data: Arc<VariantData>, 40 variant_data: Arc<VariantData>,
41} 41}
42 42
43impl StructData { 43impl StructData {
44 pub(crate) fn new(struct_def: ast::StructDef) -> StructData { 44 pub(crate) fn new(struct_def: ast::StructDef) -> StructData {
45 let name = struct_def.name().map(|n| n.text()); 45 let name = struct_def.name().map(|n| n.as_name());
46 let variant_data = VariantData::new(struct_def.flavor()); 46 let variant_data = VariantData::new(struct_def.flavor());
47 let variant_data = Arc::new(variant_data); 47 let variant_data = Arc::new(variant_data);
48 StructData { name, variant_data } 48 StructData { name, variant_data }
49 } 49 }
50 50
51 pub fn name(&self) -> Option<&SmolStr> { 51 pub fn name(&self) -> Option<&Name> {
52 self.name.as_ref() 52 self.name.as_ref()
53 } 53 }
54 54
@@ -70,31 +70,29 @@ impl Enum {
70 self.def_id 70 self.def_id
71 } 71 }
72 72
73 pub fn name(&self, db: &impl HirDatabase) -> Cancelable<Option<SmolStr>> { 73 pub fn name(&self, db: &impl HirDatabase) -> Cancelable<Option<Name>> {
74 Ok(db.enum_data(self.def_id)?.name.clone()) 74 Ok(db.enum_data(self.def_id)?.name.clone())
75 } 75 }
76 76
77 pub fn variants(&self, db: &impl HirDatabase) -> Cancelable<Vec<(SmolStr, Arc<VariantData>)>> { 77 pub fn variants(&self, db: &impl HirDatabase) -> Cancelable<Vec<(Name, Arc<VariantData>)>> {
78 Ok(db.enum_data(self.def_id)?.variants.clone()) 78 Ok(db.enum_data(self.def_id)?.variants.clone())
79 } 79 }
80} 80}
81 81
82#[derive(Debug, Clone, PartialEq, Eq)] 82#[derive(Debug, Clone, PartialEq, Eq)]
83pub struct EnumData { 83pub struct EnumData {
84 name: Option<SmolStr>, 84 name: Option<Name>,
85 variants: Vec<(SmolStr, Arc<VariantData>)>, 85 variants: Vec<(Name, Arc<VariantData>)>,
86} 86}
87 87
88impl EnumData { 88impl EnumData {
89 pub(crate) fn new(enum_def: ast::EnumDef) -> Self { 89 pub(crate) fn new(enum_def: ast::EnumDef) -> Self {
90 let name = enum_def.name().map(|n| n.text()); 90 let name = enum_def.name().map(|n| n.as_name());
91 let variants = if let Some(evl) = enum_def.variant_list() { 91 let variants = if let Some(evl) = enum_def.variant_list() {
92 evl.variants() 92 evl.variants()
93 .map(|v| { 93 .map(|v| {
94 ( 94 (
95 v.name() 95 v.name().map(|n| n.as_name()).unwrap_or_else(Name::missing),
96 .map(|n| n.text())
97 .unwrap_or_else(|| SmolStr::new("[error]")),
98 Arc::new(VariantData::new(v.flavor())), 96 Arc::new(VariantData::new(v.flavor())),
99 ) 97 )
100 }) 98 })
@@ -109,12 +107,12 @@ impl EnumData {
109/// A single field of an enum variant or struct 107/// A single field of an enum variant or struct
110#[derive(Debug, Clone, PartialEq, Eq)] 108#[derive(Debug, Clone, PartialEq, Eq)]
111pub struct StructField { 109pub struct StructField {
112 name: SmolStr, 110 name: Name,
113 type_ref: TypeRef, 111 type_ref: TypeRef,
114} 112}
115 113
116impl StructField { 114impl StructField {
117 pub fn name(&self) -> SmolStr { 115 pub fn name(&self) -> Name {
118 self.name.clone() 116 self.name.clone()
119 } 117 }
120 pub fn type_ref(&self) -> &TypeRef { 118 pub fn type_ref(&self) -> &TypeRef {
@@ -138,7 +136,7 @@ impl VariantData {
138 .fields() 136 .fields()
139 .enumerate() 137 .enumerate()
140 .map(|(i, fd)| StructField { 138 .map(|(i, fd)| StructField {
141 name: SmolStr::new(i.to_string()), 139 name: Name::tuple_field_name(i),
142 type_ref: TypeRef::from_ast_opt(fd.type_ref()), 140 type_ref: TypeRef::from_ast_opt(fd.type_ref()),
143 }) 141 })
144 .collect(); 142 .collect();
@@ -148,10 +146,7 @@ impl VariantData {
148 let fields = fl 146 let fields = fl
149 .fields() 147 .fields()
150 .map(|fd| StructField { 148 .map(|fd| StructField {
151 name: fd 149 name: fd.name().map(|n| n.as_name()).unwrap_or_else(Name::missing),
152 .name()
153 .map(|n| n.text())
154 .unwrap_or_else(|| SmolStr::new("[error]")),
155 type_ref: TypeRef::from_ast_opt(fd.type_ref()), 150 type_ref: TypeRef::from_ast_opt(fd.type_ref()),
156 }) 151 })
157 .collect(); 152 .collect();
@@ -161,10 +156,10 @@ impl VariantData {
161 } 156 }
162 } 157 }
163 158
164 pub(crate) fn get_field_type_ref(&self, field_name: &str) -> Option<&TypeRef> { 159 pub(crate) fn get_field_type_ref(&self, field_name: &Name) -> Option<&TypeRef> {
165 self.fields() 160 self.fields()
166 .iter() 161 .iter()
167 .find(|f| f.name == field_name) 162 .find(|f| f.name == *field_name)
168 .map(|f| &f.type_ref) 163 .map(|f| &f.type_ref)
169 } 164 }
170 165