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
52pub trait Elongate {
55    fn elongate(&self) -> &(dyn SemanticGroup + 'static);
56}
57
58#[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    #[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    #[salsa::invoke(items::constant::constant_semantic_diagnostics)]
147    fn constant_semantic_diagnostics(
148        &self,
149        const_id: ConstantId,
150    ) -> Diagnostics<SemanticDiagnostic>;
151    #[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    #[salsa::invoke(items::constant::const_calc_info)]
166    fn const_calc_info(&self) -> Arc<ConstCalcInfo>;
167
168    #[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    #[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    #[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    #[salsa::invoke(items::us::priv_global_use_imported_module)]
192    fn priv_global_use_imported_module(&self, global_use_id: GlobalUseId) -> Maybe<ModuleId>;
193    #[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    #[salsa::invoke(items::us::priv_module_use_star_modules)]
201    fn priv_module_use_star_modules(&self, module_id: ModuleId) -> Arc<ImportedModules>;
202
203    #[salsa::invoke(items::module::priv_module_semantic_data)]
208    fn priv_module_semantic_data(&self, module_id: ModuleId) -> Maybe<Arc<ModuleSemanticData>>;
209
210    #[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    #[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    #[salsa::invoke(items::module::module_all_used_uses)]
230    fn module_all_used_uses(&self, module_id: ModuleId) -> Maybe<Arc<OrderedHashSet<UseId>>>;
231
232    #[salsa::invoke(items::module::module_attributes)]
234    fn module_attributes(&self, module_id: ModuleId) -> Maybe<Vec<Attribute>>;
235
236    #[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    #[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    #[salsa::invoke(items::structure::struct_declaration_diagnostics)]
253    fn struct_declaration_diagnostics(
254        &self,
255        struct_id: StructId,
256    ) -> Diagnostics<SemanticDiagnostic>;
257    #[salsa::invoke(items::structure::struct_attributes)]
259    fn struct_attributes(&self, struct_id: StructId) -> Maybe<Vec<Attribute>>;
260    #[salsa::invoke(items::structure::struct_generic_params)]
262    fn struct_generic_params(&self, struct_id: StructId) -> Maybe<Vec<GenericParam>>;
263    #[salsa::invoke(items::structure::struct_generic_params_data)]
265    fn struct_generic_params_data(&self, struct_id: StructId) -> Maybe<GenericParamsData>;
266    #[salsa::invoke(items::structure::struct_declaration_resolver_data)]
268    fn struct_declaration_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
269
270    #[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    #[salsa::invoke(items::structure::struct_definition_diagnostics)]
278    fn struct_definition_diagnostics(&self, struct_id: StructId)
279    -> Diagnostics<SemanticDiagnostic>;
280    #[salsa::invoke(items::structure::struct_members)]
282    fn struct_members(
283        &self,
284        struct_id: StructId,
285    ) -> Maybe<Arc<OrderedHashMap<SmolStr, semantic::Member>>>;
286    #[salsa::invoke(items::structure::struct_definition_resolver_data)]
288    fn struct_definition_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
289    #[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    #[salsa::invoke(items::enm::priv_enum_declaration_data)]
300    fn priv_enum_declaration_data(&self, enum_id: EnumId)
301    -> Maybe<items::enm::EnumDeclarationData>;
302    #[salsa::invoke(items::enm::enum_declaration_diagnostics)]
304    fn enum_declaration_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
305    #[salsa::invoke(items::enm::enum_generic_params)]
307    fn enum_generic_params(&self, enum_id: EnumId) -> Maybe<Vec<GenericParam>>;
308    #[salsa::invoke(items::enm::enum_generic_params_data)]
310    fn enum_generic_params_data(&self, enum_id: EnumId) -> Maybe<GenericParamsData>;
311    #[salsa::invoke(items::enm::enum_attributes)]
313    fn enum_attributes(&self, enum_id: EnumId) -> Maybe<Vec<Attribute>>;
314    #[salsa::invoke(items::enm::enum_declaration_resolver_data)]
316    fn enum_declaration_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
317
318    #[salsa::invoke(items::enm::priv_enum_definition_data)]
320    fn priv_enum_definition_data(&self, enum_id: EnumId) -> Maybe<items::enm::EnumDefinitionData>;
321    #[salsa::invoke(items::enm::enum_definition_diagnostics)]
323    fn enum_definition_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
324    #[salsa::invoke(items::enm::enum_variants)]
326    fn enum_variants(&self, enum_id: EnumId) -> Maybe<OrderedHashMap<SmolStr, VariantId>>;
327    #[salsa::invoke(items::enm::variant_semantic)]
329    fn variant_semantic(&self, enum_id: EnumId, variant_id: VariantId) -> Maybe<semantic::Variant>;
330    #[salsa::invoke(items::enm::enum_definition_resolver_data)]
332    fn enum_definition_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
333
334    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[salsa::invoke(items::impl_alias::impl_alias_generic_params)]
404    fn impl_alias_generic_params(&self, impl_alias_id: ImplAliasId) -> Maybe<Vec<GenericParam>>;
405    #[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    #[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    #[salsa::invoke(items::impl_alias::impl_alias_attributes)]
417    fn impl_alias_attributes(&self, impl_def_id: ImplAliasId) -> Maybe<Vec<Attribute>>;
418
419    #[salsa::invoke(items::trt::trait_semantic_declaration_diagnostics)]
423    fn trait_semantic_declaration_diagnostics(
424        &self,
425        trait_id: TraitId,
426    ) -> Diagnostics<SemanticDiagnostic>;
427    #[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    #[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    #[salsa::invoke(items::trt::trait_attributes)]
441    fn trait_attributes(&self, trait_id: TraitId) -> Maybe<Vec<Attribute>>;
442    #[salsa::invoke(items::trt::trait_resolver_data)]
444    fn trait_resolver_data(&self, trait_id: TraitId) -> Maybe<Arc<ResolverData>>;
445    #[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    #[salsa::invoke(items::trt::trait_semantic_definition_diagnostics)]
454    fn trait_semantic_definition_diagnostics(
455        &self,
456        trait_id: TraitId,
457    ) -> Diagnostics<SemanticDiagnostic>;
458    #[salsa::invoke(items::trt::trait_required_item_names)]
460    fn trait_required_item_names(&self, trait_id: TraitId) -> Maybe<OrderedHashSet<SmolStr>>;
461    #[salsa::invoke(items::trt::trait_item_by_name)]
463    fn trait_item_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitItemId>>;
464    #[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    #[salsa::invoke(items::trt::trait_all_used_uses)]
473    fn trait_all_used_uses(&self, trait_id: TraitId) -> Maybe<Arc<OrderedHashSet<UseId>>>;
474    #[salsa::invoke(items::trt::trait_functions)]
476    fn trait_functions(&self, trait_id: TraitId)
477    -> Maybe<OrderedHashMap<SmolStr, TraitFunctionId>>;
478    #[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    #[salsa::invoke(items::trt::trait_types)]
487    fn trait_types(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitTypeId>>;
488    #[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    #[salsa::invoke(items::trt::trait_constants)]
494    fn trait_constants(&self, trait_id: TraitId)
495    -> Maybe<OrderedHashMap<SmolStr, TraitConstantId>>;
496    #[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    #[salsa::invoke(items::trt::trait_impls)]
505    fn trait_impls(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitImplId>>;
506    #[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    #[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    #[salsa::invoke(items::trt::trait_type_diagnostics)]
521    fn trait_type_diagnostics(&self, trait_type_id: TraitTypeId)
522    -> Diagnostics<SemanticDiagnostic>;
523    #[salsa::invoke(items::trt::trait_type_generic_params)]
525    fn trait_type_generic_params(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<GenericParam>>;
526    #[salsa::invoke(items::trt::trait_type_attributes)]
528    fn trait_type_attributes(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<Attribute>>;
529    #[salsa::invoke(items::trt::trait_type_resolver_data)]
531    fn trait_type_resolver_data(&self, trait_type_id: TraitTypeId) -> Maybe<Arc<ResolverData>>;
532    #[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    #[salsa::invoke(items::trt::priv_trait_type_data)]
540    fn priv_trait_type_data(&self, type_id: TraitTypeId) -> Maybe<TraitItemTypeData>;
541
542    #[salsa::invoke(items::trt::trait_constant_diagnostics)]
546    fn trait_constant_diagnostics(
547        &self,
548        trait_constant: TraitConstantId,
549    ) -> Diagnostics<SemanticDiagnostic>;
550    #[salsa::invoke(items::trt::trait_constant_attributes)]
552    fn trait_constant_attributes(&self, trait_constant: TraitConstantId) -> Maybe<Vec<Attribute>>;
553    #[salsa::invoke(items::trt::trait_constant_type)]
555    fn trait_constant_type(&self, trait_type_id: TraitConstantId) -> Maybe<TypeId>;
556    #[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    #[salsa::invoke(items::trt::priv_trait_constant_data)]
564    fn priv_trait_constant_data(
565        &self,
566        trait_constant: TraitConstantId,
567    ) -> Maybe<TraitItemConstantData>;
568    #[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    #[salsa::invoke(items::trt::trait_impl_diagnostics)]
579    fn trait_impl_diagnostics(&self, trait_impl: TraitImplId) -> Diagnostics<SemanticDiagnostic>;
580    #[salsa::invoke(items::trt::trait_impl_attributes)]
582    fn trait_impl_attributes(&self, trait_impl: TraitImplId) -> Maybe<Vec<Attribute>>;
583    #[salsa::invoke(items::trt::trait_impl_concrete_trait)]
585    fn trait_impl_concrete_trait(&self, trait_impl_id: TraitImplId) -> Maybe<ConcreteTraitId>;
586    #[salsa::invoke(items::trt::trait_impl_resolver_data)]
588    fn trait_impl_resolver_data(&self, trait_impl: TraitImplId) -> Maybe<Arc<ResolverData>>;
589    #[salsa::invoke(items::trt::priv_trait_impl_data)]
591    fn priv_trait_impl_data(&self, trait_impl: TraitImplId) -> Maybe<TraitItemImplData>;
592    #[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    #[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    #[salsa::invoke(items::trt::trait_function_signature)]
609    fn trait_function_signature(
610        &self,
611        trait_function_id: TraitFunctionId,
612    ) -> Maybe<semantic::Signature>;
613    #[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    #[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    #[salsa::invoke(items::trt::trait_function_attributes)]
627    fn trait_function_attributes(
628        &self,
629        trait_function_id: TraitFunctionId,
630    ) -> Maybe<Vec<Attribute>>;
631    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[salsa::invoke(items::imp::impl_def_generic_params_data)]
736    fn impl_def_generic_params_data(&self, impl_def_id: ImplDefId) -> Maybe<GenericParamsData>;
737    #[salsa::invoke(items::imp::impl_def_generic_params)]
739    fn impl_def_generic_params(&self, impl_def_id: ImplDefId) -> Maybe<Vec<GenericParam>>;
740    #[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    #[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    #[salsa::invoke(items::imp::impl_def_substitution)]
750    fn impl_def_substitution(&self, impl_def_id: ImplDefId) -> Maybe<Arc<GenericSubstitution>>;
751    #[salsa::invoke(items::imp::impl_def_attributes)]
753    fn impl_def_attributes(&self, impl_def_id: ImplDefId) -> Maybe<Vec<Attribute>>;
754    #[salsa::invoke(items::imp::impl_concrete_trait)]
756    fn impl_concrete_trait(&self, impl_id: ImplId) -> Maybe<ConcreteTraitId>;
757    #[salsa::invoke(items::imp::impl_def_trait)]
760    fn impl_def_trait(&self, impl_def_id: ImplDefId) -> Maybe<TraitId>;
761    #[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    #[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    #[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    #[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    #[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    #[salsa::invoke(items::imp::impl_all_used_uses)]
795    fn impl_all_used_uses(&self, impl_def_id: ImplDefId) -> Maybe<Arc<OrderedHashSet<UseId>>>;
796    #[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    #[salsa::invoke(items::imp::impl_type_ids)]
804    fn impl_type_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplTypeDefId]>>;
805    #[salsa::invoke(items::imp::impl_type_by_id)]
807    fn impl_type_by_id(&self, impl_type_id: ImplTypeDefId) -> Maybe<Option<ast::ItemTypeAlias>>;
808    #[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    #[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    #[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    #[salsa::invoke(items::imp::impl_impl_ids)]
831    fn impl_impl_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplImplDefId]>>;
832    #[salsa::invoke(items::imp::impl_impl_by_id)]
834    fn impl_impl_by_id(&self, impl_impl_id: ImplImplDefId) -> Maybe<Option<ast::ItemImplAlias>>;
835    #[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    #[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    #[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    #[salsa::invoke(items::imp::impl_functions)]
860    fn impl_functions(
861        &self,
862        impl_def_id: ImplDefId,
863    ) -> Maybe<OrderedHashMap<SmolStr, ImplFunctionId>>;
864    #[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    #[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    #[salsa::invoke(items::imp::priv_impl_is_fully_concrete)]
883    fn priv_impl_is_fully_concrete(&self, impl_id: ImplId) -> bool;
884
885    #[salsa::invoke(items::imp::priv_impl_is_var_free)]
887    fn priv_impl_is_var_free(&self, impl_id: ImplId) -> bool;
888
889    #[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    #[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    #[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    #[salsa::invoke(items::imp::impl_type_def_attributes)]
909    fn impl_type_def_attributes(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<Vec<Attribute>>;
910    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[salsa::invoke(items::imp::impl_impl_concrete_trait)]
1096    fn impl_impl_concrete_trait(&self, impl_impl_id: ImplImplId) -> Maybe<ConcreteTraitId>;
1097
1098    #[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    #[salsa::invoke(items::imp::impl_function_signature)]
1108    fn impl_function_signature(
1109        &self,
1110        impl_function_id: ImplFunctionId,
1111    ) -> Maybe<semantic::Signature>;
1112    #[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    #[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    #[salsa::invoke(items::imp::impl_function_attributes)]
1126    fn impl_function_attributes(&self, impl_function_id: ImplFunctionId) -> Maybe<Vec<Attribute>>;
1127    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[salsa::invoke(items::imp::impl_function_body)]
1172    fn impl_function_body(&self, impl_function_id: ImplFunctionId) -> Maybe<Arc<FunctionBody>>;
1173    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[salsa::invoke(items::function_with_body::function_declaration_diagnostics)]
1280    fn function_declaration_diagnostics(
1281        &self,
1282        function_id: FunctionWithBodyId,
1283    ) -> Diagnostics<SemanticDiagnostic>;
1284    #[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    #[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    #[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    #[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    #[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    #[salsa::invoke(items::function_with_body::function_body_diagnostics)]
1317    fn function_body_diagnostics(
1318        &self,
1319        function_id: FunctionWithBodyId,
1320    ) -> Diagnostics<SemanticDiagnostic>;
1321    #[salsa::invoke(items::function_with_body::function_body_expr)]
1323    fn function_body_expr(&self, function_id: FunctionWithBodyId) -> Maybe<semantic::ExprId>;
1324    #[salsa::invoke(items::function_with_body::function_body)]
1326    fn function_body(&self, function_id: FunctionWithBodyId) -> Maybe<Arc<FunctionBody>>;
1327
1328    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[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    #[salsa::invoke(items::extern_type::extern_type_attributes)]
1418    fn extern_type_attributes(&self, extern_type_id: ExternTypeId) -> Maybe<Vec<Attribute>>;
1419
1420    #[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    #[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    #[salsa::invoke(items::functions::concrete_function_signature)]
1443    fn concrete_function_signature(&self, function_id: FunctionId) -> Maybe<semantic::Signature>;
1444
1445    #[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    #[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    #[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    #[salsa::invoke(items::macro_declaration::macro_declaration_diagnostics)]
1470    fn macro_declaration_diagnostics(
1471        &self,
1472        macro_id: MacroDeclarationId,
1473    ) -> Diagnostics<SemanticDiagnostic>;
1474    #[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    #[salsa::invoke(items::macro_declaration::macro_declaration_attributes)]
1482    fn macro_declaration_attributes(&self, macro_id: MacroDeclarationId) -> Maybe<Vec<Attribute>>;
1483    #[salsa::invoke(items::macro_declaration::macro_declaration_rules)]
1485    fn macro_declaration_rules(&self, macro_id: MacroDeclarationId) -> Maybe<Vec<MacroRuleData>>;
1486    #[salsa::invoke(types::generic_type_generic_params)]
1490    fn generic_type_generic_params(&self, generic_type: GenericTypeId) -> Maybe<Vec<GenericParam>>;
1491
1492    #[salsa::invoke(items::generics::generic_param_semantic)]
1496    fn generic_param_semantic(&self, generic_param: GenericParamId) -> Maybe<GenericParam>;
1497    #[salsa::invoke(items::generics::generic_param_diagnostics)]
1499    fn generic_param_diagnostics(
1500        &self,
1501        generic_param: GenericParamId,
1502    ) -> Diagnostics<SemanticDiagnostic>;
1503    #[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    #[salsa::invoke(items::generics::generic_impl_param_trait)]
1512    fn generic_impl_param_trait(&self, generic_param_id: GenericParamId) -> Maybe<TraitId>;
1513    #[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    #[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    #[salsa::invoke(types::single_value_type)]
1536    fn single_value_type(&self, ty: types::TypeId) -> Maybe<bool>;
1537
1538    #[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    #[salsa::invoke(types::type_info)]
1545    fn type_info(&self, lookup_context: ImplLookupContext, ty: types::TypeId) -> types::TypeInfo;
1546
1547    #[salsa::invoke(types::copyable)]
1549    fn copyable(&self, ty: types::TypeId) -> Result<ImplId, InferenceError>;
1550
1551    #[salsa::invoke(types::droppable)]
1553    fn droppable(&self, ty: types::TypeId) -> Result<ImplId, InferenceError>;
1554
1555    #[salsa::invoke(types::priv_type_is_fully_concrete)]
1557    fn priv_type_is_fully_concrete(&self, ty: types::TypeId) -> bool;
1558
1559    #[salsa::invoke(types::priv_type_is_var_free)]
1561    fn priv_type_is_var_free(&self, ty: types::TypeId) -> bool;
1562
1563    #[salsa::invoke(types::priv_type_short_name)]
1565    fn priv_type_short_name(&self, ty: types::TypeId) -> String;
1566
1567    #[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    #[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    #[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    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    fn module_semantic_diagnostics(
1608        &self,
1609        module_id: ModuleId,
1610    ) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1611
1612    fn file_semantic_diagnostics(&self, file_id: FileId) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1614
1615    #[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    #[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    fn crate_analyzer_plugins(&self, crate_id: CrateId) -> Arc<[AnalyzerPluginId]>;
1641
1642    fn declared_allows(&self, crate_id: CrateId) -> Arc<OrderedHashSet<String>>;
1645
1646    #[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    #[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    #[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    #[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    #[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    #[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
1695pub 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    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            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                if let Ok(file_id) = db.module_main_file(ModuleId::Submodule(*submodule_id)) {
1758                    if db.file_content(file_id).is_none() {
1759                        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
1828fn 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
1850fn 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        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    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
1985pub trait PluginSuiteInput: SemanticGroup {
1987    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    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    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 {}