Intern GenericArgs
This shaves off another ~4 mb or so
This commit is contained in:
parent
8ebb8d29e1
commit
533e9207d3
@ -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,
|
||||
);
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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> {
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user