cairo_lang_semantic/
db.rs

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