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