Skip to content

Commit 9094f61

Browse files
committed
refactor(semantic): Encapsulate impl alias item.
1 parent f4960cb commit 9094f61

File tree

1 file changed

+40
-182
lines changed

1 file changed

+40
-182
lines changed

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

Lines changed: 40 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use cairo_lang_defs::db::DefsGroup;
44
use cairo_lang_defs::ids::{
55
ImplAliasId, ImplDefId, LanguageElementId, LookupItemId, ModuleFileId, ModuleItemId,
66
};
7-
use cairo_lang_diagnostics::{Diagnostics, Maybe, skip_diagnostic};
7+
use cairo_lang_diagnostics::{Diagnostics, Maybe, MaybeAsRef, skip_diagnostic};
88
use cairo_lang_proc_macros::DebugWithDb;
99
use cairo_lang_syntax::attribute::structured::{Attribute, AttributeListStructurize};
1010
use cairo_lang_syntax::node::{TypedStablePtr, TypedSyntaxNode, ast};
@@ -33,16 +33,18 @@ pub struct ImplAliasData<'db> {
3333
pub resolver_data: Arc<ResolverData<'db>>,
3434
}
3535

36-
/// Implementation of [ImplAliasSemantic::priv_impl_alias_semantic_data].
37-
pub fn priv_impl_alias_semantic_data<'db>(
36+
/// Returns data about a type alias.
37+
#[salsa::tracked(cycle_result=impl_alias_semantic_data_cycle, returns(ref))]
38+
fn impl_alias_semantic_data<'db>(
3839
db: &'db dyn Database,
3940
impl_alias_id: ImplAliasId<'db>,
4041
in_cycle: bool,
4142
) -> Maybe<ImplAliasData<'db>> {
4243
let lookup_item_id = LookupItemId::ModuleItem(ModuleItemId::ImplAlias(impl_alias_id));
4344
let impl_alias_ast = db.module_impl_alias_by_id(impl_alias_id)?;
4445

45-
let generic_params_data = db.impl_alias_generic_params_data(impl_alias_id)?;
46+
let generic_params_data =
47+
impl_alias_generic_params_data(db, impl_alias_id).maybe_as_ref()?.clone();
4648

4749
if in_cycle {
4850
impl_alias_semantic_data_cycle_helper(
@@ -56,16 +58,6 @@ pub fn priv_impl_alias_semantic_data<'db>(
5658
}
5759
}
5860

59-
/// Query implementation of [ImplAliasSemantic::priv_impl_alias_semantic_data].
60-
#[salsa::tracked(cycle_result=priv_impl_alias_semantic_data_cycle)]
61-
pub fn priv_impl_alias_semantic_data_tracked<'db>(
62-
db: &'db dyn Database,
63-
impl_alias_id: ImplAliasId<'db>,
64-
in_cycle: bool,
65-
) -> Maybe<ImplAliasData<'db>> {
66-
priv_impl_alias_semantic_data(db, impl_alias_id, in_cycle)
67-
}
68-
6961
/// A helper function to compute the semantic data of an impl-alias item.
7062
pub fn impl_alias_semantic_data_helper<'db>(
7163
db: &'db dyn Database,
@@ -114,13 +106,12 @@ pub fn impl_alias_semantic_data_helper<'db>(
114106
})
115107
}
116108

117-
/// Cycle handling for [ImplAliasSemantic::priv_impl_alias_semantic_data].
118-
pub fn priv_impl_alias_semantic_data_cycle<'db>(
109+
fn impl_alias_semantic_data_cycle<'db>(
119110
db: &'db dyn Database,
120111
impl_alias_id: ImplAliasId<'db>,
121112
_in_cycle: bool,
122113
) -> Maybe<ImplAliasData<'db>> {
123-
priv_impl_alias_semantic_data(db, impl_alias_id, true)
114+
impl_alias_semantic_data(db, impl_alias_id, true).clone()
124115
}
125116

126117
/// A helper function to compute the semantic data of an impl-alias item when a cycle is detected.
@@ -151,70 +142,9 @@ pub fn impl_alias_semantic_data_cycle_helper<'db>(
151142
})
152143
}
153144

