Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/lib.rs')
| -rw-r--r-- | crates/hir/src/lib.rs | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 56832d6f8b..3c12907b82 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -2075,7 +2075,7 @@ impl GenericDef { id: LifetimeParamId { parent: self.into(), local_id }, }) .map(GenericParam::LifetimeParam); - ty_params.chain(lt_params).collect() + lt_params.chain(ty_params).collect() } pub fn type_params(self, db: &dyn HirDatabase) -> Vec<TypeOrConstParam> { @@ -2336,6 +2336,18 @@ impl TypeParam { self.id.parent().module(db.upcast()).into() } + /// Is this type parameter implicitly introduced (eg. `Self` in a trait or an `impl Trait` + /// argument)? + pub fn is_implicit(self, db: &dyn HirDatabase) -> bool { + let params = db.generic_params(self.id.parent()); + let data = ¶ms.type_or_consts[self.id.local_id()]; + match data.type_param().unwrap().provenance { + hir_def::generics::TypeParamProvenance::TypeParamList => false, + hir_def::generics::TypeParamProvenance::TraitSelf + | hir_def::generics::TypeParamProvenance::ArgumentImplTrait => true, + } + } + pub fn ty(self, db: &dyn HirDatabase) -> Type { let resolver = self.id.parent().resolver(db.upcast()); let krate = self.id.parent().module(db.upcast()).krate(); |