Collect generic args in struct variant paths as well

This commit is contained in:
Florian Diebold 2019-01-13 21:12:36 +01:00
parent cc4562ab6e
commit d37bb128ef
2 changed files with 24 additions and 15 deletions
crates/ra_hir/src

@ -1054,25 +1054,34 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
}
fn resolve_variant(&mut self, path: Option<&Path>) -> (Ty, Option<DefId>) {
let path = if let Some(path) = path {
path
} else {
return (Ty::Unknown, None);
let path = match path {
Some(path) => path,
None => return (Ty::Unknown, None),
};
let def_id = if let Some(def_id) = self.module.resolve_path(self.db, &path).take_types() {
def_id
} else {
return (Ty::Unknown, None);
let def_id = match self.module.resolve_path(self.db, &path).take_types() {
Some(def_id) => def_id,
_ => return (Ty::Unknown, None),
};
// TODO remove the duplication between here and `Ty::from_path`?
// TODO provide generics of function
let generics = Generics::default();
let substs = Ty::substs_from_path(
self.db,
&self.module,
self.impl_block.as_ref(),
&generics,
path,
def_id,
);
match def_id.resolve(self.db) {
Def::Struct(s) => {
let ty = type_for_struct(self.db, s);
let ty = self.insert_type_vars(ty);
let ty = self.insert_type_vars(ty.apply_substs(substs));
(ty, Some(def_id))
}
Def::EnumVariant(ev) => {
let ty = type_for_enum_variant(self.db, ev);
let ty = self.insert_type_vars(ty);
let ty = self.insert_type_vars(ty.apply_substs(substs));
(ty, Some(def_id))
}
_ => (Ty::Unknown, None),

@ -8,8 +8,8 @@
[88; 89) 'i': i32
[97; 99) 'a2': A<i32>
[97; 101) 'a2.x': i32
[111; 113) 'a3': A<i32>
[116; 134) 'A::<i1...x: 1 }': A<i32>
[131; 132) '1': i32
[140; 142) 'a3': A<i32>
[140; 144) 'a3.x': i32
[111; 113) 'a3': A<i128>
[116; 134) 'A::<i1...x: 1 }': A<i128>
[131; 132) '1': i128
[140; 142) 'a3': A<i128>
[140; 144) 'a3.x': i128