Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/item_tree/lower.rs')
-rw-r--r--crates/hir-def/src/item_tree/lower.rs47
1 files changed, 13 insertions, 34 deletions
diff --git a/crates/hir-def/src/item_tree/lower.rs b/crates/hir-def/src/item_tree/lower.rs
index 7dffd6fc18..d66ea743e8 100644
--- a/crates/hir-def/src/item_tree/lower.rs
+++ b/crates/hir-def/src/item_tree/lower.rs
@@ -602,44 +602,23 @@ impl<'a> Ctx<'a> {
generics.fill_bounds(&self.body_ctx, bounds, Either::Left(self_param));
}
- generics.fill(&self.body_ctx, node);
-
- generics.shrink_to_fit();
-
- if let Some(params) = node.generic_param_list() {
- let params_by_name: FxHashMap<_, _> = params
- .generic_params()
- .filter_map(|param| {
- let name = match &param {
- ast::GenericParam::ConstParam(param) => param.name()?.as_name(),
- ast::GenericParam::LifetimeParam(param) => {
- Name::new_lifetime(&param.lifetime()?)
- }
- ast::GenericParam::TypeParam(param) => param.name()?.as_name(),
- };
- Some((name, param))
- })
- .collect();
- for (idx, param) in generics.type_or_consts.iter() {
- if let Some(name) = param.name() {
- if let Some(param) = params_by_name.get(name) {
- self.add_attrs(
- idx.into(),
- RawAttrs::new(self.db.upcast(), param, self.hygiene()),
- );
- }
+ let add_param_attrs = |item, param| {
+ let attrs = RawAttrs::new(self.db.upcast(), &param, self.body_ctx.hygiene());
+ // This is identical to the body of `Ctx::add_attrs()` but we can't call that here
+ // because it requires `&mut self` and the call to `generics.fill()` below also
+ // references `self`.
+ match self.tree.attrs.entry(item) {
+ Entry::Occupied(mut entry) => {
+ *entry.get_mut() = entry.get().merge(attrs);
}
- }
- for (idx, param) in generics.lifetimes.iter() {
- if let Some(param) = params_by_name.get(&param.name) {
- self.add_attrs(
- idx.into(),
- RawAttrs::new(self.db.upcast(), param, self.hygiene()),
- );
+ Entry::Vacant(entry) => {
+ entry.insert(attrs);
}
}
- }
+ };
+ generics.fill(&self.body_ctx, node, add_param_attrs);
+ generics.shrink_to_fit();
Interned::new(generics)
}