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 @@ fn storage() -> &'static InternStorage<Self> {
crate::type_ref::TraitRef,
crate::type_ref::TypeBound,
crate::path::ModPath,
crate::path::GenericArgs,
GenericParams,
str,
);

View File

@ -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)
}

View File

@ -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<Interned<TypeRef>>,
mod_path: Interned<ModPath>,
/// 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
@ -185,7 +184,7 @@ pub fn from_src(path: ast::Path, ctx: &LowerCtx) -> Option<Path> {
/// Converts a known mod path to `Path`.
pub(crate) fn from_known_path(
path: ModPath,
generic_args: Vec<Option<Arc<GenericArgs>>>,
generic_args: Vec<Option<Interned<GenericArgs>>>,
) -> 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<Arc<GenericArgs>>],
generic_args: &'a [Option<Interned<GenericArgs>>],
}
impl<'a> PathSegments<'a> {

View File

@ -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<Path> {
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<Path> {
// 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));
}
}
}