154-
/// Implementation of [ImplAliasSemantic::impl_alias_semantic_diagnostics].
155-
pub fn impl_alias_semantic_diagnostics<'db>(
156-
db: &'db dyn Database,
157-
impl_alias_id: ImplAliasId<'db>,
158-
) -> Diagnostics<'db, SemanticDiagnostic<'db>> {
159-
db.priv_impl_alias_semantic_data(impl_alias_id, false)
160-
.map(|data| data.diagnostics)
161-
.unwrap_or_default()
162-
}
163-
164-
/// Query implementation of [ImplAliasSemantic::impl_alias_semantic_diagnostics].
165-
#[salsa::tracked]
166-
pub fn impl_alias_semantic_diagnostics_tracked<'db>(
167-
db: &'db dyn Database,
168-
impl_alias_id: ImplAliasId<'db>,
169-
) -> Diagnostics<'db, SemanticDiagnostic<'db>> {
170-
impl_alias_semantic_diagnostics(db, impl_alias_id)
171-
}
172-
173-
/// Implementation of [ImplAliasSemantic::impl_alias_resolved_impl].
174-
pub fn impl_alias_resolved_impl<'db>(
175-
db: &'db dyn Database,
176-
impl_alias_id: ImplAliasId<'db>,
177-
) -> Maybe<ImplId<'db>> {
178-
db.priv_impl_alias_semantic_data(impl_alias_id, false)?.resolved_impl
179-
}
180-
181-
/// Query implementation of [ImplAliasSemantic::impl_alias_resolved_impl].
182-
#[salsa::tracked(cycle_result=impl_alias_resolved_impl_cycle)]
183-
pub fn impl_alias_resolved_impl_tracked<'db>(
184-
db: &'db dyn Database,
185-
impl_alias_id: ImplAliasId<'db>,
186-
) -> Maybe<ImplId<'db>> {
187-
impl_alias_resolved_impl(db, impl_alias_id)
188-
}
189-
190-
/// Trivial cycle handling for [ImplAliasSemantic::impl_alias_resolved_impl].
191-
pub fn impl_alias_resolved_impl_cycle<'db>(
192-
db: &'db dyn Database,
193-
impl_alias_id: ImplAliasId<'db>,
194-
) -> Maybe<ImplId<'db>> {
195-
// Forwarding (not as a query) cycle handling to `priv_impl_alias_semantic_data` cycle handler.
196-
db.priv_impl_alias_semantic_data(impl_alias_id, true)?.resolved_impl
197-
}
198-
199-
/// Implementation of [ImplAliasSemantic::impl_alias_generic_params].
200-
pub fn impl_alias_generic_params<'db>(
201-
db: &'db dyn Database,
202-
impl_alias_id: ImplAliasId<'db>,
203-
) -> Maybe<Vec<GenericParam<'db>>> {
204-
Ok(db.impl_alias_generic_params_data(impl_alias_id)?.generic_params)
205-
}
206-
207-
/// Query implementation of [ImplAliasSemantic::impl_alias_generic_params].
208-
#[salsa::tracked]
209-
pub fn impl_alias_generic_params_tracked<'db>(
210-
db: &'db dyn Database,
211-
impl_alias_id: ImplAliasId<'db>,
212-
) -> Maybe<Vec<GenericParam<'db>>> {
213-
impl_alias_generic_params(db, impl_alias_id)
214-
}
215-
216-
/// Implementation of [ImplAliasSemantic::impl_alias_generic_params_data].
217-
pub fn impl_alias_generic_params_data<'db>(
145+
/// Returns the generic parameters data of a type alias.
146+
#[salsa::tracked(returns(ref))]
147+
fn impl_alias_generic_params_data<'db>(
218148
db: &'db dyn Database,
219149
impl_alias_id: ImplAliasId<'db>,
220150
) -> Maybe<GenericParamsData<'db>> {
@@ -229,15 +159,6 @@ pub fn impl_alias_generic_params_data<'db>(
229159
)
230160
}
231161

232-
/// Query implementation of [ImplAliasSemantic::impl_alias_generic_params_data].
233-
#[salsa::tracked]
234-
pub fn impl_alias_generic_params_data_tracked<'db>(
235-
db: &'db dyn Database,
236-
impl_alias_id: ImplAliasId<'db>,
237-
) -> Maybe<GenericParamsData<'db>> {
238-
impl_alias_generic_params_data(db, impl_alias_id)
239-
}
240-
241162
/// Computes data about the generic parameters of an impl-alias item.
242163
pub fn impl_alias_generic_params_data_helper<'db>(
243164
db: &'db dyn Database,
@@ -272,51 +193,9 @@ pub fn impl_alias_generic_params_data_helper<'db>(
272193
Ok(GenericParamsData { diagnostics: diagnostics.build(), generic_params, resolver_data })
273194
}
274195

