Skip to content

Commit f4960cb

Browse files
committed
refactor(semantic): Better encapsulation of generics.rs.
1 parent 31a3eb8 commit f4960cb

File tree

4 files changed

+36
-136
lines changed

4 files changed

+36
-136
lines changed

crates/cairo-lang-semantic/src/expr/compute.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ pub fn compute_root_expr<'db>(
15311531
}
15321532
let constrains =
15331533
ctx.db.generic_params_type_constraints(ctx.resolver.data.generic_params.clone());
1534-
inference.conform_generic_params_type_constraints(&constrains);
1534+
inference.conform_generic_params_type_constraints(constrains);
15351535

15361536
let return_type = ctx.reduce_ty(return_type);
15371537
let res = compute_expr_block_semantic(ctx, syntax)?;

crates/cairo-lang-semantic/src/expr/inference/conform.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ impl<'db> Inference<'db, '_> {
831831
/// Creates a var for each constrained impl_type and conforms the types.
832832
pub fn conform_generic_params_type_constraints(
833833
&mut self,
834-
constraints: &Vec<(TypeId<'db>, TypeId<'db>)>,
834+
constraints: &[(TypeId<'db>, TypeId<'db>)],
835835
) {
836836
let mut impl_type_bounds = Default::default();
837837
for (ty0, ty1) in constraints {

crates/cairo-lang-semantic/src/items/generics.rs

Lines changed: 33 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -229,62 +229,8 @@ pub struct GenericParamsData<'db> {
229229
pub resolver_data: Arc<ResolverData<'db>>,
230230
}
231231

232-
// --- Selectors ---
233-
234-
/// Implementation of [GenericsSemantic::generic_param_semantic].
235-
fn generic_param_semantic<'db>(
236-
db: &'db dyn Database,
237-
generic_param_id: GenericParamId<'db>,
238-
) -> Maybe<GenericParam<'db>> {
239-
db.priv_generic_param_data(generic_param_id, false)?.generic_param
240-
}
241-
242-
/// Query implementation of [GenericsSemantic::generic_param_semantic].
243-
#[salsa::tracked]
244-
fn generic_param_semantic_tracked<'db>(
245-
db: &'db dyn Database,
246-
generic_param_id: GenericParamId<'db>,
247-
) -> Maybe<GenericParam<'db>> {
248-
generic_param_semantic(db, generic_param_id)
249-
}
250-
251-
/// Implementation of [GenericsSemantic::generic_param_diagnostics].
252-
fn generic_param_diagnostics<'db>(
253-
db: &'db dyn Database,
254-
generic_param_id: GenericParamId<'db>,
255-
) -> Diagnostics<'db, SemanticDiagnostic<'db>> {
256-
db.priv_generic_param_data(generic_param_id, false)
257-
.map(|data| data.diagnostics)
258-
.unwrap_or_default()
259-
}
260-
261-
/// Query implementation of [GenericsSemantic::generic_param_diagnostics].
262-
#[salsa::tracked]
263-
fn generic_param_diagnostics_tracked<'db>(
264-
db: &'db dyn Database,
265-
generic_param_id: GenericParamId<'db>,
266-
) -> Diagnostics<'db, SemanticDiagnostic<'db>> {
267-
generic_param_diagnostics(db, generic_param_id)
268-
}
269-
270-
/// Implementation of [GenericsSemantic::generic_param_resolver_data].
271-
fn generic_param_resolver_data<'db>(
272-
db: &'db dyn Database,
273-
generic_param_id: GenericParamId<'db>,
274-
) -> Maybe<Arc<ResolverData<'db>>> {
275-
Ok(db.priv_generic_param_data(generic_param_id, false)?.resolver_data)
276-
}
277-
278-
/// Query implementation of [GenericsSemantic::generic_param_resolver_data].
232+
/// Query implementation of [GenericsSemantic::generic_impl_param_trait].
279233
#[salsa::tracked]
280-
fn generic_param_resolver_data_tracked<'db>(
281-
db: &'db dyn Database,
282-
generic_param_id: GenericParamId<'db>,
283-
) -> Maybe<Arc<ResolverData<'db>>> {
284-
generic_param_resolver_data(db, generic_param_id)
285-
}
286-
287-
/// Implementation of [GenericsSemantic::generic_impl_param_trait].
288234
fn generic_impl_param_trait<'db>(
289235
db: &'db dyn Database,
290236
generic_param_id: GenericParamId<'db>,
@@ -322,28 +268,10 @@ fn generic_impl_param_trait<'db>(
322268
resolve_trait_path(db, &mut diagnostics, &mut resolver, &trait_path_syntax)
323269
}
324270

