diff options
Diffstat (limited to 'crates/hir_def/src')
-rw-r--r-- | crates/hir_def/src/item_tree/lower.rs | 11 | ||||
-rw-r--r-- | crates/hir_def/src/type_ref.rs | 16 |
2 files changed, 14 insertions, 13 deletions
diff --git a/crates/hir_def/src/item_tree/lower.rs b/crates/hir_def/src/item_tree/lower.rs index 4b2af564e..8d3862811 100644 --- a/crates/hir_def/src/item_tree/lower.rs +++ b/crates/hir_def/src/item_tree/lower.rs | |||
@@ -536,7 +536,10 @@ impl Ctx { | |||
536 | fn lower_impl(&mut self, impl_def: &ast::Impl) -> Option<FileItemTreeId<Impl>> { | 536 | fn lower_impl(&mut self, impl_def: &ast::Impl) -> Option<FileItemTreeId<Impl>> { |
537 | let generic_params = | 537 | let generic_params = |
538 | self.lower_generic_params_and_inner_items(GenericsOwner::Impl, impl_def); | 538 | self.lower_generic_params_and_inner_items(GenericsOwner::Impl, impl_def); |
539 | let target_trait = impl_def.trait_().map(|tr| self.lower_trait_ref(&tr)); | 539 | // FIXME: If trait lowering fails, due to a non PathType for example, we treat this impl |
540 | // as if it was an non-trait impl. Ideally we want to create a unique missing ref that only | ||
541 | // equals itself. | ||
542 | let target_trait = impl_def.trait_().and_then(|tr| self.lower_trait_ref(&tr)); | ||
540 | let self_ty = self.lower_type_ref(&impl_def.self_ty()?); | 543 | let self_ty = self.lower_type_ref(&impl_def.self_ty()?); |
541 | let is_negative = impl_def.excl_token().is_some(); | 544 | let is_negative = impl_def.excl_token().is_some(); |
542 | 545 | ||
@@ -740,9 +743,9 @@ impl Ctx { | |||
740 | self.data().vis.alloc(vis) | 743 | self.data().vis.alloc(vis) |
741 | } | 744 | } |
742 | 745 | ||
743 | fn lower_trait_ref(&mut self, trait_ref: &ast::Type) -> Idx<TraitRef> { | 746 | fn lower_trait_ref(&mut self, trait_ref: &ast::Type) -> Option<Idx<TraitRef>> { |
744 | let trait_ref = TraitRef::from_ast(&self.body_ctx, trait_ref.clone()); | 747 | let trait_ref = TraitRef::from_ast(&self.body_ctx, trait_ref.clone())?; |
745 | self.data().trait_refs.intern(trait_ref) | 748 | Some(self.data().trait_refs.intern(trait_ref)) |
746 | } | 749 | } |
747 | 750 | ||
748 | fn lower_type_ref(&mut self, type_ref: &ast::Type) -> Idx<TypeRef> { | 751 | fn lower_type_ref(&mut self, type_ref: &ast::Type) -> Idx<TypeRef> { |
diff --git a/crates/hir_def/src/type_ref.rs b/crates/hir_def/src/type_ref.rs index b7484ed0d..4c24aae94 100644 --- a/crates/hir_def/src/type_ref.rs +++ b/crates/hir_def/src/type_ref.rs | |||
@@ -52,21 +52,19 @@ impl Rawness { | |||
52 | } | 52 | } |
53 | 53 | ||
54 | #[derive(Clone, PartialEq, Eq, Hash, Debug)] | 54 | #[derive(Clone, PartialEq, Eq, Hash, Debug)] |
55 | pub enum TraitRef { | 55 | pub struct TraitRef { |
56 | Path(Path), | 56 | pub path: Path, |
57 | Error, | ||
58 | } | 57 | } |
59 | 58 | ||
60 | impl TraitRef { | 59 | impl TraitRef { |
61 | /// Converts an `ast::PathType` to a `hir::TraitRef`. | 60 | /// Converts an `ast::PathType` to a `hir::TraitRef`. |
62 | pub(crate) fn from_ast(ctx: &LowerCtx, node: ast::Type) -> Self { | 61 | pub(crate) fn from_ast(ctx: &LowerCtx, node: ast::Type) -> Option<Self> { |
63 | // FIXME: Use `Path::from_src` | 62 | // FIXME: Use `Path::from_src` |
64 | match node { | 63 | match node { |
65 | ast::Type::PathType(path) => path | 64 | ast::Type::PathType(path) => { |
66 | .path() | 65 | path.path().and_then(|it| ctx.lower_path(it)).map(|path| TraitRef { path }) |
67 | .and_then(|it| ctx.lower_path(it)) | 66 | } |
68 | .map_or(TraitRef::Error, TraitRef::Path), | 67 | _ => None, |
69 | _ => TraitRef::Error, | ||
70 | } | 68 | } |
71 | } | 69 | } |
72 | } | 70 | } |