275-
/// Implementation of [ImplAliasSemantic::impl_alias_resolver_data].
276-
pub fn impl_alias_resolver_data<'db>(
277-
db: &'db dyn Database,
278-
impl_alias_id: ImplAliasId<'db>,
279-
) -> Maybe<Arc<ResolverData<'db>>> {
280-
Ok(db.priv_impl_alias_semantic_data(impl_alias_id, false)?.resolver_data)
281-
}
282-
283-
/// Query implementation of [ImplAliasSemantic::impl_alias_resolver_data].
284-
#[salsa::tracked(cycle_result=impl_alias_resolver_data_cycle)]
285-
pub fn impl_alias_resolver_data_tracked<'db>(
286-
db: &'db dyn Database,
287-
impl_alias_id: ImplAliasId<'db>,
288-
) -> Maybe<Arc<ResolverData<'db>>> {
289-
impl_alias_resolver_data(db, impl_alias_id)
290-
}
291-
292-
/// Trivial cycle handling for [ImplAliasSemantic::impl_alias_resolver_data].
293-
pub fn impl_alias_resolver_data_cycle<'db>(
294-
db: &'db dyn Database,
295-
impl_alias_id: ImplAliasId<'db>,
296-
) -> Maybe<Arc<ResolverData<'db>>> {
297-
// Forwarding (not as a query) cycle handling to `priv_impl_alias_semantic_data` cycle handler.
298-
impl_alias_resolver_data(db, impl_alias_id)
299-
}
300-
301-
/// Implementation of [ImplAliasSemantic::impl_alias_attributes].
302-
pub fn impl_alias_attributes<'db>(
303-
db: &'db dyn Database,
304-
impl_alias_id: ImplAliasId<'db>,
305-
) -> Maybe<Vec<Attribute<'db>>> {
306-
Ok(db.priv_impl_alias_semantic_data(impl_alias_id, false)?.attributes)
307-
}
308-
309-
/// Query implementation of [ImplAliasSemantic::impl_alias_attributes].
310-
#[salsa::tracked]
311-
pub fn impl_alias_attributes_tracked<'db>(
312-
db: &'db dyn Database,
313-
impl_alias_id: ImplAliasId<'db>,
314-
) -> Maybe<Vec<Attribute<'db>>> {
315-
impl_alias_attributes(db, impl_alias_id)
316-
}
317-
318196
/// Implementation of [ImplAliasSemantic::impl_alias_impl_def].
319-
pub fn impl_alias_impl_def<'db>(
197+
#[salsa::tracked(cycle_result=impl_alias_impl_def_cycle)]
198+
fn impl_alias_impl_def<'db>(
320199
db: &'db dyn Database,
321200
impl_alias_id: ImplAliasId<'db>,
322201
) -> Maybe<ImplDefId<'db>> {
@@ -339,83 +218,62 @@ pub fn impl_alias_impl_def<'db>(
339218
Ok(ResolvedGenericItem::Impl(imp)) => Ok(imp),
340219
Ok(ResolvedGenericItem::GenericImplAlias(impl_alias)) => db.impl_alias_impl_def(impl_alias),
341220
// Skipping diagnostics since we will get these through when resolving in the
342-
// `priv_impl_alias_semantic_data` query.
221+
// `impl_alias_semantic_data` query.
343222
_ => Err(skip_diagnostic()),
344223
}
345224
}
346225

347-
/// Query implementation of [ImplAliasSemantic::impl_alias_impl_def].
348-
#[salsa::tracked(cycle_result=impl_alias_impl_def_cycle)]
349-
pub fn impl_alias_impl_def_tracked<'db>(
350-
db: &'db dyn Database,
351-
impl_alias_id: ImplAliasId<'db>,
352-
) -> Maybe<ImplDefId<'db>> {
353-
impl_alias_impl_def(db, impl_alias_id)
354-
}
355-
356226
/// Cycle handling for [ImplAliasSemantic::impl_alias_impl_def].
357-
pub fn impl_alias_impl_def_cycle<'db>(
227+
fn impl_alias_impl_def_cycle<'db>(
358228
_db: &dyn Database,
359229
_impl_alias_id: ImplAliasId<'db>,
360230
) -> Maybe<ImplDefId<'db>> {
361231
// Skipping diagnostics since we will get these through when resolving in the
362-
// `priv_impl_alias_semantic_data` query.
232+
// `impl_alias_semantic_data` query.
363233
Err(skip_diagnostic())
364234
}
365235