325-
/// Query implementation of [GenericsSemantic::generic_impl_param_trait].
326-
#[salsa::tracked]
327-
fn generic_impl_param_trait_tracked<'db>(
328-
db: &'db dyn Database,
329-
generic_param_id: GenericParamId<'db>,
330-
) -> Maybe<TraitId<'db>> {
331-
generic_impl_param_trait(db, generic_param_id)
332-
}
333-
334-
/// Implementation of
271+
/// Query implementation of
335272
/// [GenericsSemantic::generic_impl_param_shallow_trait_generic_args].
336-
fn generic_impl_param_shallow_trait_generic_args<'db>(
337-
db: &'db dyn Database,
338-
impl_def_id: GenericParamId<'db>,
339-
) -> Maybe<&'db [(GenericParamId<'db>, ShallowGenericArg<'db>)]> {
340-
Ok(generic_impl_param_shallow_trait_generic_args_helper(db, impl_def_id).maybe_as_ref()?)
341-
}
342-
343-
/// Helper for [generic_impl_param_shallow_trait_generic_args]
344-
/// The actual query implementation, separated to allow returning a reference.
345273
#[salsa::tracked(returns(ref))]
346-
fn generic_impl_param_shallow_trait_generic_args_helper<'db>(
274+
fn generic_impl_param_shallow_trait_generic_args<'db>(
347275
db: &'db dyn Database,
348276
generic_param_id: GenericParamId<'db>,
349277
) -> Maybe<Vec<(GenericParamId<'db>, ShallowGenericArg<'db>)>> {
@@ -447,10 +375,9 @@ fn generic_impl_param_shallow_trait_generic_args_helper<'db>(
447375
}
448376
}
449377

450-
// --- Computation ---
451-
452-
/// Implementation of [GenericsSemantic::priv_generic_param_data].
453-
fn priv_generic_param_data<'db>(
378+
/// Returns data about a generic param.
379+
#[salsa::tracked(cycle_result=generic_param_data_cycle, returns(ref))]
380+
fn generic_param_data<'db>(
454381
db: &'db dyn Database,
455382
generic_param_id: GenericParamId<'db>,
456383
in_cycle: bool,
@@ -519,28 +446,20 @@ fn priv_generic_param_data<'db>(
519446
})
520447
}
521448

522-
/// Query implementation of [GenericsSemantic::priv_generic_param_data].
523-
#[salsa::tracked(cycle_result=priv_generic_param_data_cycle)]
524-
fn priv_generic_param_data_tracked<'db>(
525-
db: &'db dyn Database,
526-
generic_param_id: GenericParamId<'db>,
527-
in_cycle: bool,
528-
) -> Maybe<GenericParamData<'db>> {
529-
priv_generic_param_data(db, generic_param_id, in_cycle)
530-
}
531-
532-
/// Cycle handling for [GenericsSemantic::priv_generic_param_data].
533-
fn priv_generic_param_data_cycle<'db>(
449+
/// Cycle handling for [generic_param_data].
450+
fn generic_param_data_cycle<'db>(
534451
db: &'db dyn Database,
535452
generic_param_id: GenericParamId<'db>,
536453
_in_cycle: bool,
537454
) -> Maybe<GenericParamData<'db>> {
538-
priv_generic_param_data(db, generic_param_id, true)
455+
generic_param_data(db, generic_param_id, true).clone()
539456
}
540457

541-
/// Implementation of [GenericsSemantic::generic_params_type_constraints].
458+
/// Query implementation of [GenericsSemantic::generic_params_type_constraints].
459+
#[salsa::tracked(returns(ref))]
542460
fn generic_params_type_constraints<'db>(
543461
db: &'db dyn Database,
462+
_tracked: Tracked,
544463
generic_params: Vec<GenericParamId<'db>>,
545464
) -> Vec<(TypeId<'db>, TypeId<'db>)> {
546465
let mut constraints = vec![];
@@ -573,23 +492,6 @@ fn generic_params_type_constraints<'db>(
573492
constraints
574493
}
575494

576-
/// Query implementation of [GenericsSemantic::generic_params_type_constraints].
577-
fn generic_params_type_constraints_tracked<'db>(
578-
db: &'db dyn Database,
579-
generic_params: Vec<GenericParamId<'db>>,
580-
) -> Vec<(TypeId<'db>, TypeId<'db>)> {
581-
generic_params_type_constraints_helper(db, (), generic_params)
582-
}
583-
584-
#[salsa::tracked]
585-
fn generic_params_type_constraints_helper<'db>(
586-
db: &'db dyn Database,
587-
_tracked: Tracked,
588-
generic_params: Vec<GenericParamId<'db>>,
589-
) -> Vec<(TypeId<'db>, TypeId<'db>)> {
590-
generic_params_type_constraints(db, generic_params)
591-
}
592-
593495
// --- Helpers ---
594496

