1use std::collections::BTreeMap;
2use std::sync::Arc;
3
4use cairo_lang_defs::db::{DefsGroup, DefsGroupEx};
5use cairo_lang_defs::diagnostic_utils::StableLocation;
6use cairo_lang_defs::ids::{
7 ConstantId, EnumId, ExternFunctionId, ExternTypeId, FreeFunctionId, FunctionTitleId,
8 FunctionWithBodyId, GenericParamId, GenericTypeId, GlobalUseId, ImplAliasId, ImplConstantDefId,
9 ImplDefId, ImplFunctionId, ImplImplDefId, ImplItemId, ImplTypeDefId, ImportableId,
10 InlineMacroExprPluginLongId, LanguageElementId, LookupItemId, MacroPluginLongId, ModuleFileId,
11 ModuleId, ModuleItemId, ModuleTypeAliasId, StructId, TraitConstantId, TraitFunctionId, TraitId,
12 TraitImplId, TraitItemId, TraitTypeId, UseId, VariantId,
13};
14use cairo_lang_diagnostics::{Diagnostics, DiagnosticsBuilder, Maybe};
15use cairo_lang_filesystem::db::{AsFilesGroupMut, FilesGroup};
16use cairo_lang_filesystem::ids::{CrateId, FileId, FileLongId};
17use cairo_lang_parser::db::ParserGroup;
18use cairo_lang_syntax::attribute::structured::Attribute;
19use cairo_lang_syntax::node::{TypedStablePtr, ast};
20use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
21use cairo_lang_utils::ordered_hash_set::OrderedHashSet;
22use cairo_lang_utils::{LookupIntern, Upcast, require};
23use smol_str::SmolStr;
24
25use crate::corelib::CoreInfo;
26use crate::diagnostic::SemanticDiagnosticKind;
27use crate::expr::inference::{self, ImplVar, ImplVarId};
28use crate::ids::{AnalyzerPluginId, AnalyzerPluginLongId};
29use crate::items::constant::{ConstCalcInfo, ConstValueId, Constant, ImplConstantId};
30use crate::items::function_with_body::FunctionBody;
31use crate::items::functions::{GenericFunctionId, ImplicitPrecedence, InlineConfiguration};
32use crate::items::generics::{GenericParam, GenericParamData, GenericParamsData};
33use crate::items::imp::{
34 ImplId, ImplImplId, ImplItemInfo, ImplLookupContext, ImplicitImplImplData, UninferredImpl,
35};
36use crate::items::module::{ModuleItemInfo, ModuleSemanticData};
37use crate::items::trt::{
38 ConcreteTraitGenericFunctionId, ConcreteTraitId, TraitItemConstantData, TraitItemImplData,
39 TraitItemInfo, TraitItemTypeData,
40};
41use crate::items::us::{ImportedModules, SemanticUseEx};
42use crate::items::visibility::Visibility;
43use crate::plugin::{AnalyzerPlugin, InternedPluginSuite, PluginSuite};
44use crate::resolve::{ResolvedConcreteItem, ResolvedGenericItem, ResolverData};
45use crate::substitution::GenericSubstitution;
46use crate::types::{ImplTypeById, ImplTypeId, TypeSizeInformation};
47use crate::{
48 FunctionId, Parameter, SemanticDiagnostic, TypeId, corelib, items, lsp_helpers, semantic, types,
49};
50
51pub trait Elongate {
54 fn elongate(&self) -> &(dyn SemanticGroup + 'static);
55}
56
57#[salsa::query_group(SemanticDatabase)]
64pub trait SemanticGroup:
65 DefsGroup
66 + Upcast<dyn DefsGroup>
67 + Upcast<dyn ParserGroup>
68 + Upcast<dyn FilesGroup>
69 + AsFilesGroupMut
70 + Elongate
71{
72 #[salsa::interned]
73 fn intern_function(&self, id: items::functions::FunctionLongId) -> semantic::FunctionId;
74 #[salsa::interned]
75 fn intern_concrete_function_with_body(
76 &self,
77 id: items::functions::ConcreteFunctionWithBody,
78 ) -> semantic::ConcreteFunctionWithBodyId;
79 #[salsa::interned]
80 fn intern_concrete_struct(&self, id: types::ConcreteStructLongId) -> types::ConcreteStructId;
81 #[salsa::interned]
82 fn intern_concrete_enum(&self, id: types::ConcreteEnumLongId) -> types::ConcreteEnumId;
83 #[salsa::interned]
84 fn intern_concrete_extern_type(
85 &self,
86 id: types::ConcreteExternTypeLongId,
87 ) -> types::ConcreteExternTypeId;
88 #[salsa::interned]
89 fn intern_concrete_trait(
90 &self,
91 id: items::trt::ConcreteTraitLongId,
92 ) -> items::trt::ConcreteTraitId;
93 #[salsa::interned]
94 fn intern_concrete_trait_function(
95 &self,
96 id: items::trt::ConcreteTraitGenericFunctionLongId,
97 ) -> items::trt::ConcreteTraitGenericFunctionId;
98 #[salsa::interned]
99 fn intern_concrete_trait_type(
100 &self,
101 id: items::trt::ConcreteTraitTypeLongId,
102 ) -> items::trt::ConcreteTraitTypeId;
103 #[salsa::interned]
104 fn intern_concrete_trait_constant(
105 &self,
106 id: items::trt::ConcreteTraitConstantLongId,
107 ) -> items::trt::ConcreteTraitConstantId;
108 #[salsa::interned]
109 fn intern_concrete_impl(
110 &self,
111 id: items::imp::ConcreteImplLongId,
112 ) -> items::imp::ConcreteImplId;
113 #[salsa::interned]
114 fn intern_concrete_trait_impl(
115 &self,
116 id: items::trt::ConcreteTraitImplLongId,
117 ) -> items::trt::ConcreteTraitImplId;
118 #[salsa::interned]
119 fn intern_type(&self, id: types::TypeLongId) -> semantic::TypeId;
120 #[salsa::interned]
121 fn intern_const_value(&self, id: items::constant::ConstValue) -> items::constant::ConstValueId;
122 #[salsa::interned]
123 fn intern_impl(&self, id: items::imp::ImplLongId) -> items::imp::ImplId;
124 #[salsa::interned]
125 fn intern_impl_var(&self, id: ImplVar) -> ImplVarId;
126
127 #[salsa::interned]
128 fn intern_generated_impl(
129 &self,
130 id: items::imp::GeneratedImplLongId,
131 ) -> items::imp::GeneratedImplId;
132
133 #[salsa::interned]
134 fn intern_uninferred_generated_impl(
135 &self,
136 id: items::imp::UninferredGeneratedImplLongId,
137 ) -> items::imp::UninferredGeneratedImplId;
138
139 #[salsa::invoke(items::constant::priv_constant_semantic_data)]
143 #[salsa::cycle(items::constant::priv_constant_semantic_data_cycle)]
144 fn priv_constant_semantic_data(
145 &self,
146 const_id: ConstantId,
147 in_cycle: bool,
148 ) -> Maybe<items::constant::ConstantData>;
149 #[salsa::invoke(items::constant::constant_semantic_diagnostics)]
151 fn constant_semantic_diagnostics(
152 &self,
153 const_id: ConstantId,
154 ) -> Diagnostics<SemanticDiagnostic>;
155 #[salsa::invoke(items::constant::constant_semantic_data)]
157 #[salsa::cycle(items::constant::constant_semantic_data_cycle)]
158 fn constant_semantic_data(&self, use_id: ConstantId) -> Maybe<Constant>;
159 #[salsa::invoke(items::constant::constant_resolver_data)]
160 #[salsa::cycle(items::constant::constant_resolver_data_cycle)]
161 fn constant_resolver_data(&self, use_id: ConstantId) -> Maybe<Arc<ResolverData>>;
162 #[salsa::invoke(items::constant::constant_const_value)]
163 #[salsa::cycle(items::constant::constant_const_value_cycle)]
164 fn constant_const_value(&self, const_id: ConstantId) -> Maybe<ConstValueId>;
165 #[salsa::invoke(items::constant::constant_const_type)]
166 #[salsa::cycle(items::constant::constant_const_type_cycle)]
167 fn constant_const_type(&self, const_id: ConstantId) -> Maybe<TypeId>;
168 #[salsa::invoke(items::constant::const_calc_info)]
170 fn const_calc_info(&self) -> Arc<ConstCalcInfo>;
171
172 #[salsa::invoke(items::us::priv_use_semantic_data)]
176 #[salsa::cycle(items::us::priv_use_semantic_data_cycle)]
177 fn priv_use_semantic_data(&self, use_id: UseId) -> Maybe<items::us::UseData>;
178 #[salsa::invoke(items::us::use_semantic_diagnostics)]
180 fn use_semantic_diagnostics(&self, use_id: UseId) -> Diagnostics<SemanticDiagnostic>;
181 #[salsa::invoke(items::us::use_resolver_data)]
182 #[salsa::cycle(items::us::use_resolver_data_cycle)]
183 fn use_resolver_data(&self, use_id: UseId) -> Maybe<Arc<ResolverData>>;
184
185 #[salsa::invoke(items::us::priv_global_use_semantic_data)]
189 #[salsa::cycle(items::us::priv_global_use_semantic_data_cycle)]
190 fn priv_global_use_semantic_data(
191 &self,
192 global_use_id: GlobalUseId,
193 ) -> Maybe<items::us::UseGlobalData>;
194 #[salsa::invoke(items::us::priv_global_use_imported_module)]
196 fn priv_global_use_imported_module(&self, global_use_id: GlobalUseId) -> Maybe<ModuleId>;
197 #[salsa::invoke(items::us::global_use_semantic_diagnostics)]
199 fn global_use_semantic_diagnostics(
200 &self,
201 global_use_id: GlobalUseId,
202 ) -> Diagnostics<SemanticDiagnostic>;
203 #[salsa::invoke(items::us::priv_module_use_star_modules)]
205 fn priv_module_use_star_modules(&self, module_id: ModuleId) -> Arc<ImportedModules>;
206
207 #[salsa::invoke(items::module::priv_module_semantic_data)]
212 fn priv_module_semantic_data(&self, module_id: ModuleId) -> Maybe<Arc<ModuleSemanticData>>;
213
214 #[salsa::invoke(items::module::module_item_by_name)]
217 fn module_item_by_name(
218 &self,
219 module_id: ModuleId,
220 name: SmolStr,
221 ) -> Maybe<Option<ModuleItemId>>;
222
223 #[salsa::invoke(items::module::module_item_info_by_name)]
226 fn module_item_info_by_name(
227 &self,
228 module_id: ModuleId,
229 name: SmolStr,
230 ) -> Maybe<Option<ModuleItemInfo>>;
231
232 #[salsa::invoke(items::module::module_all_used_items)]
234 fn module_all_used_items(
235 &self,
236 module_id: ModuleId,
237 ) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
238
239 #[salsa::invoke(items::module::module_attributes)]
241 fn module_attributes(&self, module_id: ModuleId) -> Maybe<Vec<Attribute>>;
242
243 #[salsa::invoke(items::module::module_usable_trait_ids)]
245 fn module_usable_trait_ids(
246 &self,
247 module_id: ModuleId,
248 ) -> Maybe<Arc<OrderedHashMap<TraitId, LookupItemId>>>;
249
250 #[salsa::invoke(items::structure::priv_struct_declaration_data)]
254 fn priv_struct_declaration_data(
255 &self,
256 struct_id: StructId,
257 ) -> Maybe<items::structure::StructDeclarationData>;
258 #[salsa::invoke(items::structure::struct_declaration_diagnostics)]
260 fn struct_declaration_diagnostics(
261 &self,
262 struct_id: StructId,
263 ) -> Diagnostics<SemanticDiagnostic>;
264 #[salsa::invoke(items::structure::struct_attributes)]
266 fn struct_attributes(&self, struct_id: StructId) -> Maybe<Vec<Attribute>>;
267 #[salsa::invoke(items::structure::struct_generic_params)]
269 fn struct_generic_params(&self, struct_id: StructId) -> Maybe<Vec<GenericParam>>;
270 #[salsa::invoke(items::structure::struct_generic_params_data)]
272 fn struct_generic_params_data(&self, struct_id: StructId) -> Maybe<GenericParamsData>;
273 #[salsa::invoke(items::structure::struct_declaration_resolver_data)]
275 fn struct_declaration_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
276
277 #[salsa::invoke(items::structure::priv_struct_definition_data)]
279 fn priv_struct_definition_data(
280 &self,
281 struct_id: StructId,
282 ) -> Maybe<items::structure::StructDefinitionData>;
283 #[salsa::invoke(items::structure::struct_definition_diagnostics)]
285 fn struct_definition_diagnostics(&self, struct_id: StructId)
286 -> Diagnostics<SemanticDiagnostic>;
287 #[salsa::invoke(items::structure::struct_members)]
289 fn struct_members(
290 &self,
291 struct_id: StructId,
292 ) -> Maybe<Arc<OrderedHashMap<SmolStr, semantic::Member>>>;
293 #[salsa::invoke(items::structure::struct_definition_resolver_data)]
295 fn struct_definition_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
296 #[salsa::invoke(items::structure::concrete_struct_members)]
298 fn concrete_struct_members(
299 &self,
300 concrete_struct_id: types::ConcreteStructId,
301 ) -> Maybe<Arc<OrderedHashMap<SmolStr, semantic::Member>>>;
302
303 #[salsa::invoke(items::enm::priv_enum_declaration_data)]
307 fn priv_enum_declaration_data(&self, enum_id: EnumId)
308 -> Maybe<items::enm::EnumDeclarationData>;
309 #[salsa::invoke(items::enm::enum_declaration_diagnostics)]
311 fn enum_declaration_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
312 #[salsa::invoke(items::enm::enum_generic_params)]
314 fn enum_generic_params(&self, enum_id: EnumId) -> Maybe<Vec<GenericParam>>;
315 #[salsa::invoke(items::enm::enum_generic_params_data)]
317 fn enum_generic_params_data(&self, enum_id: EnumId) -> Maybe<GenericParamsData>;
318 #[salsa::invoke(items::enm::enum_attributes)]
320 fn enum_attributes(&self, enum_id: EnumId) -> Maybe<Vec<Attribute>>;
321 #[salsa::invoke(items::enm::enum_declaration_resolver_data)]
323 fn enum_declaration_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
324
325 #[salsa::invoke(items::enm::priv_enum_definition_data)]
327 fn priv_enum_definition_data(&self, enum_id: EnumId) -> Maybe<items::enm::EnumDefinitionData>;
328 #[salsa::invoke(items::enm::enum_definition_diagnostics)]
330 fn enum_definition_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
331 #[salsa::invoke(items::enm::enum_variants)]
333 fn enum_variants(&self, enum_id: EnumId) -> Maybe<OrderedHashMap<SmolStr, VariantId>>;
334 #[salsa::invoke(items::enm::variant_semantic)]
336 fn variant_semantic(&self, enum_id: EnumId, variant_id: VariantId) -> Maybe<semantic::Variant>;
337 #[salsa::invoke(items::enm::enum_definition_resolver_data)]
339 fn enum_definition_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
340
341 #[salsa::invoke(items::module_type_alias::module_type_alias_semantic_diagnostics)]
345 fn module_type_alias_semantic_diagnostics(
346 &self,
347 module_type_alias_id: ModuleTypeAliasId,
348 ) -> Diagnostics<SemanticDiagnostic>;
349 #[salsa::invoke(items::module_type_alias::module_type_alias_resolved_type)]
351 #[salsa::cycle(items::module_type_alias::module_type_alias_resolved_type_cycle)]
352 fn module_type_alias_resolved_type(
353 &self,
354 module_type_alias_id: ModuleTypeAliasId,
355 ) -> Maybe<TypeId>;
356 #[salsa::invoke(items::module_type_alias::module_type_alias_generic_params)]
358 fn module_type_alias_generic_params(
359 &self,
360 enum_id: ModuleTypeAliasId,
361 ) -> Maybe<Vec<GenericParam>>;
362 #[salsa::invoke(items::module_type_alias::module_type_alias_resolver_data)]
364 #[salsa::cycle(items::module_type_alias::module_type_alias_resolver_data_cycle)]
365 fn module_type_alias_resolver_data(
366 &self,
367 module_type_alias_id: ModuleTypeAliasId,
368 ) -> Maybe<Arc<ResolverData>>;
369 #[salsa::invoke(items::module_type_alias::priv_module_type_alias_generic_params_data)]
371 fn priv_module_type_alias_generic_params_data(
372 &self,
373 enum_id: ModuleTypeAliasId,
374 ) -> Maybe<GenericParamsData>;
375 #[salsa::invoke(items::module_type_alias::priv_module_type_alias_semantic_data)]
377 #[salsa::cycle(items::module_type_alias::priv_module_type_alias_semantic_data_cycle)]
378 fn priv_module_type_alias_semantic_data(
379 &self,
380 module_type_alias_id: ModuleTypeAliasId,
381 in_cycle: bool,
382 ) -> Maybe<items::module_type_alias::ModuleTypeAliasData>;
383
384 #[salsa::invoke(items::impl_alias::impl_alias_impl_def)]
389 #[salsa::cycle(items::impl_alias::impl_alias_impl_def_cycle)]
390 fn impl_alias_impl_def(&self, impl_alias_id: ImplAliasId) -> Maybe<ImplDefId>;
391 #[salsa::invoke(items::impl_alias::priv_impl_alias_semantic_data)]
393 #[salsa::cycle(items::impl_alias::priv_impl_alias_semantic_data_cycle)]
394 fn priv_impl_alias_semantic_data(
395 &self,
396 impl_alias_id: ImplAliasId,
397 in_cycle: bool,
398 ) -> Maybe<items::impl_alias::ImplAliasData>;
399 #[salsa::invoke(items::impl_alias::impl_alias_semantic_diagnostics)]
401 fn impl_alias_semantic_diagnostics(
402 &self,
403 impl_alias_id: ImplAliasId,
404 ) -> Diagnostics<SemanticDiagnostic>;
405 #[salsa::invoke(items::impl_alias::impl_alias_resolved_impl)]
407 #[salsa::cycle(items::impl_alias::impl_alias_resolved_impl_cycle)]
408 fn impl_alias_resolved_impl(&self, impl_alias_id: ImplAliasId) -> Maybe<ImplId>;
409 #[salsa::invoke(items::impl_alias::impl_alias_generic_params)]
411 fn impl_alias_generic_params(&self, impl_alias_id: ImplAliasId) -> Maybe<Vec<GenericParam>>;
412 #[salsa::invoke(items::impl_alias::impl_alias_generic_params_data)]
414 fn impl_alias_generic_params_data(
415 &self,
416 impl_alias_id: ImplAliasId,
417 ) -> Maybe<GenericParamsData>;
418 #[salsa::invoke(items::impl_alias::impl_alias_resolver_data)]
420 #[salsa::cycle(items::impl_alias::impl_alias_resolver_data_cycle)]
421 fn impl_alias_resolver_data(&self, impl_alias_id: ImplAliasId) -> Maybe<Arc<ResolverData>>;
422 #[salsa::invoke(items::impl_alias::impl_alias_attributes)]
424 fn impl_alias_attributes(&self, impl_def_id: ImplAliasId) -> Maybe<Vec<Attribute>>;
425
426 #[salsa::invoke(items::trt::trait_semantic_declaration_diagnostics)]
430 fn trait_semantic_declaration_diagnostics(
431 &self,
432 trait_id: TraitId,
433 ) -> Diagnostics<SemanticDiagnostic>;
434 #[salsa::invoke(items::trt::trait_generic_params)]
436 #[salsa::cycle(items::trt::trait_generic_params_cycle)]
437 fn trait_generic_params(&self, trait_id: TraitId) -> Maybe<Vec<GenericParam>>;
438 #[salsa::invoke(items::trt::trait_generic_params_data)]
440 #[salsa::cycle(items::trt::trait_generic_params_data_cycle)]
441 fn trait_generic_params_data(
442 &self,
443 trait_id: TraitId,
444 in_cycle: bool,
445 ) -> Maybe<GenericParamsData>;
446 #[salsa::invoke(items::trt::trait_attributes)]
448 fn trait_attributes(&self, trait_id: TraitId) -> Maybe<Vec<Attribute>>;
449 #[salsa::invoke(items::trt::trait_resolver_data)]
451 fn trait_resolver_data(&self, trait_id: TraitId) -> Maybe<Arc<ResolverData>>;
452 #[salsa::invoke(items::trt::priv_trait_declaration_data)]
454 fn priv_trait_declaration_data(
455 &self,
456 trait_id: TraitId,
457 ) -> Maybe<items::trt::TraitDeclarationData>;
458
459 #[salsa::invoke(items::trt::trait_semantic_definition_diagnostics)]
461 fn trait_semantic_definition_diagnostics(
462 &self,
463 trait_id: TraitId,
464 ) -> Diagnostics<SemanticDiagnostic>;
465 #[salsa::invoke(items::trt::trait_required_item_names)]
467 fn trait_required_item_names(&self, trait_id: TraitId) -> Maybe<OrderedHashSet<SmolStr>>;
468 #[salsa::invoke(items::trt::trait_item_by_name)]
470 fn trait_item_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitItemId>>;
471 #[salsa::invoke(items::trt::trait_item_info_by_name)]
473 fn trait_item_info_by_name(
474 &self,
475 trait_id: TraitId,
476 name: SmolStr,
477 ) -> Maybe<Option<TraitItemInfo>>;
478 #[salsa::invoke(items::trt::trait_all_used_items)]
480 fn trait_all_used_items(&self, trait_id: TraitId) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
481 #[salsa::invoke(items::trt::trait_functions)]
483 fn trait_functions(&self, trait_id: TraitId)
484 -> Maybe<OrderedHashMap<SmolStr, TraitFunctionId>>;
485 #[salsa::invoke(items::trt::trait_function_by_name)]
487 fn trait_function_by_name(
488 &self,
489 trait_id: TraitId,
490 name: SmolStr,
491 ) -> Maybe<Option<TraitFunctionId>>;
492 #[salsa::invoke(items::trt::trait_types)]
494 fn trait_types(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitTypeId>>;
495 #[salsa::invoke(items::trt::trait_type_by_name)]
497 fn trait_type_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitTypeId>>;
498
499 #[salsa::invoke(items::trt::trait_constants)]
501 fn trait_constants(&self, trait_id: TraitId)
502 -> Maybe<OrderedHashMap<SmolStr, TraitConstantId>>;
503 #[salsa::invoke(items::trt::trait_constant_by_name)]
505 fn trait_constant_by_name(
506 &self,
507 trait_id: TraitId,
508 name: SmolStr,
509 ) -> Maybe<Option<TraitConstantId>>;
510 #[salsa::invoke(items::trt::trait_impls)]
512 fn trait_impls(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitImplId>>;
513 #[salsa::invoke(items::trt::trait_impl_by_name)]
515 fn trait_impl_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitImplId>>;
516
517 #[salsa::invoke(items::trt::priv_trait_definition_data)]
519 fn priv_trait_definition_data(
520 &self,
521 trait_id: TraitId,
522 ) -> Maybe<items::trt::TraitDefinitionData>;
523
524 #[salsa::invoke(items::trt::trait_type_diagnostics)]
528 fn trait_type_diagnostics(&self, trait_type_id: TraitTypeId)
529 -> Diagnostics<SemanticDiagnostic>;
530 #[salsa::invoke(items::trt::trait_type_generic_params)]
532 fn trait_type_generic_params(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<GenericParam>>;
533 #[salsa::invoke(items::trt::trait_type_attributes)]
535 fn trait_type_attributes(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<Attribute>>;
536 #[salsa::invoke(items::trt::trait_type_resolver_data)]
538 fn trait_type_resolver_data(&self, trait_type_id: TraitTypeId) -> Maybe<Arc<ResolverData>>;
539 #[salsa::invoke(items::trt::priv_trait_type_generic_params_data)]
541 fn priv_trait_type_generic_params_data(
542 &self,
543 trait_type_id: TraitTypeId,
544 ) -> Maybe<GenericParamsData>;
545 #[salsa::invoke(items::trt::priv_trait_type_data)]
547 fn priv_trait_type_data(&self, type_id: TraitTypeId) -> Maybe<TraitItemTypeData>;
548
549 #[salsa::invoke(items::trt::trait_constant_diagnostics)]
553 fn trait_constant_diagnostics(
554 &self,
555 trait_constant: TraitConstantId,
556 ) -> Diagnostics<SemanticDiagnostic>;
557 #[salsa::invoke(items::trt::trait_constant_attributes)]
559 fn trait_constant_attributes(&self, trait_constant: TraitConstantId) -> Maybe<Vec<Attribute>>;
560 #[salsa::invoke(items::trt::trait_constant_type)]
562 fn trait_constant_type(&self, trait_type_id: TraitConstantId) -> Maybe<TypeId>;
563 #[salsa::invoke(items::trt::trait_constant_resolver_data)]
565 fn trait_constant_resolver_data(
566 &self,
567 trait_constant: TraitConstantId,
568 ) -> Maybe<Arc<ResolverData>>;
569 #[salsa::invoke(items::trt::priv_trait_constant_data)]
571 fn priv_trait_constant_data(
572 &self,
573 trait_constant: TraitConstantId,
574 ) -> Maybe<TraitItemConstantData>;
575 #[salsa::invoke(items::trt::concrete_trait_constant_type)]
577 fn concrete_trait_constant_type(
578 &self,
579 concrete_trait_constant_id: items::trt::ConcreteTraitConstantId,
580 ) -> Maybe<TypeId>;
581
582 #[salsa::invoke(items::trt::trait_impl_diagnostics)]
586 fn trait_impl_diagnostics(&self, trait_impl: TraitImplId) -> Diagnostics<SemanticDiagnostic>;
587 #[salsa::invoke(items::trt::trait_impl_attributes)]
589 fn trait_impl_attributes(&self, trait_impl: TraitImplId) -> Maybe<Vec<Attribute>>;
590 #[salsa::invoke(items::trt::trait_impl_concrete_trait)]
592 fn trait_impl_concrete_trait(&self, trait_impl_id: TraitImplId) -> Maybe<ConcreteTraitId>;
593 #[salsa::invoke(items::trt::trait_impl_resolver_data)]
595 fn trait_impl_resolver_data(&self, trait_impl: TraitImplId) -> Maybe<Arc<ResolverData>>;
596 #[salsa::invoke(items::trt::priv_trait_impl_data)]
598 fn priv_trait_impl_data(&self, trait_impl: TraitImplId) -> Maybe<TraitItemImplData>;
599 #[salsa::invoke(items::trt::concrete_trait_impl_concrete_trait)]
601 fn concrete_trait_impl_concrete_trait(
602 &self,
603 concrete_trait_impl_id: items::trt::ConcreteTraitImplId,
604 ) -> Maybe<ConcreteTraitId>;
605
606 #[salsa::invoke(items::trt::trait_function_declaration_diagnostics)]
610 fn trait_function_declaration_diagnostics(
611 &self,
612 trait_function_id: TraitFunctionId,
613 ) -> Diagnostics<SemanticDiagnostic>;
614 #[salsa::invoke(items::trt::trait_function_signature)]
616 fn trait_function_signature(
617 &self,
618 trait_function_id: TraitFunctionId,
619 ) -> Maybe<semantic::Signature>;
620 #[salsa::invoke(items::trt::trait_function_generic_params)]
622 fn trait_function_generic_params(
623 &self,
624 trait_function_id: TraitFunctionId,
625 ) -> Maybe<Vec<GenericParam>>;
626 #[salsa::invoke(items::trt::priv_trait_function_generic_params_data)]
628 fn priv_trait_function_generic_params_data(
629 &self,
630 trait_function_id: TraitFunctionId,
631 ) -> Maybe<GenericParamsData>;
632 #[salsa::invoke(items::trt::trait_function_attributes)]
634 fn trait_function_attributes(
635 &self,
636 trait_function_id: TraitFunctionId,
637 ) -> Maybe<Vec<Attribute>>;
638 #[salsa::invoke(items::trt::trait_function_resolver_data)]
640 fn trait_function_resolver_data(
641 &self,
642 trait_function_id: TraitFunctionId,
643 ) -> Maybe<Arc<ResolverData>>;
644 #[salsa::invoke(items::trt::trait_function_declaration_inline_config)]
646 fn trait_function_declaration_inline_config(
647 &self,
648 trait_function_id: TraitFunctionId,
649 ) -> Maybe<InlineConfiguration>;
650 #[salsa::invoke(items::trt::trait_function_declaration_implicit_precedence)]
652 fn trait_function_declaration_implicit_precedence(
653 &self,
654 trait_function_id: TraitFunctionId,
655 ) -> Maybe<ImplicitPrecedence>;
656 #[salsa::invoke(items::trt::trait_function_declaration_implicits)]
658 fn trait_function_declaration_implicits(
659 &self,
660 trait_function_id: TraitFunctionId,
661 ) -> Maybe<Vec<TypeId>>;
662 #[salsa::invoke(items::trt::priv_trait_function_declaration_data)]
664 fn priv_trait_function_declaration_data(
665 &self,
666 function_id: TraitFunctionId,
667 ) -> Maybe<items::functions::FunctionDeclarationData>;
668
669 #[salsa::invoke(items::trt::trait_function_body_diagnostics)]
671 fn trait_function_body_diagnostics(
672 &self,
673 trait_function_id: TraitFunctionId,
674 ) -> Diagnostics<SemanticDiagnostic>;
675 #[salsa::invoke(items::trt::trait_function_body)]
677 fn trait_function_body(
678 &self,
679 trait_function_id: TraitFunctionId,
680 ) -> Maybe<Option<Arc<FunctionBody>>>;
681 #[salsa::invoke(items::trt::priv_trait_function_body_data)]
683 fn priv_trait_function_body_data(
684 &self,
685 trait_function_id: TraitFunctionId,
686 ) -> Maybe<Option<items::function_with_body::FunctionBodyData>>;
687
688 #[salsa::invoke(items::trt::concrete_trait_function_generic_params)]
692 fn concrete_trait_function_generic_params(
693 &self,
694 concrete_trait_function_id: ConcreteTraitGenericFunctionId,
695 ) -> Maybe<Vec<GenericParam>>;
696 #[salsa::invoke(items::trt::concrete_trait_function_signature)]
698 fn concrete_trait_function_signature(
699 &self,
700 concrete_trait_function_id: ConcreteTraitGenericFunctionId,
701 ) -> Maybe<semantic::Signature>;
702
703 #[salsa::invoke(items::imp::module_impl_ids_for_trait_filter)]
707 #[salsa::cycle(items::imp::module_impl_ids_for_trait_filter_cycle)]
708 fn module_impl_ids_for_trait_filter(
709 &self,
710 module_id: ModuleId,
711 trait_lookup_constraint: items::imp::TraitFilter,
712 ) -> Maybe<Vec<UninferredImpl>>;
713 #[salsa::invoke(items::imp::impl_impl_ids_for_trait_filter)]
714 #[salsa::cycle(items::imp::impl_impl_ids_for_trait_filter_cycle)]
715 fn impl_impl_ids_for_trait_filter(
716 &self,
717 impl_id: ImplId,
718 trait_lookup_constraint: items::imp::TraitFilter,
719 ) -> Maybe<Vec<UninferredImpl>>;
720 #[salsa::invoke(inference::solver::canonic_trait_solutions)]
722 #[salsa::cycle(inference::solver::canonic_trait_solutions_cycle)]
723 fn canonic_trait_solutions(
724 &self,
725 canonical_trait: inference::canonic::CanonicalTrait,
726 lookup_context: ImplLookupContext,
727 impl_type_bounds: BTreeMap<ImplTypeById, TypeId>,
728 ) -> Result<
729 inference::solver::SolutionSet<inference::canonic::CanonicalImpl>,
730 inference::InferenceError,
731 >;
732
733 #[salsa::invoke(items::imp::impl_semantic_declaration_diagnostics)]
737 fn impl_semantic_declaration_diagnostics(
738 &self,
739 impl_def_id: ImplDefId,
740 ) -> Diagnostics<SemanticDiagnostic>;
741 #[salsa::invoke(items::imp::impl_def_generic_params_data)]
743 fn impl_def_generic_params_data(&self, impl_def_id: ImplDefId) -> Maybe<GenericParamsData>;
744 #[salsa::invoke(items::imp::impl_def_generic_params)]
746 fn impl_def_generic_params(&self, impl_def_id: ImplDefId) -> Maybe<Vec<GenericParam>>;
747 #[salsa::invoke(items::imp::impl_def_resolver_data)]
749 #[salsa::cycle(items::imp::impl_def_resolver_data_cycle)]
750 fn impl_def_resolver_data(&self, impl_def_id: ImplDefId) -> Maybe<Arc<ResolverData>>;
751 #[salsa::invoke(items::imp::impl_def_concrete_trait)]
753 #[salsa::cycle(items::imp::impl_def_concrete_trait_cycle)]
754 fn impl_def_concrete_trait(&self, impl_def_id: ImplDefId) -> Maybe<ConcreteTraitId>;
755 #[salsa::invoke(items::imp::impl_def_substitution)]
757 fn impl_def_substitution(&self, impl_def_id: ImplDefId) -> Maybe<Arc<GenericSubstitution>>;
758 #[salsa::invoke(items::imp::impl_def_attributes)]
760 fn impl_def_attributes(&self, impl_def_id: ImplDefId) -> Maybe<Vec<Attribute>>;
761 #[salsa::invoke(items::imp::impl_concrete_trait)]
763 fn impl_concrete_trait(&self, impl_id: ImplId) -> Maybe<ConcreteTraitId>;
764 #[salsa::invoke(items::imp::impl_def_trait)]
767 fn impl_def_trait(&self, impl_def_id: ImplDefId) -> Maybe<TraitId>;
768 #[salsa::invoke(items::imp::priv_impl_declaration_data)]
770 #[salsa::cycle(items::imp::priv_impl_declaration_data_cycle)]
771 fn priv_impl_declaration_data(
772 &self,
773 impl_def_id: ImplDefId,
774 ) -> Maybe<items::imp::ImplDeclarationData>;
775
776 #[salsa::invoke(items::imp::impl_semantic_definition_diagnostics)]
778 fn impl_semantic_definition_diagnostics(
779 &self,
780 impl_def_id: ImplDefId,
781 ) -> Diagnostics<SemanticDiagnostic>;
782 #[salsa::invoke(items::imp::impl_item_by_name)]
784 fn impl_item_by_name(&self, impl_def_id: ImplDefId, name: SmolStr)
785 -> Maybe<Option<ImplItemId>>;
786 #[salsa::invoke(items::imp::impl_item_info_by_name)]
788 fn impl_item_info_by_name(
789 &self,
790 impl_def_id: ImplDefId,
791 name: SmolStr,
792 ) -> Maybe<Option<ImplItemInfo>>;
793 #[salsa::invoke(items::imp::impl_implicit_impl_by_name)]
795 fn impl_implicit_impl_by_name(
796 &self,
797 impl_def_id: ImplDefId,
798 name: SmolStr,
799 ) -> Maybe<Option<TraitImplId>>;
800 #[salsa::invoke(items::imp::impl_all_used_items)]
802 fn impl_all_used_items(
803 &self,
804 impl_def_id: ImplDefId,
805 ) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
806 #[salsa::invoke(items::imp::impl_types)]
808 fn impl_types(
809 &self,
810 impl_def_id: ImplDefId,
811 ) -> Maybe<Arc<OrderedHashMap<ImplTypeDefId, ast::ItemTypeAlias>>>;
812 #[salsa::invoke(items::imp::impl_type_ids)]
814 fn impl_type_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplTypeDefId]>>;
815 #[salsa::invoke(items::imp::impl_type_by_id)]
817 fn impl_type_by_id(&self, impl_type_id: ImplTypeDefId) -> Maybe<Option<ast::ItemTypeAlias>>;
818 #[salsa::invoke(items::imp::impl_type_by_trait_type)]
820 fn impl_type_by_trait_type(
821 &self,
822 impl_def_id: ImplDefId,
823 trait_type_id: TraitTypeId,
824 ) -> Maybe<ImplTypeDefId>;
825
826 #[salsa::invoke(items::imp::impl_constants)]
828 fn impl_constants(
829 &self,
830 impl_def_id: ImplDefId,
831 ) -> Maybe<Arc<OrderedHashMap<ImplConstantDefId, ast::ItemConstant>>>;
832
833 #[salsa::invoke(items::imp::impl_impls)]
835 fn impl_impls(
836 &self,
837 impl_def_id: ImplDefId,
838 ) -> Maybe<Arc<OrderedHashMap<ImplImplDefId, ast::ItemImplAlias>>>;
839 #[salsa::invoke(items::imp::impl_impl_ids)]
841 fn impl_impl_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplImplDefId]>>;
842 #[salsa::invoke(items::imp::impl_impl_by_id)]
844 fn impl_impl_by_id(&self, impl_impl_id: ImplImplDefId) -> Maybe<Option<ast::ItemImplAlias>>;
845 #[salsa::invoke(items::imp::impl_impl_by_trait_impl)]
847 fn impl_impl_by_trait_impl(
848 &self,
849 impl_def_id: ImplDefId,
850 trait_impl_id: TraitImplId,
851 ) -> Maybe<ImplImplDefId>;
852 #[salsa::invoke(items::imp::is_implicit_impl_impl)]
854 fn is_implicit_impl_impl(
855 &self,
856 impl_def_id: ImplDefId,
857 trait_impl_id: TraitImplId,
858 ) -> Maybe<bool>;
859
860 #[salsa::invoke(items::imp::impl_constant_by_trait_constant)]
862 fn impl_constant_by_trait_constant(
863 &self,
864 impl_def_id: ImplDefId,
865 trait_constant_id: TraitConstantId,
866 ) -> Maybe<ImplConstantDefId>;
867
868 #[salsa::invoke(items::imp::impl_functions)]
870 fn impl_functions(
871 &self,
872 impl_def_id: ImplDefId,
873 ) -> Maybe<OrderedHashMap<SmolStr, ImplFunctionId>>;
874 #[salsa::invoke(items::imp::impl_function_by_trait_function)]
879 fn impl_function_by_trait_function(
880 &self,
881 impl_def_id: ImplDefId,
882 trait_function_id: TraitFunctionId,
883 ) -> Maybe<Option<ImplFunctionId>>;
884 #[salsa::invoke(items::imp::priv_impl_definition_data)]
886 fn priv_impl_definition_data(
887 &self,
888 impl_def_id: ImplDefId,
889 ) -> Maybe<items::imp::ImplDefinitionData>;
890
891 #[salsa::invoke(items::imp::priv_impl_is_fully_concrete)]
893 fn priv_impl_is_fully_concrete(&self, impl_id: ImplId) -> bool;
894
895 #[salsa::invoke(items::imp::priv_impl_is_var_free)]
897 fn priv_impl_is_var_free(&self, impl_id: ImplId) -> bool;
898
899 #[salsa::invoke(items::imp::impl_type_def_semantic_diagnostics)]
903 fn impl_type_def_semantic_diagnostics(
904 &self,
905 impl_type_def_id: ImplTypeDefId,
906 ) -> Diagnostics<SemanticDiagnostic>;
907 #[salsa::invoke(items::imp::impl_type_def_resolved_type)]
909 #[salsa::cycle(items::imp::impl_type_def_resolved_type_cycle)]
910 fn impl_type_def_resolved_type(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<TypeId>;
911 #[salsa::invoke(items::imp::impl_type_def_generic_params)]
913 fn impl_type_def_generic_params(
914 &self,
915 impl_type_def_id: ImplTypeDefId,
916 ) -> Maybe<Vec<GenericParam>>;
917 #[salsa::invoke(items::imp::impl_type_def_attributes)]
919 fn impl_type_def_attributes(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<Vec<Attribute>>;
920 #[salsa::invoke(items::imp::impl_type_def_resolver_data)]
922 fn impl_type_def_resolver_data(
923 &self,
924 impl_type_def_id: ImplTypeDefId,
925 ) -> Maybe<Arc<ResolverData>>;
926 #[salsa::invoke(items::imp::impl_type_def_trait_type)]
928 fn impl_type_def_trait_type(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<TraitTypeId>;
929
930 #[salsa::invoke(items::imp::priv_impl_type_semantic_data)]
932 #[salsa::cycle(items::imp::priv_impl_type_semantic_data_cycle)]
933 fn priv_impl_type_semantic_data(
934 &self,
935 impl_type_def_id: ImplTypeDefId,
936 in_cycle: bool,
937 ) -> Maybe<items::imp::ImplItemTypeData>;
938 #[salsa::invoke(items::imp::priv_impl_type_def_generic_params_data)]
940 fn priv_impl_type_def_generic_params_data(
941 &self,
942 impl_type_def_id: ImplTypeDefId,
943 ) -> Maybe<GenericParamsData>;
944
945 #[salsa::invoke(items::imp::deref_chain)]
947 #[salsa::cycle(items::imp::deref_chain_cycle)]
948 fn deref_chain(&self, ty: TypeId, try_deref_mut: bool) -> Maybe<items::imp::DerefChain>;
949
950 #[salsa::invoke(items::imp::impl_type_concrete_implized)]
956 #[salsa::cycle(items::imp::impl_type_concrete_implized_cycle)]
957 fn impl_type_concrete_implized(&self, impl_type_def_id: ImplTypeId) -> Maybe<TypeId>;
958
959 #[salsa::invoke(items::imp::impl_constant_def_semantic_diagnostics)]
963 fn impl_constant_def_semantic_diagnostics(
964 &self,
965 impl_constant_def_id: ImplConstantDefId,
966 ) -> Diagnostics<SemanticDiagnostic>;
967 #[salsa::invoke(items::imp::impl_constant_def_value)]
969 #[salsa::cycle(items::imp::impl_constant_def_value_cycle)]
970 fn impl_constant_def_value(
971 &self,
972 impl_constant_def_id: ImplConstantDefId,
973 ) -> Maybe<ConstValueId>;
974 #[salsa::invoke(items::imp::impl_constant_def_resolver_data)]
976 fn impl_constant_def_resolver_data(
977 &self,
978 impl_constant_def_id: ImplConstantDefId,
979 ) -> Maybe<Arc<ResolverData>>;
980 #[salsa::invoke(items::imp::impl_constant_def_trait_constant)]
982 fn impl_constant_def_trait_constant(
983 &self,
984 impl_constant_def_id: ImplConstantDefId,
985 ) -> Maybe<TraitConstantId>;
986
987 #[salsa::invoke(items::imp::priv_impl_constant_semantic_data)]
989 #[salsa::cycle(items::imp::priv_impl_constant_semantic_data_cycle)]
990 fn priv_impl_constant_semantic_data(
991 &self,
992 impl_constant_def_id: ImplConstantDefId,
993 in_cycle: bool,
994 ) -> Maybe<items::imp::ImplItemConstantData>;
995
996 #[salsa::invoke(items::imp::impl_constant_implized_by_context)]
1000 #[salsa::cycle(items::imp::impl_constant_implized_by_context_cycle)]
1001 fn impl_constant_implized_by_context(
1002 &self,
1003 impl_constant_id: ImplConstantId,
1004 impl_def_id: ImplDefId,
1005 ) -> Maybe<ConstValueId>;
1006 #[salsa::invoke(items::imp::impl_constant_concrete_implized_value)]
1009 #[salsa::cycle(items::imp::impl_constant_concrete_implized_value_cycle)]
1010 fn impl_constant_concrete_implized_value(
1011 &self,
1012 impl_constant_id: ImplConstantId,
1013 ) -> Maybe<ConstValueId>;
1014 #[salsa::invoke(items::imp::impl_constant_concrete_implized_type)]
1017 #[salsa::cycle(items::imp::impl_constant_concrete_implized_type_cycle)]
1018 fn impl_constant_concrete_implized_type(
1019 &self,
1020 impl_constant_id: ImplConstantId,
1021 ) -> Maybe<TypeId>;
1022
1023 #[salsa::invoke(items::imp::impl_impl_def_semantic_diagnostics)]
1027 fn impl_impl_def_semantic_diagnostics(
1028 &self,
1029 impl_impl_def_id: ImplImplDefId,
1030 ) -> Diagnostics<SemanticDiagnostic>;
1031 #[salsa::invoke(items::imp::impl_impl_def_resolver_data)]
1033 fn impl_impl_def_resolver_data(
1034 &self,
1035 impl_impl_def_id: ImplImplDefId,
1036 ) -> Maybe<Arc<ResolverData>>;
1037 #[salsa::invoke(items::imp::impl_impl_def_trait_impl)]
1039 fn impl_impl_def_trait_impl(&self, impl_impl_def_id: ImplImplDefId) -> Maybe<TraitImplId>;
1040
1041 #[salsa::invoke(items::imp::impl_impl_def_impl)]
1043 #[salsa::cycle(items::imp::impl_impl_def_impl_cycle)]
1044 fn impl_impl_def_impl(&self, impl_impl_def_id: ImplImplDefId, in_cycle: bool) -> Maybe<ImplId>;
1045
1046 #[salsa::invoke(items::imp::priv_impl_impl_semantic_data)]
1048 #[salsa::cycle(items::imp::priv_impl_impl_semantic_data_cycle)]
1049 fn priv_impl_impl_semantic_data(
1050 &self,
1051 impl_impl_def_id: ImplImplDefId,
1052 in_cycle: bool,
1053 ) -> Maybe<items::imp::ImplItemImplData>;
1054
1055 #[salsa::invoke(items::imp::priv_impl_impl_def_generic_params_data)]
1057 fn priv_impl_impl_def_generic_params_data(
1058 &self,
1059 impl_impl_def_id: ImplImplDefId,
1060 ) -> Maybe<GenericParamsData>;
1061
1062 #[salsa::invoke(items::imp::implicit_impl_impl_semantic_diagnostics)]
1064 fn implicit_impl_impl_semantic_diagnostics(
1065 &self,
1066 impl_def_id: ImplDefId,
1067 trait_impl_id: TraitImplId,
1068 ) -> Diagnostics<SemanticDiagnostic>;
1069
1070 #[salsa::invoke(items::imp::implicit_impl_impl_impl)]
1072 #[salsa::cycle(items::imp::implicit_impl_impl_impl_cycle)]
1073 fn implicit_impl_impl_impl(
1074 &self,
1075 impl_def_id: ImplDefId,
1076 trait_impl_id: TraitImplId,
1077 in_cycle: bool,
1078 ) -> Maybe<ImplId>;
1079 #[salsa::invoke(items::imp::priv_implicit_impl_impl_semantic_data)]
1081 #[salsa::cycle(items::imp::priv_implicit_impl_impl_semantic_data_cycle)]
1082 fn priv_implicit_impl_impl_semantic_data(
1083 &self,
1084 impl_def_id: ImplDefId,
1085 trait_impl_id: TraitImplId,
1086 in_cycle: bool,
1087 ) -> Maybe<ImplicitImplImplData>;
1088
1089 #[salsa::invoke(items::imp::impl_impl_implized_by_context)]
1093 #[salsa::cycle(items::imp::impl_impl_implized_by_context_cycle)]
1094 fn impl_impl_implized_by_context(
1095 &self,
1096 impl_impl_id: ImplImplId,
1097 impl_def_id: ImplDefId,
1098 in_cycle: bool,
1099 ) -> Maybe<ImplId>;
1100 #[salsa::invoke(items::imp::impl_impl_concrete_implized)]
1102 #[salsa::cycle(items::imp::impl_impl_concrete_implized_cycle)]
1103 fn impl_impl_concrete_implized(&self, impl_impl_id: ImplImplId) -> Maybe<ImplId>;
1104 #[salsa::invoke(items::imp::impl_impl_concrete_trait)]
1106 fn impl_impl_concrete_trait(&self, impl_impl_id: ImplImplId) -> Maybe<ConcreteTraitId>;
1107
1108 #[salsa::invoke(items::imp::impl_function_declaration_diagnostics)]
1112 fn impl_function_declaration_diagnostics(
1113 &self,
1114 impl_function_id: ImplFunctionId,
1115 ) -> Diagnostics<SemanticDiagnostic>;
1116 #[salsa::invoke(items::imp::impl_function_signature)]
1118 fn impl_function_signature(
1119 &self,
1120 impl_function_id: ImplFunctionId,
1121 ) -> Maybe<semantic::Signature>;
1122 #[salsa::invoke(items::imp::impl_function_generic_params)]
1124 fn impl_function_generic_params(
1125 &self,
1126 impl_function_id: ImplFunctionId,
1127 ) -> Maybe<Vec<GenericParam>>;
1128 #[salsa::invoke(items::imp::priv_impl_function_generic_params_data)]
1130 fn priv_impl_function_generic_params_data(
1131 &self,
1132 impl_function_id: ImplFunctionId,
1133 ) -> Maybe<GenericParamsData>;
1134 #[salsa::invoke(items::imp::impl_function_attributes)]
1136 fn impl_function_attributes(&self, impl_function_id: ImplFunctionId) -> Maybe<Vec<Attribute>>;
1137 #[salsa::invoke(items::imp::impl_function_resolver_data)]
1139 fn impl_function_resolver_data(
1140 &self,
1141 impl_function_id: ImplFunctionId,
1142 ) -> Maybe<Arc<ResolverData>>;
1143 #[salsa::invoke(items::imp::impl_function_declaration_inline_config)]
1145 fn impl_function_declaration_inline_config(
1146 &self,
1147 impl_function_id: ImplFunctionId,
1148 ) -> Maybe<InlineConfiguration>;
1149 #[salsa::invoke(items::imp::impl_function_declaration_implicit_precedence)]
1151 fn impl_function_declaration_implicit_precedence(
1152 &self,
1153 impl_function_id: ImplFunctionId,
1154 ) -> Maybe<ImplicitPrecedence>;
1155 #[salsa::invoke(items::imp::impl_function_declaration_implicits)]
1157 fn impl_function_declaration_implicits(
1158 &self,
1159 impl_function_id: ImplFunctionId,
1160 ) -> Maybe<Vec<TypeId>>;
1161 #[salsa::invoke(items::imp::impl_function_trait_function)]
1163 fn impl_function_trait_function(
1164 &self,
1165 impl_function_id: ImplFunctionId,
1166 ) -> Maybe<TraitFunctionId>;
1167 #[salsa::invoke(items::imp::priv_impl_function_declaration_data)]
1169 fn priv_impl_function_declaration_data(
1170 &self,
1171 impl_function_id: ImplFunctionId,
1172 ) -> Maybe<items::imp::ImplFunctionDeclarationData>;
1173
1174 #[salsa::invoke(items::imp::impl_function_body_diagnostics)]
1176 fn impl_function_body_diagnostics(
1177 &self,
1178 impl_function_id: ImplFunctionId,
1179 ) -> Diagnostics<SemanticDiagnostic>;
1180 #[salsa::invoke(items::imp::impl_function_body)]
1182 fn impl_function_body(&self, impl_function_id: ImplFunctionId) -> Maybe<Arc<FunctionBody>>;
1183 #[salsa::invoke(items::imp::impl_function_body_resolver_data)]
1185 fn impl_function_body_resolver_data(
1186 &self,
1187 impl_function_id: ImplFunctionId,
1188 ) -> Maybe<Arc<ResolverData>>;
1189 #[salsa::invoke(items::imp::priv_impl_function_body_data)]
1191 fn priv_impl_function_body_data(
1192 &self,
1193 impl_function_id: ImplFunctionId,
1194 ) -> Maybe<items::function_with_body::FunctionBodyData>;
1195
1196 #[salsa::invoke(items::implization::trait_type_implized_by_context)]
1202 #[salsa::cycle(items::implization::trait_type_implized_by_context_cycle)]
1203 fn trait_type_implized_by_context(
1204 &self,
1205 trait_type_def_id: TraitTypeId,
1206 impl_def_id: ImplDefId,
1207 ) -> Maybe<TypeId>;
1208
1209 #[salsa::invoke(items::free_function::free_function_declaration_diagnostics)]
1213 fn free_function_declaration_diagnostics(
1214 &self,
1215 free_function_id: FreeFunctionId,
1216 ) -> Diagnostics<SemanticDiagnostic>;
1217 #[salsa::invoke(items::free_function::free_function_signature)]
1219 fn free_function_signature(
1220 &self,
1221 free_function_id: FreeFunctionId,
1222 ) -> Maybe<semantic::Signature>;
1223 #[salsa::invoke(items::free_function::free_function_declaration_implicits)]
1225 fn free_function_declaration_implicits(
1226 &self,
1227 free_function_id: FreeFunctionId,
1228 ) -> Maybe<Vec<TypeId>>;
1229 #[salsa::invoke(items::free_function::free_function_declaration_implicit_precedence)]
1231 fn free_function_declaration_implicit_precedence(
1232 &self,
1233 free_function_id: FreeFunctionId,
1234 ) -> Maybe<ImplicitPrecedence>;
1235 #[salsa::invoke(items::free_function::free_function_generic_params)]
1237 fn free_function_generic_params(
1238 &self,
1239 free_function_id: FreeFunctionId,
1240 ) -> Maybe<Vec<GenericParam>>;
1241 #[salsa::invoke(items::free_function::free_function_generic_params_data)]
1243 fn free_function_generic_params_data(
1244 &self,
1245 free_function_id: FreeFunctionId,
1246 ) -> Maybe<GenericParamsData>;
1247 #[salsa::invoke(items::free_function::free_function_declaration_resolver_data)]
1249 fn free_function_declaration_resolver_data(
1250 &self,
1251 free_function_id: FreeFunctionId,
1252 ) -> Maybe<Arc<ResolverData>>;
1253 #[salsa::invoke(items::free_function::free_function_declaration_inline_config)]
1255 fn free_function_declaration_inline_config(
1256 &self,
1257 free_function_id: FreeFunctionId,
1258 ) -> Maybe<InlineConfiguration>;
1259 #[salsa::invoke(items::free_function::priv_free_function_declaration_data)]
1262 fn priv_free_function_declaration_data(
1263 &self,
1264 function_id: FreeFunctionId,
1265 ) -> Maybe<items::functions::FunctionDeclarationData>;
1266
1267 #[salsa::invoke(items::free_function::free_function_body_diagnostics)]
1269 fn free_function_body_diagnostics(
1270 &self,
1271 free_function_id: FreeFunctionId,
1272 ) -> Diagnostics<SemanticDiagnostic>;
1273 #[salsa::invoke(items::free_function::free_function_body_resolver_data)]
1275 fn free_function_body_resolver_data(
1276 &self,
1277 free_function_id: FreeFunctionId,
1278 ) -> Maybe<Arc<ResolverData>>;
1279 #[salsa::invoke(items::free_function::priv_free_function_body_data)]
1281 fn priv_free_function_body_data(
1282 &self,
1283 free_function_id: FreeFunctionId,
1284 ) -> Maybe<items::function_with_body::FunctionBodyData>;
1285
1286 #[salsa::invoke(items::function_with_body::function_declaration_diagnostics)]
1290 fn function_declaration_diagnostics(
1291 &self,
1292 function_id: FunctionWithBodyId,
1293 ) -> Diagnostics<SemanticDiagnostic>;
1294 #[salsa::invoke(items::function_with_body::function_declaration_inline_config)]
1296 fn function_declaration_inline_config(
1297 &self,
1298 function_id: FunctionWithBodyId,
1299 ) -> Maybe<InlineConfiguration>;
1300 #[salsa::invoke(items::function_with_body::function_declaration_implicit_precedence)]
1302 fn function_declaration_implicit_precedence(
1303 &self,
1304 function_id: FunctionWithBodyId,
1305 ) -> Maybe<ImplicitPrecedence>;
1306 #[salsa::invoke(items::function_with_body::function_with_body_signature)]
1308 fn function_with_body_signature(
1309 &self,
1310 function_id: FunctionWithBodyId,
1311 ) -> Maybe<semantic::Signature>;
1312 #[salsa::invoke(items::function_with_body::function_with_body_generic_params)]
1314 fn function_with_body_generic_params(
1315 &self,
1316 function_id: FunctionWithBodyId,
1317 ) -> Maybe<Vec<GenericParam>>;
1318 #[salsa::invoke(items::function_with_body::function_with_body_attributes)]
1320 fn function_with_body_attributes(
1321 &self,
1322 function_id: FunctionWithBodyId,
1323 ) -> Maybe<Vec<Attribute>>;
1324
1325 #[salsa::invoke(items::function_with_body::function_body_diagnostics)]
1327 fn function_body_diagnostics(
1328 &self,
1329 function_id: FunctionWithBodyId,
1330 ) -> Diagnostics<SemanticDiagnostic>;
1331 #[salsa::invoke(items::function_with_body::function_body_expr)]
1333 fn function_body_expr(&self, function_id: FunctionWithBodyId) -> Maybe<semantic::ExprId>;
1334 #[salsa::invoke(items::function_with_body::function_body)]
1336 fn function_body(&self, function_id: FunctionWithBodyId) -> Maybe<Arc<FunctionBody>>;
1337
1338 #[salsa::invoke(items::extern_function::priv_extern_function_declaration_data)]
1343 fn priv_extern_function_declaration_data(
1344 &self,
1345 function_id: ExternFunctionId,
1346 ) -> Maybe<items::functions::FunctionDeclarationData>;
1347 #[salsa::invoke(items::extern_function::extern_function_declaration_inline_config)]
1349 fn extern_function_declaration_inline_config(
1350 &self,
1351 extern_function_id: ExternFunctionId,
1352 ) -> Maybe<InlineConfiguration>;
1353 #[salsa::invoke(items::extern_function::extern_function_declaration_diagnostics)]
1356 fn extern_function_declaration_diagnostics(
1357 &self,
1358 extern_function_id: ExternFunctionId,
1359 ) -> Diagnostics<SemanticDiagnostic>;
1360 #[salsa::invoke(items::extern_function::extern_function_signature)]
1362 fn extern_function_signature(
1363 &self,
1364 extern_function_id: ExternFunctionId,
1365 ) -> Maybe<semantic::Signature>;
1366 #[salsa::invoke(items::extern_function::extern_function_declaration_generic_params)]
1368 fn extern_function_declaration_generic_params(
1369 &self,
1370 extern_function_id: ExternFunctionId,
1371 ) -> Maybe<Vec<GenericParam>>;
1372 #[salsa::invoke(items::extern_function::extern_function_declaration_generic_params_data)]
1374 fn extern_function_declaration_generic_params_data(
1375 &self,
1376 extern_function_id: ExternFunctionId,
1377 ) -> Maybe<GenericParamsData>;
1378 #[salsa::invoke(items::extern_function::extern_function_declaration_implicits)]
1380 fn extern_function_declaration_implicits(
1381 &self,
1382 extern_function_id: ExternFunctionId,
1383 ) -> Maybe<Vec<TypeId>>;
1384 #[salsa::invoke(items::extern_function::extern_function_declaration_refs)]
1386 fn extern_function_declaration_refs(
1387 &self,
1388 extern_function_id: ExternFunctionId,
1389 ) -> Maybe<Vec<Parameter>>;
1390 #[salsa::invoke(items::extern_function::extern_function_declaration_resolver_data)]
1392 fn extern_function_declaration_resolver_data(
1393 &self,
1394 extern_function_id: ExternFunctionId,
1395 ) -> Maybe<Arc<ResolverData>>;
1396
1397 #[salsa::invoke(items::extern_type::priv_extern_type_declaration_data)]
1402 fn priv_extern_type_declaration_data(
1403 &self,
1404 type_id: ExternTypeId,
1405 ) -> Maybe<items::extern_type::ExternTypeDeclarationData>;
1406 #[salsa::invoke(items::extern_type::extern_type_declaration_diagnostics)]
1409 fn extern_type_declaration_diagnostics(
1410 &self,
1411 extern_type_id: ExternTypeId,
1412 ) -> Diagnostics<SemanticDiagnostic>;
1413 #[salsa::invoke(items::extern_type::extern_type_declaration_generic_params)]
1415 fn extern_type_declaration_generic_params(
1416 &self,
1417 extern_type_id: ExternTypeId,
1418 ) -> Maybe<Vec<GenericParam>>;
1419 #[salsa::invoke(items::extern_type::extern_type_declaration_generic_params_data)]
1421 fn extern_type_declaration_generic_params_data(
1422 &self,
1423 extern_type_id: ExternTypeId,
1424 ) -> Maybe<GenericParamsData>;
1425
1426 #[salsa::invoke(items::extern_type::extern_type_attributes)]
1428 fn extern_type_attributes(&self, extern_type_id: ExternTypeId) -> Maybe<Vec<Attribute>>;
1429
1430 #[salsa::invoke(items::functions::function_title_signature)]
1435 fn function_title_signature(
1436 &self,
1437 function_title_id: FunctionTitleId,
1438 ) -> Maybe<semantic::Signature>;
1439
1440 #[salsa::invoke(items::functions::function_title_generic_params)]
1443 fn function_title_generic_params(
1444 &self,
1445 function_title_id: FunctionTitleId,
1446 ) -> Maybe<Vec<GenericParam>>;
1447
1448 #[salsa::invoke(items::functions::concrete_function_signature)]
1453 fn concrete_function_signature(&self, function_id: FunctionId) -> Maybe<semantic::Signature>;
1454
1455 #[salsa::invoke(items::functions::concrete_function_closure_params)]
1458 fn concrete_function_closure_params(
1459 &self,
1460 function_id: FunctionId,
1461 ) -> Maybe<OrderedHashMap<semantic::TypeId, semantic::TypeId>>;
1462
1463 #[salsa::invoke(items::functions::get_closure_params)]
1466 fn get_closure_params(
1467 &self,
1468 generic_function_id: GenericFunctionId,
1469 ) -> Maybe<OrderedHashMap<TypeId, TypeId>>;
1470
1471 #[salsa::invoke(types::generic_type_generic_params)]
1475 fn generic_type_generic_params(&self, generic_type: GenericTypeId) -> Maybe<Vec<GenericParam>>;
1476
1477 #[salsa::invoke(items::generics::generic_param_semantic)]
1481 fn generic_param_semantic(&self, generic_param: GenericParamId) -> Maybe<GenericParam>;
1482 #[salsa::invoke(items::generics::generic_param_diagnostics)]
1484 fn generic_param_diagnostics(
1485 &self,
1486 generic_param: GenericParamId,
1487 ) -> Diagnostics<SemanticDiagnostic>;
1488 #[salsa::invoke(items::generics::generic_param_resolver_data)]
1490 fn generic_param_resolver_data(
1491 &self,
1492 generic_param: GenericParamId,
1493 ) -> Maybe<Arc<ResolverData>>;
1494 #[salsa::invoke(items::generics::generic_impl_param_trait)]
1497 fn generic_impl_param_trait(&self, generic_param_id: GenericParamId) -> Maybe<TraitId>;
1498 #[salsa::invoke(items::generics::priv_generic_param_data)]
1500 #[salsa::cycle(items::generics::priv_generic_param_data_cycle)]
1501 fn priv_generic_param_data(
1502 &self,
1503 generic_param: GenericParamId,
1504 in_cycle: bool,
1505 ) -> Maybe<GenericParamData>;
1506
1507 #[salsa::invoke(items::generics::generic_params_type_constraints)]
1509 fn generic_params_type_constraints(
1510 &self,
1511 generic_params: Vec<GenericParamId>,
1512 ) -> Vec<(TypeId, TypeId)>;
1513
1514 #[salsa::invoke(types::single_value_type)]
1521 fn single_value_type(&self, ty: types::TypeId) -> Maybe<bool>;
1522
1523 #[salsa::invoke(types::type_size_info)]
1525 #[salsa::cycle(types::type_size_info_cycle)]
1526 fn type_size_info(&self, ty: types::TypeId) -> Maybe<TypeSizeInformation>;
1527
1528 #[salsa::invoke(types::type_info)]
1531 fn type_info(
1532 &self,
1533 lookup_context: ImplLookupContext,
1534 ty: types::TypeId,
1535 ) -> Maybe<types::TypeInfo>;
1536
1537 #[salsa::invoke(types::priv_type_is_fully_concrete)]
1539 fn priv_type_is_fully_concrete(&self, ty: types::TypeId) -> bool;
1540
1541 #[salsa::invoke(types::priv_type_is_var_free)]
1543 fn priv_type_is_var_free(&self, ty: types::TypeId) -> bool;
1544
1545 #[salsa::invoke(types::priv_type_short_name)]
1547 fn priv_type_short_name(&self, ty: types::TypeId) -> String;
1548
1549 #[salsa::invoke(items::function_with_body::expr_semantic)]
1553 fn expr_semantic(
1554 &self,
1555 function_id: FunctionWithBodyId,
1556 id: semantic::ExprId,
1557 ) -> semantic::Expr;
1558 #[salsa::invoke(items::function_with_body::pattern_semantic)]
1560 fn pattern_semantic(
1561 &self,
1562 function_id: FunctionWithBodyId,
1563 id: semantic::PatternId,
1564 ) -> semantic::Pattern;
1565 #[salsa::invoke(items::function_with_body::statement_semantic)]
1567 fn statement_semantic(
1568 &self,
1569 function_id: FunctionWithBodyId,
1570 id: semantic::StatementId,
1571 ) -> semantic::Statement;
1572
1573 fn lookup_resolved_generic_item_by_ptr(
1576 &self,
1577 id: LookupItemId,
1578 ptr: ast::TerminalIdentifierPtr,
1579 ) -> Option<ResolvedGenericItem>;
1580 fn lookup_resolved_concrete_item_by_ptr(
1581 &self,
1582 id: LookupItemId,
1583 ptr: ast::TerminalIdentifierPtr,
1584 ) -> Option<ResolvedConcreteItem>;
1585
1586 fn module_semantic_diagnostics(
1590 &self,
1591 module_id: ModuleId,
1592 ) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1593
1594 fn file_semantic_diagnostics(&self, file_id: FileId) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1596
1597 #[salsa::invoke(corelib::core_crate)]
1600 fn core_crate(&self) -> CrateId;
1601 #[salsa::invoke(corelib::core_module)]
1602 fn core_module(&self) -> ModuleId;
1603 #[salsa::invoke(corelib::core_info)]
1604 fn core_info(&self) -> Arc<CoreInfo>;
1605
1606 #[salsa::input]
1610 fn default_analyzer_plugins(&self) -> Arc<[AnalyzerPluginId]>;
1611
1612 #[salsa::input]
1613 fn analyzer_plugin_overrides(&self) -> Arc<OrderedHashMap<CrateId, Arc<[AnalyzerPluginId]>>>;
1614
1615 #[salsa::interned]
1616 fn intern_analyzer_plugin(&self, plugin: AnalyzerPluginLongId) -> AnalyzerPluginId;
1617
1618 fn crate_analyzer_plugins(&self, crate_id: CrateId) -> Arc<[AnalyzerPluginId]>;
1623
1624 fn declared_allows(&self, crate_id: CrateId) -> Arc<OrderedHashSet<String>>;
1627
1628 #[salsa::invoke(lsp_helpers::methods_in_module)]
1632 fn methods_in_module(
1633 &self,
1634 module_id: ModuleId,
1635 type_filter: lsp_helpers::TypeFilter,
1636 ) -> Arc<[TraitFunctionId]>;
1637 #[salsa::invoke(lsp_helpers::methods_in_crate)]
1639 fn methods_in_crate(
1640 &self,
1641 crate_id: CrateId,
1642 type_filter: lsp_helpers::TypeFilter,
1643 ) -> Arc<[TraitFunctionId]>;
1644 #[salsa::invoke(lsp_helpers::visible_importables_from_module)]
1647 fn visible_importables_from_module(
1648 &self,
1649 module_id: ModuleFileId,
1650 ) -> Option<Arc<OrderedHashMap<ImportableId, String>>>;
1651 #[salsa::invoke(lsp_helpers::visible_importables_in_module)]
1655 fn visible_importables_in_module(
1656 &self,
1657 module_id: ModuleId,
1658 user_module_file_id: ModuleFileId,
1659 include_parent: bool,
1660 ) -> Arc<[(ImportableId, String)]>;
1661 #[salsa::invoke(lsp_helpers::visible_importables_in_crate)]
1664 fn visible_importables_in_crate(
1665 &self,
1666 crate_id: CrateId,
1667 user_module_file_id: ModuleFileId,
1668 ) -> Arc<[(ImportableId, String)]>;
1669 #[salsa::invoke(lsp_helpers::visible_traits_from_module)]
1671 fn visible_traits_from_module(
1672 &self,
1673 module_id: ModuleFileId,
1674 ) -> Option<Arc<OrderedHashMap<TraitId, String>>>;
1675}
1676
1677pub fn init_semantic_group(db: &mut dyn SemanticGroup) {
1679 db.set_analyzer_plugin_overrides(Arc::new(OrderedHashMap::default()));
1680}
1681
1682impl<T: Upcast<dyn SemanticGroup + 'static>> Elongate for T {
1683 fn elongate(&self) -> &(dyn SemanticGroup + 'static) {
1684 self.upcast()
1685 }
1686}
1687
1688fn module_semantic_diagnostics(
1689 db: &dyn SemanticGroup,
1690 module_id: ModuleId,
1691) -> Maybe<Diagnostics<SemanticDiagnostic>> {
1692 let mut diagnostics = DiagnosticsBuilder::default();
1693 for (_module_file_id, plugin_diag) in db.module_plugin_diagnostics(module_id)?.iter().cloned() {
1694 diagnostics.add(SemanticDiagnostic::new(
1695 StableLocation::new(plugin_diag.stable_ptr),
1696 SemanticDiagnosticKind::PluginDiagnostic(plugin_diag),
1697 ));
1698 }
1699 let data = db.priv_module_semantic_data(module_id)?;
1700 diagnostics.extend(data.diagnostics.clone());
1701 for item in db.module_items(module_id)?.iter() {
1704 match item {
1705 ModuleItemId::Constant(const_id) => {
1706 diagnostics.extend(db.constant_semantic_diagnostics(*const_id));
1707 }
1708 ModuleItemId::Use(use_id) => {
1710 diagnostics.extend(db.use_semantic_diagnostics(*use_id));
1711 }
1712 ModuleItemId::FreeFunction(free_function) => {
1713 diagnostics.extend(db.free_function_declaration_diagnostics(*free_function));
1714 diagnostics.extend(db.free_function_body_diagnostics(*free_function));
1715 }
1716 ModuleItemId::Struct(struct_id) => {
1717 diagnostics.extend(db.struct_declaration_diagnostics(*struct_id));
1718 diagnostics.extend(db.struct_definition_diagnostics(*struct_id));
1719 }
1720 ModuleItemId::Enum(enum_id) => {
1721 diagnostics.extend(db.enum_definition_diagnostics(*enum_id));
1722 diagnostics.extend(db.enum_declaration_diagnostics(*enum_id));
1723 }
1724 ModuleItemId::Trait(trait_id) => {
1725 diagnostics.extend(db.trait_semantic_declaration_diagnostics(*trait_id));
1726 diagnostics.extend(db.trait_semantic_definition_diagnostics(*trait_id));
1727 }
1728 ModuleItemId::Impl(impl_def_id) => {
1729 diagnostics.extend(db.impl_semantic_declaration_diagnostics(*impl_def_id));
1730 diagnostics.extend(db.impl_semantic_definition_diagnostics(*impl_def_id));
1731 }
1732 ModuleItemId::Submodule(submodule_id) => {
1733 if let Ok(file_id) = db.module_main_file(ModuleId::Submodule(*submodule_id)) {
1735 if db.file_content(file_id).is_none() {
1736 let path = match file_id.lookup_intern(db) {
1740 FileLongId::OnDisk(path) => path.display().to_string(),
1741 FileLongId::Virtual(_) | FileLongId::External(_) => {
1742 panic!("Expected OnDisk file.")
1743 }
1744 };
1745
1746 let stable_location =
1747 StableLocation::new(submodule_id.stable_ptr(db.upcast()).untyped());
1748 diagnostics.add(SemanticDiagnostic::new(
1749 stable_location,
1750 SemanticDiagnosticKind::ModuleFileNotFound(path),
1751 ));
1752 }
1753 }
1754 }
1755 ModuleItemId::ExternType(extern_type) => {
1756 diagnostics.extend(db.extern_type_declaration_diagnostics(*extern_type));
1757 }
1758 ModuleItemId::ExternFunction(extern_function) => {
1759 diagnostics.extend(db.extern_function_declaration_diagnostics(*extern_function));
1760 }
1761 ModuleItemId::TypeAlias(type_alias) => {
1762 diagnostics.extend(db.module_type_alias_semantic_diagnostics(*type_alias));
1763 }
1764 ModuleItemId::ImplAlias(type_alias) => {
1765 diagnostics.extend(db.impl_alias_semantic_diagnostics(*type_alias));
1766 }
1767 }
1768 }
1769 for global_use in db.module_global_uses(module_id)?.keys() {
1770 diagnostics.extend(db.global_use_semantic_diagnostics(*global_use));
1771 }
1772 add_unused_item_diagnostics(db, module_id, &data, &mut diagnostics);
1773 for analyzer_plugin_id in db.crate_analyzer_plugins(module_id.owning_crate(db.upcast())).iter()
1774 {
1775 let analyzer_plugin = db.lookup_intern_analyzer_plugin(*analyzer_plugin_id);
1776
1777 for diag in analyzer_plugin.diagnostics(db, module_id) {
1778 diagnostics.add(SemanticDiagnostic::new(
1779 StableLocation::new(diag.stable_ptr),
1780 SemanticDiagnosticKind::PluginDiagnostic(diag),
1781 ));
1782 }
1783 }
1784
1785 Ok(diagnostics.build())
1786}
1787
1788fn crate_analyzer_plugins(db: &dyn SemanticGroup, crate_id: CrateId) -> Arc<[AnalyzerPluginId]> {
1789 db.analyzer_plugin_overrides()
1790 .get(&crate_id)
1791 .cloned()
1792 .unwrap_or_else(|| db.default_analyzer_plugins())
1793}
1794
1795fn declared_allows(db: &dyn SemanticGroup, crate_id: CrateId) -> Arc<OrderedHashSet<String>> {
1796 Arc::new(OrderedHashSet::from_iter(
1797 db.crate_analyzer_plugins(crate_id)
1798 .iter()
1799 .flat_map(|plugin| db.lookup_intern_analyzer_plugin(*plugin).declared_allows()),
1800 ))
1801}
1802
1803fn add_unused_item_diagnostics(
1807 db: &dyn SemanticGroup,
1808 module_id: ModuleId,
1809 data: &ModuleSemanticData,
1810 diagnostics: &mut DiagnosticsBuilder<SemanticDiagnostic>,
1811) {
1812 let Ok(all_used_items) = db.module_all_used_items(module_id) else {
1813 return;
1814 };
1815 for info in data.items.values() {
1816 if info.visibility == Visibility::Public {
1817 continue;
1818 }
1819 if let ModuleItemId::Use(use_id) = info.item_id {
1820 add_unused_import_diagnostics(db, &all_used_items, use_id, diagnostics);
1821 };
1822 }
1823}
1824
1825fn add_unused_import_diagnostics(
1827 db: &dyn SemanticGroup,
1828 all_used_items: &OrderedHashSet<LookupItemId>,
1829 use_id: UseId,
1830 diagnostics: &mut DiagnosticsBuilder<SemanticDiagnostic>,
1831) {
1832 let _iife = (|| {
1833 let item = db.use_resolved_item(use_id).ok()?;
1834 require(!matches!(
1837 item,
1838 ResolvedGenericItem::Impl(_) | ResolvedGenericItem::GenericImplAlias(_)
1839 ))?;
1840 require(!all_used_items.contains(&LookupItemId::ModuleItem(ModuleItemId::Use(use_id))))?;
1841 let resolver_data = db.use_resolver_data(use_id).ok()?;
1842 require(!resolver_data.feature_config.allow_unused_imports)?;
1843 Some(diagnostics.add(SemanticDiagnostic::new(
1844 StableLocation::new(use_id.untyped_stable_ptr(db.upcast())),
1845 SemanticDiagnosticKind::UnusedImport(use_id),
1846 )))
1847 })();
1848}
1849
1850fn file_semantic_diagnostics(
1851 db: &dyn SemanticGroup,
1852 file_id: FileId,
1853) -> Maybe<Diagnostics<SemanticDiagnostic>> {
1854 let mut diagnostics = DiagnosticsBuilder::default();
1855 for module_id in db.file_modules(file_id)?.iter().copied() {
1856 if let Ok(module_diagnostics) = db.module_semantic_diagnostics(module_id) {
1857 diagnostics.extend(module_diagnostics)
1858 }
1859 }
1860 Ok(diagnostics.build())
1861}
1862
1863pub fn lookup_resolved_generic_item_by_ptr(
1864 db: &dyn SemanticGroup,
1865 id: LookupItemId,
1866 ptr: ast::TerminalIdentifierPtr,
1867) -> Option<ResolvedGenericItem> {
1868 get_resolver_data_options(id, db)
1869 .into_iter()
1870 .find_map(|resolver_data| resolver_data.resolved_items.generic.get(&ptr).cloned())
1871}
1872
1873pub fn lookup_resolved_concrete_item_by_ptr(
1874 db: &dyn SemanticGroup,
1875 id: LookupItemId,
1876 ptr: ast::TerminalIdentifierPtr,
1877) -> Option<ResolvedConcreteItem> {
1878 get_resolver_data_options(id, db)
1879 .into_iter()
1880 .find_map(|resolver_data| resolver_data.resolved_items.concrete.get(&ptr).cloned())
1881}
1882
1883pub fn get_resolver_data_options(
1884 id: LookupItemId,
1885 db: &dyn SemanticGroup,
1886) -> Vec<Arc<ResolverData>> {
1887 match id {
1888 LookupItemId::ModuleItem(module_item) => match module_item {
1889 ModuleItemId::Constant(id) => vec![db.constant_resolver_data(id)],
1890 ModuleItemId::Submodule(_) => vec![],
1891 ModuleItemId::Use(id) => vec![db.use_resolver_data(id)],
1892 ModuleItemId::FreeFunction(id) => vec![
1893 db.free_function_declaration_resolver_data(id),
1894 db.free_function_body_resolver_data(id),
1895 ],
1896 ModuleItemId::Struct(id) => vec![
1897 db.struct_declaration_resolver_data(id),
1898 db.struct_definition_resolver_data(id),
1899 ],
1900 ModuleItemId::Enum(id) => {
1901 vec![db.enum_definition_resolver_data(id), db.enum_declaration_resolver_data(id)]
1902 }
1903 ModuleItemId::TypeAlias(id) => vec![db.module_type_alias_resolver_data(id)],
1904 ModuleItemId::ImplAlias(id) => vec![db.impl_alias_resolver_data(id)],
1905 ModuleItemId::Trait(_) => vec![],
1906 ModuleItemId::Impl(id) => vec![db.impl_def_resolver_data(id)],
1907 ModuleItemId::ExternType(_) => vec![],
1908 ModuleItemId::ExternFunction(id) => {
1909 vec![db.extern_function_declaration_resolver_data(id)]
1910 }
1911 },
1912 LookupItemId::TraitItem(id) => match id {
1913 cairo_lang_defs::ids::TraitItemId::Function(id) => {
1914 let mut res = vec![db.trait_function_resolver_data(id)];
1915 if let Ok(Some(body)) = db.priv_trait_function_body_data(id) {
1916 res.push(Ok(body.resolver_data));
1917 }
1918 res
1919 }
1920 cairo_lang_defs::ids::TraitItemId::Type(id) => vec![db.trait_type_resolver_data(id)],
1921 cairo_lang_defs::ids::TraitItemId::Constant(id) => {
1922 vec![db.trait_constant_resolver_data(id)]
1923 }
1924 cairo_lang_defs::ids::TraitItemId::Impl(id) => vec![db.trait_impl_resolver_data(id)],
1925 },
1926 LookupItemId::ImplItem(id) => match id {
1927 cairo_lang_defs::ids::ImplItemId::Function(id) => {
1928 vec![db.impl_function_resolver_data(id), db.impl_function_body_resolver_data(id)]
1929 }
1930 cairo_lang_defs::ids::ImplItemId::Type(id) => vec![db.impl_type_def_resolver_data(id)],
1931 cairo_lang_defs::ids::ImplItemId::Constant(id) => {
1932 vec![db.impl_constant_def_resolver_data(id)]
1933 }
1934 cairo_lang_defs::ids::ImplItemId::Impl(id) => vec![db.impl_impl_def_resolver_data(id)],
1935 },
1936 }
1937 .into_iter()
1938 .flatten()
1939 .collect()
1940}
1941
1942pub trait SemanticGroupEx: SemanticGroup {
1943 fn set_override_crate_analyzer_plugins(
1947 &mut self,
1948 crate_id: CrateId,
1949 plugins: Arc<[AnalyzerPluginId]>,
1950 ) {
1951 let mut overrides = self.analyzer_plugin_overrides().as_ref().clone();
1952 overrides.insert(crate_id, plugins);
1953 self.set_analyzer_plugin_overrides(Arc::new(overrides));
1954 }
1955}
1956
1957impl<T: SemanticGroup + ?Sized> SemanticGroupEx for T {}
1958
1959pub trait PluginSuiteInput: SemanticGroup {
1961 fn intern_plugin_suite(&mut self, suite: PluginSuite) -> InternedPluginSuite {
1963 let PluginSuite { plugins, inline_macro_plugins, analyzer_plugins } = suite;
1964
1965 let macro_plugins = plugins
1966 .into_iter()
1967 .map(|plugin| self.intern_macro_plugin(MacroPluginLongId(plugin)))
1968 .collect::<Arc<[_]>>();
1969
1970 let inline_macro_plugins = Arc::new(
1971 inline_macro_plugins
1972 .into_iter()
1973 .map(|(name, plugin)| {
1974 (name, self.intern_inline_macro_plugin(InlineMacroExprPluginLongId(plugin)))
1975 })
1976 .collect::<OrderedHashMap<_, _>>(),
1977 );
1978
1979 let analyzer_plugins = analyzer_plugins
1980 .into_iter()
1981 .map(|plugin| self.intern_analyzer_plugin(AnalyzerPluginLongId(plugin)))
1982 .collect::<Arc<[_]>>();
1983
1984 InternedPluginSuite { macro_plugins, inline_macro_plugins, analyzer_plugins }
1985 }
1986
1987 fn set_default_plugins_from_suite(&mut self, suite: InternedPluginSuite) {
1994 let InternedPluginSuite { macro_plugins, inline_macro_plugins, analyzer_plugins } = suite;
1995
1996 self.set_default_macro_plugins(macro_plugins);
1997 self.set_default_inline_macro_plugins(inline_macro_plugins);
1998 self.set_default_analyzer_plugins(analyzer_plugins);
1999 }
2000
2001 fn set_override_crate_plugins_from_suite(
2008 &mut self,
2009 crate_id: CrateId,
2010 suite: InternedPluginSuite,
2011 ) {
2012 let InternedPluginSuite { macro_plugins, inline_macro_plugins, analyzer_plugins } = suite;
2013
2014 self.set_override_crate_macro_plugins(crate_id, macro_plugins);
2015 self.set_override_crate_inline_macro_plugins(crate_id, inline_macro_plugins);
2016 self.set_override_crate_analyzer_plugins(crate_id, analyzer_plugins);
2017 }
2018}
2019
2020impl<T: SemanticGroup + ?Sized> PluginSuiteInput for T {}