366236
/// Trait for impl-alias-related semantic queries.
367237
pub trait ImplAliasSemantic<'db>: Database {
368238
/// Returns the impl definition pointed to by the impl alias, or an error if it points to
369239
/// something else.
370-
fn impl_alias_impl_def(&'db self, impl_alias_id: ImplAliasId<'db>) -> Maybe<ImplDefId<'db>> {
371-
impl_alias_impl_def_tracked(self.as_dyn_database(), impl_alias_id)
372-
}
373-
/// Private query to compute data about a type alias.
374-
fn priv_impl_alias_semantic_data(
375-
&'db self,
376-
impl_alias_id: ImplAliasId<'db>,
377-
in_cycle: bool,
378-
) -> Maybe<ImplAliasData<'db>> {
379-
priv_impl_alias_semantic_data_tracked(self.as_dyn_database(), impl_alias_id, in_cycle)
240+
fn impl_alias_impl_def(&'db self, id: ImplAliasId<'db>) -> Maybe<ImplDefId<'db>> {
241+
impl_alias_impl_def(self.as_dyn_database(), id)
380242
}
381243
/// Returns the semantic diagnostics of a type alias.
382244
fn impl_alias_semantic_diagnostics(
383245
&'db self,
384-
impl_alias_id: ImplAliasId<'db>,
246+
id: ImplAliasId<'db>,
385247
) -> Diagnostics<'db, SemanticDiagnostic<'db>> {
386-
impl_alias_semantic_diagnostics_tracked(self.as_dyn_database(), impl_alias_id)
248+
impl_alias_semantic_data(self.as_dyn_database(), id, false)
249+
.as_ref()
250+
.map(|data| data.diagnostics.clone())
251+
.unwrap_or_default()
387252
}
388253
/// Returns the resolved type of a type alias.
389-
fn impl_alias_resolved_impl(&'db self, impl_alias_id: ImplAliasId<'db>) -> Maybe<ImplId<'db>> {
390-
impl_alias_resolved_impl_tracked(self.as_dyn_database(), impl_alias_id)
254+
fn impl_alias_resolved_impl(&'db self, id: ImplAliasId<'db>) -> Maybe<ImplId<'db>> {
255+
impl_alias_semantic_data(self.as_dyn_database(), id, false).maybe_as_ref()?.resolved_impl
391256
}
392257
/// Returns the generic parameters of a type alias.
393-
fn impl_alias_generic_params(
394-
&'db self,
395-
impl_alias_id: ImplAliasId<'db>,
396-
) -> Maybe<Vec<GenericParam<'db>>> {
397-
impl_alias_generic_params_tracked(self.as_dyn_database(), impl_alias_id)
398-
}
399-
/// Returns the generic parameters data of a type alias.
400-
fn impl_alias_generic_params_data(
401-
&'db self,
402-
impl_alias_id: ImplAliasId<'db>,
403-
) -> Maybe<GenericParamsData<'db>> {
404-
impl_alias_generic_params_data_tracked(self.as_dyn_database(), impl_alias_id)
258+
fn impl_alias_generic_params(&'db self, id: ImplAliasId<'db>) -> Maybe<Vec<GenericParam<'db>>> {
259+
Ok(impl_alias_semantic_data(self.as_dyn_database(), id, false)
260+
.maybe_as_ref()?
261+
.generic_params
262+
.clone())
405263
}
406264
/// Returns the resolution resolved_items of a type alias.
407-
fn impl_alias_resolver_data(
408-
&'db self,
409-
impl_alias_id: ImplAliasId<'db>,
410-
) -> Maybe<Arc<ResolverData<'db>>> {
411-
impl_alias_resolver_data_tracked(self.as_dyn_database(), impl_alias_id)
265+
fn impl_alias_resolver_data(&'db self, id: ImplAliasId<'db>) -> Maybe<Arc<ResolverData<'db>>> {
266+
Ok(impl_alias_semantic_data(self.as_dyn_database(), id, false)
267+
.maybe_as_ref()?
268+
.resolver_data
269+
.clone())
412270
}
413271
/// Returns the attributes attached to the impl alias.
414-
fn impl_alias_attributes(
415-
&'db self,
416-
impl_def_id: ImplAliasId<'db>,
417-
) -> Maybe<Vec<Attribute<'db>>> {
418-
impl_alias_attributes_tracked(self.as_dyn_database(), impl_def_id)
272+
fn impl_alias_attributes(&'db self, id: ImplAliasId<'db>) -> Maybe<Vec<Attribute<'db>>> {
273+
Ok(impl_alias_semantic_data(self.as_dyn_database(), id, false)
274+
.maybe_as_ref()?
275+
.attributes
276+
.clone())
419277
}
420278
}
421279
impl<'db, T: Database + ?Sized> ImplAliasSemantic<'db> for T {}

0 commit comments

Comments
 (0)