From 533e9207d39c27dc22de2645fc65891189a71739 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Mon, 24 May 2021 15:35:46 +0200 Subject: Intern `GenericArgs` This shaves off another ~4 mb or so --- crates/hir_def/src/path/lower.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'crates/hir_def/src/path') diff --git a/crates/hir_def/src/path/lower.rs b/crates/hir_def/src/path/lower.rs index cf4e7c02e..5d5dd9c8f 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)); } } } -- cgit v1.2.3