Skip to content

Commit 9e6ad77

Browse files
committed
Refactored ASG to use arenas
1 parent 576221f commit 9e6ad77

35 files changed

+134
-256
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ members = [
4141
"src/components/build_c_token",
4242
"src/support/look_ahead",
4343
"src/support/repeating_last",
44-
"src/support/backend", "src/components/job", "src/support/arena",
44+
"src/support/backend",
45+
"src/components/job",
46+
"src/support/arena",
4547
]
4648

4749
[workspace.dependencies]

src/components/build_asg/src/expr/call/infer_impl.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub fn infer_callee_missing_impl_args(
1818

1919
let Some(caller) = ctx
2020
.func_ref
21-
.map(|caller_func_ref| ctx.asg.funcs.get(caller_func_ref).unwrap())
21+
.map(|caller_func_ref| &ctx.asg.funcs[caller_func_ref])
2222
else {
2323
continue;
2424
};

src/components/build_asg/src/expr/call/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ pub fn call_callee(
7676
resolve_impl_arg(ctx, &mut callee, using, &mut used_names, &mut catalog)?;
7777
}
7878

79-
let function = ctx.asg.funcs.get(callee.func_ref).unwrap();
79+
let function = &ctx.asg.funcs[callee.func_ref];
8080
let num_required = function.params.required.len();
8181

8282
infer_callee_missing_impl_args(ctx, function, &mut used_names, &mut catalog, source)?;
@@ -87,7 +87,7 @@ pub fn call_callee(
8787
callee.recipe = catalog.bake();
8888

8989
for (i, arg) in args.iter_mut().enumerate() {
90-
let function = ctx.asg.funcs.get(callee.func_ref).unwrap();
90+
let function = &ctx.asg.funcs[callee.func_ref];
9191

9292
let preferred_type =
9393
(i < num_required).then_some(PreferredType::of_parameter(callee.func_ref, i));

src/components/build_asg/src/expr/call/specified_impl.rs

+4-12
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,10 @@ fn resolve_concrete_impl_arg(
3535
let impl_arg_source = using.ty.source;
3636
let (impl_ref, impl_poly_catalog) = resolve_impl_mention_from_type(ctx, impl_arg)?;
3737

38-
let imp = ctx
39-
.asg
40-
.impls
41-
.get(impl_ref)
42-
.expect("referenced impl to exist");
38+
let imp = &ctx.asg.impls[impl_ref];
4339

4440
let arg_concrete_trait = impl_poly_catalog.resolver().resolve_trait(&imp.target)?;
45-
let callee_func = ctx.asg.funcs.get(callee.func_ref).unwrap();
41+
let callee_func = &ctx.asg.funcs[callee.func_ref];
4642

4743
try_register_specified_impl(
4844
ctx,
@@ -66,7 +62,7 @@ fn resolve_polymorph_impl_arg(
6662
catalog: &mut PolyCatalog,
6763
) -> Result<(), ResolveError> {
6864
let impl_arg_source = using.ty.source;
69-
let callee_func = ctx.asg.funcs.get(callee.func_ref).unwrap();
65+
let callee_func = &ctx.asg.funcs[callee.func_ref];
7066

7167
let Some(current_func_ref) = ctx.func_ref else {
7268
return Err(ResolveError::other(
@@ -75,11 +71,7 @@ fn resolve_polymorph_impl_arg(
7571
));
7672
};
7773

78-
let caller = ctx
79-
.asg
80-
.funcs
81-
.get(current_func_ref)
82-
.expect("referenced function to exist");
74+
let caller = &ctx.asg.funcs[current_func_ref];
8375

8476
let Some(arg_concrete_trait) = caller.impl_params.get(polymorph) else {
8577
return Err(ResolveError::other(

src/components/build_asg/src/expr/declare_assign.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ pub fn resolve_declare_assign_expr(
2929
return Err(ResolveErrorKind::CannotDeclareVariableOutsideFunction.at(source));
3030
};
3131

32-
let function = ctx.asg.funcs.get_mut(func_ref).unwrap();
33-
34-
let key = function.vars.add_variable(value.ty.clone(), true);
32+
let key = ctx.asg.funcs[func_ref]
33+
.vars
34+
.add_variable(value.ty.clone(), true);
3535

3636
ctx.variable_haystack
3737
.put(&declare_assign.name, value.ty.clone(), key);

src/components/build_asg/src/expr/member_expr.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,7 @@ pub fn resolve_member_expr(
4646
})
4747
})?;
4848

49-
let structure = ctx
50-
.asg
51-
.structs
52-
.get(struct_ref)
53-
.expect("referenced struct to exist");
49+
let structure = &ctx.asg.structs[struct_ref];
5450

5551
let (index, _key, found_field) = match structure.fields.get_full(field_name) {
5652
Some(found) => found,

src/components/build_asg/src/expr/mod.rs

+3-13
Original file line numberDiff line numberDiff line change
@@ -108,21 +108,11 @@ impl<'a> PreferredType<'a> {
108108
match self {
109109
PreferredType::Reference(reference) => reference,
110110
PreferredType::ParameterType(func_ref, index) => {
111-
&asg.funcs
112-
.get(*func_ref)
113-
.unwrap()
114-
.params
115-
.required
116-
.get(*index)
117-
.unwrap()
118-
.ty
111+
&asg.funcs[*func_ref].params.required.get(*index).unwrap().ty
119112
}
120-
PreferredType::ReturnType(func_ref) => &asg.funcs.get(*func_ref).unwrap().return_type,
113+
PreferredType::ReturnType(func_ref) => &asg.funcs[*func_ref].return_type,
121114
PreferredType::FieldType(struct_ref, field_name) => {
122-
let (_, _, field) = asg
123-
.structs
124-
.get(*struct_ref)
125-
.expect("referenced structure to exist")
115+
let (_, _, field) = asg.structs[*struct_ref]
126116
.fields
127117
.get_full::<str>(field_name)
128118
.expect("referenced struct field type to exist");

src/components/build_asg/src/expr/static_member.rs

+4-20
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,7 @@ pub fn resolve_impl_mention(
152152
Ok(imp)
153153
})?;
154154

155-
let imp = ctx
156-
.asg
157-
.impls
158-
.get(impl_decl.impl_ref)
159-
.expect("public impl of impl decl to exist");
155+
let imp = &ctx.asg.impls[impl_decl.impl_ref];
160156

161157
if imp.params.len() != impl_args.len() {
162158
return Err(ResolveError::other(
@@ -225,11 +221,7 @@ pub fn resolve_static_member_call_named(
225221

226222
let generics = resolve_type_args_to_poly_args(ctx, &static_member_call.call.generics)?;
227223

228-
let imp = ctx
229-
.asg
230-
.impls
231-
.get(impl_ref)
232-
.expect("referenced impl to exist");
224+
let imp = &ctx.asg.impls[impl_ref];
233225

234226
let mut only_match = imp
235227
.body
@@ -294,11 +286,7 @@ pub fn resolve_static_member_call_polymorph(
294286
)?);
295287
}
296288

297-
let func = ctx
298-
.asg
299-
.funcs
300-
.get(func_ref)
301-
.expect("referenced function to exist");
289+
let func = &ctx.asg.funcs[func_ref];
302290

303291
let Some(generic_trait_ref) = func.impl_params.get(polymorph) else {
304292
return Err(ResolveError::other(
@@ -307,11 +295,7 @@ pub fn resolve_static_member_call_polymorph(
307295
));
308296
};
309297

310-
let trait_decl = ctx
311-
.asg
312-
.traits
313-
.get(generic_trait_ref.trait_ref)
314-
.expect("referenced trait to exist");
298+
let trait_decl = &ctx.asg.traits[generic_trait_ref.trait_ref];
315299

316300
let member = call
317301
.name

src/components/build_asg/src/expr/struct_literal.rs

+4-21
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,7 @@ fn get_field_info<'a>(
2626
arguments: &[asg::Type],
2727
field_name: &str,
2828
) -> Result<FieldInfo, PolymorphError> {
29-
let structure = ctx
30-
.asg
31-
.structs
32-
.get(struct_ref)
33-
.expect("referenced structure to exist");
29+
let structure = &ctx.asg.structs[struct_ref];
3430

3531
let (index, _name, field) = structure
3632
.fields
@@ -83,12 +79,7 @@ pub fn resolve_struct_literal_expr(
8379
let mut resolved_fields = IndexMap::new();
8480

8581
for field_initializer in fields.iter() {
86-
let all_fields = &ctx
87-
.asg
88-
.structs
89-
.get(struct_ref)
90-
.expect("referenced struct to exist")
91-
.fields;
82+
let all_fields = &ctx.asg.structs[struct_ref].fields;
9283

9384
let field_name = match field_initializer
9485
.name
@@ -102,11 +93,7 @@ pub fn resolve_struct_literal_expr(
10293

10394
// Ensure field exists on structure
10495
{
105-
let structure = ctx
106-
.asg
107-
.structs
108-
.get(struct_ref)
109-
.expect("referenced structure to exist");
96+
let structure = &ctx.asg.structs[struct_ref];
11097

11198
if !structure.fields.contains_key::<str>(&field_name) {
11299
return Err(ResolveErrorKind::FieldDoesNotExist {
@@ -168,11 +155,7 @@ pub fn resolve_struct_literal_expr(
168155
next_index = field_info.index + 1;
169156
}
170157

171-
let structure = ctx
172-
.asg
173-
.structs
174-
.get(struct_ref)
175-
.expect("referenced structure to exist");
158+
let structure = &ctx.asg.structs[struct_ref];
176159

177160
if resolved_fields.len() != structure.fields.len() {
178161
let missing = structure

src/components/build_asg/src/expr/variable.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@ pub fn resolve_variable_expr(
1919
.as_plain_str()
2020
.and_then(|name| ctx.variable_haystack.find(name))
2121
{
22-
if let Some(function) = ctx
23-
.func_ref
24-
.map(|func_ref| ctx.asg.funcs.get_mut(func_ref).expect("valid function ref"))
25-
{
22+
if let Some(function) = ctx.func_ref.map(|func_ref| &mut ctx.asg.funcs[func_ref]) {
2623
let is_initialized = function
2724
.vars
2825
.get(variable.key)
@@ -143,7 +140,7 @@ pub fn resolve_variable_expr(
143140
}
144141

145142
fn resolve_global_variable(ctx: &ResolveExprCtx, decl: &GlobalDecl, source: Source) -> TypedExpr {
146-
let global = ctx.asg.globals.get(decl.global_ref).expect("valid global");
143+
let global = &ctx.asg.globals[decl.global_ref];
147144

148145
TypedExpr::new(
149146
global.ty.clone(),

src/components/build_asg/src/func_body.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,7 @@ fn resolve_func_body(
111111
ResolveExprMode::NeglectValue,
112112
)?;
113113

114-
asg.funcs
115-
.get_mut(func_ref)
116-
.expect("resolved function head to exist")
117-
.stmts = resolved_stmts;
118-
114+
asg.funcs[func_ref].stmts = resolved_stmts;
119115
Ok(())
120116
}
121117

@@ -138,9 +134,7 @@ fn resolve_param_vars(
138134
);
139135

140136
let ty = type_ctx.resolve(&param.ast_type, ResolveTypeOptions::Unalias)?;
141-
let function = asg.funcs.get_mut(func_ref).unwrap();
142-
143-
let key = function.vars.add_param(ty.clone());
137+
let key = asg.funcs[func_ref].vars.add_param(ty.clone());
144138

145139
if let Some(name) = &param.name {
146140
variable_haystack.put(name.clone(), ty, key);

src/components/build_asg/src/func_haystack.rs

+8-18
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ impl FuncHaystack {
105105
local_matches
106106
.chain(remote_matches)
107107
.map(|func_ref| {
108-
let function = ctx.asg.funcs.get(*func_ref).unwrap();
108+
let function = &ctx.asg.funcs[*func_ref];
109109

110110
format!(
111111
"{}({})",
@@ -124,7 +124,7 @@ impl FuncHaystack {
124124
existing_catalog: Option<PolyCatalog>,
125125
source: Source,
126126
) -> Option<Callee> {
127-
let function = ctx.asg.funcs.get(func_ref).unwrap();
127+
let function = &ctx.asg.funcs[func_ref];
128128
let params = &function.params;
129129

130130
let mut catalog = existing_catalog.unwrap_or_default();
@@ -308,22 +308,12 @@ impl FuncHaystack {
308308
.and_then(|first_type| {
309309
if let Ok(first_type) = unalias(ctx.asg, first_type) {
310310
match &first_type.kind {
311-
TypeKind::Structure(_, struct_ref, _) => Some(
312-
ctx.asg
313-
.structs
314-
.get(*struct_ref)
315-
.expect("valid struct")
316-
.name
317-
.fs_node_id,
318-
),
319-
TypeKind::Enum(_, enum_ref) => Some(
320-
ctx.asg
321-
.enums
322-
.get(*enum_ref)
323-
.expect("valid enum")
324-
.name
325-
.fs_node_id,
326-
),
311+
TypeKind::Structure(_, struct_ref, _) => {
312+
Some(ctx.asg.structs[*struct_ref].name.fs_node_id)
313+
}
314+
TypeKind::Enum(_, enum_ref) => {
315+
Some(ctx.asg.enums[*enum_ref].name.fs_node_id)
316+
}
327317
_ => None,
328318
}
329319
} else {

src/components/build_asg/src/func_head.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ pub fn create_func_head<'a>(
119119
));
120120
}
121121

122-
Ok(asg.funcs.insert(asg::Func {
122+
Ok(asg.funcs.alloc(asg::Func {
123123
name,
124124
type_params: head.type_params.clone(),
125125
params,

src/components/build_asg/src/global_variable.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub fn resolve_global_variables(
2626
let ty = type_ctx.resolve(&global.ast_type, ResolveTypeOptions::Unalias)?;
2727
let resolved_name = ResolvedName::new(module_folder_id, &Name::plain(&global.name));
2828

29-
let global_ref = asg.globals.insert(asg::Global {
29+
let global_ref = asg.globals.alloc(asg::Global {
3030
name: resolved_name,
3131
ty: ty.clone(),
3232
source: global.source,

0 commit comments

Comments
 (0)