ItemTree: Use more boxed slices

This commit is contained in:
Jonas Schievink 2020-06-24 16:07:02 +02:00
parent abdba92334
commit 94169ee504
4 changed files with 22 additions and 15 deletions

View file

@ -38,7 +38,7 @@ impl FunctionData {
Arc::new(FunctionData { Arc::new(FunctionData {
name: func.name.clone(), name: func.name.clone(),
params: func.params.clone(), params: func.params.to_vec(),
ret_type: func.ret_type.clone(), ret_type: func.ret_type.clone(),
attrs: item_tree.attrs(loc.id.value.into()).clone(), attrs: item_tree.attrs(loc.id.value.into()).clone(),
has_self_param: func.has_self_param, has_self_param: func.has_self_param,
@ -70,7 +70,7 @@ impl TypeAliasData {
name: typ.name.clone(), name: typ.name.clone(),
type_ref: typ.type_ref.clone(), type_ref: typ.type_ref.clone(),
visibility: item_tree[typ.visibility].clone(), visibility: item_tree[typ.visibility].clone(),
bounds: typ.bounds.clone(), bounds: typ.bounds.to_vec(),
}) })
} }
} }

View file

@ -438,7 +438,7 @@ pub struct Function {
pub generic_params: GenericParamsId, pub generic_params: GenericParamsId,
pub has_self_param: bool, pub has_self_param: bool,
pub is_unsafe: bool, pub is_unsafe: bool,
pub params: Vec<TypeRef>, pub params: Box<[TypeRef]>,
pub ret_type: TypeRef, pub ret_type: TypeRef,
pub ast_id: FileAstId<ast::FnDef>, pub ast_id: FileAstId<ast::FnDef>,
} }
@ -505,7 +505,7 @@ pub struct Trait {
pub visibility: RawVisibilityId, pub visibility: RawVisibilityId,
pub generic_params: GenericParamsId, pub generic_params: GenericParamsId,
pub auto: bool, pub auto: bool,
pub items: Vec<AssocItem>, pub items: Box<[AssocItem]>,
pub ast_id: FileAstId<ast::TraitDef>, pub ast_id: FileAstId<ast::TraitDef>,
} }
@ -515,7 +515,7 @@ pub struct Impl {
pub target_trait: Option<TypeRef>, pub target_trait: Option<TypeRef>,
pub target_type: TypeRef, pub target_type: TypeRef,
pub is_negative: bool, pub is_negative: bool,
pub items: Vec<AssocItem>, pub items: Box<[AssocItem]>,
pub ast_id: FileAstId<ast::ImplDef>, pub ast_id: FileAstId<ast::ImplDef>,
} }
@ -524,7 +524,7 @@ pub struct TypeAlias {
pub name: Name, pub name: Name,
pub visibility: RawVisibilityId, pub visibility: RawVisibilityId,
/// Bounds on the type alias itself. Only valid in trait declarations, eg. `type Assoc: Copy;`. /// Bounds on the type alias itself. Only valid in trait declarations, eg. `type Assoc: Copy;`.
pub bounds: Vec<TypeBound>, pub bounds: Box<[TypeBound]>,
pub generic_params: GenericParamsId, pub generic_params: GenericParamsId,
pub type_ref: Option<TypeRef>, pub type_ref: Option<TypeRef>,
pub ast_id: FileAstId<ast::TypeAliasDef>, pub ast_id: FileAstId<ast::TypeAliasDef>,
@ -541,7 +541,7 @@ pub struct Mod {
#[derive(Debug, Clone, Eq, PartialEq)] #[derive(Debug, Clone, Eq, PartialEq)]
pub enum ModKind { pub enum ModKind {
/// `mod m { ... }` /// `mod m { ... }`
Inline { items: Vec<ModItem> }, Inline { items: Box<[ModItem]> },
/// `mod m;` /// `mod m;`
Outline {}, Outline {},

View file

@ -325,7 +325,7 @@ impl Ctx {
generic_params: GenericParamsId::EMPTY, generic_params: GenericParamsId::EMPTY,
has_self_param, has_self_param,
is_unsafe: func.unsafe_token().is_some(), is_unsafe: func.unsafe_token().is_some(),
params, params: params.into_boxed_slice(),
ret_type, ret_type,
ast_id, ast_id,
}; };
@ -344,7 +344,14 @@ impl Ctx {
let bounds = self.lower_type_bounds(type_alias); let bounds = self.lower_type_bounds(type_alias);
let generic_params = self.lower_generic_params(GenericsOwner::TypeAlias, type_alias); let generic_params = self.lower_generic_params(GenericsOwner::TypeAlias, type_alias);
let ast_id = self.source_ast_id_map.ast_id(type_alias); let ast_id = self.source_ast_id_map.ast_id(type_alias);
let res = TypeAlias { name, visibility, bounds, generic_params, type_ref, ast_id }; let res = TypeAlias {
name,
visibility,
bounds: bounds.into_boxed_slice(),
generic_params,
type_ref,
ast_id,
};
Some(id(self.data().type_aliases.alloc(res))) Some(id(self.data().type_aliases.alloc(res)))
} }
@ -384,7 +391,7 @@ impl Ctx {
}) })
.unwrap_or_else(|| { .unwrap_or_else(|| {
mark::hit!(name_res_works_for_broken_modules); mark::hit!(name_res_works_for_broken_modules);
Vec::new() Box::new([]) as Box<[_]>
}), }),
} }
}; };
@ -552,7 +559,7 @@ impl Ctx {
GenericsOwner::Function(func) => { GenericsOwner::Function(func) => {
generics.fill(&self.body_ctx, sm, node); generics.fill(&self.body_ctx, sm, node);
// lower `impl Trait` in arguments // lower `impl Trait` in arguments
for param in &func.params { for param in &*func.params {
generics.fill_implicit_impl_trait_args(param); generics.fill_implicit_impl_trait_args(param);
} }
} }

View file

@ -31,7 +31,7 @@ fn test_inner_items(ra_fixture: &str) {
ModItem::TypeAlias(it) => tree.source(&db, InFile::new(file_id, it)).into(), ModItem::TypeAlias(it) => tree.source(&db, InFile::new(file_id, it)).into(),
ModItem::Mod(it) => { ModItem::Mod(it) => {
if let ModKind::Inline { items } = &tree[it].kind { if let ModKind::Inline { items } = &tree[it].kind {
worklist.extend(items); worklist.extend(&**items);
} }
tree.source(&db, InFile::new(file_id, it)).into() tree.source(&db, InFile::new(file_id, it)).into()
} }
@ -125,14 +125,14 @@ fn fmt_mod_item(out: &mut String, tree: &ItemTree, item: ModItem) {
} }
ModItem::Trait(it) => { ModItem::Trait(it) => {
format_to!(out, "{:?}", tree[it]); format_to!(out, "{:?}", tree[it]);
for item in &tree[it].items { for item in &*tree[it].items {
fmt_mod_item(&mut children, tree, ModItem::from(*item)); fmt_mod_item(&mut children, tree, ModItem::from(*item));
format_to!(children, "\n"); format_to!(children, "\n");
} }
} }
ModItem::Impl(it) => { ModItem::Impl(it) => {
format_to!(out, "{:?}", tree[it]); format_to!(out, "{:?}", tree[it]);
for item in &tree[it].items { for item in &*tree[it].items {
fmt_mod_item(&mut children, tree, ModItem::from(*item)); fmt_mod_item(&mut children, tree, ModItem::from(*item));
format_to!(children, "\n"); format_to!(children, "\n");
} }
@ -144,7 +144,7 @@ fn fmt_mod_item(out: &mut String, tree: &ItemTree, item: ModItem) {
format_to!(out, "{:?}", tree[it]); format_to!(out, "{:?}", tree[it]);
match &tree[it].kind { match &tree[it].kind {
ModKind::Inline { items } => { ModKind::Inline { items } => {
for item in items { for item in &**items {
fmt_mod_item(&mut children, tree, *item); fmt_mod_item(&mut children, tree, *item);
format_to!(children, "\n"); format_to!(children, "\n");
} }