Finish move of StructField for pattern type inference

This commit is contained in:
Marcus Klaas de Vries 2019-01-18 15:38:11 +01:00 committed by Aleksey Kladov
parent 4277f420aa
commit bcbfa2cc11
3 changed files with 46 additions and 31 deletions

View File

@ -158,7 +158,7 @@ impl Module {
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct StructField { pub struct StructField {
struct_: Struct, parent: DefId,
name: Name, name: Name,
} }
@ -166,8 +166,9 @@ impl StructField {
pub fn name(&self) -> &Name { pub fn name(&self) -> &Name {
&self.name &self.name
} }
pub fn ty(&self, db: &impl HirDatabase) -> Option<Ty> { pub fn ty(&self, db: &impl HirDatabase) -> Option<Ty> {
db.type_for_field(self.struct_.def_id, self.name.clone()) db.type_for_field(self.parent, self.name.clone())
} }
} }
@ -191,7 +192,7 @@ impl Struct {
.fields() .fields()
.iter() .iter()
.map(|it| StructField { .map(|it| StructField {
struct_: self.clone(), parent: self.def_id,
name: it.name.clone(), name: it.name.clone(),
}) })
.collect() .collect()
@ -255,6 +256,17 @@ impl EnumVariant {
db.enum_variant_data(self.def_id).variant_data.clone() db.enum_variant_data(self.def_id).variant_data.clone()
} }
pub fn fields(&self, db: &impl HirDatabase) -> Vec<StructField> {
self.variant_data(db)
.fields()
.iter()
.map(|it| StructField {
parent: self.def_id,
name: it.name.clone(),
})
.collect()
}
pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc<ast::EnumVariant>) { pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc<ast::EnumVariant>) {
def_id_to_ast(db, self.def_id) def_id_to_ast(db, self.def_id)
} }

View File

@ -872,22 +872,19 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
} }
} }
// TODO: add fields method for tuple like structs and variants
// TODO: and add tests!
fn resolve_fields(&self, path: Option<&Path>) -> Option<(Ty, Vec<StructField>)> { fn resolve_fields(&self, path: Option<&Path>) -> Option<(Ty, Vec<StructField>)> {
let def_id = self.module.resolve_path(self.db, path?).take_types()?; let def_id = self.module.resolve_path(self.db, path?).take_types()?;
let def = def_id.resolve(self.db); let def = def_id.resolve(self.db);
match def { match def {
Def::Struct(s) => { Def::Struct(s) => {
let fields: Vec<_> = s.fields(self.db); let fields = s.fields(self.db);
Some((type_for_struct(self.db, s), fields)) Some((type_for_struct(self.db, s), fields))
} }
// Def::EnumVariant(ev) => { Def::EnumVariant(ev) => {
// let fields: Vec<_> = ev.variant_data(self.db).fields().to_owned(); let fields = ev.fields(self.db);
// Some((type_for_enum_variant(self.db, ev), fields)) Some((type_for_enum_variant(self.db, ev), fields))
// } }
_ => None, _ => None,
} }
} }

View File

@ -43,18 +43,20 @@ SOURCE_FILE@[0; 119)
FIELD_PAT_LIST@[40; 56) FIELD_PAT_LIST@[40; 56)
L_CURLY@[40; 41) L_CURLY@[40; 41)
WHITESPACE@[41; 42) WHITESPACE@[41; 42)
BIND_PAT@[42; 43) FIELD_PAT@[42; 43)
NAME@[42; 43) BIND_PAT@[42; 43)
IDENT@[42; 43) "f" NAME@[42; 43)
IDENT@[42; 43) "f"
COMMA@[43; 44) COMMA@[43; 44)
WHITESPACE@[44; 45) WHITESPACE@[44; 45)
BIND_PAT@[45; 54) FIELD_PAT@[45; 54)
REF_KW@[45; 48) BIND_PAT@[45; 54)
WHITESPACE@[48; 49) REF_KW@[45; 48)
MUT_KW@[49; 52) WHITESPACE@[48; 49)
WHITESPACE@[52; 53) MUT_KW@[49; 52)
NAME@[53; 54) WHITESPACE@[52; 53)
IDENT@[53; 54) "g" NAME@[53; 54)
IDENT@[53; 54) "g"
WHITESPACE@[54; 55) WHITESPACE@[54; 55)
R_CURLY@[55; 56) R_CURLY@[55; 56)
WHITESPACE@[56; 57) WHITESPACE@[56; 57)
@ -77,11 +79,13 @@ SOURCE_FILE@[0; 119)
FIELD_PAT_LIST@[73; 84) FIELD_PAT_LIST@[73; 84)
L_CURLY@[73; 74) L_CURLY@[73; 74)
WHITESPACE@[74; 75) WHITESPACE@[74; 75)
IDENT@[75; 76) "h" FIELD_PAT@[75; 79)
COLON@[76; 77) NAME@[75; 76)
WHITESPACE@[77; 78) IDENT@[75; 76) "h"
PLACEHOLDER_PAT@[78; 79) COLON@[76; 77)
UNDERSCORE@[78; 79) WHITESPACE@[77; 78)
PLACEHOLDER_PAT@[78; 79)
UNDERSCORE@[78; 79)
COMMA@[79; 80) COMMA@[79; 80)
WHITESPACE@[80; 81) WHITESPACE@[80; 81)
DOTDOT@[81; 83) DOTDOT@[81; 83)
@ -106,11 +110,13 @@ SOURCE_FILE@[0; 119)
FIELD_PAT_LIST@[101; 110) FIELD_PAT_LIST@[101; 110)
L_CURLY@[101; 102) L_CURLY@[101; 102)
WHITESPACE@[102; 103) WHITESPACE@[102; 103)
IDENT@[103; 104) "h" FIELD_PAT@[103; 107)
COLON@[104; 105) NAME@[103; 104)
WHITESPACE@[105; 106) IDENT@[103; 104) "h"
PLACEHOLDER_PAT@[106; 107) COLON@[104; 105)
UNDERSCORE@[106; 107) WHITESPACE@[105; 106)
PLACEHOLDER_PAT@[106; 107)
UNDERSCORE@[106; 107)
COMMA@[107; 108) COMMA@[107; 108)
WHITESPACE@[108; 109) WHITESPACE@[108; 109)
R_CURLY@[109; 110) R_CURLY@[109; 110)