595497
/// Returns the generic parameters list AST node of a generic parameter.
@@ -633,15 +535,11 @@ pub fn semantic_generic_params_ex<'db>(
633535
.filter_map(|param_syntax| {
634536
let generic_param_id =
635537
GenericParamLongId(module_file_id, param_syntax.stable_ptr(db)).intern(db);
636-
let generic_param_data =
637-
db.priv_generic_param_data(generic_param_id, in_cycle).ok()?;
638-
let generic_param = generic_param_data.generic_param;
639-
diagnostics.extend(generic_param_data.diagnostics);
538+
let data = generic_param_data(db, generic_param_id, in_cycle).as_ref().ok()?;
539+
let generic_param = data.generic_param.clone();
540+
diagnostics.extend(data.diagnostics.clone());
640541
resolver.add_generic_param(generic_param_id);
641-
resolver
642-
.data
643-
.used_uses
644-
.extend(generic_param_data.resolver_data.used_uses.iter().copied());
542+
resolver.data.used_uses.extend(data.resolver_data.used_uses.iter().copied());
645543
generic_param.ok()
646544
})
647545
.collect(),
@@ -849,51 +747,53 @@ pub trait GenericsSemantic<'db>: Database {
849747
&'db self,
850748
generic_param: GenericParamId<'db>,
851749
) -> Maybe<GenericParam<'db>> {
852-
generic_param_semantic_tracked(self.as_dyn_database(), generic_param)
750+
generic_param_data(self.as_dyn_database(), generic_param, false)
751+
.maybe_as_ref()?
752+
.generic_param
753+
.clone()
853754
}
854755
/// Returns the semantic diagnostics of a generic param.
855756
fn generic_param_diagnostics(
856757
&'db self,
857758
generic_param: GenericParamId<'db>,
858759
) -> Diagnostics<'db, SemanticDiagnostic<'db>> {
859-
generic_param_diagnostics_tracked(self.as_dyn_database(), generic_param)
760+
generic_param_data(self.as_dyn_database(), generic_param, false)
761+
.as_ref()
762+
.map(|data| data.diagnostics.clone())
763+
.unwrap_or_default()
860764
}
861765
/// Returns the resolver data of a generic param.
862766
fn generic_param_resolver_data(
863767
&'db self,
864768
generic_param: GenericParamId<'db>,
865769
) -> Maybe<Arc<ResolverData<'db>>> {
866-
generic_param_resolver_data_tracked(self.as_dyn_database(), generic_param)
770+
Ok(generic_param_data(self.as_dyn_database(), generic_param, false)
771+
.maybe_as_ref()?
772+
.resolver_data
773+
.clone())
867774
}
868775
/// Returns the trait a generic param impl should implement.
869776
/// Panics if the generic param is not an impl generic param.
870777
fn generic_impl_param_trait(
871778
&'db self,
872779
generic_param_id: GenericParamId<'db>,
873780
) -> Maybe<TraitId<'db>> {
874-
generic_impl_param_trait_tracked(self.as_dyn_database(), generic_param_id)
781+
generic_impl_param_trait(self.as_dyn_database(), generic_param_id)
875782
}
876783
/// Returns the shallow generic args of a generic impl param.
877784
fn generic_impl_param_shallow_trait_generic_args(
878785
&'db self,
879786
generic_param: GenericParamId<'db>,
880787
) -> Maybe<&'db [(GenericParamId<'db>, ShallowGenericArg<'db>)]> {
881-
generic_impl_param_shallow_trait_generic_args(self.as_dyn_database(), generic_param)
882-
}
883-
/// Private query to compute data about a generic param.
884-
fn priv_generic_param_data(
885-
&'db self,
886-
generic_param: GenericParamId<'db>,
887-
in_cycle: bool,
888-
) -> Maybe<GenericParamData<'db>> {
889-
priv_generic_param_data_tracked(self.as_dyn_database(), generic_param, in_cycle)
788+
Ok(generic_impl_param_shallow_trait_generic_args(self.as_dyn_database(), generic_param)
789+
.maybe_as_ref()?)
890790
}
891791
/// Returns the type constraints introduced by the generic params.
892792
fn generic_params_type_constraints(
893793
&'db self,
894794
generic_params: Vec<GenericParamId<'db>>,
895-
) -> Vec<(TypeId<'db>, TypeId<'db>)> {
896-
generic_params_type_constraints_tracked(self.as_dyn_database(), generic_params)
795+
) -> &'db [(TypeId<'db>, TypeId<'db>)] {
796+
generic_params_type_constraints(self.as_dyn_database(), (), generic_params)
897797
}
898798
}
899799
impl<'db, T: Database + ?Sized> GenericsSemantic<'db> for T {}

crates/cairo-lang-semantic/src/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ pub fn get_impl_at_context<'db>(
782782
}
783783
let mut inference_data = InferenceData::new(InferenceId::NoContext);
784784
let mut inference = inference_data.inference(db);
785-
inference.conform_generic_params_type_constraints(&constrains);
785+
inference.conform_generic_params_type_constraints(constrains);
786786
// It's ok to consume the errors without reporting as this is a helper function meant to find an
787787
// impl and return it, but it's ok if the impl can't be found.
788788
let impl_id = inference.new_impl_var(concrete_trait_id, stable_ptr, lookup_context);

0 commit comments

Comments
 (0)