@@ -4,7 +4,7 @@ use cairo_lang_defs::db::DefsGroup;
4
4
use cairo_lang_defs:: ids:: {
5
5
ImplAliasId , ImplDefId , LanguageElementId , LookupItemId , ModuleFileId , ModuleItemId ,
6
6
} ;
7
- use cairo_lang_diagnostics:: { Diagnostics , Maybe , skip_diagnostic} ;
7
+ use cairo_lang_diagnostics:: { Diagnostics , Maybe , MaybeAsRef , skip_diagnostic} ;
8
8
use cairo_lang_proc_macros:: DebugWithDb ;
9
9
use cairo_lang_syntax:: attribute:: structured:: { Attribute , AttributeListStructurize } ;
10
10
use cairo_lang_syntax:: node:: { TypedStablePtr , TypedSyntaxNode , ast} ;
@@ -33,16 +33,18 @@ pub struct ImplAliasData<'db> {
33
33
pub resolver_data : Arc < ResolverData < ' db > > ,
34
34
}
35
35
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 > (
38
39
db : & ' db dyn Database ,
39
40
impl_alias_id : ImplAliasId < ' db > ,
40
41
in_cycle : bool ,
41
42
) -> Maybe < ImplAliasData < ' db > > {
42
43
let lookup_item_id = LookupItemId :: ModuleItem ( ModuleItemId :: ImplAlias ( impl_alias_id) ) ;
43
44
let impl_alias_ast = db. module_impl_alias_by_id ( impl_alias_id) ?;
44
45
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 ( ) ;
46
48
47
49
if in_cycle {
48
50
impl_alias_semantic_data_cycle_helper (
@@ -56,16 +58,6 @@ pub fn priv_impl_alias_semantic_data<'db>(
56
58
}
57
59
}
58
60
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
-
69
61
/// A helper function to compute the semantic data of an impl-alias item.
70
62
pub fn impl_alias_semantic_data_helper < ' db > (
71
63
db : & ' db dyn Database ,
@@ -114,13 +106,12 @@ pub fn impl_alias_semantic_data_helper<'db>(
114
106
} )
115
107
}
116
108
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 > (
119
110
db : & ' db dyn Database ,
120
111
impl_alias_id : ImplAliasId < ' db > ,
121
112
_in_cycle : bool ,
122
113
) -> 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 ( )
124
115
}
125
116
126
117
/// 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>(
151
142
} )
152
143
}
153
144
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 > (
218
148
db : & ' db dyn Database ,
219
149
impl_alias_id : ImplAliasId < ' db > ,
220
150
) -> Maybe < GenericParamsData < ' db > > {
@@ -229,15 +159,6 @@ pub fn impl_alias_generic_params_data<'db>(
229
159
)
230
160
}
231
161
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
-
241
162
/// Computes data about the generic parameters of an impl-alias item.
242
163
pub fn impl_alias_generic_params_data_helper < ' db > (
243
164
db : & ' db dyn Database ,
@@ -272,51 +193,9 @@ pub fn impl_alias_generic_params_data_helper<'db>(
272
193
Ok ( GenericParamsData { diagnostics : diagnostics. build ( ) , generic_params, resolver_data } )
273
194
}
274
195
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
-
318
196
/// 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 > (
320
199
db : & ' db dyn Database ,
321
200
impl_alias_id : ImplAliasId < ' db > ,
322
201
) -> Maybe < ImplDefId < ' db > > {
@@ -339,83 +218,62 @@ pub fn impl_alias_impl_def<'db>(
339
218
Ok ( ResolvedGenericItem :: Impl ( imp) ) => Ok ( imp) ,
340
219
Ok ( ResolvedGenericItem :: GenericImplAlias ( impl_alias) ) => db. impl_alias_impl_def ( impl_alias) ,
341
220
// 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.
343
222
_ => Err ( skip_diagnostic ( ) ) ,
344
223
}
345
224
}
346
225
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
-
356
226
/// 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 > (
358
228
_db : & dyn Database ,
359
229
_impl_alias_id : ImplAliasId < ' db > ,
360
230
) -> Maybe < ImplDefId < ' db > > {
361
231
// 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.
363
233
Err ( skip_diagnostic ( ) )
364
234
}
365
235
366
236
/// Trait for impl-alias-related semantic queries.
367
237
pub trait ImplAliasSemantic < ' db > : Database {
368
238
/// Returns the impl definition pointed to by the impl alias, or an error if it points to
369
239
/// 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)
380
242
}
381
243
/// Returns the semantic diagnostics of a type alias.
382
244
fn impl_alias_semantic_diagnostics (
383
245
& ' db self ,
384
- impl_alias_id : ImplAliasId < ' db > ,
246
+ id : ImplAliasId < ' db > ,
385
247
) -> 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 ( )
387
252
}
388
253
/// 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
391
256
}
392
257
/// 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 ( ) )
405
263
}
406
264
/// 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 ( ) )
412
270
}
413
271
/// 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 ( ) )
419
277
}
420
278
}
421
279
impl < ' db , T : Database + ?Sized > ImplAliasSemantic < ' db > for T { }
0 commit comments