From bb6e1bf811bce09fdab115a4257e47cc0d5ddc82 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Wed, 24 Mar 2021 17:00:29 +0100 Subject: Lower traits to TraitRef instead of TypeRef --- crates/hir_def/src/item_tree/lower.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'crates/hir_def/src/item_tree') diff --git a/crates/hir_def/src/item_tree/lower.rs b/crates/hir_def/src/item_tree/lower.rs index 3f558edd8..34af5c8d4 100644 --- a/crates/hir_def/src/item_tree/lower.rs +++ b/crates/hir_def/src/item_tree/lower.rs @@ -11,7 +11,7 @@ use syntax::{ use crate::{ generics::{GenericParams, TypeParamData, TypeParamProvenance}, - type_ref::LifetimeRef, + type_ref::{LifetimeRef, TraitRef}, }; use super::*; @@ -536,7 +536,7 @@ impl Ctx { fn lower_impl(&mut self, impl_def: &ast::Impl) -> Option> { let generic_params = self.lower_generic_params_and_inner_items(GenericsOwner::Impl, impl_def); - let target_trait = impl_def.trait_().map(|tr| self.lower_type_ref(&tr)); + let target_trait = impl_def.trait_().map(|tr| self.lower_trait_ref(&tr)); let target_type = self.lower_type_ref(&impl_def.self_ty()?); let is_negative = impl_def.excl_token().is_some(); @@ -740,10 +740,16 @@ impl Ctx { self.data().vis.alloc(vis) } + fn lower_trait_ref(&mut self, trait_ref: &ast::Type) -> Idx { + let trait_ref = TraitRef::from_ast(&self.body_ctx, trait_ref.clone()); + self.data().trait_refs.intern(trait_ref) + } + fn lower_type_ref(&mut self, type_ref: &ast::Type) -> Idx { let tyref = TypeRef::from_ast(&self.body_ctx, type_ref.clone()); self.data().type_refs.intern(tyref) } + fn lower_type_ref_opt(&mut self, type_ref: Option) -> Idx { match type_ref.map(|ty| self.lower_type_ref(&ty)) { Some(it) => it, -- cgit v1.2.3 From c2a63b97a80cb738f800da61c64e748994709c31 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Mon, 29 Mar 2021 17:46:33 +0200 Subject: Rename target_ty to self_ty --- crates/hir_def/src/item_tree/lower.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/hir_def/src/item_tree') diff --git a/crates/hir_def/src/item_tree/lower.rs b/crates/hir_def/src/item_tree/lower.rs index 34af5c8d4..4b2af564e 100644 --- a/crates/hir_def/src/item_tree/lower.rs +++ b/crates/hir_def/src/item_tree/lower.rs @@ -537,7 +537,7 @@ impl Ctx { let generic_params = self.lower_generic_params_and_inner_items(GenericsOwner::Impl, impl_def); let target_trait = impl_def.trait_().map(|tr| self.lower_trait_ref(&tr)); - let target_type = self.lower_type_ref(&impl_def.self_ty()?); + let self_ty = self.lower_type_ref(&impl_def.self_ty()?); let is_negative = impl_def.excl_token().is_some(); // We cannot use `assoc_items()` here as that does not include macro calls. @@ -554,7 +554,7 @@ impl Ctx { }) .collect(); let ast_id = self.source_ast_id_map.ast_id(impl_def); - let res = Impl { generic_params, target_trait, target_type, is_negative, items, ast_id }; + let res = Impl { generic_params, target_trait, self_ty, is_negative, items, ast_id }; Some(id(self.data().impls.alloc(res))) } -- cgit v1.2.3 From b4bb7743810b1e6ac8b897a465c430e9ed8d5c44 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Mon, 29 Mar 2021 18:39:58 +0200 Subject: Remove TraitRef::Error --- crates/hir_def/src/item_tree/lower.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'crates/hir_def/src/item_tree') 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 { fn lower_impl(&mut self, impl_def: &ast::Impl) -> Option> { let generic_params = self.lower_generic_params_and_inner_items(GenericsOwner::Impl, impl_def); - let target_trait = impl_def.trait_().map(|tr| self.lower_trait_ref(&tr)); + // FIXME: If trait lowering fails, due to a non PathType for example, we treat this impl + // as if it was an non-trait impl. Ideally we want to create a unique missing ref that only + // equals itself. + let target_trait = impl_def.trait_().and_then(|tr| self.lower_trait_ref(&tr)); let self_ty = self.lower_type_ref(&impl_def.self_ty()?); let is_negative = impl_def.excl_token().is_some(); @@ -740,9 +743,9 @@ impl Ctx { self.data().vis.alloc(vis) } - fn lower_trait_ref(&mut self, trait_ref: &ast::Type) -> Idx { - let trait_ref = TraitRef::from_ast(&self.body_ctx, trait_ref.clone()); - self.data().trait_refs.intern(trait_ref) + fn lower_trait_ref(&mut self, trait_ref: &ast::Type) -> Option> { + let trait_ref = TraitRef::from_ast(&self.body_ctx, trait_ref.clone())?; + Some(self.data().trait_refs.intern(trait_ref)) } fn lower_type_ref(&mut self, type_ref: &ast::Type) -> Idx { -- cgit v1.2.3