Intern GenericArgs

This shaves off another ~4 mb or so
This commit is contained in:
Jonas Schievink 2021-05-24 15:35:46 +02:00
parent 8ebb8d29e1
commit 533e9207d3
4 changed files with 10 additions and 11 deletions

View File

@ -218,6 +218,7 @@ impl_internable!(
crate::type_ref::TraitRef, crate::type_ref::TraitRef,
crate::type_ref::TypeBound, crate::type_ref::TypeBound,
crate::path::ModPath, crate::path::ModPath,
crate::path::GenericArgs,
GenericParams, GenericParams,
str, str,
); );

View File

@ -811,7 +811,7 @@ fn desugar_future_path(orig: TypeRef) -> Path {
let binding = let binding =
AssociatedTypeBinding { name: name![Output], type_ref: Some(orig), bounds: Vec::new() }; AssociatedTypeBinding { name: name![Output], type_ref: Some(orig), bounds: Vec::new() };
last.bindings.push(binding); 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) Path::from_known_path(path, generic_args)
} }

View File

@ -4,7 +4,6 @@ mod lower;
use std::{ use std::{
fmt::{self, Display}, fmt::{self, Display},
iter, iter,
sync::Arc,
}; };
use crate::{body::LowerCtx, db::DefDatabase, intern::Interned, type_ref::LifetimeRef}; use crate::{body::LowerCtx, db::DefDatabase, intern::Interned, type_ref::LifetimeRef};
@ -136,7 +135,7 @@ pub struct Path {
type_anchor: Option<Interned<TypeRef>>, type_anchor: Option<Interned<TypeRef>>,
mod_path: Interned<ModPath>, mod_path: Interned<ModPath>,
/// Invariant: the same len as `self.mod_path.segments` /// Invariant: the same len as `self.mod_path.segments`
generic_args: Vec<Option<Arc<GenericArgs>>>, generic_args: Vec<Option<Interned<GenericArgs>>>,
} }
/// Generic arguments to a path segment (e.g. the `i32` in `Option<i32>`). This /// Generic arguments to a path segment (e.g. the `i32` in `Option<i32>`). This
@ -185,7 +184,7 @@ impl Path {
/// Converts a known mod path to `Path`. /// Converts a known mod path to `Path`.
pub(crate) fn from_known_path( pub(crate) fn from_known_path(
path: ModPath, path: ModPath,
generic_args: Vec<Option<Arc<GenericArgs>>>, generic_args: Vec<Option<Interned<GenericArgs>>>,
) -> Path { ) -> Path {
Path { type_anchor: None, mod_path: Interned::new(path), generic_args } Path { type_anchor: None, mod_path: Interned::new(path), generic_args }
} }
@ -239,7 +238,7 @@ pub struct PathSegment<'a> {
pub struct PathSegments<'a> { pub struct PathSegments<'a> {
segments: &'a [Name], segments: &'a [Name],
generic_args: &'a [Option<Arc<GenericArgs>>], generic_args: &'a [Option<Interned<GenericArgs>>],
} }
impl<'a> PathSegments<'a> { impl<'a> PathSegments<'a> {

View File

@ -3,7 +3,6 @@
mod lower_use; mod lower_use;
use crate::intern::Interned; use crate::intern::Interned;
use std::sync::Arc;
use either::Either; use either::Either;
use hir_expand::name::{name, AsName}; use hir_expand::name::{name, AsName};
@ -48,7 +47,7 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option<Path> {
segment.ret_type(), segment.ret_type(),
) )
}) })
.map(Arc::new); .map(Interned::new);
segments.push(name); segments.push(name);
generic_args.push(args) generic_args.push(args)
} }
@ -87,13 +86,13 @@ pub(super) fn lower_path(mut path: ast::Path, ctx: &LowerCtx) -> Option<Path> {
// Insert the type reference (T in the above example) as Self parameter for the trait // Insert the type reference (T in the above example) as Self parameter for the trait
let last_segment = let last_segment =
generic_args.iter_mut().rev().nth(num_segments.saturating_sub(1))?; generic_args.iter_mut().rev().nth(num_segments.saturating_sub(1))?;
if last_segment.is_none() { let mut args_inner = match last_segment {
*last_segment = Some(Arc::new(GenericArgs::empty())); 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.has_self_type = true;
args_inner.args.insert(0, GenericArg::Type(self_type)); args_inner.args.insert(0, GenericArg::Type(self_type));
*last_segment = Some(Interned::new(args_inner));
} }
} }
} }