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 {}