diff --git a/crates/hir_def/src/intern.rs b/crates/hir_def/src/intern.rs index 8b3f799e2cb..1189c9327d6 100644 --- a/crates/hir_def/src/intern.rs +++ b/crates/hir_def/src/intern.rs @@ -218,6 +218,7 @@ fn storage() -> &'static InternStorage { crate::type_ref::TraitRef, crate::type_ref::TypeBound, crate::path::ModPath, + crate::path::GenericArgs, GenericParams, str, ); diff --git a/crates/hir_def/src/item_tree/lower.rs b/crates/hir_def/src/item_tree/lower.rs index 1a0e54413c3..b4389371fbb 100644 --- a/crates/hir_def/src/item_tree/lower.rs +++ b/crates/hir_def/src/item_tree/lower.rs @@ -811,7 +811,7 @@ fn desugar_future_path(orig: TypeRef) -> Path { let binding = AssociatedTypeBinding { name: name![Output], type_ref: Some(orig), bounds: Vec::new() }; last.bindings.push(binding); - generic_args.push(Some(Arc::new(last))); + generic_args.push(Some(Interned::new(last))); Path::from_known_path(path, generic_args) } diff --git a/crates/hir_def/src/path.rs b/crates/hir_def/src/path.rs index 7bd7d9d4f21..45ab9d0ffbf 100644 --- a/crates/hir_def/src/path.rs +++ b/crates/hir_def/src/path.rs @@ -4,7 +4,6 @@ use std::{ fmt::{self, Display}, iter, - sync::Arc, }; use crate::{body::LowerCtx, db::DefDatabase, intern::Interned, type_ref::LifetimeRef}; @@ -136,7 +135,7 @@ pub struct Path { type_anchor: Option>, mod_path: Interned, /// Invariant: the same len as `self.mod_path.segments` - generic_args: Vec>>, + generic_args: Vec>>, } /// Generic arguments to a path segment (e.g. the `i32` in `Option`). This @@ -185,7 +184,7 @@ pub fn from_src(path: ast::Path, ctx: &LowerCtx) -> Option { /// Converts a known mod path to `Path`. pub(crate) fn from_known_path( path: ModPath, - generic_args: Vec>>, + generic_args: Vec>>, ) -> Path { Path { type_anchor: None, mod_path: Interned::new(path), generic_args } } @@ -239,7 +238,7 @@ pub struct PathSegment<'a> { pub struct PathSegments<'a> { segments: &'a [Name], - generic_args: &'a [Option>], + generic_args: &'a [Option>], } impl<'a> PathSegments<'a> { diff --git a/crates/hir_def/src/path/lower.rs b/crates/hir_def/src/path/lower.rs index cf4e7c02eee..5d5dd9c8f8a 100644 --- a/crates/hir_def/src/path/lower.rs +++ b/crates/hir_def/src/path/lower.rs @@ -3,7 +3,6 @@ mod lower_use; use crate::intern::Interned; -use std::sync::Arc; use either::Either; use hir_expand::name::{name, AsName}; @@ -48,7 +47,7 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option { segment.ret_type(), ) }) - .map(Arc::new); + .map(Interned::new); segments.push(name); generic_args.push(args) } @@ -87,13 +86,13 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option { // Insert the type reference (T in the above example) as Self parameter for the trait let last_segment = generic_args.iter_mut().rev().nth(num_segments.saturating_sub(1))?; - if last_segment.is_none() { - *last_segment = Some(Arc::new(GenericArgs::empty())); + let mut args_inner = match last_segment { + Some(it) => it.as_ref().clone(), + None => GenericArgs::empty(), }; - let args = last_segment.as_mut().unwrap(); - let mut args_inner = Arc::make_mut(args); args_inner.has_self_type = true; args_inner.args.insert(0, GenericArg::Type(self_type)); + *last_segment = Some(Interned::new(args_inner)); } } }