cairo_lang_semantic/
db.rs

1use std::sync::Arc;
2
3use cairo_lang_defs::db::DefsGroup;
4use cairo_lang_defs::diagnostic_utils::StableLocation;
5use cairo_lang_defs::ids::{
6    ConstantId, EnumId, ExternFunctionId, ExternTypeId, FreeFunctionId, FunctionTitleId,
7    FunctionWithBodyId, GenericParamId, GenericTypeId, GlobalUseId, ImplAliasId, ImplConstantDefId,
8    ImplDefId, ImplFunctionId, ImplImplDefId, ImplItemId, ImplTypeDefId, LanguageElementId,
9    LookupItemId, ModuleFileId, ModuleId, ModuleItemId, ModuleTypeAliasId, StructId,
10    TraitConstantId, TraitFunctionId, TraitId, TraitImplId, TraitItemId, TraitTypeId, UseId,
11    VariantId,
12};
13use cairo_lang_diagnostics::{Diagnostics, DiagnosticsBuilder, Maybe};
14use cairo_lang_filesystem::db::{AsFilesGroupMut, FilesGroup};
15use cairo_lang_filesystem::ids::{CrateId, FileId, FileLongId};
16use cairo_lang_parser::db::ParserGroup;
17use cairo_lang_syntax::attribute::structured::Attribute;
18use cairo_lang_syntax::node::{TypedStablePtr, ast};
19use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
20use cairo_lang_utils::ordered_hash_set::OrderedHashSet;
21use cairo_lang_utils::{LookupIntern, Upcast, require};
22use smol_str::SmolStr;
23
24use crate::diagnostic::SemanticDiagnosticKind;
25use crate::expr::inference::{self, ImplVar, ImplVarId};
26use crate::items::constant::{ConstValueId, Constant, ImplConstantId};
27use crate::items::function_with_body::FunctionBody;
28use crate::items::functions::{ImplicitPrecedence, InlineConfiguration};
29use crate::items::generics::{GenericParam, GenericParamData, GenericParamsData};
30use crate::items::imp::{
31    ImplId, ImplImplId, ImplLookupContext, ImplicitImplImplData, UninferredImpl,
32};
33use crate::items::module::{ModuleItemInfo, ModuleSemanticData};
34use crate::items::trt::{
35    ConcreteTraitGenericFunctionId, ConcreteTraitId, TraitItemConstantData, TraitItemImplData,
36    TraitItemTypeData,
37};
38use crate::items::us::{ImportedModules, SemanticUseEx};
39use crate::items::visibility::Visibility;
40use crate::plugin::AnalyzerPlugin;
41use crate::resolve::{ResolvedConcreteItem, ResolvedGenericItem, ResolverData};
42use crate::substitution::GenericSubstitution;
43use crate::types::{ImplTypeId, TypeSizeInformation};
44use crate::{
45    FunctionId, Parameter, SemanticDiagnostic, TypeId, corelib, items, lsp_helpers, semantic, types,
46};
47
48/// Helper trait to make sure we can always get a `dyn SemanticGroup + 'static` from a
49/// SemanticGroup.
50pub trait Elongate {
51    fn elongate(&self) -> &(dyn SemanticGroup + 'static);
52}
53
54// Salsa database interface.
55// All queries starting with priv_ are for internal use only by this crate.
56// They appear in the public API because of salsa limitations.
57// We differentiate between the declaration and the definition of each item:
58// Declarations and definitions must not depend on other definitions, only other declarations.
59// This prevents cycles where there shouldn't be any.
60#[salsa::query_group(SemanticDatabase)]
61pub trait SemanticGroup:
62    DefsGroup
63    + Upcast<dyn DefsGroup>
64    + Upcast<dyn ParserGroup>
65    + Upcast<dyn FilesGroup>
66    + AsFilesGroupMut
67    + Elongate
68{
69    #[salsa::interned]
70    fn intern_function(&self, id: items::functions::FunctionLongId) -> semantic::FunctionId;
71    #[salsa::interned]
72    fn intern_concrete_function_with_body(
73        &self,
74        id: items::functions::ConcreteFunctionWithBody,
75    ) -> semantic::ConcreteFunctionWithBodyId;
76    #[salsa::interned]
77    fn intern_concrete_struct(&self, id: types::ConcreteStructLongId) -> types::ConcreteStructId;
78    #[salsa::interned]
79    fn intern_concrete_enum(&self, id: types::ConcreteEnumLongId) -> types::ConcreteEnumId;
80    #[salsa::interned]
81    fn intern_concrete_extern_type(
82        &self,
83        id: types::ConcreteExternTypeLongId,
84    ) -> types::ConcreteExternTypeId;
85    #[salsa::interned]
86    fn intern_concrete_trait(
87        &self,
88        id: items::trt::ConcreteTraitLongId,
89    ) -> items::trt::ConcreteTraitId;
90    #[salsa::interned]
91    fn intern_concrete_trait_function(
92        &self,
93        id: items::trt::ConcreteTraitGenericFunctionLongId,
94    ) -> items::trt::ConcreteTraitGenericFunctionId;
95    #[salsa::interned]
96    fn intern_concrete_trait_type(
97        &self,
98        id: items::trt::ConcreteTraitTypeLongId,
99    ) -> items::trt::ConcreteTraitTypeId;
100    #[salsa::interned]
101    fn intern_concrete_trait_constant(
102        &self,
103        id: items::trt::ConcreteTraitConstantLongId,
104    ) -> items::trt::ConcreteTraitConstantId;
105    #[salsa::interned]
106    fn intern_concrete_impl(
107        &self,
108        id: items::imp::ConcreteImplLongId,
109    ) -> items::imp::ConcreteImplId;
110    #[salsa::interned]
111    fn intern_concrete_trait_impl(
112        &self,
113        id: items::trt::ConcreteTraitImplLongId,
114    ) -> items::trt::ConcreteTraitImplId;
115    #[salsa::interned]
116    fn intern_type(&self, id: types::TypeLongId) -> semantic::TypeId;
117    #[salsa::interned]
118    fn intern_const_value(&self, id: items::constant::ConstValue) -> items::constant::ConstValueId;
119    #[salsa::interned]
120    fn intern_impl(&self, id: items::imp::ImplLongId) -> items::imp::ImplId;
121    #[salsa::interned]
122    fn intern_impl_var(&self, id: ImplVar) -> ImplVarId;
123
124    #[salsa::interned]
125    fn intern_generated_impl(
126        &self,
127        id: items::imp::GeneratedImplLongId,
128    ) -> items::imp::GeneratedImplId;
129
130    #[salsa::interned]
131    fn intern_uninferred_generated_impl(
132        &self,
133        id: items::imp::UninferredGeneratedImplLongId,
134    ) -> items::imp::UninferredGeneratedImplId;
135
136    // Const.
137    // ====
138    /// Private query to compute data about a constant definition.
139    #[salsa::invoke(items::constant::priv_constant_semantic_data)]
140    #[salsa::cycle(items::constant::priv_constant_semantic_data_cycle)]
141    fn priv_constant_semantic_data(
142        &self,
143        const_id: ConstantId,
144        in_cycle: bool,
145    ) -> Maybe<items::constant::ConstantData>;
146    /// Returns the semantic diagnostics of a constant definition.
147    #[salsa::invoke(items::constant::constant_semantic_diagnostics)]
148    fn constant_semantic_diagnostics(
149        &self,
150        const_id: ConstantId,
151    ) -> Diagnostics<SemanticDiagnostic>;
152    /// Returns the semantic data of a constant definition.
153    #[salsa::invoke(items::constant::constant_semantic_data)]
154    #[salsa::cycle(items::constant::constant_semantic_data_cycle)]
155    fn constant_semantic_data(&self, use_id: ConstantId) -> Maybe<Constant>;
156    #[salsa::invoke(items::constant::constant_resolver_data)]
157    #[salsa::cycle(items::constant::constant_resolver_data_cycle)]
158    fn constant_resolver_data(&self, use_id: ConstantId) -> Maybe<Arc<ResolverData>>;
159    #[salsa::invoke(items::constant::constant_const_value)]
160    #[salsa::cycle(items::constant::constant_const_value_cycle)]
161    fn constant_const_value(&self, const_id: ConstantId) -> Maybe<ConstValueId>;
162    #[salsa::invoke(items::constant::constant_const_type)]
163    #[salsa::cycle(items::constant::constant_const_type_cycle)]
164    fn constant_const_type(&self, const_id: ConstantId) -> Maybe<TypeId>;
165
166    // Use.
167    // ====
168    /// Private query to compute data about a use.
169    #[salsa::invoke(items::us::priv_use_semantic_data)]
170    #[salsa::cycle(items::us::priv_use_semantic_data_cycle)]
171    fn priv_use_semantic_data(&self, use_id: UseId) -> Maybe<items::us::UseData>;
172    /// Returns the semantic diagnostics of a use.
173    #[salsa::invoke(items::us::use_semantic_diagnostics)]
174    fn use_semantic_diagnostics(&self, use_id: UseId) -> Diagnostics<SemanticDiagnostic>;
175    #[salsa::invoke(items::us::use_resolver_data)]
176    #[salsa::cycle(items::us::use_resolver_data_cycle)]
177    fn use_resolver_data(&self, use_id: UseId) -> Maybe<Arc<ResolverData>>;
178
179    // Global Use.
180    // ====
181    /// Private query to compute data about a global use.
182    #[salsa::invoke(items::us::priv_global_use_semantic_data)]
183    #[salsa::cycle(items::us::priv_global_use_semantic_data_cycle)]
184    fn priv_global_use_semantic_data(
185        &self,
186        global_use_id: GlobalUseId,
187    ) -> Maybe<items::us::UseGlobalData>;
188    /// Private query to compute the imported module, given a global use.
189    #[salsa::invoke(items::us::priv_global_use_imported_module)]
190    fn priv_global_use_imported_module(&self, global_use_id: GlobalUseId) -> Maybe<ModuleId>;
191    /// Returns the semantic diagnostics of a global use.
192    #[salsa::invoke(items::us::global_use_semantic_diagnostics)]
193    fn global_use_semantic_diagnostics(
194        &self,
195        global_use_id: GlobalUseId,
196    ) -> Diagnostics<SemanticDiagnostic>;
197    /// Private query to compute the imported modules of a module, using global uses.
198    #[salsa::invoke(items::us::priv_module_use_star_modules)]
199    fn priv_module_use_star_modules(&self, module_id: ModuleId) -> Arc<ImportedModules>;
200
201    // Module.
202    // ====
203
204    /// Private query to compute data about the module.
205    #[salsa::invoke(items::module::priv_module_semantic_data)]
206    fn priv_module_semantic_data(&self, module_id: ModuleId) -> Maybe<Arc<ModuleSemanticData>>;
207
208    /// Returns [Maybe::Err] if the module was not properly resolved.
209    /// Returns [Maybe::Ok(Option::None)] if the item does not exist.
210    #[salsa::invoke(items::module::module_item_by_name)]
211    fn module_item_by_name(
212        &self,
213        module_id: ModuleId,
214        name: SmolStr,
215    ) -> Maybe<Option<ModuleItemId>>;
216
217    /// Returns [Maybe::Err] if the module was not properly resolved.
218    /// Returns [Maybe::Ok(Option::None)] if the item does not exist.
219    #[salsa::invoke(items::module::module_item_info_by_name)]
220    fn module_item_info_by_name(
221        &self,
222        module_id: ModuleId,
223        name: SmolStr,
224    ) -> Maybe<Option<ModuleItemInfo>>;
225
226    /// Returns all the items used within the module.
227    #[salsa::invoke(items::module::module_all_used_items)]
228    fn module_all_used_items(
229        &self,
230        module_id: ModuleId,
231    ) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
232
233    /// Returns the attributes of a module.
234    #[salsa::invoke(items::module::module_attributes)]
235    fn module_attributes(&self, module_id: ModuleId) -> Maybe<Vec<Attribute>>;
236
237    /// Finds all the trait ids usable in the module.
238    #[salsa::invoke(items::module::module_usable_trait_ids)]
239    fn module_usable_trait_ids(
240        &self,
241        module_id: ModuleId,
242    ) -> Maybe<Arc<OrderedHashMap<TraitId, LookupItemId>>>;
243
244    // Struct.
245    // =======
246    /// Private query to compute data about a struct declaration.
247    #[salsa::invoke(items::structure::priv_struct_declaration_data)]
248    fn priv_struct_declaration_data(
249        &self,
250        struct_id: StructId,
251    ) -> Maybe<items::structure::StructDeclarationData>;
252    /// Returns the declaration diagnostics of a struct.
253    #[salsa::invoke(items::structure::struct_declaration_diagnostics)]
254    fn struct_declaration_diagnostics(
255        &self,
256        struct_id: StructId,
257    ) -> Diagnostics<SemanticDiagnostic>;
258    /// Returns the attributes of a struct.
259    #[salsa::invoke(items::structure::struct_attributes)]
260    fn struct_attributes(&self, struct_id: StructId) -> Maybe<Vec<Attribute>>;
261    /// Returns the generic parameters of an enum.
262    #[salsa::invoke(items::structure::struct_generic_params)]
263    fn struct_generic_params(&self, struct_id: StructId) -> Maybe<Vec<GenericParam>>;
264    /// Returns the generic parameters data of an enum.
265    #[salsa::invoke(items::structure::struct_generic_params_data)]
266    fn struct_generic_params_data(&self, struct_id: StructId) -> Maybe<GenericParamsData>;
267    /// Returns the resolution resolved_items of a struct declaration.
268    #[salsa::invoke(items::structure::struct_declaration_resolver_data)]
269    fn struct_declaration_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
270
271    /// Private query to compute data about a struct definition.
272    #[salsa::invoke(items::structure::priv_struct_definition_data)]
273    fn priv_struct_definition_data(
274        &self,
275        struct_id: StructId,
276    ) -> Maybe<items::structure::StructDefinitionData>;
277    /// Returns the semantic diagnostics of a struct definition.
278    #[salsa::invoke(items::structure::struct_definition_diagnostics)]
279    fn struct_definition_diagnostics(&self, struct_id: StructId)
280    -> Diagnostics<SemanticDiagnostic>;
281    /// Returns the members of a struct.
282    #[salsa::invoke(items::structure::struct_members)]
283    fn struct_members(
284        &self,
285        struct_id: StructId,
286    ) -> Maybe<Arc<OrderedHashMap<SmolStr, semantic::Member>>>;
287    /// Returns the resolution resolved_items of a struct definition.
288    #[salsa::invoke(items::structure::struct_definition_resolver_data)]
289    fn struct_definition_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
290    /// Returns the concrete members of a struct.
291    #[salsa::invoke(items::structure::concrete_struct_members)]
292    fn concrete_struct_members(
293        &self,
294        concrete_struct_id: types::ConcreteStructId,
295    ) -> Maybe<Arc<OrderedHashMap<SmolStr, semantic::Member>>>;
296
297    // Enum.
298    // =======
299    /// Private query to compute data about an enum declaration.
300    #[salsa::invoke(items::enm::priv_enum_declaration_data)]
301    fn priv_enum_declaration_data(&self, enum_id: EnumId)
302    -> Maybe<items::enm::EnumDeclarationData>;
303    /// Returns the diagnostics of an enum declaration.
304    #[salsa::invoke(items::enm::enum_declaration_diagnostics)]
305    fn enum_declaration_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
306    /// Returns the generic parameters of an enum.
307    #[salsa::invoke(items::enm::enum_generic_params)]
308    fn enum_generic_params(&self, enum_id: EnumId) -> Maybe<Vec<GenericParam>>;
309    /// Returns the generic parameters data of an enum.
310    #[salsa::invoke(items::enm::enum_generic_params_data)]
311    fn enum_generic_params_data(&self, enum_id: EnumId) -> Maybe<GenericParamsData>;
312    /// Returns the attributes attached to an enum.
313    #[salsa::invoke(items::enm::enum_attributes)]
314    fn enum_attributes(&self, enum_id: EnumId) -> Maybe<Vec<Attribute>>;
315    /// Returns the resolution resolved_items of an enum declaration.
316    #[salsa::invoke(items::enm::enum_declaration_resolver_data)]
317    fn enum_declaration_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
318
319    /// Private query to compute data about an enum definition.
320    #[salsa::invoke(items::enm::priv_enum_definition_data)]
321    fn priv_enum_definition_data(&self, enum_id: EnumId) -> Maybe<items::enm::EnumDefinitionData>;
322    /// Returns the definition diagnostics of an enum definition.
323    #[salsa::invoke(items::enm::enum_definition_diagnostics)]
324    fn enum_definition_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
325    /// Returns the members of an enum.
326    #[salsa::invoke(items::enm::enum_variants)]
327    fn enum_variants(&self, enum_id: EnumId) -> Maybe<OrderedHashMap<SmolStr, VariantId>>;
328    /// Returns the semantic model of a variant.
329    #[salsa::invoke(items::enm::variant_semantic)]
330    fn variant_semantic(&self, enum_id: EnumId, variant_id: VariantId) -> Maybe<semantic::Variant>;
331    /// Returns the resolution resolved_items of an enum definition.
332    #[salsa::invoke(items::enm::enum_definition_resolver_data)]
333    fn enum_definition_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
334
335    // Type Alias.
336    // ===========
337    /// Returns the semantic diagnostics of a type alias.
338    #[salsa::invoke(items::module_type_alias::module_type_alias_semantic_diagnostics)]
339    fn module_type_alias_semantic_diagnostics(
340        &self,
341        module_type_alias_id: ModuleTypeAliasId,
342    ) -> Diagnostics<SemanticDiagnostic>;
343    /// Returns the resolved type of a type alias.
344    #[salsa::invoke(items::module_type_alias::module_type_alias_resolved_type)]
345    #[salsa::cycle(items::module_type_alias::module_type_alias_resolved_type_cycle)]
346    fn module_type_alias_resolved_type(
347        &self,
348        module_type_alias_id: ModuleTypeAliasId,
349    ) -> Maybe<TypeId>;
350    /// Returns the generic parameters of a type alias.
351    #[salsa::invoke(items::module_type_alias::module_type_alias_generic_params)]
352    fn module_type_alias_generic_params(
353        &self,
354        enum_id: ModuleTypeAliasId,
355    ) -> Maybe<Vec<GenericParam>>;
356    /// Returns the resolution resolved_items of a type alias.
357    #[salsa::invoke(items::module_type_alias::module_type_alias_resolver_data)]
358    #[salsa::cycle(items::module_type_alias::module_type_alias_resolver_data_cycle)]
359    fn module_type_alias_resolver_data(
360        &self,
361        module_type_alias_id: ModuleTypeAliasId,
362    ) -> Maybe<Arc<ResolverData>>;
363    /// Private query to compute the generic parameters data of a type alias.
364    #[salsa::invoke(items::module_type_alias::priv_module_type_alias_generic_params_data)]
365    fn priv_module_type_alias_generic_params_data(
366        &self,
367        enum_id: ModuleTypeAliasId,
368    ) -> Maybe<GenericParamsData>;
369    /// Private query to compute data about a type alias.
370    #[salsa::invoke(items::module_type_alias::priv_module_type_alias_semantic_data)]
371    #[salsa::cycle(items::module_type_alias::priv_module_type_alias_semantic_data_cycle)]
372    fn priv_module_type_alias_semantic_data(
373        &self,
374        module_type_alias_id: ModuleTypeAliasId,
375        in_cycle: bool,
376    ) -> Maybe<items::module_type_alias::ModuleTypeAliasData>;
377
378    // Impl Alias.
379    // ====
380    /// Returns the impl definition pointed to by the impl alias, or an error if it points to
381    /// something else.
382    #[salsa::invoke(items::impl_alias::impl_alias_impl_def)]
383    #[salsa::cycle(items::impl_alias::impl_alias_impl_def_cycle)]
384    fn impl_alias_impl_def(&self, impl_alias_id: ImplAliasId) -> Maybe<ImplDefId>;
385    /// Private query to compute data about a type alias.
386    #[salsa::invoke(items::impl_alias::priv_impl_alias_semantic_data)]
387    #[salsa::cycle(items::impl_alias::priv_impl_alias_semantic_data_cycle)]
388    fn priv_impl_alias_semantic_data(
389        &self,
390        impl_alias_id: ImplAliasId,
391        in_cycle: bool,
392    ) -> Maybe<items::impl_alias::ImplAliasData>;
393    /// Returns the semantic diagnostics of a type alias.
394    #[salsa::invoke(items::impl_alias::impl_alias_semantic_diagnostics)]
395    fn impl_alias_semantic_diagnostics(
396        &self,
397        impl_alias_id: ImplAliasId,
398    ) -> Diagnostics<SemanticDiagnostic>;
399    /// Returns the resolved type of a type alias.
400    #[salsa::invoke(items::impl_alias::impl_alias_resolved_impl)]
401    #[salsa::cycle(items::impl_alias::impl_alias_resolved_impl_cycle)]
402    fn impl_alias_resolved_impl(&self, impl_alias_id: ImplAliasId) -> Maybe<ImplId>;
403    /// Returns the generic parameters of a type alias.
404    #[salsa::invoke(items::impl_alias::impl_alias_generic_params)]
405    fn impl_alias_generic_params(&self, impl_alias_id: ImplAliasId) -> Maybe<Vec<GenericParam>>;
406    /// Returns the generic parameters data of a type alias.
407    #[salsa::invoke(items::impl_alias::impl_alias_generic_params_data)]
408    fn impl_alias_generic_params_data(
409        &self,
410        impl_alias_id: ImplAliasId,
411    ) -> Maybe<GenericParamsData>;
412    /// Returns the resolution resolved_items of a type alias.
413    #[salsa::invoke(items::impl_alias::impl_alias_resolver_data)]
414    #[salsa::cycle(items::impl_alias::impl_alias_resolver_data_cycle)]
415    fn impl_alias_resolver_data(&self, impl_alias_id: ImplAliasId) -> Maybe<Arc<ResolverData>>;
416    /// Returns the attributes attached to the impl alias.
417    #[salsa::invoke(items::impl_alias::impl_alias_attributes)]
418    fn impl_alias_attributes(&self, impl_def_id: ImplAliasId) -> Maybe<Vec<Attribute>>;
419
420    // Trait.
421    // =======
422    /// Returns the semantic declaration diagnostics of a trait.
423    #[salsa::invoke(items::trt::trait_semantic_declaration_diagnostics)]
424    fn trait_semantic_declaration_diagnostics(
425        &self,
426        trait_id: TraitId,
427    ) -> Diagnostics<SemanticDiagnostic>;
428    /// Returns the generic parameters of a trait.
429    #[salsa::invoke(items::trt::trait_generic_params)]
430    #[salsa::cycle(items::trt::trait_generic_params_cycle)]
431    fn trait_generic_params(&self, trait_id: TraitId) -> Maybe<Vec<GenericParam>>;
432    /// Returns the generic parameters data of a trait.
433    #[salsa::invoke(items::trt::trait_generic_params_data)]
434    #[salsa::cycle(items::trt::trait_generic_params_data_cycle)]
435    fn trait_generic_params_data(
436        &self,
437        trait_id: TraitId,
438        in_cycle: bool,
439    ) -> Maybe<GenericParamsData>;
440    /// Returns the attributes of a trait.
441    #[salsa::invoke(items::trt::trait_attributes)]
442    fn trait_attributes(&self, trait_id: TraitId) -> Maybe<Vec<Attribute>>;
443    /// Returns the resolution resolved_items of a trait.
444    #[salsa::invoke(items::trt::trait_resolver_data)]
445    fn trait_resolver_data(&self, trait_id: TraitId) -> Maybe<Arc<ResolverData>>;
446    /// Private query to compute declaration data about a trait.
447    #[salsa::invoke(items::trt::priv_trait_declaration_data)]
448    fn priv_trait_declaration_data(
449        &self,
450        trait_id: TraitId,
451    ) -> Maybe<items::trt::TraitDeclarationData>;
452
453    /// Returns the semantic definition diagnostics of a trait.
454    #[salsa::invoke(items::trt::trait_semantic_definition_diagnostics)]
455    fn trait_semantic_definition_diagnostics(
456        &self,
457        trait_id: TraitId,
458    ) -> Diagnostics<SemanticDiagnostic>;
459    /// Returns the names of all the non default implemented items of a trait.
460    #[salsa::invoke(items::trt::trait_required_item_names)]
461    fn trait_required_item_names(&self, trait_id: TraitId) -> Maybe<OrderedHashSet<SmolStr>>;
462    /// Returns the item of the trait, by the given `name`, if exists.
463    #[salsa::invoke(items::trt::trait_item_by_name)]
464    fn trait_item_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitItemId>>;
465    /// Returns all the items used within the trait.
466    #[salsa::invoke(items::trt::trait_all_used_items)]
467    fn trait_all_used_items(&self, trait_id: TraitId) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
468    /// Returns the functions of a trait.
469    #[salsa::invoke(items::trt::trait_functions)]
470    fn trait_functions(&self, trait_id: TraitId)
471    -> Maybe<OrderedHashMap<SmolStr, TraitFunctionId>>;
472    /// Returns the function with the given name of the given trait, if exists.
473    #[salsa::invoke(items::trt::trait_function_by_name)]
474    fn trait_function_by_name(
475        &self,
476        trait_id: TraitId,
477        name: SmolStr,
478    ) -> Maybe<Option<TraitFunctionId>>;
479    /// Returns the types of a trait.
480    #[salsa::invoke(items::trt::trait_types)]
481    fn trait_types(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitTypeId>>;
482    /// Returns the item type with the given name of the given trait, if exists.
483    #[salsa::invoke(items::trt::trait_type_by_name)]
484    fn trait_type_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitTypeId>>;
485
486    /// Returns the constants of a trait.
487    #[salsa::invoke(items::trt::trait_constants)]
488    fn trait_constants(&self, trait_id: TraitId)
489    -> Maybe<OrderedHashMap<SmolStr, TraitConstantId>>;
490    /// Returns the item constants with the given name of the given trait, if exists.
491    #[salsa::invoke(items::trt::trait_constant_by_name)]
492    fn trait_constant_by_name(
493        &self,
494        trait_id: TraitId,
495        name: SmolStr,
496    ) -> Maybe<Option<TraitConstantId>>;
497    /// Returns the constants of a trait.
498    #[salsa::invoke(items::trt::trait_impls)]
499    fn trait_impls(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitImplId>>;
500    /// Returns the item impls with the given name of the given trait, if exists.
501    #[salsa::invoke(items::trt::trait_impl_by_name)]
502    fn trait_impl_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitImplId>>;
503
504    /// Private query to compute definition data about a trait.
505    #[salsa::invoke(items::trt::priv_trait_definition_data)]
506    fn priv_trait_definition_data(
507        &self,
508        trait_id: TraitId,
509    ) -> Maybe<items::trt::TraitDefinitionData>;
510
511    // Trait type.
512    // ================
513    /// Returns the semantic diagnostics of a trait type.
514    #[salsa::invoke(items::trt::trait_type_diagnostics)]
515    fn trait_type_diagnostics(&self, trait_type_id: TraitTypeId)
516    -> Diagnostics<SemanticDiagnostic>;
517    /// Returns the generic params of a trait type.
518    #[salsa::invoke(items::trt::trait_type_generic_params)]
519    fn trait_type_generic_params(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<GenericParam>>;
520    /// Returns the attributes of a trait type.
521    #[salsa::invoke(items::trt::trait_type_attributes)]
522    fn trait_type_attributes(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<Attribute>>;
523    /// Returns the resolution resolved_items of a trait type.
524    #[salsa::invoke(items::trt::trait_type_resolver_data)]
525    fn trait_type_resolver_data(&self, trait_type_id: TraitTypeId) -> Maybe<Arc<ResolverData>>;
526    /// Private query to compute the generic params data of a trait type.
527    #[salsa::invoke(items::trt::priv_trait_type_generic_params_data)]
528    fn priv_trait_type_generic_params_data(
529        &self,
530        trait_type_id: TraitTypeId,
531    ) -> Maybe<GenericParamsData>;
532    /// Private query to compute data about a trait type.
533    #[salsa::invoke(items::trt::priv_trait_type_data)]
534    fn priv_trait_type_data(&self, type_id: TraitTypeId) -> Maybe<TraitItemTypeData>;
535
536    // Trait constants.
537    // ================
538    /// Returns the semantic diagnostics of a trait type.
539    #[salsa::invoke(items::trt::trait_constant_diagnostics)]
540    fn trait_constant_diagnostics(
541        &self,
542        trait_constant: TraitConstantId,
543    ) -> Diagnostics<SemanticDiagnostic>;
544    /// Returns the attributes of a trait constants.
545    #[salsa::invoke(items::trt::trait_constant_attributes)]
546    fn trait_constant_attributes(&self, trait_constant: TraitConstantId) -> Maybe<Vec<Attribute>>;
547    /// Returns the type of a trait constant.
548    #[salsa::invoke(items::trt::trait_constant_type)]
549    fn trait_constant_type(&self, trait_type_id: TraitConstantId) -> Maybe<TypeId>;
550    /// Returns the resolution resolved_items of a trait constants.
551    #[salsa::invoke(items::trt::trait_constant_resolver_data)]
552    fn trait_constant_resolver_data(
553        &self,
554        trait_constant: TraitConstantId,
555    ) -> Maybe<Arc<ResolverData>>;
556    /// Private query to compute data about a trait constant.
557    #[salsa::invoke(items::trt::priv_trait_constant_data)]
558    fn priv_trait_constant_data(
559        &self,
560        trait_constant: TraitConstantId,
561    ) -> Maybe<TraitItemConstantData>;
562    /// Returns the type of a trait constant.
563    #[salsa::invoke(items::trt::concrete_trait_constant_type)]
564    fn concrete_trait_constant_type(
565        &self,
566        concrete_trait_constant_id: items::trt::ConcreteTraitConstantId,
567    ) -> Maybe<TypeId>;
568
569    // Trait impls.
570    // ================
571    /// Returns the semantic diagnostics of a trait impls.
572    #[salsa::invoke(items::trt::trait_impl_diagnostics)]
573    fn trait_impl_diagnostics(&self, trait_impl: TraitImplId) -> Diagnostics<SemanticDiagnostic>;
574    /// Returns the attributes of a trait impls.
575    #[salsa::invoke(items::trt::trait_impl_attributes)]
576    fn trait_impl_attributes(&self, trait_impl: TraitImplId) -> Maybe<Vec<Attribute>>;
577    /// Returns the concrete trait of a trait impl.
578    #[salsa::invoke(items::trt::trait_impl_concrete_trait)]
579    fn trait_impl_concrete_trait(&self, trait_impl_id: TraitImplId) -> Maybe<ConcreteTraitId>;
580    /// Returns the resolution resolved_items of a trait impls.
581    #[salsa::invoke(items::trt::trait_impl_resolver_data)]
582    fn trait_impl_resolver_data(&self, trait_impl: TraitImplId) -> Maybe<Arc<ResolverData>>;
583    /// Private query to compute data about a trait impl.
584    #[salsa::invoke(items::trt::priv_trait_impl_data)]
585    fn priv_trait_impl_data(&self, trait_impl: TraitImplId) -> Maybe<TraitItemImplData>;
586    /// Returns the concrete trait of a concrete trait impl.
587    #[salsa::invoke(items::trt::concrete_trait_impl_concrete_trait)]
588    fn concrete_trait_impl_concrete_trait(
589        &self,
590        concrete_trait_impl_id: items::trt::ConcreteTraitImplId,
591    ) -> Maybe<ConcreteTraitId>;
592
593    // Trait function.
594    // ================
595    /// Returns the semantic diagnostics of a trait function.
596    #[salsa::invoke(items::trt::trait_function_declaration_diagnostics)]
597    fn trait_function_declaration_diagnostics(
598        &self,
599        trait_function_id: TraitFunctionId,
600    ) -> Diagnostics<SemanticDiagnostic>;
601    /// Returns the signature of a trait function.
602    #[salsa::invoke(items::trt::trait_function_signature)]
603    fn trait_function_signature(
604        &self,
605        trait_function_id: TraitFunctionId,
606    ) -> Maybe<semantic::Signature>;
607    /// Returns the generic params of a trait function.
608    #[salsa::invoke(items::trt::trait_function_generic_params)]
609    fn trait_function_generic_params(
610        &self,
611        trait_function_id: TraitFunctionId,
612    ) -> Maybe<Vec<GenericParam>>;
613    /// Returns the generic params data of a trait function.
614    #[salsa::invoke(items::trt::priv_trait_function_generic_params_data)]
615    fn priv_trait_function_generic_params_data(
616        &self,
617        trait_function_id: TraitFunctionId,
618    ) -> Maybe<GenericParamsData>;
619    /// Returns the attributes of a trait function.
620    #[salsa::invoke(items::trt::trait_function_attributes)]
621    fn trait_function_attributes(
622        &self,
623        trait_function_id: TraitFunctionId,
624    ) -> Maybe<Vec<Attribute>>;
625    /// Returns the resolution resolved_items of a trait function.
626    #[salsa::invoke(items::trt::trait_function_resolver_data)]
627    fn trait_function_resolver_data(
628        &self,
629        trait_function_id: TraitFunctionId,
630    ) -> Maybe<Arc<ResolverData>>;
631    /// Returns the inline configuration of a trait function's declaration.
632    #[salsa::invoke(items::trt::trait_function_declaration_inline_config)]
633    fn trait_function_declaration_inline_config(
634        &self,
635        trait_function_id: TraitFunctionId,
636    ) -> Maybe<InlineConfiguration>;
637    /// Returns the implicits precedence of a trait function.
638    #[salsa::invoke(items::trt::trait_function_declaration_implicit_precedence)]
639    fn trait_function_declaration_implicit_precedence(
640        &self,
641        trait_function_id: TraitFunctionId,
642    ) -> Maybe<ImplicitPrecedence>;
643    /// Returns the explicit implicits of a signature of a trait function.
644    #[salsa::invoke(items::trt::trait_function_declaration_implicits)]
645    fn trait_function_declaration_implicits(
646        &self,
647        trait_function_id: TraitFunctionId,
648    ) -> Maybe<Vec<TypeId>>;
649    /// Private query to compute data about a trait function declaration.
650    #[salsa::invoke(items::trt::priv_trait_function_declaration_data)]
651    fn priv_trait_function_declaration_data(
652        &self,
653        function_id: TraitFunctionId,
654    ) -> Maybe<items::functions::FunctionDeclarationData>;
655
656    /// Returns the semantic diagnostics of a trait function definition (declaration + body).
657    #[salsa::invoke(items::trt::trait_function_body_diagnostics)]
658    fn trait_function_body_diagnostics(
659        &self,
660        trait_function_id: TraitFunctionId,
661    ) -> Diagnostics<SemanticDiagnostic>;
662    /// Returns the body of a trait function, if any.
663    #[salsa::invoke(items::trt::trait_function_body)]
664    fn trait_function_body(
665        &self,
666        trait_function_id: TraitFunctionId,
667    ) -> Maybe<Option<Arc<FunctionBody>>>;
668    /// Private query to compute data about a trait function definition (declaration + body)
669    #[salsa::invoke(items::trt::priv_trait_function_body_data)]
670    fn priv_trait_function_body_data(
671        &self,
672        trait_function_id: TraitFunctionId,
673    ) -> Maybe<Option<items::function_with_body::FunctionBodyData>>;
674
675    // Concrete Trait function.
676    // ========================
677    /// Returns the generic params of a concrete trait function.
678    #[salsa::invoke(items::trt::concrete_trait_function_generic_params)]
679    fn concrete_trait_function_generic_params(
680        &self,
681        concrete_trait_function_id: ConcreteTraitGenericFunctionId,
682    ) -> Maybe<Vec<GenericParam>>;
683    /// Returns the signature of a concrete trait function.
684    #[salsa::invoke(items::trt::concrete_trait_function_signature)]
685    fn concrete_trait_function_signature(
686        &self,
687        concrete_trait_function_id: ConcreteTraitGenericFunctionId,
688    ) -> Maybe<semantic::Signature>;
689
690    // Trait filter.
691    // ==============
692    /// Returns candidate [ImplDefId]s for a specific trait lookup constraint.
693    #[salsa::invoke(items::imp::module_impl_ids_for_trait_filter)]
694    #[salsa::cycle(items::imp::module_impl_ids_for_trait_filter_cycle)]
695    fn module_impl_ids_for_trait_filter(
696        &self,
697        module_id: ModuleId,
698        trait_lookup_constraint: items::imp::TraitFilter,
699    ) -> Maybe<Vec<UninferredImpl>>;
700    #[salsa::invoke(items::imp::impl_impl_ids_for_trait_filter)]
701    #[salsa::cycle(items::imp::impl_impl_ids_for_trait_filter_cycle)]
702    fn impl_impl_ids_for_trait_filter(
703        &self,
704        impl_id: ImplId,
705        trait_lookup_constraint: items::imp::TraitFilter,
706    ) -> Maybe<Vec<UninferredImpl>>;
707    // Returns the solution set for a canonical trait.
708    #[salsa::invoke(inference::solver::canonic_trait_solutions)]
709    #[salsa::cycle(inference::solver::canonic_trait_solutions_cycle)]
710    fn canonic_trait_solutions(
711        &self,
712        canonical_trait: inference::canonic::CanonicalTrait,
713        lookup_context: ImplLookupContext,
714    ) -> Result<
715        inference::solver::SolutionSet<inference::canonic::CanonicalImpl>,
716        inference::InferenceError,
717    >;
718
719    // Impl.
720    // =======
721    /// Returns the semantic declaration diagnostics of an impl.
722    #[salsa::invoke(items::imp::impl_semantic_declaration_diagnostics)]
723    fn impl_semantic_declaration_diagnostics(
724        &self,
725        impl_def_id: ImplDefId,
726    ) -> Diagnostics<SemanticDiagnostic>;
727    /// Returns the generic parameters data of an impl.
728    #[salsa::invoke(items::imp::impl_def_generic_params_data)]
729    fn impl_def_generic_params_data(&self, impl_def_id: ImplDefId) -> Maybe<GenericParamsData>;
730    /// Returns the generic parameters of an impl.
731    #[salsa::invoke(items::imp::impl_def_generic_params)]
732    fn impl_def_generic_params(&self, impl_def_id: ImplDefId) -> Maybe<Vec<GenericParam>>;
733    /// Returns the resolution resolved_items of an impl.
734    #[salsa::invoke(items::imp::impl_def_resolver_data)]
735    #[salsa::cycle(items::imp::impl_def_resolver_data_cycle)]
736    fn impl_def_resolver_data(&self, impl_def_id: ImplDefId) -> Maybe<Arc<ResolverData>>;
737    /// Returns the concrete trait that is implemented by the impl.
738    #[salsa::invoke(items::imp::impl_def_concrete_trait)]
739    #[salsa::cycle(items::imp::impl_def_concrete_trait_cycle)]
740    fn impl_def_concrete_trait(&self, impl_def_id: ImplDefId) -> Maybe<ConcreteTraitId>;
741    /// Returns the substitution for generics for the impl.
742    #[salsa::invoke(items::imp::impl_def_substitution)]
743    fn impl_def_substitution(&self, impl_def_id: ImplDefId) -> Maybe<Arc<GenericSubstitution>>;
744    /// Returns the attributes attached to the impl.
745    #[salsa::invoke(items::imp::impl_def_attributes)]
746    fn impl_def_attributes(&self, impl_def_id: ImplDefId) -> Maybe<Vec<Attribute>>;
747    /// Returns the concrete trait that is implemented by the concrete impl.
748    #[salsa::invoke(items::imp::impl_concrete_trait)]
749    fn impl_concrete_trait(&self, impl_id: ImplId) -> Maybe<ConcreteTraitId>;
750    /// Returns the trait that is implemented by the impl, or an error if the RHS of the `of` is not
751    /// a trait.
752    #[salsa::invoke(items::imp::impl_def_trait)]
753    fn impl_def_trait(&self, impl_def_id: ImplDefId) -> Maybe<TraitId>;
754    /// Private query to compute declaration data about an impl.
755    #[salsa::invoke(items::imp::priv_impl_declaration_data)]
756    #[salsa::cycle(items::imp::priv_impl_declaration_data_cycle)]
757    fn priv_impl_declaration_data(
758        &self,
759        impl_def_id: ImplDefId,
760    ) -> Maybe<items::imp::ImplDeclarationData>;
761
762    /// Returns the semantic definition diagnostics of an impl.
763    #[salsa::invoke(items::imp::impl_semantic_definition_diagnostics)]
764    fn impl_semantic_definition_diagnostics(
765        &self,
766        impl_def_id: ImplDefId,
767    ) -> Diagnostics<SemanticDiagnostic>;
768    /// Returns the item of the impl, by the given `name`, if exists.
769    #[salsa::invoke(items::imp::impl_item_by_name)]
770    fn impl_item_by_name(&self, impl_def_id: ImplDefId, name: SmolStr)
771    -> Maybe<Option<ImplItemId>>;
772    /// Returns the trait impl of an implicit impl if `name` exists in trait and not in the impl.
773    #[salsa::invoke(items::imp::impl_implicit_impl_by_name)]
774    fn impl_implicit_impl_by_name(
775        &self,
776        impl_def_id: ImplDefId,
777        name: SmolStr,
778    ) -> Maybe<Option<TraitImplId>>;
779    /// Returns all the items used within the impl.
780    #[salsa::invoke(items::imp::impl_all_used_items)]
781    fn impl_all_used_items(
782        &self,
783        impl_def_id: ImplDefId,
784    ) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
785    /// Returns the type items in the impl.
786    #[salsa::invoke(items::imp::impl_types)]
787    fn impl_types(
788        &self,
789        impl_def_id: ImplDefId,
790    ) -> Maybe<Arc<OrderedHashMap<ImplTypeDefId, ast::ItemTypeAlias>>>;
791    /// Returns the ids of the type items in the impl.
792    #[salsa::invoke(items::imp::impl_type_ids)]
793    fn impl_type_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplTypeDefId]>>;
794    /// Returns the impl AST of the impl type that matches the given id, if exists.
795    #[salsa::invoke(items::imp::impl_type_by_id)]
796    fn impl_type_by_id(&self, impl_type_id: ImplTypeDefId) -> Maybe<Option<ast::ItemTypeAlias>>;
797    /// Returns the impl type item that matches the given trait type item, if exists.
798    #[salsa::invoke(items::imp::impl_type_by_trait_type)]
799    fn impl_type_by_trait_type(
800        &self,
801        impl_def_id: ImplDefId,
802        trait_type_id: TraitTypeId,
803    ) -> Maybe<ImplTypeDefId>;
804
805    /// Returns the constant items in the impl.
806    #[salsa::invoke(items::imp::impl_constants)]
807    fn impl_constants(
808        &self,
809        impl_def_id: ImplDefId,
810    ) -> Maybe<Arc<OrderedHashMap<ImplConstantDefId, ast::ItemConstant>>>;
811
812    /// Returns the impls items in the impl.
813    #[salsa::invoke(items::imp::impl_impls)]
814    fn impl_impls(
815        &self,
816        impl_def_id: ImplDefId,
817    ) -> Maybe<Arc<OrderedHashMap<ImplImplDefId, ast::ItemImplAlias>>>;
818    /// Returns the ids of the impl items in the impl.
819    #[salsa::invoke(items::imp::impl_impl_ids)]
820    fn impl_impl_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplImplDefId]>>;
821    /// Returns the impl AST of the impl impl that matches the given id, if exists.
822    #[salsa::invoke(items::imp::impl_impl_by_id)]
823    fn impl_impl_by_id(&self, impl_impl_id: ImplImplDefId) -> Maybe<Option<ast::ItemImplAlias>>;
824    /// Returns the impl impl item that matches the given trait impl item, if exists.
825    #[salsa::invoke(items::imp::impl_impl_by_trait_impl)]
826    fn impl_impl_by_trait_impl(
827        &self,
828        impl_def_id: ImplDefId,
829        trait_impl_id: TraitImplId,
830    ) -> Maybe<ImplImplDefId>;
831    /// Returns whether `trait_impl_id` is an implicit impl in `impl_def_id`.
832    #[salsa::invoke(items::imp::is_implicit_impl_impl)]
833    fn is_implicit_impl_impl(
834        &self,
835        impl_def_id: ImplDefId,
836        trait_impl_id: TraitImplId,
837    ) -> Maybe<bool>;
838
839    /// Returns the impl constant item that matches the given trait constant item, if exists.
840    #[salsa::invoke(items::imp::impl_constant_by_trait_constant)]
841    fn impl_constant_by_trait_constant(
842        &self,
843        impl_def_id: ImplDefId,
844        trait_constant_id: TraitConstantId,
845    ) -> Maybe<ImplConstantDefId>;
846
847    /// Returns the functions in the impl.
848    #[salsa::invoke(items::imp::impl_functions)]
849    fn impl_functions(
850        &self,
851        impl_def_id: ImplDefId,
852    ) -> Maybe<OrderedHashMap<SmolStr, ImplFunctionId>>;
853    /// Returns the impl function that matches the given trait function, if exists.
854    /// Note that a function that doesn't exist in the impl doesn't necessarily indicate an error,
855    /// as, e.g., a trait function that has a default implementation doesn't have to be
856    /// implemented in the impl.
857    #[salsa::invoke(items::imp::impl_function_by_trait_function)]
858    fn impl_function_by_trait_function(
859        &self,
860        impl_def_id: ImplDefId,
861        trait_function_id: TraitFunctionId,
862    ) -> Maybe<Option<ImplFunctionId>>;
863    /// Private query to compute definition data about an impl.
864    #[salsa::invoke(items::imp::priv_impl_definition_data)]
865    fn priv_impl_definition_data(
866        &self,
867        impl_def_id: ImplDefId,
868    ) -> Maybe<items::imp::ImplDefinitionData>;
869
870    /// Private query to check if an impl is fully concrete.
871    #[salsa::invoke(items::imp::priv_impl_is_fully_concrete)]
872    fn priv_impl_is_fully_concrete(&self, impl_id: ImplId) -> bool;
873
874    /// Private query to check if an impl contains no variables.
875    #[salsa::invoke(items::imp::priv_impl_is_var_free)]
876    fn priv_impl_is_var_free(&self, impl_id: ImplId) -> bool;
877
878    // Impl type def.
879    // ================
880    /// Returns the semantic diagnostics of an impl item type.
881    #[salsa::invoke(items::imp::impl_type_def_semantic_diagnostics)]
882    fn impl_type_def_semantic_diagnostics(
883        &self,
884        impl_type_def_id: ImplTypeDefId,
885    ) -> Diagnostics<SemanticDiagnostic>;
886    /// Returns the resolved type of an impl item type.
887    #[salsa::invoke(items::imp::impl_type_def_resolved_type)]
888    #[salsa::cycle(items::imp::impl_type_def_resolved_type_cycle)]
889    fn impl_type_def_resolved_type(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<TypeId>;
890    /// Returns the generic parameters of an impl item type.
891    #[salsa::invoke(items::imp::impl_type_def_generic_params)]
892    fn impl_type_def_generic_params(
893        &self,
894        impl_type_def_id: ImplTypeDefId,
895    ) -> Maybe<Vec<GenericParam>>;
896    /// Returns the attributes of an impl type.
897    #[salsa::invoke(items::imp::impl_type_def_attributes)]
898    fn impl_type_def_attributes(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<Vec<Attribute>>;
899    /// Returns the resolution resolved_items of an impl item type.
900    #[salsa::invoke(items::imp::impl_type_def_resolver_data)]
901    fn impl_type_def_resolver_data(
902        &self,
903        impl_type_def_id: ImplTypeDefId,
904    ) -> Maybe<Arc<ResolverData>>;
905    /// Returns the trait type of an impl type.
906    #[salsa::invoke(items::imp::impl_type_def_trait_type)]
907    fn impl_type_def_trait_type(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<TraitTypeId>;
908
909    /// Private query to compute data about an impl item type.
910    #[salsa::invoke(items::imp::priv_impl_type_semantic_data)]
911    #[salsa::cycle(items::imp::priv_impl_type_semantic_data_cycle)]
912    fn priv_impl_type_semantic_data(
913        &self,
914        impl_type_def_id: ImplTypeDefId,
915        in_cycle: bool,
916    ) -> Maybe<items::imp::ImplItemTypeData>;
917    /// Private query to compute data about the generic parameters of an impl item type.
918    #[salsa::invoke(items::imp::priv_impl_type_def_generic_params_data)]
919    fn priv_impl_type_def_generic_params_data(
920        &self,
921        impl_type_def_id: ImplTypeDefId,
922    ) -> Maybe<GenericParamsData>;
923
924    // Impl type.
925    // ================
926    /// Returns the implized impl type if the impl is concrete. Returns a TypeId that's not an impl
927    /// type with a concrete impl.
928    // TODO(Gil): Consider removing the cycle handling here if we will upgrade the salsa version.
929    #[salsa::invoke(items::imp::impl_type_concrete_implized)]
930    #[salsa::cycle(items::imp::impl_type_concrete_implized_cycle)]
931    fn impl_type_concrete_implized(&self, impl_type_def_id: ImplTypeId) -> Maybe<TypeId>;
932
933    // Impl constant def.
934    // ================
935    /// Returns the semantic diagnostics of an impl item constant.
936    #[salsa::invoke(items::imp::impl_constant_def_semantic_diagnostics)]
937    fn impl_constant_def_semantic_diagnostics(
938        &self,
939        impl_constant_def_id: ImplConstantDefId,
940    ) -> Diagnostics<SemanticDiagnostic>;
941    /// Returns the resolved constant value of an impl item constant.
942    #[salsa::invoke(items::imp::impl_constant_def_value)]
943    #[salsa::cycle(items::imp::impl_constant_def_value_cycle)]
944    fn impl_constant_def_value(
945        &self,
946        impl_constant_def_id: ImplConstantDefId,
947    ) -> Maybe<ConstValueId>;
948    /// Returns the resolution resolved_items of an impl item constant.
949    #[salsa::invoke(items::imp::impl_constant_def_resolver_data)]
950    fn impl_constant_def_resolver_data(
951        &self,
952        impl_constant_def_id: ImplConstantDefId,
953    ) -> Maybe<Arc<ResolverData>>;
954    /// Returns the type of an impl item constant.
955    #[salsa::invoke(items::imp::impl_constant_def_trait_constant)]
956    fn impl_constant_def_trait_constant(
957        &self,
958        impl_constant_def_id: ImplConstantDefId,
959    ) -> Maybe<TraitConstantId>;
960
961    /// Private query to compute data about an impl item constant.
962    #[salsa::invoke(items::imp::priv_impl_constant_semantic_data)]
963    #[salsa::cycle(items::imp::priv_impl_constant_semantic_data_cycle)]
964    fn priv_impl_constant_semantic_data(
965        &self,
966        impl_constant_def_id: ImplConstantDefId,
967        in_cycle: bool,
968    ) -> Maybe<items::imp::ImplItemConstantData>;
969
970    // Impl constant.
971    // ================
972    /// Returns the given impl constant, implized by the given impl context.
973    #[salsa::invoke(items::imp::impl_constant_implized_by_context)]
974    #[salsa::cycle(items::imp::impl_constant_implized_by_context_cycle)]
975    fn impl_constant_implized_by_context(
976        &self,
977        impl_constant_id: ImplConstantId,
978        impl_def_id: ImplDefId,
979    ) -> Maybe<ConstValueId>;
980    /// Returns the implized impl constant value if the impl is concrete.
981    // TODO(Gil): Consider removing the cycle handling here if we will upgrade the salsa version.
982    #[salsa::invoke(items::imp::impl_constant_concrete_implized_value)]
983    #[salsa::cycle(items::imp::impl_constant_concrete_implized_value_cycle)]
984    fn impl_constant_concrete_implized_value(
985        &self,
986        impl_constant_id: ImplConstantId,
987    ) -> Maybe<ConstValueId>;
988    /// Returns the implized impl constant type if the impl is concrete.
989    // TODO(Gil): Consider removing the cycle handling here if we will upgrade the salsa version.
990    #[salsa::invoke(items::imp::impl_constant_concrete_implized_type)]
991    #[salsa::cycle(items::imp::impl_constant_concrete_implized_type_cycle)]
992    fn impl_constant_concrete_implized_type(
993        &self,
994        impl_constant_id: ImplConstantId,
995    ) -> Maybe<TypeId>;
996
997    // Impl impl def.
998    // ================
999    /// Returns the semantic diagnostics of an impl item impl.
1000    #[salsa::invoke(items::imp::impl_impl_def_semantic_diagnostics)]
1001    fn impl_impl_def_semantic_diagnostics(
1002        &self,
1003        impl_impl_def_id: ImplImplDefId,
1004    ) -> Diagnostics<SemanticDiagnostic>;
1005    /// Returns the resolution resolved_items of an impl item impl.
1006    #[salsa::invoke(items::imp::impl_impl_def_resolver_data)]
1007    fn impl_impl_def_resolver_data(
1008        &self,
1009        impl_impl_def_id: ImplImplDefId,
1010    ) -> Maybe<Arc<ResolverData>>;
1011    /// Returns the type of an impl item impl.
1012    #[salsa::invoke(items::imp::impl_impl_def_trait_impl)]
1013    fn impl_impl_def_trait_impl(&self, impl_impl_def_id: ImplImplDefId) -> Maybe<TraitImplId>;
1014
1015    /// Returns the resolved impl of an impl item impl.
1016    #[salsa::invoke(items::imp::impl_impl_def_impl)]
1017    #[salsa::cycle(items::imp::impl_impl_def_impl_cycle)]
1018    fn impl_impl_def_impl(&self, impl_impl_def_id: ImplImplDefId, in_cycle: bool) -> Maybe<ImplId>;
1019
1020    /// Private query to compute data about an impl item impl.
1021    #[salsa::invoke(items::imp::priv_impl_impl_semantic_data)]
1022    #[salsa::cycle(items::imp::priv_impl_impl_semantic_data_cycle)]
1023    fn priv_impl_impl_semantic_data(
1024        &self,
1025        impl_impl_def_id: ImplImplDefId,
1026        in_cycle: bool,
1027    ) -> Maybe<items::imp::ImplItemImplData>;
1028
1029    /// Private query to compute data about the generic parameters of an impl item impl.
1030    #[salsa::invoke(items::imp::priv_impl_impl_def_generic_params_data)]
1031    fn priv_impl_impl_def_generic_params_data(
1032        &self,
1033        impl_impl_def_id: ImplImplDefId,
1034    ) -> Maybe<GenericParamsData>;
1035
1036    /// Returns the semantic diagnostics of an implicit impl.
1037    #[salsa::invoke(items::imp::implicit_impl_impl_semantic_diagnostics)]
1038    fn implicit_impl_impl_semantic_diagnostics(
1039        &self,
1040        impl_def_id: ImplDefId,
1041        trait_impl_id: TraitImplId,
1042    ) -> Diagnostics<SemanticDiagnostic>;
1043
1044    /// Returns the resolved impl of an implicit impl.
1045    #[salsa::invoke(items::imp::implicit_impl_impl_impl)]
1046    #[salsa::cycle(items::imp::implicit_impl_impl_impl_cycle)]
1047    fn implicit_impl_impl_impl(
1048        &self,
1049        impl_def_id: ImplDefId,
1050        trait_impl_id: TraitImplId,
1051        in_cycle: bool,
1052    ) -> Maybe<ImplId>;
1053    // Private query to compute data about an implicit impl.
1054    #[salsa::invoke(items::imp::priv_implicit_impl_impl_semantic_data)]
1055    #[salsa::cycle(items::imp::priv_implicit_impl_impl_semantic_data_cycle)]
1056    fn priv_implicit_impl_impl_semantic_data(
1057        &self,
1058        impl_def_id: ImplDefId,
1059        trait_impl_id: TraitImplId,
1060        in_cycle: bool,
1061    ) -> Maybe<ImplicitImplImplData>;
1062
1063    // Impl impl.
1064    // ================
1065    /// Returns the implized impl impl if the impl is concrete.
1066    #[salsa::invoke(items::imp::impl_impl_implized_by_context)]
1067    #[salsa::cycle(items::imp::impl_impl_implized_by_context_cycle)]
1068    fn impl_impl_implized_by_context(
1069        &self,
1070        impl_impl_id: ImplImplId,
1071        impl_def_id: ImplDefId,
1072        in_cycle: bool,
1073    ) -> Maybe<ImplId>;
1074    /// Returns the implized impl impl value if the impl is concrete.
1075    #[salsa::invoke(items::imp::impl_impl_concrete_implized)]
1076    #[salsa::cycle(items::imp::impl_impl_concrete_implized_cycle)]
1077    fn impl_impl_concrete_implized(&self, impl_impl_id: ImplImplId) -> Maybe<ImplId>;
1078    /// Returns the concrete trait of an impl impl.
1079    #[salsa::invoke(items::imp::impl_impl_concrete_trait)]
1080    fn impl_impl_concrete_trait(&self, impl_impl_id: ImplImplId) -> Maybe<ConcreteTraitId>;
1081
1082    // Impl function.
1083    // ================
1084    /// Returns the semantic diagnostics of an impl function's declaration (signature).
1085    #[salsa::invoke(items::imp::impl_function_declaration_diagnostics)]
1086    fn impl_function_declaration_diagnostics(
1087        &self,
1088        impl_function_id: ImplFunctionId,
1089    ) -> Diagnostics<SemanticDiagnostic>;
1090    /// Returns the signature of an impl function.
1091    #[salsa::invoke(items::imp::impl_function_signature)]
1092    fn impl_function_signature(
1093        &self,
1094        impl_function_id: ImplFunctionId,
1095    ) -> Maybe<semantic::Signature>;
1096    /// Returns the generic params of an impl function.
1097    #[salsa::invoke(items::imp::impl_function_generic_params)]
1098    fn impl_function_generic_params(
1099        &self,
1100        impl_function_id: ImplFunctionId,
1101    ) -> Maybe<Vec<GenericParam>>;
1102    /// Returns the generic params data of an impl function.
1103    #[salsa::invoke(items::imp::priv_impl_function_generic_params_data)]
1104    fn priv_impl_function_generic_params_data(
1105        &self,
1106        impl_function_id: ImplFunctionId,
1107    ) -> Maybe<GenericParamsData>;
1108    /// Returns the attributes of an impl function.
1109    #[salsa::invoke(items::imp::impl_function_attributes)]
1110    fn impl_function_attributes(&self, impl_function_id: ImplFunctionId) -> Maybe<Vec<Attribute>>;
1111    /// Returns the resolution resolved_items of an impl function's declaration.
1112    #[salsa::invoke(items::imp::impl_function_resolver_data)]
1113    fn impl_function_resolver_data(
1114        &self,
1115        impl_function_id: ImplFunctionId,
1116    ) -> Maybe<Arc<ResolverData>>;
1117    /// Returns the inline configuration of an impl function's declaration.
1118    #[salsa::invoke(items::imp::impl_function_declaration_inline_config)]
1119    fn impl_function_declaration_inline_config(
1120        &self,
1121        impl_function_id: ImplFunctionId,
1122    ) -> Maybe<InlineConfiguration>;
1123    /// Returns the implicits precedence of an impl function.
1124    #[salsa::invoke(items::imp::impl_function_declaration_implicit_precedence)]
1125    fn impl_function_declaration_implicit_precedence(
1126        &self,
1127        impl_function_id: ImplFunctionId,
1128    ) -> Maybe<ImplicitPrecedence>;
1129    /// Returns the explicit implicits of a signature of an impl function.
1130    #[salsa::invoke(items::imp::impl_function_declaration_implicits)]
1131    fn impl_function_declaration_implicits(
1132        &self,
1133        impl_function_id: ImplFunctionId,
1134    ) -> Maybe<Vec<TypeId>>;
1135    /// Returns the trait function of an impl function.
1136    #[salsa::invoke(items::imp::impl_function_trait_function)]
1137    fn impl_function_trait_function(
1138        &self,
1139        impl_function_id: ImplFunctionId,
1140    ) -> Maybe<TraitFunctionId>;
1141    /// Private query to compute data about an impl function declaration.
1142    #[salsa::invoke(items::imp::priv_impl_function_declaration_data)]
1143    fn priv_impl_function_declaration_data(
1144        &self,
1145        impl_function_id: ImplFunctionId,
1146    ) -> Maybe<items::imp::ImplFunctionDeclarationData>;
1147
1148    /// Returns the semantic diagnostics of an impl function definition (declaration + body).
1149    #[salsa::invoke(items::imp::impl_function_body_diagnostics)]
1150    fn impl_function_body_diagnostics(
1151        &self,
1152        impl_function_id: ImplFunctionId,
1153    ) -> Diagnostics<SemanticDiagnostic>;
1154    /// Returns the definition of an impl function.
1155    #[salsa::invoke(items::imp::impl_function_body)]
1156    fn impl_function_body(&self, impl_function_id: ImplFunctionId) -> Maybe<Arc<FunctionBody>>;
1157    /// Returns the resolution resolved_items of an impl function's definition.
1158    #[salsa::invoke(items::imp::impl_function_body_resolver_data)]
1159    fn impl_function_body_resolver_data(
1160        &self,
1161        impl_function_id: ImplFunctionId,
1162    ) -> Maybe<Arc<ResolverData>>;
1163    /// Private query to compute data about an impl function definition (declaration + body)
1164    #[salsa::invoke(items::imp::priv_impl_function_body_data)]
1165    fn priv_impl_function_body_data(
1166        &self,
1167        impl_function_id: ImplFunctionId,
1168    ) -> Maybe<items::function_with_body::FunctionBodyData>;
1169
1170    // Implizations.
1171    // ==============
1172    /// Returns the impl type for the given trait type, by implization by the given impl context, if
1173    /// the impl matches the trait of the trait type.
1174    // TODO(Gil): Consider removing the cycle handling here if we will upgrade the salsa version.
1175    #[salsa::invoke(items::implization::trait_type_implized_by_context)]
1176    #[salsa::cycle(items::implization::trait_type_implized_by_context_cycle)]
1177    fn trait_type_implized_by_context(
1178        &self,
1179        trait_type_def_id: TraitTypeId,
1180        impl_def_id: ImplDefId,
1181    ) -> Maybe<TypeId>;
1182
1183    // Free function.
1184    // ==============
1185    /// Returns the semantic diagnostics of a free function's declaration (signature).
1186    #[salsa::invoke(items::free_function::free_function_declaration_diagnostics)]
1187    fn free_function_declaration_diagnostics(
1188        &self,
1189        free_function_id: FreeFunctionId,
1190    ) -> Diagnostics<SemanticDiagnostic>;
1191    /// Returns the signature of a free function.
1192    #[salsa::invoke(items::free_function::free_function_signature)]
1193    fn free_function_signature(
1194        &self,
1195        free_function_id: FreeFunctionId,
1196    ) -> Maybe<semantic::Signature>;
1197    /// Returns the explicit implicits of a signature of a free function.
1198    #[salsa::invoke(items::free_function::free_function_declaration_implicits)]
1199    fn free_function_declaration_implicits(
1200        &self,
1201        free_function_id: FreeFunctionId,
1202    ) -> Maybe<Vec<TypeId>>;
1203    /// Returns the implicits precedence of a free function.
1204    #[salsa::invoke(items::free_function::free_function_declaration_implicit_precedence)]
1205    fn free_function_declaration_implicit_precedence(
1206        &self,
1207        free_function_id: FreeFunctionId,
1208    ) -> Maybe<ImplicitPrecedence>;
1209    /// Returns the generic params of a free function.
1210    #[salsa::invoke(items::free_function::free_function_generic_params)]
1211    fn free_function_generic_params(
1212        &self,
1213        free_function_id: FreeFunctionId,
1214    ) -> Maybe<Vec<GenericParam>>;
1215    /// Returns the generic params data of a free function.
1216    #[salsa::invoke(items::free_function::free_function_generic_params_data)]
1217    fn free_function_generic_params_data(
1218        &self,
1219        free_function_id: FreeFunctionId,
1220    ) -> Maybe<GenericParamsData>;
1221    /// Returns the resolution resolved_items of a free function's declaration.
1222    #[salsa::invoke(items::free_function::free_function_declaration_resolver_data)]
1223    fn free_function_declaration_resolver_data(
1224        &self,
1225        free_function_id: FreeFunctionId,
1226    ) -> Maybe<Arc<ResolverData>>;
1227    /// Returns the inline configuration of a free function's declaration.
1228    #[salsa::invoke(items::free_function::free_function_declaration_inline_config)]
1229    fn free_function_declaration_inline_config(
1230        &self,
1231        free_function_id: FreeFunctionId,
1232    ) -> Maybe<InlineConfiguration>;
1233    /// Private query to compute data about a free function declaration - its signature excluding
1234    /// its body.
1235    #[salsa::invoke(items::free_function::priv_free_function_declaration_data)]
1236    fn priv_free_function_declaration_data(
1237        &self,
1238        function_id: FreeFunctionId,
1239    ) -> Maybe<items::functions::FunctionDeclarationData>;
1240
1241    /// Returns the semantic diagnostics of a free function's body.
1242    #[salsa::invoke(items::free_function::free_function_body_diagnostics)]
1243    fn free_function_body_diagnostics(
1244        &self,
1245        free_function_id: FreeFunctionId,
1246    ) -> Diagnostics<SemanticDiagnostic>;
1247    /// Returns the resolution resolved_items of a free function's body.
1248    #[salsa::invoke(items::free_function::free_function_body_resolver_data)]
1249    fn free_function_body_resolver_data(
1250        &self,
1251        free_function_id: FreeFunctionId,
1252    ) -> Maybe<Arc<ResolverData>>;
1253    /// Private query to compute data about a free function's body.
1254    #[salsa::invoke(items::free_function::priv_free_function_body_data)]
1255    fn priv_free_function_body_data(
1256        &self,
1257        free_function_id: FreeFunctionId,
1258    ) -> Maybe<items::function_with_body::FunctionBodyData>;
1259
1260    // Function with body.
1261    // ===================
1262    /// Returns the semantic diagnostics of a declaration (signature) of a function with a body.
1263    #[salsa::invoke(items::function_with_body::function_declaration_diagnostics)]
1264    fn function_declaration_diagnostics(
1265        &self,
1266        function_id: FunctionWithBodyId,
1267    ) -> Diagnostics<SemanticDiagnostic>;
1268    /// Returns the inline configuration of a declaration (signature) of a function with a body.
1269    #[salsa::invoke(items::function_with_body::function_declaration_inline_config)]
1270    fn function_declaration_inline_config(
1271        &self,
1272        function_id: FunctionWithBodyId,
1273    ) -> Maybe<InlineConfiguration>;
1274    /// Returns the implicit order of a declaration (signature) of a function with a body.
1275    #[salsa::invoke(items::function_with_body::function_declaration_implicit_precedence)]
1276    fn function_declaration_implicit_precedence(
1277        &self,
1278        function_id: FunctionWithBodyId,
1279    ) -> Maybe<ImplicitPrecedence>;
1280    /// Returns the signature of a function with a body.
1281    #[salsa::invoke(items::function_with_body::function_with_body_signature)]
1282    fn function_with_body_signature(
1283        &self,
1284        function_id: FunctionWithBodyId,
1285    ) -> Maybe<semantic::Signature>;
1286    /// Returns all the available generic params inside a function body.
1287    #[salsa::invoke(items::function_with_body::function_with_body_generic_params)]
1288    fn function_with_body_generic_params(
1289        &self,
1290        function_id: FunctionWithBodyId,
1291    ) -> Maybe<Vec<GenericParam>>;
1292    /// Returns the attributes of a function with a body.
1293    #[salsa::invoke(items::function_with_body::function_with_body_attributes)]
1294    fn function_with_body_attributes(
1295        &self,
1296        function_id: FunctionWithBodyId,
1297    ) -> Maybe<Vec<Attribute>>;
1298
1299    /// Returns the semantic diagnostics of a body of a function (with a body).
1300    #[salsa::invoke(items::function_with_body::function_body_diagnostics)]
1301    fn function_body_diagnostics(
1302        &self,
1303        function_id: FunctionWithBodyId,
1304    ) -> Diagnostics<SemanticDiagnostic>;
1305    /// Returns the body expr of a function (with a body).
1306    #[salsa::invoke(items::function_with_body::function_body_expr)]
1307    fn function_body_expr(&self, function_id: FunctionWithBodyId) -> Maybe<semantic::ExprId>;
1308    /// Returns the body of a function (with a body).
1309    #[salsa::invoke(items::function_with_body::function_body)]
1310    fn function_body(&self, function_id: FunctionWithBodyId) -> Maybe<Arc<FunctionBody>>;
1311
1312    // Extern function.
1313    // ================
1314    /// Private query to compute data about an extern function declaration. An extern function has
1315    /// no body, and thus only has a declaration.
1316    #[salsa::invoke(items::extern_function::priv_extern_function_declaration_data)]
1317    fn priv_extern_function_declaration_data(
1318        &self,
1319        function_id: ExternFunctionId,
1320    ) -> Maybe<items::functions::FunctionDeclarationData>;
1321    /// Returns the inline configuration of an extern function's declaration.
1322    #[salsa::invoke(items::extern_function::extern_function_declaration_inline_config)]
1323    fn extern_function_declaration_inline_config(
1324        &self,
1325        extern_function_id: ExternFunctionId,
1326    ) -> Maybe<InlineConfiguration>;
1327    /// Returns the semantic diagnostics of an extern function declaration. An extern function has
1328    /// no body, and thus only has a declaration.
1329    #[salsa::invoke(items::extern_function::extern_function_declaration_diagnostics)]
1330    fn extern_function_declaration_diagnostics(
1331        &self,
1332        extern_function_id: ExternFunctionId,
1333    ) -> Diagnostics<SemanticDiagnostic>;
1334    /// Returns the signature of an extern function.
1335    #[salsa::invoke(items::extern_function::extern_function_signature)]
1336    fn extern_function_signature(
1337        &self,
1338        extern_function_id: ExternFunctionId,
1339    ) -> Maybe<semantic::Signature>;
1340    /// Returns the generic params of an extern function.
1341    #[salsa::invoke(items::extern_function::extern_function_declaration_generic_params)]
1342    fn extern_function_declaration_generic_params(
1343        &self,
1344        extern_function_id: ExternFunctionId,
1345    ) -> Maybe<Vec<GenericParam>>;
1346    /// Returns the generic params data of an extern function.
1347    #[salsa::invoke(items::extern_function::extern_function_declaration_generic_params_data)]
1348    fn extern_function_declaration_generic_params_data(
1349        &self,
1350        extern_function_id: ExternFunctionId,
1351    ) -> Maybe<GenericParamsData>;
1352    /// Returns the explicit implicits of an extern function declaration.
1353    #[salsa::invoke(items::extern_function::extern_function_declaration_implicits)]
1354    fn extern_function_declaration_implicits(
1355        &self,
1356        extern_function_id: ExternFunctionId,
1357    ) -> Maybe<Vec<TypeId>>;
1358    /// Returns the ref parameters of an extern function declaration.
1359    #[salsa::invoke(items::extern_function::extern_function_declaration_refs)]
1360    fn extern_function_declaration_refs(
1361        &self,
1362        extern_function_id: ExternFunctionId,
1363    ) -> Maybe<Vec<Parameter>>;
1364    /// Returns the resolution resolved_items of an extern function.
1365    #[salsa::invoke(items::extern_function::extern_function_declaration_resolver_data)]
1366    fn extern_function_declaration_resolver_data(
1367        &self,
1368        extern_function_id: ExternFunctionId,
1369    ) -> Maybe<Arc<ResolverData>>;
1370
1371    // Extern type.
1372    // ============
1373    /// Private query to compute data about an extern type declaration. An extern type has
1374    /// no body, and thus only has a declaration.
1375    #[salsa::invoke(items::extern_type::priv_extern_type_declaration_data)]
1376    fn priv_extern_type_declaration_data(
1377        &self,
1378        type_id: ExternTypeId,
1379    ) -> Maybe<items::extern_type::ExternTypeDeclarationData>;
1380    /// Returns the semantic diagnostics of an extern type declaration. An extern type has
1381    /// no body, and thus only has a declaration.
1382    #[salsa::invoke(items::extern_type::extern_type_declaration_diagnostics)]
1383    fn extern_type_declaration_diagnostics(
1384        &self,
1385        extern_type_id: ExternTypeId,
1386    ) -> Diagnostics<SemanticDiagnostic>;
1387    /// Returns the generic params of an extern type.
1388    #[salsa::invoke(items::extern_type::extern_type_declaration_generic_params)]
1389    fn extern_type_declaration_generic_params(
1390        &self,
1391        extern_type_id: ExternTypeId,
1392    ) -> Maybe<Vec<GenericParam>>;
1393    /// Returns the generic params data of an extern type.
1394    #[salsa::invoke(items::extern_type::extern_type_declaration_generic_params_data)]
1395    fn extern_type_declaration_generic_params_data(
1396        &self,
1397        extern_type_id: ExternTypeId,
1398    ) -> Maybe<GenericParamsData>;
1399
1400    /// Returns the attributes of an extern type.
1401    #[salsa::invoke(items::extern_type::extern_type_attributes)]
1402    fn extern_type_attributes(&self, extern_type_id: ExternTypeId) -> Maybe<Vec<Attribute>>;
1403
1404    // Function Signature.
1405    // =================
1406    /// Returns the signature of the given FunctionTitleId. This include free functions, extern
1407    /// functions, etc...
1408    #[salsa::invoke(items::functions::function_title_signature)]
1409    fn function_title_signature(
1410        &self,
1411        function_title_id: FunctionTitleId,
1412    ) -> Maybe<semantic::Signature>;
1413
1414    /// Returns the generic parameters of the given FunctionTitleId. This include free
1415    /// functions, extern functions, etc...
1416    #[salsa::invoke(items::functions::function_title_generic_params)]
1417    fn function_title_generic_params(
1418        &self,
1419        function_title_id: FunctionTitleId,
1420    ) -> Maybe<Vec<GenericParam>>;
1421
1422    // Concrete function.
1423    // =================
1424    /// Returns the signature of a concrete function. This include free functions, extern functions,
1425    /// etc...
1426    #[salsa::invoke(items::functions::concrete_function_signature)]
1427    fn concrete_function_signature(&self, function_id: FunctionId) -> Maybe<semantic::Signature>;
1428
1429    // Generic type.
1430    // =============
1431    /// Returns the generic params of a generic type.
1432    #[salsa::invoke(types::generic_type_generic_params)]
1433    fn generic_type_generic_params(&self, generic_type: GenericTypeId) -> Maybe<Vec<GenericParam>>;
1434
1435    // Generic param.
1436    // ==============
1437    /// Returns the semantic data of a generic param.
1438    #[salsa::invoke(items::generics::generic_param_semantic)]
1439    fn generic_param_semantic(&self, generic_param: GenericParamId) -> Maybe<GenericParam>;
1440    /// Returns the semantic diagnostics of a generic param.
1441    #[salsa::invoke(items::generics::generic_param_diagnostics)]
1442    fn generic_param_diagnostics(
1443        &self,
1444        generic_param: GenericParamId,
1445    ) -> Diagnostics<SemanticDiagnostic>;
1446    /// Returns the resolver data of a generic param.
1447    #[salsa::invoke(items::generics::generic_param_resolver_data)]
1448    fn generic_param_resolver_data(
1449        &self,
1450        generic_param: GenericParamId,
1451    ) -> Maybe<Arc<ResolverData>>;
1452    /// Returns the trait a generic param impl should implement.
1453    /// Panics if the generic param is not an impl generic param.
1454    #[salsa::invoke(items::generics::generic_impl_param_trait)]
1455    fn generic_impl_param_trait(&self, generic_param_id: GenericParamId) -> Maybe<TraitId>;
1456    /// Private query to compute data about a generic param.
1457    #[salsa::invoke(items::generics::priv_generic_param_data)]
1458    #[salsa::cycle(items::generics::priv_generic_param_data_cycle)]
1459    fn priv_generic_param_data(
1460        &self,
1461        generic_param: GenericParamId,
1462        in_cycle: bool,
1463    ) -> Maybe<GenericParamData>;
1464
1465    // Concrete type.
1466    // ==============
1467    /// Returns true if there is only one value for the given type and hence the values of the given
1468    /// type are all interchangeable.
1469    /// Examples include the unit type tuple of a unit type and empty structs.
1470    /// Always returns false for extern types.
1471    #[salsa::invoke(types::single_value_type)]
1472    fn single_value_type(&self, ty: types::TypeId) -> Maybe<bool>;
1473
1474    /// Returns the type size information for the given type.
1475    #[salsa::invoke(types::type_size_info)]
1476    #[salsa::cycle(types::type_size_info_cycle)]
1477    fn type_size_info(&self, ty: types::TypeId) -> Maybe<TypeSizeInformation>;
1478
1479    /// Returns the generic_type of a generic function. This include free types, extern
1480    /// types, etc...
1481    #[salsa::invoke(types::type_info)]
1482    fn type_info(
1483        &self,
1484        lookup_context: ImplLookupContext,
1485        ty: types::TypeId,
1486    ) -> Maybe<types::TypeInfo>;
1487
1488    /// Private query to check if a type is fully concrete.
1489    #[salsa::invoke(types::priv_type_is_fully_concrete)]
1490    fn priv_type_is_fully_concrete(&self, ty: types::TypeId) -> bool;
1491
1492    /// Private query to check if a type contains no variables.
1493    #[salsa::invoke(types::priv_type_is_var_free)]
1494    fn priv_type_is_var_free(&self, ty: types::TypeId) -> bool;
1495
1496    /// Private query for a shorter unique name for types.
1497    #[salsa::invoke(types::priv_type_short_name)]
1498    fn priv_type_short_name(&self, ty: types::TypeId) -> String;
1499
1500    // Expression.
1501    // ===========
1502    /// Assumes function and expression are present.
1503    #[salsa::invoke(items::function_with_body::expr_semantic)]
1504    fn expr_semantic(
1505        &self,
1506        function_id: FunctionWithBodyId,
1507        id: semantic::ExprId,
1508    ) -> semantic::Expr;
1509    /// Assumes function and pattern are present.
1510    #[salsa::invoke(items::function_with_body::pattern_semantic)]
1511    fn pattern_semantic(
1512        &self,
1513        function_id: FunctionWithBodyId,
1514        id: semantic::PatternId,
1515    ) -> semantic::Pattern;
1516    /// Assumes function and statement are valid.
1517    #[salsa::invoke(items::function_with_body::statement_semantic)]
1518    fn statement_semantic(
1519        &self,
1520        function_id: FunctionWithBodyId,
1521        id: semantic::StatementId,
1522    ) -> semantic::Statement;
1523
1524    // Lookups.
1525    // ========
1526    fn lookup_resolved_generic_item_by_ptr(
1527        &self,
1528        id: LookupItemId,
1529        ptr: ast::TerminalIdentifierPtr,
1530    ) -> Option<ResolvedGenericItem>;
1531    fn lookup_resolved_concrete_item_by_ptr(
1532        &self,
1533        id: LookupItemId,
1534        ptr: ast::TerminalIdentifierPtr,
1535    ) -> Option<ResolvedConcreteItem>;
1536
1537    // Diagnostics.
1538    // ============
1539    /// Aggregates module level semantic diagnostics.
1540    fn module_semantic_diagnostics(
1541        &self,
1542        module_id: ModuleId,
1543    ) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1544
1545    /// Aggregates file level semantic diagnostics.
1546    fn file_semantic_diagnostics(&self, file_id: FileId) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1547
1548    // Corelib.
1549    // ========
1550    #[salsa::invoke(corelib::core_crate)]
1551    fn core_crate(&self) -> CrateId;
1552    #[salsa::invoke(corelib::core_module)]
1553    fn core_module(&self) -> ModuleId;
1554    #[salsa::invoke(corelib::core_felt252_ty)]
1555    fn core_felt252_ty(&self) -> semantic::TypeId;
1556
1557    // Analyzer plugins.
1558    // ========
1559    #[salsa::input]
1560    fn analyzer_plugins(&self) -> Vec<Arc<dyn AnalyzerPlugin>>;
1561
1562    /// Returns the set of `allow` that were declared as by a plugin.
1563    /// An allow that is not in this set will be handled as an unknown allow.
1564    fn declared_allows(&self) -> Arc<OrderedHashSet<String>>;
1565
1566    // Helpers for language server.
1567    // ============================
1568    /// Returns all methods in a module that match the given type filter.
1569    #[salsa::invoke(lsp_helpers::methods_in_module)]
1570    fn methods_in_module(
1571        &self,
1572        module_id: ModuleId,
1573        type_filter: lsp_helpers::TypeFilter,
1574    ) -> Arc<[TraitFunctionId]>;
1575    /// Returns all methods in a crate that match the given type filter.
1576    #[salsa::invoke(lsp_helpers::methods_in_crate)]
1577    fn methods_in_crate(
1578        &self,
1579        crate_id: CrateId,
1580        type_filter: lsp_helpers::TypeFilter,
1581    ) -> Arc<[TraitFunctionId]>;
1582    /// Returns all the traits visible from a module, alongside a visible use path to the trait.
1583    #[salsa::invoke(lsp_helpers::visible_traits_from_module)]
1584    fn visible_traits_from_module(
1585        &self,
1586        module_id: ModuleFileId,
1587    ) -> Option<Arc<OrderedHashMap<TraitId, String>>>;
1588    /// Returns all visible traits in a module, alongside a visible use path to the trait.
1589    /// `user_module_file_id` is the module from which the traits are should be visible. If
1590    /// `include_parent` is true, the parent module of `module_id` is also considered.
1591    #[salsa::invoke(lsp_helpers::visible_traits_in_module)]
1592    fn visible_traits_in_module(
1593        &self,
1594        module_id: ModuleId,
1595        user_module_file_id: ModuleFileId,
1596        include_parent: bool,
1597    ) -> Arc<[(TraitId, String)]>;
1598    /// Returns all visible traits in a crate, alongside a visible use path to the trait.
1599    /// `user_module_file_id` is the module from which the traits are should be visible.
1600    #[salsa::invoke(lsp_helpers::visible_traits_in_crate)]
1601    fn visible_traits_in_crate(
1602        &self,
1603        crate_id: CrateId,
1604        user_module_file_id: ModuleFileId,
1605    ) -> Arc<[(TraitId, String)]>;
1606}
1607
1608impl<T: Upcast<dyn SemanticGroup + 'static>> Elongate for T {
1609    fn elongate(&self) -> &(dyn SemanticGroup + 'static) {
1610        self.upcast()
1611    }
1612}
1613
1614fn module_semantic_diagnostics(
1615    db: &dyn SemanticGroup,
1616    module_id: ModuleId,
1617) -> Maybe<Diagnostics<SemanticDiagnostic>> {
1618    let mut diagnostics = DiagnosticsBuilder::default();
1619    for (_module_file_id, plugin_diag) in db.module_plugin_diagnostics(module_id)?.iter().cloned() {
1620        diagnostics.add(SemanticDiagnostic::new(
1621            StableLocation::new(plugin_diag.stable_ptr),
1622            SemanticDiagnosticKind::PluginDiagnostic(plugin_diag),
1623        ));
1624    }
1625    let data = db.priv_module_semantic_data(module_id)?;
1626    diagnostics.extend(data.diagnostics.clone());
1627    // TODO(Gil): Aggregate diagnostics for subitems with semantic model (i.e. impl function, trait
1628    // functions and generic params) directly and not via the parent item.
1629    for item in db.module_items(module_id)?.iter() {
1630        match item {
1631            ModuleItemId::Constant(const_id) => {
1632                diagnostics.extend(db.constant_semantic_diagnostics(*const_id));
1633            }
1634            // Add signature diagnostics.
1635            ModuleItemId::Use(use_id) => {
1636                diagnostics.extend(db.use_semantic_diagnostics(*use_id));
1637            }
1638            ModuleItemId::FreeFunction(free_function) => {
1639                diagnostics.extend(db.free_function_declaration_diagnostics(*free_function));
1640                diagnostics.extend(db.free_function_body_diagnostics(*free_function));
1641            }
1642            ModuleItemId::Struct(struct_id) => {
1643                diagnostics.extend(db.struct_declaration_diagnostics(*struct_id));
1644                diagnostics.extend(db.struct_definition_diagnostics(*struct_id));
1645            }
1646            ModuleItemId::Enum(enum_id) => {
1647                diagnostics.extend(db.enum_definition_diagnostics(*enum_id));
1648                diagnostics.extend(db.enum_declaration_diagnostics(*enum_id));
1649            }
1650            ModuleItemId::Trait(trait_id) => {
1651                diagnostics.extend(db.trait_semantic_declaration_diagnostics(*trait_id));
1652                diagnostics.extend(db.trait_semantic_definition_diagnostics(*trait_id));
1653            }
1654            ModuleItemId::Impl(impl_def_id) => {
1655                diagnostics.extend(db.impl_semantic_declaration_diagnostics(*impl_def_id));
1656                diagnostics.extend(db.impl_semantic_definition_diagnostics(*impl_def_id));
1657            }
1658            ModuleItemId::Submodule(submodule_id) => {
1659                // Note that the parent module does not report the diagnostics of its submodules.
1660                if let Ok(file_id) = db.module_main_file(ModuleId::Submodule(*submodule_id)) {
1661                    if db.file_content(file_id).is_none() {
1662                        // Note that the error location is in the parent module, not the
1663                        // submodule.
1664
1665                        let path = match file_id.lookup_intern(db) {
1666                            FileLongId::OnDisk(path) => path.display().to_string(),
1667                            FileLongId::Virtual(_) | FileLongId::External(_) => {
1668                                panic!("Expected OnDisk file.")
1669                            }
1670                        };
1671
1672                        let stable_location =
1673                            StableLocation::new(submodule_id.stable_ptr(db.upcast()).untyped());
1674                        diagnostics.add(SemanticDiagnostic::new(
1675                            stable_location,
1676                            SemanticDiagnosticKind::ModuleFileNotFound(path),
1677                        ));
1678                    }
1679                }
1680            }
1681            ModuleItemId::ExternType(extern_type) => {
1682                diagnostics.extend(db.extern_type_declaration_diagnostics(*extern_type));
1683            }
1684            ModuleItemId::ExternFunction(extern_function) => {
1685                diagnostics.extend(db.extern_function_declaration_diagnostics(*extern_function));
1686            }
1687            ModuleItemId::TypeAlias(type_alias) => {
1688                diagnostics.extend(db.module_type_alias_semantic_diagnostics(*type_alias));
1689            }
1690            ModuleItemId::ImplAlias(type_alias) => {
1691                diagnostics.extend(db.impl_alias_semantic_diagnostics(*type_alias));
1692            }
1693        }
1694    }
1695    for global_use in db.module_global_uses(module_id)?.keys() {
1696        diagnostics.extend(db.global_use_semantic_diagnostics(*global_use));
1697    }
1698    add_unused_item_diagnostics(db, module_id, &data, &mut diagnostics);
1699    for analyzer_plugin in db.analyzer_plugins().iter() {
1700        for diag in analyzer_plugin.diagnostics(db, module_id) {
1701            diagnostics.add(SemanticDiagnostic::new(
1702                StableLocation::new(diag.stable_ptr),
1703                SemanticDiagnosticKind::PluginDiagnostic(diag),
1704            ));
1705        }
1706    }
1707
1708    Ok(diagnostics.build())
1709}
1710
1711fn declared_allows(db: &dyn SemanticGroup) -> Arc<OrderedHashSet<String>> {
1712    Arc::new(OrderedHashSet::from_iter(
1713        db.analyzer_plugins().into_iter().flat_map(|plugin| plugin.declared_allows()),
1714    ))
1715}
1716
1717/// Adds diagnostics for unused items in a module.
1718///
1719/// Returns `None` if skipped attempt to add diagnostics.
1720fn add_unused_item_diagnostics(
1721    db: &dyn SemanticGroup,
1722    module_id: ModuleId,
1723    data: &ModuleSemanticData,
1724    diagnostics: &mut DiagnosticsBuilder<SemanticDiagnostic>,
1725) {
1726    let Ok(all_used_items) = db.module_all_used_items(module_id) else {
1727        return;
1728    };
1729    for info in data.items.values() {
1730        if info.visibility == Visibility::Public {
1731            continue;
1732        }
1733        if let ModuleItemId::Use(use_id) = info.item_id {
1734            add_unused_import_diagnostics(db, &all_used_items, use_id, diagnostics);
1735        };
1736    }
1737}
1738
1739/// Adds diagnostics for unused imports.
1740fn add_unused_import_diagnostics(
1741    db: &dyn SemanticGroup,
1742    all_used_items: &OrderedHashSet<LookupItemId>,
1743    use_id: UseId,
1744    diagnostics: &mut DiagnosticsBuilder<SemanticDiagnostic>,
1745) {
1746    let _iife = (|| {
1747        let item = db.use_resolved_item(use_id).ok()?;
1748        // TODO(orizi): Properly handle usages of impls, and than add warnings on their usages as
1749        // well.
1750        require(!matches!(
1751            item,
1752            ResolvedGenericItem::Impl(_) | ResolvedGenericItem::GenericImplAlias(_)
1753        ))?;
1754        require(!all_used_items.contains(&LookupItemId::ModuleItem(ModuleItemId::Use(use_id))))?;
1755        let resolver_data = db.use_resolver_data(use_id).ok()?;
1756        require(!resolver_data.feature_config.allow_unused_imports)?;
1757        Some(diagnostics.add(SemanticDiagnostic::new(
1758            StableLocation::new(use_id.untyped_stable_ptr(db.upcast())),
1759            SemanticDiagnosticKind::UnusedImport(use_id),
1760        )))
1761    })();
1762}
1763
1764fn file_semantic_diagnostics(
1765    db: &dyn SemanticGroup,
1766    file_id: FileId,
1767) -> Maybe<Diagnostics<SemanticDiagnostic>> {
1768    let mut diagnostics = DiagnosticsBuilder::default();
1769    for module_id in db.file_modules(file_id)?.iter().copied() {
1770        if let Ok(module_diagnostics) = db.module_semantic_diagnostics(module_id) {
1771            diagnostics.extend(module_diagnostics)
1772        }
1773    }
1774    Ok(diagnostics.build())
1775}
1776
1777pub fn lookup_resolved_generic_item_by_ptr(
1778    db: &dyn SemanticGroup,
1779    id: LookupItemId,
1780    ptr: ast::TerminalIdentifierPtr,
1781) -> Option<ResolvedGenericItem> {
1782    get_resolver_data_options(id, db)
1783        .into_iter()
1784        .find_map(|resolver_data| resolver_data.resolved_items.generic.get(&ptr).cloned())
1785}
1786
1787pub fn lookup_resolved_concrete_item_by_ptr(
1788    db: &dyn SemanticGroup,
1789    id: LookupItemId,
1790    ptr: ast::TerminalIdentifierPtr,
1791) -> Option<ResolvedConcreteItem> {
1792    get_resolver_data_options(id, db)
1793        .into_iter()
1794        .find_map(|resolver_data| resolver_data.resolved_items.concrete.get(&ptr).cloned())
1795}
1796
1797pub fn get_resolver_data_options(
1798    id: LookupItemId,
1799    db: &dyn SemanticGroup,
1800) -> Vec<Arc<ResolverData>> {
1801    match id {
1802        LookupItemId::ModuleItem(module_item) => match module_item {
1803            ModuleItemId::Constant(id) => vec![db.constant_resolver_data(id)],
1804            ModuleItemId::Submodule(_) => vec![],
1805            ModuleItemId::Use(id) => vec![db.use_resolver_data(id)],
1806            ModuleItemId::FreeFunction(id) => vec![
1807                db.free_function_declaration_resolver_data(id),
1808                db.free_function_body_resolver_data(id),
1809            ],
1810            ModuleItemId::Struct(id) => vec![
1811                db.struct_declaration_resolver_data(id),
1812                db.struct_definition_resolver_data(id),
1813            ],
1814            ModuleItemId::Enum(id) => {
1815                vec![db.enum_definition_resolver_data(id), db.enum_declaration_resolver_data(id)]
1816            }
1817            ModuleItemId::TypeAlias(id) => vec![db.module_type_alias_resolver_data(id)],
1818            ModuleItemId::ImplAlias(id) => vec![db.impl_alias_resolver_data(id)],
1819            ModuleItemId::Trait(_) => vec![],
1820            ModuleItemId::Impl(id) => vec![db.impl_def_resolver_data(id)],
1821            ModuleItemId::ExternType(_) => vec![],
1822            ModuleItemId::ExternFunction(id) => {
1823                vec![db.extern_function_declaration_resolver_data(id)]
1824            }
1825        },
1826        LookupItemId::TraitItem(id) => match id {
1827            cairo_lang_defs::ids::TraitItemId::Function(id) => {
1828                let mut res = vec![db.trait_function_resolver_data(id)];
1829                if let Ok(Some(body)) = db.priv_trait_function_body_data(id) {
1830                    res.push(Ok(body.resolver_data));
1831                }
1832                res
1833            }
1834            cairo_lang_defs::ids::TraitItemId::Type(id) => vec![db.trait_type_resolver_data(id)],
1835            cairo_lang_defs::ids::TraitItemId::Constant(id) => {
1836                vec![db.trait_constant_resolver_data(id)]
1837            }
1838            cairo_lang_defs::ids::TraitItemId::Impl(id) => vec![db.trait_impl_resolver_data(id)],
1839        },
1840        LookupItemId::ImplItem(id) => match id {
1841            cairo_lang_defs::ids::ImplItemId::Function(id) => {
1842                vec![db.impl_function_resolver_data(id), db.impl_function_body_resolver_data(id)]
1843            }
1844            cairo_lang_defs::ids::ImplItemId::Type(id) => vec![db.impl_type_def_resolver_data(id)],
1845            cairo_lang_defs::ids::ImplItemId::Constant(id) => {
1846                vec![db.impl_constant_def_resolver_data(id)]
1847            }
1848            cairo_lang_defs::ids::ImplItemId::Impl(id) => vec![db.impl_impl_def_resolver_data(id)],
1849        },
1850    }
1851    .into_iter()
1852    .flatten()
1853    .collect()
1854}