diff options
Diffstat (limited to 'crates/ra_hir/src/ty')
-rw-r--r-- | crates/ra_hir/src/ty/infer.rs | 14 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/lower.rs | 34 |
2 files changed, 18 insertions, 30 deletions
diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index 3970c49e3..540a99b15 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs | |||
@@ -48,7 +48,7 @@ use crate::{ | |||
48 | resolve::{Resolution, Resolver}, | 48 | resolve::{Resolution, Resolver}, |
49 | ty::infer::diagnostics::InferenceDiagnostic, | 49 | ty::infer::diagnostics::InferenceDiagnostic, |
50 | type_ref::{Mutability, TypeRef}, | 50 | type_ref::{Mutability, TypeRef}, |
51 | AdtDef, ConstData, DefWithBody, FnData, Function, HasBody, ImplItem, ModuleDef, Name, Path, | 51 | Adt, ConstData, DefWithBody, FnData, Function, HasBody, ImplItem, ModuleDef, Name, Path, |
52 | StructField, | 52 | StructField, |
53 | }; | 53 | }; |
54 | 54 | ||
@@ -668,7 +668,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
668 | // FIXME remove the duplication between here and `Ty::from_path`? | 668 | // FIXME remove the duplication between here and `Ty::from_path`? |
669 | let substs = Ty::substs_from_path(self.db, resolver, path, def); | 669 | let substs = Ty::substs_from_path(self.db, resolver, path, def); |
670 | match def { | 670 | match def { |
671 | TypableDef::Struct(s) => { | 671 | TypableDef::Adt(Adt::Struct(s)) => { |
672 | let ty = s.ty(self.db); | 672 | let ty = s.ty(self.db); |
673 | let ty = self.insert_type_vars(ty.apply_substs(substs)); | 673 | let ty = self.insert_type_vars(ty.apply_substs(substs)); |
674 | (ty, Some(s.into())) | 674 | (ty, Some(s.into())) |
@@ -678,10 +678,10 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
678 | let ty = self.insert_type_vars(ty.apply_substs(substs)); | 678 | let ty = self.insert_type_vars(ty.apply_substs(substs)); |
679 | (ty, Some(var.into())) | 679 | (ty, Some(var.into())) |
680 | } | 680 | } |
681 | TypableDef::Union(_) | 681 | TypableDef::Adt(Adt::Enum(_)) |
682 | | TypableDef::Adt(Adt::Union(_)) | ||
682 | | TypableDef::TypeAlias(_) | 683 | | TypableDef::TypeAlias(_) |
683 | | TypableDef::Function(_) | 684 | | TypableDef::Function(_) |
684 | | TypableDef::Enum(_) | ||
685 | | TypableDef::Const(_) | 685 | | TypableDef::Const(_) |
686 | | TypableDef::Static(_) | 686 | | TypableDef::Static(_) |
687 | | TypableDef::BuiltinType(_) => (Ty::Unknown, None), | 687 | | TypableDef::BuiltinType(_) => (Ty::Unknown, None), |
@@ -1185,7 +1185,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1185 | let i = name.to_string().parse::<usize>().ok(); | 1185 | let i = name.to_string().parse::<usize>().ok(); |
1186 | i.and_then(|i| a_ty.parameters.0.get(i).cloned()) | 1186 | i.and_then(|i| a_ty.parameters.0.get(i).cloned()) |
1187 | } | 1187 | } |
1188 | TypeCtor::Adt(AdtDef::Struct(s)) => s.field(self.db, name).map(|field| { | 1188 | TypeCtor::Adt(Adt::Struct(s)) => s.field(self.db, name).map(|field| { |
1189 | self.write_field_resolution(tgt_expr, field); | 1189 | self.write_field_resolution(tgt_expr, field); |
1190 | field.ty(self.db).subst(&a_ty.parameters) | 1190 | field.ty(self.db).subst(&a_ty.parameters) |
1191 | }), | 1191 | }), |
@@ -1489,7 +1489,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1489 | trait_.associated_type_by_name(self.db, &name::OUTPUT) | 1489 | trait_.associated_type_by_name(self.db, &name::OUTPUT) |
1490 | } | 1490 | } |
1491 | 1491 | ||
1492 | fn resolve_boxed_box(&self) -> Option<AdtDef> { | 1492 | fn resolve_boxed_box(&self) -> Option<Adt> { |
1493 | let boxed_box_path = Path { | 1493 | let boxed_box_path = Path { |
1494 | kind: PathKind::Abs, | 1494 | kind: PathKind::Abs, |
1495 | segments: vec![ | 1495 | segments: vec![ |
@@ -1499,7 +1499,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
1499 | ], | 1499 | ], |
1500 | }; | 1500 | }; |
1501 | let struct_ = self.resolver.resolve_known_struct(self.db, &boxed_box_path)?; | 1501 | let struct_ = self.resolver.resolve_known_struct(self.db, &boxed_box_path)?; |
1502 | Some(AdtDef::Struct(struct_)) | 1502 | Some(Adt::Struct(struct_)) |
1503 | } | 1503 | } |
1504 | } | 1504 | } |
1505 | 1505 | ||
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index e67525a74..946e9e9fb 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs | |||
@@ -20,7 +20,7 @@ use crate::{ | |||
20 | nameres::Namespace, | 20 | nameres::Namespace, |
21 | path::{GenericArg, PathSegment}, | 21 | path::{GenericArg, PathSegment}, |
22 | resolve::{Resolution, Resolver}, | 22 | resolve::{Resolution, Resolver}, |
23 | ty::AdtDef, | 23 | ty::Adt, |
24 | type_ref::{TypeBound, TypeRef}, | 24 | type_ref::{TypeBound, TypeRef}, |
25 | BuiltinType, Const, Enum, EnumVariant, Function, ModuleDef, Path, Static, Struct, StructField, | 25 | BuiltinType, Const, Enum, EnumVariant, Function, ModuleDef, Path, Static, Struct, StructField, |
26 | Trait, TypeAlias, Union, | 26 | Trait, TypeAlias, Union, |
@@ -172,9 +172,7 @@ impl Ty { | |||
172 | ) -> Substs { | 172 | ) -> Substs { |
173 | let def_generic: Option<GenericDef> = match resolved { | 173 | let def_generic: Option<GenericDef> = match resolved { |
174 | TypableDef::Function(func) => Some(func.into()), | 174 | TypableDef::Function(func) => Some(func.into()), |
175 | TypableDef::Struct(s) => Some(s.into()), | 175 | TypableDef::Adt(adt) => Some(adt.into()), |
176 | TypableDef::Union(u) => Some(u.into()), | ||
177 | TypableDef::Enum(e) => Some(e.into()), | ||
178 | TypableDef::EnumVariant(var) => Some(var.parent_enum(db).into()), | 176 | TypableDef::EnumVariant(var) => Some(var.parent_enum(db).into()), |
179 | TypableDef::TypeAlias(t) => Some(t.into()), | 177 | TypableDef::TypeAlias(t) => Some(t.into()), |
180 | TypableDef::Const(_) | TypableDef::Static(_) | TypableDef::BuiltinType(_) => None, | 178 | TypableDef::Const(_) | TypableDef::Static(_) | TypableDef::BuiltinType(_) => None, |
@@ -193,9 +191,7 @@ impl Ty { | |||
193 | let last = path.segments.last().expect("path should have at least one segment"); | 191 | let last = path.segments.last().expect("path should have at least one segment"); |
194 | let segment = match resolved { | 192 | let segment = match resolved { |
195 | TypableDef::Function(_) | 193 | TypableDef::Function(_) |
196 | | TypableDef::Struct(_) | 194 | | TypableDef::Adt(_) |
197 | | TypableDef::Union(_) | ||
198 | | TypableDef::Enum(_) | ||
199 | | TypableDef::Const(_) | 195 | | TypableDef::Const(_) |
200 | | TypableDef::Static(_) | 196 | | TypableDef::Static(_) |
201 | | TypableDef::TypeAlias(_) | 197 | | TypableDef::TypeAlias(_) |
@@ -410,11 +406,9 @@ fn assoc_type_bindings_from_type_bound<'a>( | |||
410 | pub(crate) fn type_for_def(db: &impl HirDatabase, def: TypableDef, ns: Namespace) -> Ty { | 406 | pub(crate) fn type_for_def(db: &impl HirDatabase, def: TypableDef, ns: Namespace) -> Ty { |
411 | match (def, ns) { | 407 | match (def, ns) { |
412 | (TypableDef::Function(f), Namespace::Values) => type_for_fn(db, f), | 408 | (TypableDef::Function(f), Namespace::Values) => type_for_fn(db, f), |
413 | (TypableDef::Struct(s), Namespace::Types) => type_for_adt(db, s), | 409 | (TypableDef::Adt(Adt::Struct(s)), Namespace::Values) => type_for_struct_constructor(db, s), |
414 | (TypableDef::Struct(s), Namespace::Values) => type_for_struct_constructor(db, s), | 410 | (TypableDef::Adt(adt), Namespace::Types) => type_for_adt(db, adt), |
415 | (TypableDef::Enum(e), Namespace::Types) => type_for_adt(db, e), | ||
416 | (TypableDef::EnumVariant(v), Namespace::Values) => type_for_enum_variant_constructor(db, v), | 411 | (TypableDef::EnumVariant(v), Namespace::Values) => type_for_enum_variant_constructor(db, v), |
417 | (TypableDef::Union(u), Namespace::Types) => type_for_adt(db, u), | ||
418 | (TypableDef::TypeAlias(t), Namespace::Types) => type_for_type_alias(db, t), | 412 | (TypableDef::TypeAlias(t), Namespace::Types) => type_for_type_alias(db, t), |
419 | (TypableDef::Const(c), Namespace::Values) => type_for_const(db, c), | 413 | (TypableDef::Const(c), Namespace::Values) => type_for_const(db, c), |
420 | (TypableDef::Static(c), Namespace::Values) => type_for_static(db, c), | 414 | (TypableDef::Static(c), Namespace::Values) => type_for_static(db, c), |
@@ -422,8 +416,8 @@ pub(crate) fn type_for_def(db: &impl HirDatabase, def: TypableDef, ns: Namespace | |||
422 | 416 | ||
423 | // 'error' cases: | 417 | // 'error' cases: |
424 | (TypableDef::Function(_), Namespace::Types) => Ty::Unknown, | 418 | (TypableDef::Function(_), Namespace::Types) => Ty::Unknown, |
425 | (TypableDef::Union(_), Namespace::Values) => Ty::Unknown, | 419 | (TypableDef::Adt(Adt::Union(_)), Namespace::Values) => Ty::Unknown, |
426 | (TypableDef::Enum(_), Namespace::Values) => Ty::Unknown, | 420 | (TypableDef::Adt(Adt::Enum(_)), Namespace::Values) => Ty::Unknown, |
427 | (TypableDef::EnumVariant(_), Namespace::Types) => Ty::Unknown, | 421 | (TypableDef::EnumVariant(_), Namespace::Types) => Ty::Unknown, |
428 | (TypableDef::TypeAlias(_), Namespace::Values) => Ty::Unknown, | 422 | (TypableDef::TypeAlias(_), Namespace::Values) => Ty::Unknown, |
429 | (TypableDef::Const(_), Namespace::Types) => Ty::Unknown, | 423 | (TypableDef::Const(_), Namespace::Types) => Ty::Unknown, |
@@ -591,7 +585,7 @@ fn type_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariant) -> | |||
591 | Ty::apply(TypeCtor::FnDef(def.into()), substs) | 585 | Ty::apply(TypeCtor::FnDef(def.into()), substs) |
592 | } | 586 | } |
593 | 587 | ||
594 | fn type_for_adt(db: &impl HirDatabase, adt: impl Into<AdtDef> + HasGenericParams) -> Ty { | 588 | fn type_for_adt(db: &impl HirDatabase, adt: impl Into<Adt> + HasGenericParams) -> Ty { |
595 | let generics = adt.generic_params(db); | 589 | let generics = adt.generic_params(db); |
596 | Ty::apply(TypeCtor::Adt(adt.into()), Substs::identity(&generics)) | 590 | Ty::apply(TypeCtor::Adt(adt.into()), Substs::identity(&generics)) |
597 | } | 591 | } |
@@ -608,9 +602,7 @@ fn type_for_type_alias(db: &impl HirDatabase, t: TypeAlias) -> Ty { | |||
608 | #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] | 602 | #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] |
609 | pub enum TypableDef { | 603 | pub enum TypableDef { |
610 | Function(Function), | 604 | Function(Function), |
611 | Struct(Struct), | 605 | Adt(Adt), |
612 | Union(Union), | ||
613 | Enum(Enum), | ||
614 | EnumVariant(EnumVariant), | 606 | EnumVariant(EnumVariant), |
615 | TypeAlias(TypeAlias), | 607 | TypeAlias(TypeAlias), |
616 | Const(Const), | 608 | Const(Const), |
@@ -619,9 +611,7 @@ pub enum TypableDef { | |||
619 | } | 611 | } |
620 | impl_froms!( | 612 | impl_froms!( |
621 | TypableDef: Function, | 613 | TypableDef: Function, |
622 | Struct, | 614 | Adt(Struct, Enum, Union), |
623 | Union, | ||
624 | Enum, | ||
625 | EnumVariant, | 615 | EnumVariant, |
626 | TypeAlias, | 616 | TypeAlias, |
627 | Const, | 617 | Const, |
@@ -633,9 +623,7 @@ impl From<ModuleDef> for Option<TypableDef> { | |||
633 | fn from(def: ModuleDef) -> Option<TypableDef> { | 623 | fn from(def: ModuleDef) -> Option<TypableDef> { |
634 | let res = match def { | 624 | let res = match def { |
635 | ModuleDef::Function(f) => f.into(), | 625 | ModuleDef::Function(f) => f.into(), |
636 | ModuleDef::Struct(s) => s.into(), | 626 | ModuleDef::Adt(adt) => adt.into(), |
637 | ModuleDef::Union(u) => u.into(), | ||
638 | ModuleDef::Enum(e) => e.into(), | ||
639 | ModuleDef::EnumVariant(v) => v.into(), | 627 | ModuleDef::EnumVariant(v) => v.into(), |
640 | ModuleDef::TypeAlias(t) => t.into(), | 628 | ModuleDef::TypeAlias(t) => t.into(), |
641 | ModuleDef::Const(v) => v.into(), | 629 | ModuleDef::Const(v) => v.into(), |