1use std::collections::BTreeMap;
2use std::sync::Arc;
3
4use cairo_lang_defs::db::DefsGroup;
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, LanguageElementId,
10 LookupItemId, ModuleFileId, ModuleId, ModuleItemId, ModuleTypeAliasId, StructId,
11 TraitConstantId, TraitFunctionId, TraitId, TraitImplId, TraitItemId, TraitTypeId, UseId,
12 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::diagnostic::SemanticDiagnosticKind;
26use crate::expr::inference::{self, ImplVar, ImplVarId};
27use crate::items::constant::{ConstValueId, Constant, ImplConstantId};
28use crate::items::function_with_body::FunctionBody;
29use crate::items::functions::{ImplicitPrecedence, InlineConfiguration};
30use crate::items::generics::{GenericParam, GenericParamData, GenericParamsData};
31use crate::items::imp::{
32 ImplId, ImplImplId, ImplLookupContext, ImplicitImplImplData, UninferredImpl,
33};
34use crate::items::module::{ModuleItemInfo, ModuleSemanticData};
35use crate::items::trt::{
36 ConcreteTraitGenericFunctionId, ConcreteTraitId, TraitItemConstantData, TraitItemImplData,
37 TraitItemTypeData,
38};
39use crate::items::us::{ImportedModules, SemanticUseEx};
40use crate::items::visibility::Visibility;
41use crate::plugin::AnalyzerPlugin;
42use crate::resolve::{ResolvedConcreteItem, ResolvedGenericItem, ResolverData};
43use crate::substitution::GenericSubstitution;
44use crate::types::{ImplTypeById, ImplTypeId, TypeSizeInformation};
45use crate::{
46 FunctionId, Parameter, SemanticDiagnostic, TypeId, corelib, items, lsp_helpers, semantic, types,
47};
48
49pub trait Elongate {
52 fn elongate(&self) -> &(dyn SemanticGroup + 'static);
53}
54
55#[salsa::query_group(SemanticDatabase)]
62pub trait SemanticGroup:
63 DefsGroup
64 + Upcast<dyn DefsGroup>
65 + Upcast<dyn ParserGroup>
66 + Upcast<dyn FilesGroup>
67 + AsFilesGroupMut
68 + Elongate
69{
70 #[salsa::interned]
71 fn intern_function(&self, id: items::functions::FunctionLongId) -> semantic::FunctionId;
72 #[salsa::interned]
73 fn intern_concrete_function_with_body(
74 &self,
75 id: items::functions::ConcreteFunctionWithBody,
76 ) -> semantic::ConcreteFunctionWithBodyId;
77 #[salsa::interned]
78 fn intern_concrete_struct(&self, id: types::ConcreteStructLongId) -> types::ConcreteStructId;
79 #[salsa::interned]
80 fn intern_concrete_enum(&self, id: types::ConcreteEnumLongId) -> types::ConcreteEnumId;
81 #[salsa::interned]
82 fn intern_concrete_extern_type(
83 &self,
84 id: types::ConcreteExternTypeLongId,
85 ) -> types::ConcreteExternTypeId;
86 #[salsa::interned]
87 fn intern_concrete_trait(
88 &self,
89 id: items::trt::ConcreteTraitLongId,
90 ) -> items::trt::ConcreteTraitId;
91 #[salsa::interned]
92 fn intern_concrete_trait_function(
93 &self,
94 id: items::trt::ConcreteTraitGenericFunctionLongId,
95 ) -> items::trt::ConcreteTraitGenericFunctionId;
96 #[salsa::interned]
97 fn intern_concrete_trait_type(
98 &self,
99 id: items::trt::ConcreteTraitTypeLongId,
100 ) -> items::trt::ConcreteTraitTypeId;
101 #[salsa::interned]
102 fn intern_concrete_trait_constant(
103 &self,
104 id: items::trt::ConcreteTraitConstantLongId,
105 ) -> items::trt::ConcreteTraitConstantId;
106 #[salsa::interned]
107 fn intern_concrete_impl(
108 &self,
109 id: items::imp::ConcreteImplLongId,
110 ) -> items::imp::ConcreteImplId;
111 #[salsa::interned]
112 fn intern_concrete_trait_impl(
113 &self,
114 id: items::trt::ConcreteTraitImplLongId,
115 ) -> items::trt::ConcreteTraitImplId;
116 #[salsa::interned]
117 fn intern_type(&self, id: types::TypeLongId) -> semantic::TypeId;
118 #[salsa::interned]
119 fn intern_const_value(&self, id: items::constant::ConstValue) -> items::constant::ConstValueId;
120 #[salsa::interned]
121 fn intern_impl(&self, id: items::imp::ImplLongId) -> items::imp::ImplId;
122 #[salsa::interned]
123 fn intern_impl_var(&self, id: ImplVar) -> ImplVarId;
124
125 #[salsa::interned]
126 fn intern_generated_impl(
127 &self,
128 id: items::imp::GeneratedImplLongId,
129 ) -> items::imp::GeneratedImplId;
130
131 #[salsa::interned]
132 fn intern_uninferred_generated_impl(
133 &self,
134 id: items::imp::UninferredGeneratedImplLongId,
135 ) -> items::imp::UninferredGeneratedImplId;
136
137 #[salsa::invoke(items::constant::priv_constant_semantic_data)]
141 #[salsa::cycle(items::constant::priv_constant_semantic_data_cycle)]
142 fn priv_constant_semantic_data(
143 &self,
144 const_id: ConstantId,
145 in_cycle: bool,
146 ) -> Maybe<items::constant::ConstantData>;
147 #[salsa::invoke(items::constant::constant_semantic_diagnostics)]
149 fn constant_semantic_diagnostics(
150 &self,
151 const_id: ConstantId,
152 ) -> Diagnostics<SemanticDiagnostic>;
153 #[salsa::invoke(items::constant::constant_semantic_data)]
155 #[salsa::cycle(items::constant::constant_semantic_data_cycle)]
156 fn constant_semantic_data(&self, use_id: ConstantId) -> Maybe<Constant>;
157 #[salsa::invoke(items::constant::constant_resolver_data)]
158 #[salsa::cycle(items::constant::constant_resolver_data_cycle)]
159 fn constant_resolver_data(&self, use_id: ConstantId) -> Maybe<Arc<ResolverData>>;
160 #[salsa::invoke(items::constant::constant_const_value)]
161 #[salsa::cycle(items::constant::constant_const_value_cycle)]
162 fn constant_const_value(&self, const_id: ConstantId) -> Maybe<ConstValueId>;
163 #[salsa::invoke(items::constant::constant_const_type)]
164 #[salsa::cycle(items::constant::constant_const_type_cycle)]
165 fn constant_const_type(&self, const_id: ConstantId) -> Maybe<TypeId>;
166
167 #[salsa::invoke(items::us::priv_use_semantic_data)]
171 #[salsa::cycle(items::us::priv_use_semantic_data_cycle)]
172 fn priv_use_semantic_data(&self, use_id: UseId) -> Maybe<items::us::UseData>;
173 #[salsa::invoke(items::us::use_semantic_diagnostics)]
175 fn use_semantic_diagnostics(&self, use_id: UseId) -> Diagnostics<SemanticDiagnostic>;
176 #[salsa::invoke(items::us::use_resolver_data)]
177 #[salsa::cycle(items::us::use_resolver_data_cycle)]
178 fn use_resolver_data(&self, use_id: UseId) -> Maybe<Arc<ResolverData>>;
179
180 #[salsa::invoke(items::us::priv_global_use_semantic_data)]
184 #[salsa::cycle(items::us::priv_global_use_semantic_data_cycle)]
185 fn priv_global_use_semantic_data(
186 &self,
187 global_use_id: GlobalUseId,
188 ) -> Maybe<items::us::UseGlobalData>;
189 #[salsa::invoke(items::us::priv_global_use_imported_module)]
191 fn priv_global_use_imported_module(&self, global_use_id: GlobalUseId) -> Maybe<ModuleId>;
192 #[salsa::invoke(items::us::global_use_semantic_diagnostics)]
194 fn global_use_semantic_diagnostics(
195 &self,
196 global_use_id: GlobalUseId,
197 ) -> Diagnostics<SemanticDiagnostic>;
198 #[salsa::invoke(items::us::priv_module_use_star_modules)]
200 fn priv_module_use_star_modules(&self, module_id: ModuleId) -> Arc<ImportedModules>;
201
202 #[salsa::invoke(items::module::priv_module_semantic_data)]
207 fn priv_module_semantic_data(&self, module_id: ModuleId) -> Maybe<Arc<ModuleSemanticData>>;
208
209 #[salsa::invoke(items::module::module_item_by_name)]
212 fn module_item_by_name(
213 &self,
214 module_id: ModuleId,
215 name: SmolStr,
216 ) -> Maybe<Option<ModuleItemId>>;
217
218 #[salsa::invoke(items::module::module_item_info_by_name)]
221 fn module_item_info_by_name(
222 &self,
223 module_id: ModuleId,
224 name: SmolStr,
225 ) -> Maybe<Option<ModuleItemInfo>>;
226
227 #[salsa::invoke(items::module::module_all_used_items)]
229 fn module_all_used_items(
230 &self,
231 module_id: ModuleId,
232 ) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
233
234 #[salsa::invoke(items::module::module_attributes)]
236 fn module_attributes(&self, module_id: ModuleId) -> Maybe<Vec<Attribute>>;
237
238 #[salsa::invoke(items::module::module_usable_trait_ids)]
240 fn module_usable_trait_ids(
241 &self,
242 module_id: ModuleId,
243 ) -> Maybe<Arc<OrderedHashMap<TraitId, LookupItemId>>>;
244
245 #[salsa::invoke(items::structure::priv_struct_declaration_data)]
249 fn priv_struct_declaration_data(
250 &self,
251 struct_id: StructId,
252 ) -> Maybe<items::structure::StructDeclarationData>;
253 #[salsa::invoke(items::structure::struct_declaration_diagnostics)]
255 fn struct_declaration_diagnostics(
256 &self,
257 struct_id: StructId,
258 ) -> Diagnostics<SemanticDiagnostic>;
259 #[salsa::invoke(items::structure::struct_attributes)]
261 fn struct_attributes(&self, struct_id: StructId) -> Maybe<Vec<Attribute>>;
262 #[salsa::invoke(items::structure::struct_generic_params)]
264 fn struct_generic_params(&self, struct_id: StructId) -> Maybe<Vec<GenericParam>>;
265 #[salsa::invoke(items::structure::struct_generic_params_data)]
267 fn struct_generic_params_data(&self, struct_id: StructId) -> Maybe<GenericParamsData>;
268 #[salsa::invoke(items::structure::struct_declaration_resolver_data)]
270 fn struct_declaration_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
271
272 #[salsa::invoke(items::structure::priv_struct_definition_data)]
274 fn priv_struct_definition_data(
275 &self,
276 struct_id: StructId,
277 ) -> Maybe<items::structure::StructDefinitionData>;
278 #[salsa::invoke(items::structure::struct_definition_diagnostics)]
280 fn struct_definition_diagnostics(&self, struct_id: StructId)
281 -> Diagnostics<SemanticDiagnostic>;
282 #[salsa::invoke(items::structure::struct_members)]
284 fn struct_members(
285 &self,
286 struct_id: StructId,
287 ) -> Maybe<Arc<OrderedHashMap<SmolStr, semantic::Member>>>;
288 #[salsa::invoke(items::structure::struct_definition_resolver_data)]
290 fn struct_definition_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
291 #[salsa::invoke(items::structure::concrete_struct_members)]
293 fn concrete_struct_members(
294 &self,
295 concrete_struct_id: types::ConcreteStructId,
296 ) -> Maybe<Arc<OrderedHashMap<SmolStr, semantic::Member>>>;
297
298 #[salsa::invoke(items::enm::priv_enum_declaration_data)]
302 fn priv_enum_declaration_data(&self, enum_id: EnumId)
303 -> Maybe<items::enm::EnumDeclarationData>;
304 #[salsa::invoke(items::enm::enum_declaration_diagnostics)]
306 fn enum_declaration_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
307 #[salsa::invoke(items::enm::enum_generic_params)]
309 fn enum_generic_params(&self, enum_id: EnumId) -> Maybe<Vec<GenericParam>>;
310 #[salsa::invoke(items::enm::enum_generic_params_data)]
312 fn enum_generic_params_data(&self, enum_id: EnumId) -> Maybe<GenericParamsData>;
313 #[salsa::invoke(items::enm::enum_attributes)]
315 fn enum_attributes(&self, enum_id: EnumId) -> Maybe<Vec<Attribute>>;
316 #[salsa::invoke(items::enm::enum_declaration_resolver_data)]
318 fn enum_declaration_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
319
320 #[salsa::invoke(items::enm::priv_enum_definition_data)]
322 fn priv_enum_definition_data(&self, enum_id: EnumId) -> Maybe<items::enm::EnumDefinitionData>;
323 #[salsa::invoke(items::enm::enum_definition_diagnostics)]
325 fn enum_definition_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
326 #[salsa::invoke(items::enm::enum_variants)]
328 fn enum_variants(&self, enum_id: EnumId) -> Maybe<OrderedHashMap<SmolStr, VariantId>>;
329 #[salsa::invoke(items::enm::variant_semantic)]
331 fn variant_semantic(&self, enum_id: EnumId, variant_id: VariantId) -> Maybe<semantic::Variant>;
332 #[salsa::invoke(items::enm::enum_definition_resolver_data)]
334 fn enum_definition_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
335
336 #[salsa::invoke(items::module_type_alias::module_type_alias_semantic_diagnostics)]
340 fn module_type_alias_semantic_diagnostics(
341 &self,
342 module_type_alias_id: ModuleTypeAliasId,
343 ) -> Diagnostics<SemanticDiagnostic>;
344 #[salsa::invoke(items::module_type_alias::module_type_alias_resolved_type)]
346 #[salsa::cycle(items::module_type_alias::module_type_alias_resolved_type_cycle)]
347 fn module_type_alias_resolved_type(
348 &self,
349 module_type_alias_id: ModuleTypeAliasId,
350 ) -> Maybe<TypeId>;
351 #[salsa::invoke(items::module_type_alias::module_type_alias_generic_params)]
353 fn module_type_alias_generic_params(
354 &self,
355 enum_id: ModuleTypeAliasId,
356 ) -> Maybe<Vec<GenericParam>>;
357 #[salsa::invoke(items::module_type_alias::module_type_alias_resolver_data)]
359 #[salsa::cycle(items::module_type_alias::module_type_alias_resolver_data_cycle)]
360 fn module_type_alias_resolver_data(
361 &self,
362 module_type_alias_id: ModuleTypeAliasId,
363 ) -> Maybe<Arc<ResolverData>>;
364 #[salsa::invoke(items::module_type_alias::priv_module_type_alias_generic_params_data)]
366 fn priv_module_type_alias_generic_params_data(
367 &self,
368 enum_id: ModuleTypeAliasId,
369 ) -> Maybe<GenericParamsData>;
370 #[salsa::invoke(items::module_type_alias::priv_module_type_alias_semantic_data)]
372 #[salsa::cycle(items::module_type_alias::priv_module_type_alias_semantic_data_cycle)]
373 fn priv_module_type_alias_semantic_data(
374 &self,
375 module_type_alias_id: ModuleTypeAliasId,
376 in_cycle: bool,
377 ) -> Maybe<items::module_type_alias::ModuleTypeAliasData>;
378
379 #[salsa::invoke(items::impl_alias::impl_alias_impl_def)]
384 #[salsa::cycle(items::impl_alias::impl_alias_impl_def_cycle)]
385 fn impl_alias_impl_def(&self, impl_alias_id: ImplAliasId) -> Maybe<ImplDefId>;
386 #[salsa::invoke(items::impl_alias::priv_impl_alias_semantic_data)]
388 #[salsa::cycle(items::impl_alias::priv_impl_alias_semantic_data_cycle)]
389 fn priv_impl_alias_semantic_data(
390 &self,
391 impl_alias_id: ImplAliasId,
392 in_cycle: bool,
393 ) -> Maybe<items::impl_alias::ImplAliasData>;
394 #[salsa::invoke(items::impl_alias::impl_alias_semantic_diagnostics)]
396 fn impl_alias_semantic_diagnostics(
397 &self,
398 impl_alias_id: ImplAliasId,
399 ) -> Diagnostics<SemanticDiagnostic>;
400 #[salsa::invoke(items::impl_alias::impl_alias_resolved_impl)]
402 #[salsa::cycle(items::impl_alias::impl_alias_resolved_impl_cycle)]
403 fn impl_alias_resolved_impl(&self, impl_alias_id: ImplAliasId) -> Maybe<ImplId>;
404 #[salsa::invoke(items::impl_alias::impl_alias_generic_params)]
406 fn impl_alias_generic_params(&self, impl_alias_id: ImplAliasId) -> Maybe<Vec<GenericParam>>;
407 #[salsa::invoke(items::impl_alias::impl_alias_generic_params_data)]
409 fn impl_alias_generic_params_data(
410 &self,
411 impl_alias_id: ImplAliasId,
412 ) -> Maybe<GenericParamsData>;
413 #[salsa::invoke(items::impl_alias::impl_alias_resolver_data)]
415 #[salsa::cycle(items::impl_alias::impl_alias_resolver_data_cycle)]
416 fn impl_alias_resolver_data(&self, impl_alias_id: ImplAliasId) -> Maybe<Arc<ResolverData>>;
417 #[salsa::invoke(items::impl_alias::impl_alias_attributes)]
419 fn impl_alias_attributes(&self, impl_def_id: ImplAliasId) -> Maybe<Vec<Attribute>>;
420
421 #[salsa::invoke(items::trt::trait_semantic_declaration_diagnostics)]
425 fn trait_semantic_declaration_diagnostics(
426 &self,
427 trait_id: TraitId,
428 ) -> Diagnostics<SemanticDiagnostic>;
429 #[salsa::invoke(items::trt::trait_generic_params)]
431 #[salsa::cycle(items::trt::trait_generic_params_cycle)]
432 fn trait_generic_params(&self, trait_id: TraitId) -> Maybe<Vec<GenericParam>>;
433 #[salsa::invoke(items::trt::trait_generic_params_data)]
435 #[salsa::cycle(items::trt::trait_generic_params_data_cycle)]
436 fn trait_generic_params_data(
437 &self,
438 trait_id: TraitId,
439 in_cycle: bool,
440 ) -> Maybe<GenericParamsData>;
441 #[salsa::invoke(items::trt::trait_attributes)]
443 fn trait_attributes(&self, trait_id: TraitId) -> Maybe<Vec<Attribute>>;
444 #[salsa::invoke(items::trt::trait_resolver_data)]
446 fn trait_resolver_data(&self, trait_id: TraitId) -> Maybe<Arc<ResolverData>>;
447 #[salsa::invoke(items::trt::priv_trait_declaration_data)]
449 fn priv_trait_declaration_data(
450 &self,
451 trait_id: TraitId,
452 ) -> Maybe<items::trt::TraitDeclarationData>;
453
454 #[salsa::invoke(items::trt::trait_semantic_definition_diagnostics)]
456 fn trait_semantic_definition_diagnostics(
457 &self,
458 trait_id: TraitId,
459 ) -> Diagnostics<SemanticDiagnostic>;
460 #[salsa::invoke(items::trt::trait_required_item_names)]
462 fn trait_required_item_names(&self, trait_id: TraitId) -> Maybe<OrderedHashSet<SmolStr>>;
463 #[salsa::invoke(items::trt::trait_item_by_name)]
465 fn trait_item_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitItemId>>;
466 #[salsa::invoke(items::trt::trait_all_used_items)]
468 fn trait_all_used_items(&self, trait_id: TraitId) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
469 #[salsa::invoke(items::trt::trait_functions)]
471 fn trait_functions(&self, trait_id: TraitId)
472 -> Maybe<OrderedHashMap<SmolStr, TraitFunctionId>>;
473 #[salsa::invoke(items::trt::trait_function_by_name)]
475 fn trait_function_by_name(
476 &self,
477 trait_id: TraitId,
478 name: SmolStr,
479 ) -> Maybe<Option<TraitFunctionId>>;
480 #[salsa::invoke(items::trt::trait_types)]
482 fn trait_types(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitTypeId>>;
483 #[salsa::invoke(items::trt::trait_type_by_name)]
485 fn trait_type_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitTypeId>>;
486
487 #[salsa::invoke(items::trt::trait_constants)]
489 fn trait_constants(&self, trait_id: TraitId)
490 -> Maybe<OrderedHashMap<SmolStr, TraitConstantId>>;
491 #[salsa::invoke(items::trt::trait_constant_by_name)]
493 fn trait_constant_by_name(
494 &self,
495 trait_id: TraitId,
496 name: SmolStr,
497 ) -> Maybe<Option<TraitConstantId>>;
498 #[salsa::invoke(items::trt::trait_impls)]
500 fn trait_impls(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitImplId>>;
501 #[salsa::invoke(items::trt::trait_impl_by_name)]
503 fn trait_impl_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitImplId>>;
504
505 #[salsa::invoke(items::trt::priv_trait_definition_data)]
507 fn priv_trait_definition_data(
508 &self,
509 trait_id: TraitId,
510 ) -> Maybe<items::trt::TraitDefinitionData>;
511
512 #[salsa::invoke(items::trt::trait_type_diagnostics)]
516 fn trait_type_diagnostics(&self, trait_type_id: TraitTypeId)
517 -> Diagnostics<SemanticDiagnostic>;
518 #[salsa::invoke(items::trt::trait_type_generic_params)]
520 fn trait_type_generic_params(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<GenericParam>>;
521 #[salsa::invoke(items::trt::trait_type_attributes)]
523 fn trait_type_attributes(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<Attribute>>;
524 #[salsa::invoke(items::trt::trait_type_resolver_data)]
526 fn trait_type_resolver_data(&self, trait_type_id: TraitTypeId) -> Maybe<Arc<ResolverData>>;
527 #[salsa::invoke(items::trt::priv_trait_type_generic_params_data)]
529 fn priv_trait_type_generic_params_data(
530 &self,
531 trait_type_id: TraitTypeId,
532 ) -> Maybe<GenericParamsData>;
533 #[salsa::invoke(items::trt::priv_trait_type_data)]
535 fn priv_trait_type_data(&self, type_id: TraitTypeId) -> Maybe<TraitItemTypeData>;
536
537 #[salsa::invoke(items::trt::trait_constant_diagnostics)]
541 fn trait_constant_diagnostics(
542 &self,
543 trait_constant: TraitConstantId,
544 ) -> Diagnostics<SemanticDiagnostic>;
545 #[salsa::invoke(items::trt::trait_constant_attributes)]
547 fn trait_constant_attributes(&self, trait_constant: TraitConstantId) -> Maybe<Vec<Attribute>>;
548 #[salsa::invoke(items::trt::trait_constant_type)]
550 fn trait_constant_type(&self, trait_type_id: TraitConstantId) -> Maybe<TypeId>;
551 #[salsa::invoke(items::trt::trait_constant_resolver_data)]
553 fn trait_constant_resolver_data(
554 &self,
555 trait_constant: TraitConstantId,
556 ) -> Maybe<Arc<ResolverData>>;
557 #[salsa::invoke(items::trt::priv_trait_constant_data)]
559 fn priv_trait_constant_data(
560 &self,
561 trait_constant: TraitConstantId,
562 ) -> Maybe<TraitItemConstantData>;
563 #[salsa::invoke(items::trt::concrete_trait_constant_type)]
565 fn concrete_trait_constant_type(
566 &self,
567 concrete_trait_constant_id: items::trt::ConcreteTraitConstantId,
568 ) -> Maybe<TypeId>;
569
570 #[salsa::invoke(items::trt::trait_impl_diagnostics)]
574 fn trait_impl_diagnostics(&self, trait_impl: TraitImplId) -> Diagnostics<SemanticDiagnostic>;
575 #[salsa::invoke(items::trt::trait_impl_attributes)]
577 fn trait_impl_attributes(&self, trait_impl: TraitImplId) -> Maybe<Vec<Attribute>>;
578 #[salsa::invoke(items::trt::trait_impl_concrete_trait)]
580 fn trait_impl_concrete_trait(&self, trait_impl_id: TraitImplId) -> Maybe<ConcreteTraitId>;
581 #[salsa::invoke(items::trt::trait_impl_resolver_data)]
583 fn trait_impl_resolver_data(&self, trait_impl: TraitImplId) -> Maybe<Arc<ResolverData>>;
584 #[salsa::invoke(items::trt::priv_trait_impl_data)]
586 fn priv_trait_impl_data(&self, trait_impl: TraitImplId) -> Maybe<TraitItemImplData>;
587 #[salsa::invoke(items::trt::concrete_trait_impl_concrete_trait)]
589 fn concrete_trait_impl_concrete_trait(
590 &self,
591 concrete_trait_impl_id: items::trt::ConcreteTraitImplId,
592 ) -> Maybe<ConcreteTraitId>;
593
594 #[salsa::invoke(items::trt::trait_function_declaration_diagnostics)]
598 fn trait_function_declaration_diagnostics(
599 &self,
600 trait_function_id: TraitFunctionId,
601 ) -> Diagnostics<SemanticDiagnostic>;
602 #[salsa::invoke(items::trt::trait_function_signature)]
604 fn trait_function_signature(
605 &self,
606 trait_function_id: TraitFunctionId,
607 ) -> Maybe<semantic::Signature>;
608 #[salsa::invoke(items::trt::trait_function_generic_params)]
610 fn trait_function_generic_params(
611 &self,
612 trait_function_id: TraitFunctionId,
613 ) -> Maybe<Vec<GenericParam>>;
614 #[salsa::invoke(items::trt::priv_trait_function_generic_params_data)]
616 fn priv_trait_function_generic_params_data(
617 &self,
618 trait_function_id: TraitFunctionId,
619 ) -> Maybe<GenericParamsData>;
620 #[salsa::invoke(items::trt::trait_function_attributes)]
622 fn trait_function_attributes(
623 &self,
624 trait_function_id: TraitFunctionId,
625 ) -> Maybe<Vec<Attribute>>;
626 #[salsa::invoke(items::trt::trait_function_resolver_data)]
628 fn trait_function_resolver_data(
629 &self,
630 trait_function_id: TraitFunctionId,
631 ) -> Maybe<Arc<ResolverData>>;
632 #[salsa::invoke(items::trt::trait_function_declaration_inline_config)]
634 fn trait_function_declaration_inline_config(
635 &self,
636 trait_function_id: TraitFunctionId,
637 ) -> Maybe<InlineConfiguration>;
638 #[salsa::invoke(items::trt::trait_function_declaration_implicit_precedence)]
640 fn trait_function_declaration_implicit_precedence(
641 &self,
642 trait_function_id: TraitFunctionId,
643 ) -> Maybe<ImplicitPrecedence>;
644 #[salsa::invoke(items::trt::trait_function_declaration_implicits)]
646 fn trait_function_declaration_implicits(
647 &self,
648 trait_function_id: TraitFunctionId,
649 ) -> Maybe<Vec<TypeId>>;
650 #[salsa::invoke(items::trt::priv_trait_function_declaration_data)]
652 fn priv_trait_function_declaration_data(
653 &self,
654 function_id: TraitFunctionId,
655 ) -> Maybe<items::functions::FunctionDeclarationData>;
656
657 #[salsa::invoke(items::trt::trait_function_body_diagnostics)]
659 fn trait_function_body_diagnostics(
660 &self,
661 trait_function_id: TraitFunctionId,
662 ) -> Diagnostics<SemanticDiagnostic>;
663 #[salsa::invoke(items::trt::trait_function_body)]
665 fn trait_function_body(
666 &self,
667 trait_function_id: TraitFunctionId,
668 ) -> Maybe<Option<Arc<FunctionBody>>>;
669 #[salsa::invoke(items::trt::priv_trait_function_body_data)]
671 fn priv_trait_function_body_data(
672 &self,
673 trait_function_id: TraitFunctionId,
674 ) -> Maybe<Option<items::function_with_body::FunctionBodyData>>;
675
676 #[salsa::invoke(items::trt::concrete_trait_function_generic_params)]
680 fn concrete_trait_function_generic_params(
681 &self,
682 concrete_trait_function_id: ConcreteTraitGenericFunctionId,
683 ) -> Maybe<Vec<GenericParam>>;
684 #[salsa::invoke(items::trt::concrete_trait_function_signature)]
686 fn concrete_trait_function_signature(
687 &self,
688 concrete_trait_function_id: ConcreteTraitGenericFunctionId,
689 ) -> Maybe<semantic::Signature>;
690
691 #[salsa::invoke(items::imp::module_impl_ids_for_trait_filter)]
695 #[salsa::cycle(items::imp::module_impl_ids_for_trait_filter_cycle)]
696 fn module_impl_ids_for_trait_filter(
697 &self,
698 module_id: ModuleId,
699 trait_lookup_constraint: items::imp::TraitFilter,
700 ) -> Maybe<Vec<UninferredImpl>>;
701 #[salsa::invoke(items::imp::impl_impl_ids_for_trait_filter)]
702 #[salsa::cycle(items::imp::impl_impl_ids_for_trait_filter_cycle)]
703 fn impl_impl_ids_for_trait_filter(
704 &self,
705 impl_id: ImplId,
706 trait_lookup_constraint: items::imp::TraitFilter,
707 ) -> Maybe<Vec<UninferredImpl>>;
708 #[salsa::invoke(inference::solver::canonic_trait_solutions)]
710 #[salsa::cycle(inference::solver::canonic_trait_solutions_cycle)]
711 fn canonic_trait_solutions(
712 &self,
713 canonical_trait: inference::canonic::CanonicalTrait,
714 lookup_context: ImplLookupContext,
715 impl_type_bounds: BTreeMap<ImplTypeById, TypeId>,
716 ) -> Result<
717 inference::solver::SolutionSet<inference::canonic::CanonicalImpl>,
718 inference::InferenceError,
719 >;
720
721 #[salsa::invoke(items::imp::impl_semantic_declaration_diagnostics)]
725 fn impl_semantic_declaration_diagnostics(
726 &self,
727 impl_def_id: ImplDefId,
728 ) -> Diagnostics<SemanticDiagnostic>;
729 #[salsa::invoke(items::imp::impl_def_generic_params_data)]
731 fn impl_def_generic_params_data(&self, impl_def_id: ImplDefId) -> Maybe<GenericParamsData>;
732 #[salsa::invoke(items::imp::impl_def_generic_params)]
734 fn impl_def_generic_params(&self, impl_def_id: ImplDefId) -> Maybe<Vec<GenericParam>>;
735 #[salsa::invoke(items::imp::impl_def_resolver_data)]
737 #[salsa::cycle(items::imp::impl_def_resolver_data_cycle)]
738 fn impl_def_resolver_data(&self, impl_def_id: ImplDefId) -> Maybe<Arc<ResolverData>>;
739 #[salsa::invoke(items::imp::impl_def_concrete_trait)]
741 #[salsa::cycle(items::imp::impl_def_concrete_trait_cycle)]
742 fn impl_def_concrete_trait(&self, impl_def_id: ImplDefId) -> Maybe<ConcreteTraitId>;
743 #[salsa::invoke(items::imp::impl_def_substitution)]
745 fn impl_def_substitution(&self, impl_def_id: ImplDefId) -> Maybe<Arc<GenericSubstitution>>;
746 #[salsa::invoke(items::imp::impl_def_attributes)]
748 fn impl_def_attributes(&self, impl_def_id: ImplDefId) -> Maybe<Vec<Attribute>>;
749 #[salsa::invoke(items::imp::impl_concrete_trait)]
751 fn impl_concrete_trait(&self, impl_id: ImplId) -> Maybe<ConcreteTraitId>;
752 #[salsa::invoke(items::imp::impl_def_trait)]
755 fn impl_def_trait(&self, impl_def_id: ImplDefId) -> Maybe<TraitId>;
756 #[salsa::invoke(items::imp::priv_impl_declaration_data)]
758 #[salsa::cycle(items::imp::priv_impl_declaration_data_cycle)]
759 fn priv_impl_declaration_data(
760 &self,
761 impl_def_id: ImplDefId,
762 ) -> Maybe<items::imp::ImplDeclarationData>;
763
764 #[salsa::invoke(items::imp::impl_semantic_definition_diagnostics)]
766 fn impl_semantic_definition_diagnostics(
767 &self,
768 impl_def_id: ImplDefId,
769 ) -> Diagnostics<SemanticDiagnostic>;
770 #[salsa::invoke(items::imp::impl_item_by_name)]
772 fn impl_item_by_name(&self, impl_def_id: ImplDefId, name: SmolStr)
773 -> Maybe<Option<ImplItemId>>;
774 #[salsa::invoke(items::imp::impl_implicit_impl_by_name)]
776 fn impl_implicit_impl_by_name(
777 &self,
778 impl_def_id: ImplDefId,
779 name: SmolStr,
780 ) -> Maybe<Option<TraitImplId>>;
781 #[salsa::invoke(items::imp::impl_all_used_items)]
783 fn impl_all_used_items(
784 &self,
785 impl_def_id: ImplDefId,
786 ) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
787 #[salsa::invoke(items::imp::impl_types)]
789 fn impl_types(
790 &self,
791 impl_def_id: ImplDefId,
792 ) -> Maybe<Arc<OrderedHashMap<ImplTypeDefId, ast::ItemTypeAlias>>>;
793 #[salsa::invoke(items::imp::impl_type_ids)]
795 fn impl_type_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplTypeDefId]>>;
796 #[salsa::invoke(items::imp::impl_type_by_id)]
798 fn impl_type_by_id(&self, impl_type_id: ImplTypeDefId) -> Maybe<Option<ast::ItemTypeAlias>>;
799 #[salsa::invoke(items::imp::impl_type_by_trait_type)]
801 fn impl_type_by_trait_type(
802 &self,
803 impl_def_id: ImplDefId,
804 trait_type_id: TraitTypeId,
805 ) -> Maybe<ImplTypeDefId>;
806
807 #[salsa::invoke(items::imp::impl_constants)]
809 fn impl_constants(
810 &self,
811 impl_def_id: ImplDefId,
812 ) -> Maybe<Arc<OrderedHashMap<ImplConstantDefId, ast::ItemConstant>>>;
813
814 #[salsa::invoke(items::imp::impl_impls)]
816 fn impl_impls(
817 &self,
818 impl_def_id: ImplDefId,
819 ) -> Maybe<Arc<OrderedHashMap<ImplImplDefId, ast::ItemImplAlias>>>;
820 #[salsa::invoke(items::imp::impl_impl_ids)]
822 fn impl_impl_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplImplDefId]>>;
823 #[salsa::invoke(items::imp::impl_impl_by_id)]
825 fn impl_impl_by_id(&self, impl_impl_id: ImplImplDefId) -> Maybe<Option<ast::ItemImplAlias>>;
826 #[salsa::invoke(items::imp::impl_impl_by_trait_impl)]
828 fn impl_impl_by_trait_impl(
829 &self,
830 impl_def_id: ImplDefId,
831 trait_impl_id: TraitImplId,
832 ) -> Maybe<ImplImplDefId>;
833 #[salsa::invoke(items::imp::is_implicit_impl_impl)]
835 fn is_implicit_impl_impl(
836 &self,
837 impl_def_id: ImplDefId,
838 trait_impl_id: TraitImplId,
839 ) -> Maybe<bool>;
840
841 #[salsa::invoke(items::imp::impl_constant_by_trait_constant)]
843 fn impl_constant_by_trait_constant(
844 &self,
845 impl_def_id: ImplDefId,
846 trait_constant_id: TraitConstantId,
847 ) -> Maybe<ImplConstantDefId>;
848
849 #[salsa::invoke(items::imp::impl_functions)]
851 fn impl_functions(
852 &self,
853 impl_def_id: ImplDefId,
854 ) -> Maybe<OrderedHashMap<SmolStr, ImplFunctionId>>;
855 #[salsa::invoke(items::imp::impl_function_by_trait_function)]
860 fn impl_function_by_trait_function(
861 &self,
862 impl_def_id: ImplDefId,
863 trait_function_id: TraitFunctionId,
864 ) -> Maybe<Option<ImplFunctionId>>;
865 #[salsa::invoke(items::imp::priv_impl_definition_data)]
867 fn priv_impl_definition_data(
868 &self,
869 impl_def_id: ImplDefId,
870 ) -> Maybe<items::imp::ImplDefinitionData>;
871
872 #[salsa::invoke(items::imp::priv_impl_is_fully_concrete)]
874 fn priv_impl_is_fully_concrete(&self, impl_id: ImplId) -> bool;
875
876 #[salsa::invoke(items::imp::priv_impl_is_var_free)]
878 fn priv_impl_is_var_free(&self, impl_id: ImplId) -> bool;
879
880 #[salsa::invoke(items::imp::impl_type_def_semantic_diagnostics)]
884 fn impl_type_def_semantic_diagnostics(
885 &self,
886 impl_type_def_id: ImplTypeDefId,
887 ) -> Diagnostics<SemanticDiagnostic>;
888 #[salsa::invoke(items::imp::impl_type_def_resolved_type)]
890 #[salsa::cycle(items::imp::impl_type_def_resolved_type_cycle)]
891 fn impl_type_def_resolved_type(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<TypeId>;
892 #[salsa::invoke(items::imp::impl_type_def_generic_params)]
894 fn impl_type_def_generic_params(
895 &self,
896 impl_type_def_id: ImplTypeDefId,
897 ) -> Maybe<Vec<GenericParam>>;
898 #[salsa::invoke(items::imp::impl_type_def_attributes)]
900 fn impl_type_def_attributes(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<Vec<Attribute>>;
901 #[salsa::invoke(items::imp::impl_type_def_resolver_data)]
903 fn impl_type_def_resolver_data(
904 &self,
905 impl_type_def_id: ImplTypeDefId,
906 ) -> Maybe<Arc<ResolverData>>;
907 #[salsa::invoke(items::imp::impl_type_def_trait_type)]
909 fn impl_type_def_trait_type(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<TraitTypeId>;
910
911 #[salsa::invoke(items::imp::priv_impl_type_semantic_data)]
913 #[salsa::cycle(items::imp::priv_impl_type_semantic_data_cycle)]
914 fn priv_impl_type_semantic_data(
915 &self,
916 impl_type_def_id: ImplTypeDefId,
917 in_cycle: bool,
918 ) -> Maybe<items::imp::ImplItemTypeData>;
919 #[salsa::invoke(items::imp::priv_impl_type_def_generic_params_data)]
921 fn priv_impl_type_def_generic_params_data(
922 &self,
923 impl_type_def_id: ImplTypeDefId,
924 ) -> Maybe<GenericParamsData>;
925
926 #[salsa::invoke(items::imp::impl_type_concrete_implized)]
932 #[salsa::cycle(items::imp::impl_type_concrete_implized_cycle)]
933 fn impl_type_concrete_implized(&self, impl_type_def_id: ImplTypeId) -> Maybe<TypeId>;
934
935 #[salsa::invoke(items::imp::impl_constant_def_semantic_diagnostics)]
939 fn impl_constant_def_semantic_diagnostics(
940 &self,
941 impl_constant_def_id: ImplConstantDefId,
942 ) -> Diagnostics<SemanticDiagnostic>;
943 #[salsa::invoke(items::imp::impl_constant_def_value)]
945 #[salsa::cycle(items::imp::impl_constant_def_value_cycle)]
946 fn impl_constant_def_value(
947 &self,
948 impl_constant_def_id: ImplConstantDefId,
949 ) -> Maybe<ConstValueId>;
950 #[salsa::invoke(items::imp::impl_constant_def_resolver_data)]
952 fn impl_constant_def_resolver_data(
953 &self,
954 impl_constant_def_id: ImplConstantDefId,
955 ) -> Maybe<Arc<ResolverData>>;
956 #[salsa::invoke(items::imp::impl_constant_def_trait_constant)]
958 fn impl_constant_def_trait_constant(
959 &self,
960 impl_constant_def_id: ImplConstantDefId,
961 ) -> Maybe<TraitConstantId>;
962
963 #[salsa::invoke(items::imp::priv_impl_constant_semantic_data)]
965 #[salsa::cycle(items::imp::priv_impl_constant_semantic_data_cycle)]
966 fn priv_impl_constant_semantic_data(
967 &self,
968 impl_constant_def_id: ImplConstantDefId,
969 in_cycle: bool,
970 ) -> Maybe<items::imp::ImplItemConstantData>;
971
972 #[salsa::invoke(items::imp::impl_constant_implized_by_context)]
976 #[salsa::cycle(items::imp::impl_constant_implized_by_context_cycle)]
977 fn impl_constant_implized_by_context(
978 &self,
979 impl_constant_id: ImplConstantId,
980 impl_def_id: ImplDefId,
981 ) -> Maybe<ConstValueId>;
982 #[salsa::invoke(items::imp::impl_constant_concrete_implized_value)]
985 #[salsa::cycle(items::imp::impl_constant_concrete_implized_value_cycle)]
986 fn impl_constant_concrete_implized_value(
987 &self,
988 impl_constant_id: ImplConstantId,
989 ) -> Maybe<ConstValueId>;
990 #[salsa::invoke(items::imp::impl_constant_concrete_implized_type)]
993 #[salsa::cycle(items::imp::impl_constant_concrete_implized_type_cycle)]
994 fn impl_constant_concrete_implized_type(
995 &self,
996 impl_constant_id: ImplConstantId,
997 ) -> Maybe<TypeId>;
998
999 #[salsa::invoke(items::imp::impl_impl_def_semantic_diagnostics)]
1003 fn impl_impl_def_semantic_diagnostics(
1004 &self,
1005 impl_impl_def_id: ImplImplDefId,
1006 ) -> Diagnostics<SemanticDiagnostic>;
1007 #[salsa::invoke(items::imp::impl_impl_def_resolver_data)]
1009 fn impl_impl_def_resolver_data(
1010 &self,
1011 impl_impl_def_id: ImplImplDefId,
1012 ) -> Maybe<Arc<ResolverData>>;
1013 #[salsa::invoke(items::imp::impl_impl_def_trait_impl)]
1015 fn impl_impl_def_trait_impl(&self, impl_impl_def_id: ImplImplDefId) -> Maybe<TraitImplId>;
1016
1017 #[salsa::invoke(items::imp::impl_impl_def_impl)]
1019 #[salsa::cycle(items::imp::impl_impl_def_impl_cycle)]
1020 fn impl_impl_def_impl(&self, impl_impl_def_id: ImplImplDefId, in_cycle: bool) -> Maybe<ImplId>;
1021
1022 #[salsa::invoke(items::imp::priv_impl_impl_semantic_data)]
1024 #[salsa::cycle(items::imp::priv_impl_impl_semantic_data_cycle)]
1025 fn priv_impl_impl_semantic_data(
1026 &self,
1027 impl_impl_def_id: ImplImplDefId,
1028 in_cycle: bool,
1029 ) -> Maybe<items::imp::ImplItemImplData>;
1030
1031 #[salsa::invoke(items::imp::priv_impl_impl_def_generic_params_data)]
1033 fn priv_impl_impl_def_generic_params_data(
1034 &self,
1035 impl_impl_def_id: ImplImplDefId,
1036 ) -> Maybe<GenericParamsData>;
1037
1038 #[salsa::invoke(items::imp::implicit_impl_impl_semantic_diagnostics)]
1040 fn implicit_impl_impl_semantic_diagnostics(
1041 &self,
1042 impl_def_id: ImplDefId,
1043 trait_impl_id: TraitImplId,
1044 ) -> Diagnostics<SemanticDiagnostic>;
1045
1046 #[salsa::invoke(items::imp::implicit_impl_impl_impl)]
1048 #[salsa::cycle(items::imp::implicit_impl_impl_impl_cycle)]
1049 fn implicit_impl_impl_impl(
1050 &self,
1051 impl_def_id: ImplDefId,
1052 trait_impl_id: TraitImplId,
1053 in_cycle: bool,
1054 ) -> Maybe<ImplId>;
1055 #[salsa::invoke(items::imp::priv_implicit_impl_impl_semantic_data)]
1057 #[salsa::cycle(items::imp::priv_implicit_impl_impl_semantic_data_cycle)]
1058 fn priv_implicit_impl_impl_semantic_data(
1059 &self,
1060 impl_def_id: ImplDefId,
1061 trait_impl_id: TraitImplId,
1062 in_cycle: bool,
1063 ) -> Maybe<ImplicitImplImplData>;
1064
1065 #[salsa::invoke(items::imp::impl_impl_implized_by_context)]
1069 #[salsa::cycle(items::imp::impl_impl_implized_by_context_cycle)]
1070 fn impl_impl_implized_by_context(
1071 &self,
1072 impl_impl_id: ImplImplId,
1073 impl_def_id: ImplDefId,
1074 in_cycle: bool,
1075 ) -> Maybe<ImplId>;
1076 #[salsa::invoke(items::imp::impl_impl_concrete_implized)]
1078 #[salsa::cycle(items::imp::impl_impl_concrete_implized_cycle)]
1079 fn impl_impl_concrete_implized(&self, impl_impl_id: ImplImplId) -> Maybe<ImplId>;
1080 #[salsa::invoke(items::imp::impl_impl_concrete_trait)]
1082 fn impl_impl_concrete_trait(&self, impl_impl_id: ImplImplId) -> Maybe<ConcreteTraitId>;
1083
1084 #[salsa::invoke(items::imp::impl_function_declaration_diagnostics)]
1088 fn impl_function_declaration_diagnostics(
1089 &self,
1090 impl_function_id: ImplFunctionId,
1091 ) -> Diagnostics<SemanticDiagnostic>;
1092 #[salsa::invoke(items::imp::impl_function_signature)]
1094 fn impl_function_signature(
1095 &self,
1096 impl_function_id: ImplFunctionId,
1097 ) -> Maybe<semantic::Signature>;
1098 #[salsa::invoke(items::imp::impl_function_generic_params)]
1100 fn impl_function_generic_params(
1101 &self,
1102 impl_function_id: ImplFunctionId,
1103 ) -> Maybe<Vec<GenericParam>>;
1104 #[salsa::invoke(items::imp::priv_impl_function_generic_params_data)]
1106 fn priv_impl_function_generic_params_data(
1107 &self,
1108 impl_function_id: ImplFunctionId,
1109 ) -> Maybe<GenericParamsData>;
1110 #[salsa::invoke(items::imp::impl_function_attributes)]
1112 fn impl_function_attributes(&self, impl_function_id: ImplFunctionId) -> Maybe<Vec<Attribute>>;
1113 #[salsa::invoke(items::imp::impl_function_resolver_data)]
1115 fn impl_function_resolver_data(
1116 &self,
1117 impl_function_id: ImplFunctionId,
1118 ) -> Maybe<Arc<ResolverData>>;
1119 #[salsa::invoke(items::imp::impl_function_declaration_inline_config)]
1121 fn impl_function_declaration_inline_config(
1122 &self,
1123 impl_function_id: ImplFunctionId,
1124 ) -> Maybe<InlineConfiguration>;
1125 #[salsa::invoke(items::imp::impl_function_declaration_implicit_precedence)]
1127 fn impl_function_declaration_implicit_precedence(
1128 &self,
1129 impl_function_id: ImplFunctionId,
1130 ) -> Maybe<ImplicitPrecedence>;
1131 #[salsa::invoke(items::imp::impl_function_declaration_implicits)]
1133 fn impl_function_declaration_implicits(
1134 &self,
1135 impl_function_id: ImplFunctionId,
1136 ) -> Maybe<Vec<TypeId>>;
1137 #[salsa::invoke(items::imp::impl_function_trait_function)]
1139 fn impl_function_trait_function(
1140 &self,
1141 impl_function_id: ImplFunctionId,
1142 ) -> Maybe<TraitFunctionId>;
1143 #[salsa::invoke(items::imp::priv_impl_function_declaration_data)]
1145 fn priv_impl_function_declaration_data(
1146 &self,
1147 impl_function_id: ImplFunctionId,
1148 ) -> Maybe<items::imp::ImplFunctionDeclarationData>;
1149
1150 #[salsa::invoke(items::imp::impl_function_body_diagnostics)]
1152 fn impl_function_body_diagnostics(
1153 &self,
1154 impl_function_id: ImplFunctionId,
1155 ) -> Diagnostics<SemanticDiagnostic>;
1156 #[salsa::invoke(items::imp::impl_function_body)]
1158 fn impl_function_body(&self, impl_function_id: ImplFunctionId) -> Maybe<Arc<FunctionBody>>;
1159 #[salsa::invoke(items::imp::impl_function_body_resolver_data)]
1161 fn impl_function_body_resolver_data(
1162 &self,
1163 impl_function_id: ImplFunctionId,
1164 ) -> Maybe<Arc<ResolverData>>;
1165 #[salsa::invoke(items::imp::priv_impl_function_body_data)]
1167 fn priv_impl_function_body_data(
1168 &self,
1169 impl_function_id: ImplFunctionId,
1170 ) -> Maybe<items::function_with_body::FunctionBodyData>;
1171
1172 #[salsa::invoke(items::implization::trait_type_implized_by_context)]
1178 #[salsa::cycle(items::implization::trait_type_implized_by_context_cycle)]
1179 fn trait_type_implized_by_context(
1180 &self,
1181 trait_type_def_id: TraitTypeId,
1182 impl_def_id: ImplDefId,
1183 ) -> Maybe<TypeId>;
1184
1185 #[salsa::invoke(items::free_function::free_function_declaration_diagnostics)]
1189 fn free_function_declaration_diagnostics(
1190 &self,
1191 free_function_id: FreeFunctionId,
1192 ) -> Diagnostics<SemanticDiagnostic>;
1193 #[salsa::invoke(items::free_function::free_function_signature)]
1195 fn free_function_signature(
1196 &self,
1197 free_function_id: FreeFunctionId,
1198 ) -> Maybe<semantic::Signature>;
1199 #[salsa::invoke(items::free_function::free_function_declaration_implicits)]
1201 fn free_function_declaration_implicits(
1202 &self,
1203 free_function_id: FreeFunctionId,
1204 ) -> Maybe<Vec<TypeId>>;
1205 #[salsa::invoke(items::free_function::free_function_declaration_implicit_precedence)]
1207 fn free_function_declaration_implicit_precedence(
1208 &self,
1209 free_function_id: FreeFunctionId,
1210 ) -> Maybe<ImplicitPrecedence>;
1211 #[salsa::invoke(items::free_function::free_function_generic_params)]
1213 fn free_function_generic_params(
1214 &self,
1215 free_function_id: FreeFunctionId,
1216 ) -> Maybe<Vec<GenericParam>>;
1217 #[salsa::invoke(items::free_function::free_function_generic_params_data)]
1219 fn free_function_generic_params_data(
1220 &self,
1221 free_function_id: FreeFunctionId,
1222 ) -> Maybe<GenericParamsData>;
1223 #[salsa::invoke(items::free_function::free_function_declaration_resolver_data)]
1225 fn free_function_declaration_resolver_data(
1226 &self,
1227 free_function_id: FreeFunctionId,
1228 ) -> Maybe<Arc<ResolverData>>;
1229 #[salsa::invoke(items::free_function::free_function_declaration_inline_config)]
1231 fn free_function_declaration_inline_config(
1232 &self,
1233 free_function_id: FreeFunctionId,
1234 ) -> Maybe<InlineConfiguration>;
1235 #[salsa::invoke(items::free_function::priv_free_function_declaration_data)]
1238 fn priv_free_function_declaration_data(
1239 &self,
1240 function_id: FreeFunctionId,
1241 ) -> Maybe<items::functions::FunctionDeclarationData>;
1242
1243 #[salsa::invoke(items::free_function::free_function_body_diagnostics)]
1245 fn free_function_body_diagnostics(
1246 &self,
1247 free_function_id: FreeFunctionId,
1248 ) -> Diagnostics<SemanticDiagnostic>;
1249 #[salsa::invoke(items::free_function::free_function_body_resolver_data)]
1251 fn free_function_body_resolver_data(
1252 &self,
1253 free_function_id: FreeFunctionId,
1254 ) -> Maybe<Arc<ResolverData>>;
1255 #[salsa::invoke(items::free_function::priv_free_function_body_data)]
1257 fn priv_free_function_body_data(
1258 &self,
1259 free_function_id: FreeFunctionId,
1260 ) -> Maybe<items::function_with_body::FunctionBodyData>;
1261
1262 #[salsa::invoke(items::function_with_body::function_declaration_diagnostics)]
1266 fn function_declaration_diagnostics(
1267 &self,
1268 function_id: FunctionWithBodyId,
1269 ) -> Diagnostics<SemanticDiagnostic>;
1270 #[salsa::invoke(items::function_with_body::function_declaration_inline_config)]
1272 fn function_declaration_inline_config(
1273 &self,
1274 function_id: FunctionWithBodyId,
1275 ) -> Maybe<InlineConfiguration>;
1276 #[salsa::invoke(items::function_with_body::function_declaration_implicit_precedence)]
1278 fn function_declaration_implicit_precedence(
1279 &self,
1280 function_id: FunctionWithBodyId,
1281 ) -> Maybe<ImplicitPrecedence>;
1282 #[salsa::invoke(items::function_with_body::function_with_body_signature)]
1284 fn function_with_body_signature(
1285 &self,
1286 function_id: FunctionWithBodyId,
1287 ) -> Maybe<semantic::Signature>;
1288 #[salsa::invoke(items::function_with_body::function_with_body_generic_params)]
1290 fn function_with_body_generic_params(
1291 &self,
1292 function_id: FunctionWithBodyId,
1293 ) -> Maybe<Vec<GenericParam>>;
1294 #[salsa::invoke(items::function_with_body::function_with_body_attributes)]
1296 fn function_with_body_attributes(
1297 &self,
1298 function_id: FunctionWithBodyId,
1299 ) -> Maybe<Vec<Attribute>>;
1300
1301 #[salsa::invoke(items::function_with_body::function_body_diagnostics)]
1303 fn function_body_diagnostics(
1304 &self,
1305 function_id: FunctionWithBodyId,
1306 ) -> Diagnostics<SemanticDiagnostic>;
1307 #[salsa::invoke(items::function_with_body::function_body_expr)]
1309 fn function_body_expr(&self, function_id: FunctionWithBodyId) -> Maybe<semantic::ExprId>;
1310 #[salsa::invoke(items::function_with_body::function_body)]
1312 fn function_body(&self, function_id: FunctionWithBodyId) -> Maybe<Arc<FunctionBody>>;
1313
1314 #[salsa::invoke(items::extern_function::priv_extern_function_declaration_data)]
1319 fn priv_extern_function_declaration_data(
1320 &self,
1321 function_id: ExternFunctionId,
1322 ) -> Maybe<items::functions::FunctionDeclarationData>;
1323 #[salsa::invoke(items::extern_function::extern_function_declaration_inline_config)]
1325 fn extern_function_declaration_inline_config(
1326 &self,
1327 extern_function_id: ExternFunctionId,
1328 ) -> Maybe<InlineConfiguration>;
1329 #[salsa::invoke(items::extern_function::extern_function_declaration_diagnostics)]
1332 fn extern_function_declaration_diagnostics(
1333 &self,
1334 extern_function_id: ExternFunctionId,
1335 ) -> Diagnostics<SemanticDiagnostic>;
1336 #[salsa::invoke(items::extern_function::extern_function_signature)]
1338 fn extern_function_signature(
1339 &self,
1340 extern_function_id: ExternFunctionId,
1341 ) -> Maybe<semantic::Signature>;
1342 #[salsa::invoke(items::extern_function::extern_function_declaration_generic_params)]
1344 fn extern_function_declaration_generic_params(
1345 &self,
1346 extern_function_id: ExternFunctionId,
1347 ) -> Maybe<Vec<GenericParam>>;
1348 #[salsa::invoke(items::extern_function::extern_function_declaration_generic_params_data)]
1350 fn extern_function_declaration_generic_params_data(
1351 &self,
1352 extern_function_id: ExternFunctionId,
1353 ) -> Maybe<GenericParamsData>;
1354 #[salsa::invoke(items::extern_function::extern_function_declaration_implicits)]
1356 fn extern_function_declaration_implicits(
1357 &self,
1358 extern_function_id: ExternFunctionId,
1359 ) -> Maybe<Vec<TypeId>>;
1360 #[salsa::invoke(items::extern_function::extern_function_declaration_refs)]
1362 fn extern_function_declaration_refs(
1363 &self,
1364 extern_function_id: ExternFunctionId,
1365 ) -> Maybe<Vec<Parameter>>;
1366 #[salsa::invoke(items::extern_function::extern_function_declaration_resolver_data)]
1368 fn extern_function_declaration_resolver_data(
1369 &self,
1370 extern_function_id: ExternFunctionId,
1371 ) -> Maybe<Arc<ResolverData>>;
1372
1373 #[salsa::invoke(items::extern_type::priv_extern_type_declaration_data)]
1378 fn priv_extern_type_declaration_data(
1379 &self,
1380 type_id: ExternTypeId,
1381 ) -> Maybe<items::extern_type::ExternTypeDeclarationData>;
1382 #[salsa::invoke(items::extern_type::extern_type_declaration_diagnostics)]
1385 fn extern_type_declaration_diagnostics(
1386 &self,
1387 extern_type_id: ExternTypeId,
1388 ) -> Diagnostics<SemanticDiagnostic>;
1389 #[salsa::invoke(items::extern_type::extern_type_declaration_generic_params)]
1391 fn extern_type_declaration_generic_params(
1392 &self,
1393 extern_type_id: ExternTypeId,
1394 ) -> Maybe<Vec<GenericParam>>;
1395 #[salsa::invoke(items::extern_type::extern_type_declaration_generic_params_data)]
1397 fn extern_type_declaration_generic_params_data(
1398 &self,
1399 extern_type_id: ExternTypeId,
1400 ) -> Maybe<GenericParamsData>;
1401
1402 #[salsa::invoke(items::extern_type::extern_type_attributes)]
1404 fn extern_type_attributes(&self, extern_type_id: ExternTypeId) -> Maybe<Vec<Attribute>>;
1405
1406 #[salsa::invoke(items::functions::function_title_signature)]
1411 fn function_title_signature(
1412 &self,
1413 function_title_id: FunctionTitleId,
1414 ) -> Maybe<semantic::Signature>;
1415
1416 #[salsa::invoke(items::functions::function_title_generic_params)]
1419 fn function_title_generic_params(
1420 &self,
1421 function_title_id: FunctionTitleId,
1422 ) -> Maybe<Vec<GenericParam>>;
1423
1424 #[salsa::invoke(items::functions::concrete_function_signature)]
1429 fn concrete_function_signature(&self, function_id: FunctionId) -> Maybe<semantic::Signature>;
1430
1431 #[salsa::invoke(types::generic_type_generic_params)]
1435 fn generic_type_generic_params(&self, generic_type: GenericTypeId) -> Maybe<Vec<GenericParam>>;
1436
1437 #[salsa::invoke(items::generics::generic_param_semantic)]
1441 fn generic_param_semantic(&self, generic_param: GenericParamId) -> Maybe<GenericParam>;
1442 #[salsa::invoke(items::generics::generic_param_diagnostics)]
1444 fn generic_param_diagnostics(
1445 &self,
1446 generic_param: GenericParamId,
1447 ) -> Diagnostics<SemanticDiagnostic>;
1448 #[salsa::invoke(items::generics::generic_param_resolver_data)]
1450 fn generic_param_resolver_data(
1451 &self,
1452 generic_param: GenericParamId,
1453 ) -> Maybe<Arc<ResolverData>>;
1454 #[salsa::invoke(items::generics::generic_impl_param_trait)]
1457 fn generic_impl_param_trait(&self, generic_param_id: GenericParamId) -> Maybe<TraitId>;
1458 #[salsa::invoke(items::generics::priv_generic_param_data)]
1460 #[salsa::cycle(items::generics::priv_generic_param_data_cycle)]
1461 fn priv_generic_param_data(
1462 &self,
1463 generic_param: GenericParamId,
1464 in_cycle: bool,
1465 ) -> Maybe<GenericParamData>;
1466
1467 #[salsa::invoke(items::generics::generic_params_type_constraints)]
1469 fn generic_params_type_constraints(
1470 &self,
1471 generic_params: Vec<GenericParamId>,
1472 ) -> Vec<(TypeId, TypeId)>;
1473
1474 #[salsa::invoke(types::single_value_type)]
1481 fn single_value_type(&self, ty: types::TypeId) -> Maybe<bool>;
1482
1483 #[salsa::invoke(types::type_size_info)]
1485 #[salsa::cycle(types::type_size_info_cycle)]
1486 fn type_size_info(&self, ty: types::TypeId) -> Maybe<TypeSizeInformation>;
1487
1488 #[salsa::invoke(types::type_info)]
1491 fn type_info(
1492 &self,
1493 lookup_context: ImplLookupContext,
1494 ty: types::TypeId,
1495 ) -> Maybe<types::TypeInfo>;
1496
1497 #[salsa::invoke(types::priv_type_is_fully_concrete)]
1499 fn priv_type_is_fully_concrete(&self, ty: types::TypeId) -> bool;
1500
1501 #[salsa::invoke(types::priv_type_is_var_free)]
1503 fn priv_type_is_var_free(&self, ty: types::TypeId) -> bool;
1504
1505 #[salsa::invoke(types::priv_type_short_name)]
1507 fn priv_type_short_name(&self, ty: types::TypeId) -> String;
1508
1509 #[salsa::invoke(items::function_with_body::expr_semantic)]
1513 fn expr_semantic(
1514 &self,
1515 function_id: FunctionWithBodyId,
1516 id: semantic::ExprId,
1517 ) -> semantic::Expr;
1518 #[salsa::invoke(items::function_with_body::pattern_semantic)]
1520 fn pattern_semantic(
1521 &self,
1522 function_id: FunctionWithBodyId,
1523 id: semantic::PatternId,
1524 ) -> semantic::Pattern;
1525 #[salsa::invoke(items::function_with_body::statement_semantic)]
1527 fn statement_semantic(
1528 &self,
1529 function_id: FunctionWithBodyId,
1530 id: semantic::StatementId,
1531 ) -> semantic::Statement;
1532
1533 fn lookup_resolved_generic_item_by_ptr(
1536 &self,
1537 id: LookupItemId,
1538 ptr: ast::TerminalIdentifierPtr,
1539 ) -> Option<ResolvedGenericItem>;
1540 fn lookup_resolved_concrete_item_by_ptr(
1541 &self,
1542 id: LookupItemId,
1543 ptr: ast::TerminalIdentifierPtr,
1544 ) -> Option<ResolvedConcreteItem>;
1545
1546 fn module_semantic_diagnostics(
1550 &self,
1551 module_id: ModuleId,
1552 ) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1553
1554 fn file_semantic_diagnostics(&self, file_id: FileId) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1556
1557 #[salsa::invoke(corelib::core_crate)]
1560 fn core_crate(&self) -> CrateId;
1561 #[salsa::invoke(corelib::core_module)]
1562 fn core_module(&self) -> ModuleId;
1563 #[salsa::invoke(corelib::core_felt252_ty)]
1564 fn core_felt252_ty(&self) -> semantic::TypeId;
1565
1566 #[salsa::input]
1569 fn analyzer_plugins(&self) -> Vec<Arc<dyn AnalyzerPlugin>>;
1570
1571 fn declared_allows(&self) -> Arc<OrderedHashSet<String>>;
1574
1575 #[salsa::invoke(lsp_helpers::methods_in_module)]
1579 fn methods_in_module(
1580 &self,
1581 module_id: ModuleId,
1582 type_filter: lsp_helpers::TypeFilter,
1583 ) -> Arc<[TraitFunctionId]>;
1584 #[salsa::invoke(lsp_helpers::methods_in_crate)]
1586 fn methods_in_crate(
1587 &self,
1588 crate_id: CrateId,
1589 type_filter: lsp_helpers::TypeFilter,
1590 ) -> Arc<[TraitFunctionId]>;
1591 #[salsa::invoke(lsp_helpers::visible_traits_from_module)]
1593 fn visible_traits_from_module(
1594 &self,
1595 module_id: ModuleFileId,
1596 ) -> Option<Arc<OrderedHashMap<TraitId, String>>>;
1597 #[salsa::invoke(lsp_helpers::visible_traits_in_module)]
1601 fn visible_traits_in_module(
1602 &self,
1603 module_id: ModuleId,
1604 user_module_file_id: ModuleFileId,
1605 include_parent: bool,
1606 ) -> Arc<[(TraitId, String)]>;
1607 #[salsa::invoke(lsp_helpers::visible_traits_in_crate)]
1610 fn visible_traits_in_crate(
1611 &self,
1612 crate_id: CrateId,
1613 user_module_file_id: ModuleFileId,
1614 ) -> Arc<[(TraitId, String)]>;
1615}
1616
1617impl<T: Upcast<dyn SemanticGroup + 'static>> Elongate for T {
1618 fn elongate(&self) -> &(dyn SemanticGroup + 'static) {
1619 self.upcast()
1620 }
1621}
1622
1623fn module_semantic_diagnostics(
1624 db: &dyn SemanticGroup,
1625 module_id: ModuleId,
1626) -> Maybe<Diagnostics<SemanticDiagnostic>> {
1627 let mut diagnostics = DiagnosticsBuilder::default();
1628 for (_module_file_id, plugin_diag) in db.module_plugin_diagnostics(module_id)?.iter().cloned() {
1629 diagnostics.add(SemanticDiagnostic::new(
1630 StableLocation::new(plugin_diag.stable_ptr),
1631 SemanticDiagnosticKind::PluginDiagnostic(plugin_diag),
1632 ));
1633 }
1634 let data = db.priv_module_semantic_data(module_id)?;
1635 diagnostics.extend(data.diagnostics.clone());
1636 for item in db.module_items(module_id)?.iter() {
1639 match item {
1640 ModuleItemId::Constant(const_id) => {
1641 diagnostics.extend(db.constant_semantic_diagnostics(*const_id));
1642 }
1643 ModuleItemId::Use(use_id) => {
1645 diagnostics.extend(db.use_semantic_diagnostics(*use_id));
1646 }
1647 ModuleItemId::FreeFunction(free_function) => {
1648 diagnostics.extend(db.free_function_declaration_diagnostics(*free_function));
1649 diagnostics.extend(db.free_function_body_diagnostics(*free_function));
1650 }
1651 ModuleItemId::Struct(struct_id) => {
1652 diagnostics.extend(db.struct_declaration_diagnostics(*struct_id));
1653 diagnostics.extend(db.struct_definition_diagnostics(*struct_id));
1654 }
1655 ModuleItemId::Enum(enum_id) => {
1656 diagnostics.extend(db.enum_definition_diagnostics(*enum_id));
1657 diagnostics.extend(db.enum_declaration_diagnostics(*enum_id));
1658 }
1659 ModuleItemId::Trait(trait_id) => {
1660 diagnostics.extend(db.trait_semantic_declaration_diagnostics(*trait_id));
1661 diagnostics.extend(db.trait_semantic_definition_diagnostics(*trait_id));
1662 }
1663 ModuleItemId::Impl(impl_def_id) => {
1664 diagnostics.extend(db.impl_semantic_declaration_diagnostics(*impl_def_id));
1665 diagnostics.extend(db.impl_semantic_definition_diagnostics(*impl_def_id));
1666 }
1667 ModuleItemId::Submodule(submodule_id) => {
1668 if let Ok(file_id) = db.module_main_file(ModuleId::Submodule(*submodule_id)) {
1670 if db.file_content(file_id).is_none() {
1671 let path = match file_id.lookup_intern(db) {
1675 FileLongId::OnDisk(path) => path.display().to_string(),
1676 FileLongId::Virtual(_) | FileLongId::External(_) => {
1677 panic!("Expected OnDisk file.")
1678 }
1679 };
1680
1681 let stable_location =
1682 StableLocation::new(submodule_id.stable_ptr(db.upcast()).untyped());
1683 diagnostics.add(SemanticDiagnostic::new(
1684 stable_location,
1685 SemanticDiagnosticKind::ModuleFileNotFound(path),
1686 ));
1687 }
1688 }
1689 }
1690 ModuleItemId::ExternType(extern_type) => {
1691 diagnostics.extend(db.extern_type_declaration_diagnostics(*extern_type));
1692 }
1693 ModuleItemId::ExternFunction(extern_function) => {
1694 diagnostics.extend(db.extern_function_declaration_diagnostics(*extern_function));
1695 }
1696 ModuleItemId::TypeAlias(type_alias) => {
1697 diagnostics.extend(db.module_type_alias_semantic_diagnostics(*type_alias));
1698 }
1699 ModuleItemId::ImplAlias(type_alias) => {
1700 diagnostics.extend(db.impl_alias_semantic_diagnostics(*type_alias));
1701 }
1702 }
1703 }
1704 for global_use in db.module_global_uses(module_id)?.keys() {
1705 diagnostics.extend(db.global_use_semantic_diagnostics(*global_use));
1706 }
1707 add_unused_item_diagnostics(db, module_id, &data, &mut diagnostics);
1708 for analyzer_plugin in db.analyzer_plugins().iter() {
1709 for diag in analyzer_plugin.diagnostics(db, module_id) {
1710 diagnostics.add(SemanticDiagnostic::new(
1711 StableLocation::new(diag.stable_ptr),
1712 SemanticDiagnosticKind::PluginDiagnostic(diag),
1713 ));
1714 }
1715 }
1716
1717 Ok(diagnostics.build())
1718}
1719
1720fn declared_allows(db: &dyn SemanticGroup) -> Arc<OrderedHashSet<String>> {
1721 Arc::new(OrderedHashSet::from_iter(
1722 db.analyzer_plugins().into_iter().flat_map(|plugin| plugin.declared_allows()),
1723 ))
1724}
1725
1726fn add_unused_item_diagnostics(
1730 db: &dyn SemanticGroup,
1731 module_id: ModuleId,
1732 data: &ModuleSemanticData,
1733 diagnostics: &mut DiagnosticsBuilder<SemanticDiagnostic>,
1734) {
1735 let Ok(all_used_items) = db.module_all_used_items(module_id) else {
1736 return;
1737 };
1738 for info in data.items.values() {
1739 if info.visibility == Visibility::Public {
1740 continue;
1741 }
1742 if let ModuleItemId::Use(use_id) = info.item_id {
1743 add_unused_import_diagnostics(db, &all_used_items, use_id, diagnostics);
1744 };
1745 }
1746}
1747
1748fn add_unused_import_diagnostics(
1750 db: &dyn SemanticGroup,
1751 all_used_items: &OrderedHashSet<LookupItemId>,
1752 use_id: UseId,
1753 diagnostics: &mut DiagnosticsBuilder<SemanticDiagnostic>,
1754) {
1755 let _iife = (|| {
1756 let item = db.use_resolved_item(use_id).ok()?;
1757 require(!matches!(
1760 item,
1761 ResolvedGenericItem::Impl(_) | ResolvedGenericItem::GenericImplAlias(_)
1762 ))?;
1763 require(!all_used_items.contains(&LookupItemId::ModuleItem(ModuleItemId::Use(use_id))))?;
1764 let resolver_data = db.use_resolver_data(use_id).ok()?;
1765 require(!resolver_data.feature_config.allow_unused_imports)?;
1766 Some(diagnostics.add(SemanticDiagnostic::new(
1767 StableLocation::new(use_id.untyped_stable_ptr(db.upcast())),
1768 SemanticDiagnosticKind::UnusedImport(use_id),
1769 )))
1770 })();
1771}
1772
1773fn file_semantic_diagnostics(
1774 db: &dyn SemanticGroup,
1775 file_id: FileId,
1776) -> Maybe<Diagnostics<SemanticDiagnostic>> {
1777 let mut diagnostics = DiagnosticsBuilder::default();
1778 for module_id in db.file_modules(file_id)?.iter().copied() {
1779 if let Ok(module_diagnostics) = db.module_semantic_diagnostics(module_id) {
1780 diagnostics.extend(module_diagnostics)
1781 }
1782 }
1783 Ok(diagnostics.build())
1784}
1785
1786pub fn lookup_resolved_generic_item_by_ptr(
1787 db: &dyn SemanticGroup,
1788 id: LookupItemId,
1789 ptr: ast::TerminalIdentifierPtr,
1790) -> Option<ResolvedGenericItem> {
1791 get_resolver_data_options(id, db)
1792 .into_iter()
1793 .find_map(|resolver_data| resolver_data.resolved_items.generic.get(&ptr).cloned())
1794}
1795
1796pub fn lookup_resolved_concrete_item_by_ptr(
1797 db: &dyn SemanticGroup,
1798 id: LookupItemId,
1799 ptr: ast::TerminalIdentifierPtr,
1800) -> Option<ResolvedConcreteItem> {
1801 get_resolver_data_options(id, db)
1802 .into_iter()
1803 .find_map(|resolver_data| resolver_data.resolved_items.concrete.get(&ptr).cloned())
1804}
1805
1806pub fn get_resolver_data_options(
1807 id: LookupItemId,
1808 db: &dyn SemanticGroup,
1809) -> Vec<Arc<ResolverData>> {
1810 match id {
1811 LookupItemId::ModuleItem(module_item) => match module_item {
1812 ModuleItemId::Constant(id) => vec![db.constant_resolver_data(id)],
1813 ModuleItemId::Submodule(_) => vec![],
1814 ModuleItemId::Use(id) => vec![db.use_resolver_data(id)],
1815 ModuleItemId::FreeFunction(id) => vec![
1816 db.free_function_declaration_resolver_data(id),
1817 db.free_function_body_resolver_data(id),
1818 ],
1819 ModuleItemId::Struct(id) => vec![
1820 db.struct_declaration_resolver_data(id),
1821 db.struct_definition_resolver_data(id),
1822 ],
1823 ModuleItemId::Enum(id) => {
1824 vec![db.enum_definition_resolver_data(id), db.enum_declaration_resolver_data(id)]
1825 }
1826 ModuleItemId::TypeAlias(id) => vec![db.module_type_alias_resolver_data(id)],
1827 ModuleItemId::ImplAlias(id) => vec![db.impl_alias_resolver_data(id)],
1828 ModuleItemId::Trait(_) => vec![],
1829 ModuleItemId::Impl(id) => vec![db.impl_def_resolver_data(id)],
1830 ModuleItemId::ExternType(_) => vec![],
1831 ModuleItemId::ExternFunction(id) => {
1832 vec![db.extern_function_declaration_resolver_data(id)]
1833 }
1834 },
1835 LookupItemId::TraitItem(id) => match id {
1836 cairo_lang_defs::ids::TraitItemId::Function(id) => {
1837 let mut res = vec![db.trait_function_resolver_data(id)];
1838 if let Ok(Some(body)) = db.priv_trait_function_body_data(id) {
1839 res.push(Ok(body.resolver_data));
1840 }
1841 res
1842 }
1843 cairo_lang_defs::ids::TraitItemId::Type(id) => vec![db.trait_type_resolver_data(id)],
1844 cairo_lang_defs::ids::TraitItemId::Constant(id) => {
1845 vec![db.trait_constant_resolver_data(id)]
1846 }
1847 cairo_lang_defs::ids::TraitItemId::Impl(id) => vec![db.trait_impl_resolver_data(id)],
1848 },
1849 LookupItemId::ImplItem(id) => match id {
1850 cairo_lang_defs::ids::ImplItemId::Function(id) => {
1851 vec![db.impl_function_resolver_data(id), db.impl_function_body_resolver_data(id)]
1852 }
1853 cairo_lang_defs::ids::ImplItemId::Type(id) => vec![db.impl_type_def_resolver_data(id)],
1854 cairo_lang_defs::ids::ImplItemId::Constant(id) => {
1855 vec![db.impl_constant_def_resolver_data(id)]
1856 }
1857 cairo_lang_defs::ids::ImplItemId::Impl(id) => vec![db.impl_impl_def_resolver_data(id)],
1858 },
1859 }
1860 .into_iter()
1861 .flatten()
1862 .collect()
1863}