cairo_lang_semantic/
db.rs

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