1use std::sync::Arc;
2
3use cairo_lang_defs::db::DefsGroup;
4use cairo_lang_defs::diagnostic_utils::StableLocation;
5use cairo_lang_defs::ids::{
6 ConstantId, EnumId, ExternFunctionId, ExternTypeId, FreeFunctionId, FunctionTitleId,
7 FunctionWithBodyId, GenericParamId, GenericTypeId, GlobalUseId, ImplAliasId, ImplConstantDefId,
8 ImplDefId, ImplFunctionId, ImplImplDefId, ImplItemId, ImplTypeDefId, LanguageElementId,
9 LookupItemId, ModuleFileId, ModuleId, ModuleItemId, ModuleTypeAliasId, StructId,
10 TraitConstantId, TraitFunctionId, TraitId, TraitImplId, TraitItemId, TraitTypeId, UseId,
11 VariantId,
12};
13use cairo_lang_diagnostics::{Diagnostics, DiagnosticsBuilder, Maybe};
14use cairo_lang_filesystem::db::{AsFilesGroupMut, FilesGroup};
15use cairo_lang_filesystem::ids::{CrateId, FileId, FileLongId};
16use cairo_lang_parser::db::ParserGroup;
17use cairo_lang_syntax::attribute::structured::Attribute;
18use cairo_lang_syntax::node::{TypedStablePtr, ast};
19use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
20use cairo_lang_utils::ordered_hash_set::OrderedHashSet;
21use cairo_lang_utils::{LookupIntern, Upcast, require};
22use smol_str::SmolStr;
23
24use crate::diagnostic::SemanticDiagnosticKind;
25use crate::expr::inference::{self, ImplVar, ImplVarId};
26use crate::items::constant::{ConstValueId, Constant, ImplConstantId};
27use crate::items::function_with_body::FunctionBody;
28use crate::items::functions::{ImplicitPrecedence, InlineConfiguration};
29use crate::items::generics::{GenericParam, GenericParamData, GenericParamsData};
30use crate::items::imp::{
31 ImplId, ImplImplId, ImplLookupContext, ImplicitImplImplData, UninferredImpl,
32};
33use crate::items::module::{ModuleItemInfo, ModuleSemanticData};
34use crate::items::trt::{
35 ConcreteTraitGenericFunctionId, ConcreteTraitId, TraitItemConstantData, TraitItemImplData,
36 TraitItemTypeData,
37};
38use crate::items::us::{ImportedModules, SemanticUseEx};
39use crate::items::visibility::Visibility;
40use crate::plugin::AnalyzerPlugin;
41use crate::resolve::{ResolvedConcreteItem, ResolvedGenericItem, ResolverData};
42use crate::substitution::GenericSubstitution;
43use crate::types::{ImplTypeId, TypeSizeInformation};
44use crate::{
45 FunctionId, Parameter, SemanticDiagnostic, TypeId, corelib, items, lsp_helpers, semantic, types,
46};
47
48pub trait Elongate {
51 fn elongate(&self) -> &(dyn SemanticGroup + 'static);
52}
53
54#[salsa::query_group(SemanticDatabase)]
61pub trait SemanticGroup:
62 DefsGroup
63 + Upcast<dyn DefsGroup>
64 + Upcast<dyn ParserGroup>
65 + Upcast<dyn FilesGroup>
66 + AsFilesGroupMut
67 + Elongate
68{
69 #[salsa::interned]
70 fn intern_function(&self, id: items::functions::FunctionLongId) -> semantic::FunctionId;
71 #[salsa::interned]
72 fn intern_concrete_function_with_body(
73 &self,
74 id: items::functions::ConcreteFunctionWithBody,
75 ) -> semantic::ConcreteFunctionWithBodyId;
76 #[salsa::interned]
77 fn intern_concrete_struct(&self, id: types::ConcreteStructLongId) -> types::ConcreteStructId;
78 #[salsa::interned]
79 fn intern_concrete_enum(&self, id: types::ConcreteEnumLongId) -> types::ConcreteEnumId;
80 #[salsa::interned]
81 fn intern_concrete_extern_type(
82 &self,
83 id: types::ConcreteExternTypeLongId,
84 ) -> types::ConcreteExternTypeId;
85 #[salsa::interned]
86 fn intern_concrete_trait(
87 &self,
88 id: items::trt::ConcreteTraitLongId,
89 ) -> items::trt::ConcreteTraitId;
90 #[salsa::interned]
91 fn intern_concrete_trait_function(
92 &self,
93 id: items::trt::ConcreteTraitGenericFunctionLongId,
94 ) -> items::trt::ConcreteTraitGenericFunctionId;
95 #[salsa::interned]
96 fn intern_concrete_trait_type(
97 &self,
98 id: items::trt::ConcreteTraitTypeLongId,
99 ) -> items::trt::ConcreteTraitTypeId;
100 #[salsa::interned]
101 fn intern_concrete_trait_constant(
102 &self,
103 id: items::trt::ConcreteTraitConstantLongId,
104 ) -> items::trt::ConcreteTraitConstantId;
105 #[salsa::interned]
106 fn intern_concrete_impl(
107 &self,
108 id: items::imp::ConcreteImplLongId,
109 ) -> items::imp::ConcreteImplId;
110 #[salsa::interned]
111 fn intern_concrete_trait_impl(
112 &self,
113 id: items::trt::ConcreteTraitImplLongId,
114 ) -> items::trt::ConcreteTraitImplId;
115 #[salsa::interned]
116 fn intern_type(&self, id: types::TypeLongId) -> semantic::TypeId;
117 #[salsa::interned]
118 fn intern_const_value(&self, id: items::constant::ConstValue) -> items::constant::ConstValueId;
119 #[salsa::interned]
120 fn intern_impl(&self, id: items::imp::ImplLongId) -> items::imp::ImplId;
121 #[salsa::interned]
122 fn intern_impl_var(&self, id: ImplVar) -> ImplVarId;
123
124 #[salsa::interned]
125 fn intern_generated_impl(
126 &self,
127 id: items::imp::GeneratedImplLongId,
128 ) -> items::imp::GeneratedImplId;
129
130 #[salsa::interned]
131 fn intern_uninferred_generated_impl(
132 &self,
133 id: items::imp::UninferredGeneratedImplLongId,
134 ) -> items::imp::UninferredGeneratedImplId;
135
136 #[salsa::invoke(items::constant::priv_constant_semantic_data)]
140 #[salsa::cycle(items::constant::priv_constant_semantic_data_cycle)]
141 fn priv_constant_semantic_data(
142 &self,
143 const_id: ConstantId,
144 in_cycle: bool,
145 ) -> Maybe<items::constant::ConstantData>;
146 #[salsa::invoke(items::constant::constant_semantic_diagnostics)]
148 fn constant_semantic_diagnostics(
149 &self,
150 const_id: ConstantId,
151 ) -> Diagnostics<SemanticDiagnostic>;
152 #[salsa::invoke(items::constant::constant_semantic_data)]
154 #[salsa::cycle(items::constant::constant_semantic_data_cycle)]
155 fn constant_semantic_data(&self, use_id: ConstantId) -> Maybe<Constant>;
156 #[salsa::invoke(items::constant::constant_resolver_data)]
157 #[salsa::cycle(items::constant::constant_resolver_data_cycle)]
158 fn constant_resolver_data(&self, use_id: ConstantId) -> Maybe<Arc<ResolverData>>;
159 #[salsa::invoke(items::constant::constant_const_value)]
160 #[salsa::cycle(items::constant::constant_const_value_cycle)]
161 fn constant_const_value(&self, const_id: ConstantId) -> Maybe<ConstValueId>;
162 #[salsa::invoke(items::constant::constant_const_type)]
163 #[salsa::cycle(items::constant::constant_const_type_cycle)]
164 fn constant_const_type(&self, const_id: ConstantId) -> Maybe<TypeId>;
165
166 #[salsa::invoke(items::us::priv_use_semantic_data)]
170 #[salsa::cycle(items::us::priv_use_semantic_data_cycle)]
171 fn priv_use_semantic_data(&self, use_id: UseId) -> Maybe<items::us::UseData>;
172 #[salsa::invoke(items::us::use_semantic_diagnostics)]
174 fn use_semantic_diagnostics(&self, use_id: UseId) -> Diagnostics<SemanticDiagnostic>;
175 #[salsa::invoke(items::us::use_resolver_data)]
176 #[salsa::cycle(items::us::use_resolver_data_cycle)]
177 fn use_resolver_data(&self, use_id: UseId) -> Maybe<Arc<ResolverData>>;
178
179 #[salsa::invoke(items::us::priv_global_use_semantic_data)]
183 #[salsa::cycle(items::us::priv_global_use_semantic_data_cycle)]
184 fn priv_global_use_semantic_data(
185 &self,
186 global_use_id: GlobalUseId,
187 ) -> Maybe<items::us::UseGlobalData>;
188 #[salsa::invoke(items::us::priv_global_use_imported_module)]
190 fn priv_global_use_imported_module(&self, global_use_id: GlobalUseId) -> Maybe<ModuleId>;
191 #[salsa::invoke(items::us::global_use_semantic_diagnostics)]
193 fn global_use_semantic_diagnostics(
194 &self,
195 global_use_id: GlobalUseId,
196 ) -> Diagnostics<SemanticDiagnostic>;
197 #[salsa::invoke(items::us::priv_module_use_star_modules)]
199 fn priv_module_use_star_modules(&self, module_id: ModuleId) -> Arc<ImportedModules>;
200
201 #[salsa::invoke(items::module::priv_module_semantic_data)]
206 fn priv_module_semantic_data(&self, module_id: ModuleId) -> Maybe<Arc<ModuleSemanticData>>;
207
208 #[salsa::invoke(items::module::module_item_by_name)]
211 fn module_item_by_name(
212 &self,
213 module_id: ModuleId,
214 name: SmolStr,
215 ) -> Maybe<Option<ModuleItemId>>;
216
217 #[salsa::invoke(items::module::module_item_info_by_name)]
220 fn module_item_info_by_name(
221 &self,
222 module_id: ModuleId,
223 name: SmolStr,
224 ) -> Maybe<Option<ModuleItemInfo>>;
225
226 #[salsa::invoke(items::module::module_all_used_items)]
228 fn module_all_used_items(
229 &self,
230 module_id: ModuleId,
231 ) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
232
233 #[salsa::invoke(items::module::module_attributes)]
235 fn module_attributes(&self, module_id: ModuleId) -> Maybe<Vec<Attribute>>;
236
237 #[salsa::invoke(items::module::module_usable_trait_ids)]
239 fn module_usable_trait_ids(
240 &self,
241 module_id: ModuleId,
242 ) -> Maybe<Arc<OrderedHashMap<TraitId, LookupItemId>>>;
243
244 #[salsa::invoke(items::structure::priv_struct_declaration_data)]
248 fn priv_struct_declaration_data(
249 &self,
250 struct_id: StructId,
251 ) -> Maybe<items::structure::StructDeclarationData>;
252 #[salsa::invoke(items::structure::struct_declaration_diagnostics)]
254 fn struct_declaration_diagnostics(
255 &self,
256 struct_id: StructId,
257 ) -> Diagnostics<SemanticDiagnostic>;
258 #[salsa::invoke(items::structure::struct_attributes)]
260 fn struct_attributes(&self, struct_id: StructId) -> Maybe<Vec<Attribute>>;
261 #[salsa::invoke(items::structure::struct_generic_params)]
263 fn struct_generic_params(&self, struct_id: StructId) -> Maybe<Vec<GenericParam>>;
264 #[salsa::invoke(items::structure::struct_generic_params_data)]
266 fn struct_generic_params_data(&self, struct_id: StructId) -> Maybe<GenericParamsData>;
267 #[salsa::invoke(items::structure::struct_declaration_resolver_data)]
269 fn struct_declaration_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
270
271 #[salsa::invoke(items::structure::priv_struct_definition_data)]
273 fn priv_struct_definition_data(
274 &self,
275 struct_id: StructId,
276 ) -> Maybe<items::structure::StructDefinitionData>;
277 #[salsa::invoke(items::structure::struct_definition_diagnostics)]
279 fn struct_definition_diagnostics(&self, struct_id: StructId)
280 -> Diagnostics<SemanticDiagnostic>;
281 #[salsa::invoke(items::structure::struct_members)]
283 fn struct_members(
284 &self,
285 struct_id: StructId,
286 ) -> Maybe<Arc<OrderedHashMap<SmolStr, semantic::Member>>>;
287 #[salsa::invoke(items::structure::struct_definition_resolver_data)]
289 fn struct_definition_resolver_data(&self, structure_id: StructId) -> Maybe<Arc<ResolverData>>;
290 #[salsa::invoke(items::structure::concrete_struct_members)]
292 fn concrete_struct_members(
293 &self,
294 concrete_struct_id: types::ConcreteStructId,
295 ) -> Maybe<Arc<OrderedHashMap<SmolStr, semantic::Member>>>;
296
297 #[salsa::invoke(items::enm::priv_enum_declaration_data)]
301 fn priv_enum_declaration_data(&self, enum_id: EnumId)
302 -> Maybe<items::enm::EnumDeclarationData>;
303 #[salsa::invoke(items::enm::enum_declaration_diagnostics)]
305 fn enum_declaration_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
306 #[salsa::invoke(items::enm::enum_generic_params)]
308 fn enum_generic_params(&self, enum_id: EnumId) -> Maybe<Vec<GenericParam>>;
309 #[salsa::invoke(items::enm::enum_generic_params_data)]
311 fn enum_generic_params_data(&self, enum_id: EnumId) -> Maybe<GenericParamsData>;
312 #[salsa::invoke(items::enm::enum_attributes)]
314 fn enum_attributes(&self, enum_id: EnumId) -> Maybe<Vec<Attribute>>;
315 #[salsa::invoke(items::enm::enum_declaration_resolver_data)]
317 fn enum_declaration_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
318
319 #[salsa::invoke(items::enm::priv_enum_definition_data)]
321 fn priv_enum_definition_data(&self, enum_id: EnumId) -> Maybe<items::enm::EnumDefinitionData>;
322 #[salsa::invoke(items::enm::enum_definition_diagnostics)]
324 fn enum_definition_diagnostics(&self, enum_id: EnumId) -> Diagnostics<SemanticDiagnostic>;
325 #[salsa::invoke(items::enm::enum_variants)]
327 fn enum_variants(&self, enum_id: EnumId) -> Maybe<OrderedHashMap<SmolStr, VariantId>>;
328 #[salsa::invoke(items::enm::variant_semantic)]
330 fn variant_semantic(&self, enum_id: EnumId, variant_id: VariantId) -> Maybe<semantic::Variant>;
331 #[salsa::invoke(items::enm::enum_definition_resolver_data)]
333 fn enum_definition_resolver_data(&self, enum_id: EnumId) -> Maybe<Arc<ResolverData>>;
334
335 #[salsa::invoke(items::module_type_alias::module_type_alias_semantic_diagnostics)]
339 fn module_type_alias_semantic_diagnostics(
340 &self,
341 module_type_alias_id: ModuleTypeAliasId,
342 ) -> Diagnostics<SemanticDiagnostic>;
343 #[salsa::invoke(items::module_type_alias::module_type_alias_resolved_type)]
345 #[salsa::cycle(items::module_type_alias::module_type_alias_resolved_type_cycle)]
346 fn module_type_alias_resolved_type(
347 &self,
348 module_type_alias_id: ModuleTypeAliasId,
349 ) -> Maybe<TypeId>;
350 #[salsa::invoke(items::module_type_alias::module_type_alias_generic_params)]
352 fn module_type_alias_generic_params(
353 &self,
354 enum_id: ModuleTypeAliasId,
355 ) -> Maybe<Vec<GenericParam>>;
356 #[salsa::invoke(items::module_type_alias::module_type_alias_resolver_data)]
358 #[salsa::cycle(items::module_type_alias::module_type_alias_resolver_data_cycle)]
359 fn module_type_alias_resolver_data(
360 &self,
361 module_type_alias_id: ModuleTypeAliasId,
362 ) -> Maybe<Arc<ResolverData>>;
363 #[salsa::invoke(items::module_type_alias::priv_module_type_alias_generic_params_data)]
365 fn priv_module_type_alias_generic_params_data(
366 &self,
367 enum_id: ModuleTypeAliasId,
368 ) -> Maybe<GenericParamsData>;
369 #[salsa::invoke(items::module_type_alias::priv_module_type_alias_semantic_data)]
371 #[salsa::cycle(items::module_type_alias::priv_module_type_alias_semantic_data_cycle)]
372 fn priv_module_type_alias_semantic_data(
373 &self,
374 module_type_alias_id: ModuleTypeAliasId,
375 in_cycle: bool,
376 ) -> Maybe<items::module_type_alias::ModuleTypeAliasData>;
377
378 #[salsa::invoke(items::impl_alias::impl_alias_impl_def)]
383 #[salsa::cycle(items::impl_alias::impl_alias_impl_def_cycle)]
384 fn impl_alias_impl_def(&self, impl_alias_id: ImplAliasId) -> Maybe<ImplDefId>;
385 #[salsa::invoke(items::impl_alias::priv_impl_alias_semantic_data)]
387 #[salsa::cycle(items::impl_alias::priv_impl_alias_semantic_data_cycle)]
388 fn priv_impl_alias_semantic_data(
389 &self,
390 impl_alias_id: ImplAliasId,
391 in_cycle: bool,
392 ) -> Maybe<items::impl_alias::ImplAliasData>;
393 #[salsa::invoke(items::impl_alias::impl_alias_semantic_diagnostics)]
395 fn impl_alias_semantic_diagnostics(
396 &self,
397 impl_alias_id: ImplAliasId,
398 ) -> Diagnostics<SemanticDiagnostic>;
399 #[salsa::invoke(items::impl_alias::impl_alias_resolved_impl)]
401 #[salsa::cycle(items::impl_alias::impl_alias_resolved_impl_cycle)]
402 fn impl_alias_resolved_impl(&self, impl_alias_id: ImplAliasId) -> Maybe<ImplId>;
403 #[salsa::invoke(items::impl_alias::impl_alias_generic_params)]
405 fn impl_alias_generic_params(&self, impl_alias_id: ImplAliasId) -> Maybe<Vec<GenericParam>>;
406 #[salsa::invoke(items::impl_alias::impl_alias_generic_params_data)]
408 fn impl_alias_generic_params_data(
409 &self,
410 impl_alias_id: ImplAliasId,
411 ) -> Maybe<GenericParamsData>;
412 #[salsa::invoke(items::impl_alias::impl_alias_resolver_data)]
414 #[salsa::cycle(items::impl_alias::impl_alias_resolver_data_cycle)]
415 fn impl_alias_resolver_data(&self, impl_alias_id: ImplAliasId) -> Maybe<Arc<ResolverData>>;
416 #[salsa::invoke(items::impl_alias::impl_alias_attributes)]
418 fn impl_alias_attributes(&self, impl_def_id: ImplAliasId) -> Maybe<Vec<Attribute>>;
419
420 #[salsa::invoke(items::trt::trait_semantic_declaration_diagnostics)]
424 fn trait_semantic_declaration_diagnostics(
425 &self,
426 trait_id: TraitId,
427 ) -> Diagnostics<SemanticDiagnostic>;
428 #[salsa::invoke(items::trt::trait_generic_params)]
430 #[salsa::cycle(items::trt::trait_generic_params_cycle)]
431 fn trait_generic_params(&self, trait_id: TraitId) -> Maybe<Vec<GenericParam>>;
432 #[salsa::invoke(items::trt::trait_generic_params_data)]
434 #[salsa::cycle(items::trt::trait_generic_params_data_cycle)]
435 fn trait_generic_params_data(
436 &self,
437 trait_id: TraitId,
438 in_cycle: bool,
439 ) -> Maybe<GenericParamsData>;
440 #[salsa::invoke(items::trt::trait_attributes)]
442 fn trait_attributes(&self, trait_id: TraitId) -> Maybe<Vec<Attribute>>;
443 #[salsa::invoke(items::trt::trait_resolver_data)]
445 fn trait_resolver_data(&self, trait_id: TraitId) -> Maybe<Arc<ResolverData>>;
446 #[salsa::invoke(items::trt::priv_trait_declaration_data)]
448 fn priv_trait_declaration_data(
449 &self,
450 trait_id: TraitId,
451 ) -> Maybe<items::trt::TraitDeclarationData>;
452
453 #[salsa::invoke(items::trt::trait_semantic_definition_diagnostics)]
455 fn trait_semantic_definition_diagnostics(
456 &self,
457 trait_id: TraitId,
458 ) -> Diagnostics<SemanticDiagnostic>;
459 #[salsa::invoke(items::trt::trait_required_item_names)]
461 fn trait_required_item_names(&self, trait_id: TraitId) -> Maybe<OrderedHashSet<SmolStr>>;
462 #[salsa::invoke(items::trt::trait_item_by_name)]
464 fn trait_item_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitItemId>>;
465 #[salsa::invoke(items::trt::trait_all_used_items)]
467 fn trait_all_used_items(&self, trait_id: TraitId) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
468 #[salsa::invoke(items::trt::trait_functions)]
470 fn trait_functions(&self, trait_id: TraitId)
471 -> Maybe<OrderedHashMap<SmolStr, TraitFunctionId>>;
472 #[salsa::invoke(items::trt::trait_function_by_name)]
474 fn trait_function_by_name(
475 &self,
476 trait_id: TraitId,
477 name: SmolStr,
478 ) -> Maybe<Option<TraitFunctionId>>;
479 #[salsa::invoke(items::trt::trait_types)]
481 fn trait_types(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitTypeId>>;
482 #[salsa::invoke(items::trt::trait_type_by_name)]
484 fn trait_type_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitTypeId>>;
485
486 #[salsa::invoke(items::trt::trait_constants)]
488 fn trait_constants(&self, trait_id: TraitId)
489 -> Maybe<OrderedHashMap<SmolStr, TraitConstantId>>;
490 #[salsa::invoke(items::trt::trait_constant_by_name)]
492 fn trait_constant_by_name(
493 &self,
494 trait_id: TraitId,
495 name: SmolStr,
496 ) -> Maybe<Option<TraitConstantId>>;
497 #[salsa::invoke(items::trt::trait_impls)]
499 fn trait_impls(&self, trait_id: TraitId) -> Maybe<OrderedHashMap<SmolStr, TraitImplId>>;
500 #[salsa::invoke(items::trt::trait_impl_by_name)]
502 fn trait_impl_by_name(&self, trait_id: TraitId, name: SmolStr) -> Maybe<Option<TraitImplId>>;
503
504 #[salsa::invoke(items::trt::priv_trait_definition_data)]
506 fn priv_trait_definition_data(
507 &self,
508 trait_id: TraitId,
509 ) -> Maybe<items::trt::TraitDefinitionData>;
510
511 #[salsa::invoke(items::trt::trait_type_diagnostics)]
515 fn trait_type_diagnostics(&self, trait_type_id: TraitTypeId)
516 -> Diagnostics<SemanticDiagnostic>;
517 #[salsa::invoke(items::trt::trait_type_generic_params)]
519 fn trait_type_generic_params(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<GenericParam>>;
520 #[salsa::invoke(items::trt::trait_type_attributes)]
522 fn trait_type_attributes(&self, trait_type_id: TraitTypeId) -> Maybe<Vec<Attribute>>;
523 #[salsa::invoke(items::trt::trait_type_resolver_data)]
525 fn trait_type_resolver_data(&self, trait_type_id: TraitTypeId) -> Maybe<Arc<ResolverData>>;
526 #[salsa::invoke(items::trt::priv_trait_type_generic_params_data)]
528 fn priv_trait_type_generic_params_data(
529 &self,
530 trait_type_id: TraitTypeId,
531 ) -> Maybe<GenericParamsData>;
532 #[salsa::invoke(items::trt::priv_trait_type_data)]
534 fn priv_trait_type_data(&self, type_id: TraitTypeId) -> Maybe<TraitItemTypeData>;
535
536 #[salsa::invoke(items::trt::trait_constant_diagnostics)]
540 fn trait_constant_diagnostics(
541 &self,
542 trait_constant: TraitConstantId,
543 ) -> Diagnostics<SemanticDiagnostic>;
544 #[salsa::invoke(items::trt::trait_constant_attributes)]
546 fn trait_constant_attributes(&self, trait_constant: TraitConstantId) -> Maybe<Vec<Attribute>>;
547 #[salsa::invoke(items::trt::trait_constant_type)]
549 fn trait_constant_type(&self, trait_type_id: TraitConstantId) -> Maybe<TypeId>;
550 #[salsa::invoke(items::trt::trait_constant_resolver_data)]
552 fn trait_constant_resolver_data(
553 &self,
554 trait_constant: TraitConstantId,
555 ) -> Maybe<Arc<ResolverData>>;
556 #[salsa::invoke(items::trt::priv_trait_constant_data)]
558 fn priv_trait_constant_data(
559 &self,
560 trait_constant: TraitConstantId,
561 ) -> Maybe<TraitItemConstantData>;
562 #[salsa::invoke(items::trt::concrete_trait_constant_type)]
564 fn concrete_trait_constant_type(
565 &self,
566 concrete_trait_constant_id: items::trt::ConcreteTraitConstantId,
567 ) -> Maybe<TypeId>;
568
569 #[salsa::invoke(items::trt::trait_impl_diagnostics)]
573 fn trait_impl_diagnostics(&self, trait_impl: TraitImplId) -> Diagnostics<SemanticDiagnostic>;
574 #[salsa::invoke(items::trt::trait_impl_attributes)]
576 fn trait_impl_attributes(&self, trait_impl: TraitImplId) -> Maybe<Vec<Attribute>>;
577 #[salsa::invoke(items::trt::trait_impl_concrete_trait)]
579 fn trait_impl_concrete_trait(&self, trait_impl_id: TraitImplId) -> Maybe<ConcreteTraitId>;
580 #[salsa::invoke(items::trt::trait_impl_resolver_data)]
582 fn trait_impl_resolver_data(&self, trait_impl: TraitImplId) -> Maybe<Arc<ResolverData>>;
583 #[salsa::invoke(items::trt::priv_trait_impl_data)]
585 fn priv_trait_impl_data(&self, trait_impl: TraitImplId) -> Maybe<TraitItemImplData>;
586 #[salsa::invoke(items::trt::concrete_trait_impl_concrete_trait)]
588 fn concrete_trait_impl_concrete_trait(
589 &self,
590 concrete_trait_impl_id: items::trt::ConcreteTraitImplId,
591 ) -> Maybe<ConcreteTraitId>;
592
593 #[salsa::invoke(items::trt::trait_function_declaration_diagnostics)]
597 fn trait_function_declaration_diagnostics(
598 &self,
599 trait_function_id: TraitFunctionId,
600 ) -> Diagnostics<SemanticDiagnostic>;
601 #[salsa::invoke(items::trt::trait_function_signature)]
603 fn trait_function_signature(
604 &self,
605 trait_function_id: TraitFunctionId,
606 ) -> Maybe<semantic::Signature>;
607 #[salsa::invoke(items::trt::trait_function_generic_params)]
609 fn trait_function_generic_params(
610 &self,
611 trait_function_id: TraitFunctionId,
612 ) -> Maybe<Vec<GenericParam>>;
613 #[salsa::invoke(items::trt::priv_trait_function_generic_params_data)]
615 fn priv_trait_function_generic_params_data(
616 &self,
617 trait_function_id: TraitFunctionId,
618 ) -> Maybe<GenericParamsData>;
619 #[salsa::invoke(items::trt::trait_function_attributes)]
621 fn trait_function_attributes(
622 &self,
623 trait_function_id: TraitFunctionId,
624 ) -> Maybe<Vec<Attribute>>;
625 #[salsa::invoke(items::trt::trait_function_resolver_data)]
627 fn trait_function_resolver_data(
628 &self,
629 trait_function_id: TraitFunctionId,
630 ) -> Maybe<Arc<ResolverData>>;
631 #[salsa::invoke(items::trt::trait_function_declaration_inline_config)]
633 fn trait_function_declaration_inline_config(
634 &self,
635 trait_function_id: TraitFunctionId,
636 ) -> Maybe<InlineConfiguration>;
637 #[salsa::invoke(items::trt::trait_function_declaration_implicit_precedence)]
639 fn trait_function_declaration_implicit_precedence(
640 &self,
641 trait_function_id: TraitFunctionId,
642 ) -> Maybe<ImplicitPrecedence>;
643 #[salsa::invoke(items::trt::trait_function_declaration_implicits)]
645 fn trait_function_declaration_implicits(
646 &self,
647 trait_function_id: TraitFunctionId,
648 ) -> Maybe<Vec<TypeId>>;
649 #[salsa::invoke(items::trt::priv_trait_function_declaration_data)]
651 fn priv_trait_function_declaration_data(
652 &self,
653 function_id: TraitFunctionId,
654 ) -> Maybe<items::functions::FunctionDeclarationData>;
655
656 #[salsa::invoke(items::trt::trait_function_body_diagnostics)]
658 fn trait_function_body_diagnostics(
659 &self,
660 trait_function_id: TraitFunctionId,
661 ) -> Diagnostics<SemanticDiagnostic>;
662 #[salsa::invoke(items::trt::trait_function_body)]
664 fn trait_function_body(
665 &self,
666 trait_function_id: TraitFunctionId,
667 ) -> Maybe<Option<Arc<FunctionBody>>>;
668 #[salsa::invoke(items::trt::priv_trait_function_body_data)]
670 fn priv_trait_function_body_data(
671 &self,
672 trait_function_id: TraitFunctionId,
673 ) -> Maybe<Option<items::function_with_body::FunctionBodyData>>;
674
675 #[salsa::invoke(items::trt::concrete_trait_function_generic_params)]
679 fn concrete_trait_function_generic_params(
680 &self,
681 concrete_trait_function_id: ConcreteTraitGenericFunctionId,
682 ) -> Maybe<Vec<GenericParam>>;
683 #[salsa::invoke(items::trt::concrete_trait_function_signature)]
685 fn concrete_trait_function_signature(
686 &self,
687 concrete_trait_function_id: ConcreteTraitGenericFunctionId,
688 ) -> Maybe<semantic::Signature>;
689
690 #[salsa::invoke(items::imp::module_impl_ids_for_trait_filter)]
694 #[salsa::cycle(items::imp::module_impl_ids_for_trait_filter_cycle)]
695 fn module_impl_ids_for_trait_filter(
696 &self,
697 module_id: ModuleId,
698 trait_lookup_constraint: items::imp::TraitFilter,
699 ) -> Maybe<Vec<UninferredImpl>>;
700 #[salsa::invoke(items::imp::impl_impl_ids_for_trait_filter)]
701 #[salsa::cycle(items::imp::impl_impl_ids_for_trait_filter_cycle)]
702 fn impl_impl_ids_for_trait_filter(
703 &self,
704 impl_id: ImplId,
705 trait_lookup_constraint: items::imp::TraitFilter,
706 ) -> Maybe<Vec<UninferredImpl>>;
707 #[salsa::invoke(inference::solver::canonic_trait_solutions)]
709 #[salsa::cycle(inference::solver::canonic_trait_solutions_cycle)]
710 fn canonic_trait_solutions(
711 &self,
712 canonical_trait: inference::canonic::CanonicalTrait,
713 lookup_context: ImplLookupContext,
714 ) -> Result<
715 inference::solver::SolutionSet<inference::canonic::CanonicalImpl>,
716 inference::InferenceError,
717 >;
718
719 #[salsa::invoke(items::imp::impl_semantic_declaration_diagnostics)]
723 fn impl_semantic_declaration_diagnostics(
724 &self,
725 impl_def_id: ImplDefId,
726 ) -> Diagnostics<SemanticDiagnostic>;
727 #[salsa::invoke(items::imp::impl_def_generic_params_data)]
729 fn impl_def_generic_params_data(&self, impl_def_id: ImplDefId) -> Maybe<GenericParamsData>;
730 #[salsa::invoke(items::imp::impl_def_generic_params)]
732 fn impl_def_generic_params(&self, impl_def_id: ImplDefId) -> Maybe<Vec<GenericParam>>;
733 #[salsa::invoke(items::imp::impl_def_resolver_data)]
735 #[salsa::cycle(items::imp::impl_def_resolver_data_cycle)]
736 fn impl_def_resolver_data(&self, impl_def_id: ImplDefId) -> Maybe<Arc<ResolverData>>;
737 #[salsa::invoke(items::imp::impl_def_concrete_trait)]
739 #[salsa::cycle(items::imp::impl_def_concrete_trait_cycle)]
740 fn impl_def_concrete_trait(&self, impl_def_id: ImplDefId) -> Maybe<ConcreteTraitId>;
741 #[salsa::invoke(items::imp::impl_def_substitution)]
743 fn impl_def_substitution(&self, impl_def_id: ImplDefId) -> Maybe<Arc<GenericSubstitution>>;
744 #[salsa::invoke(items::imp::impl_def_attributes)]
746 fn impl_def_attributes(&self, impl_def_id: ImplDefId) -> Maybe<Vec<Attribute>>;
747 #[salsa::invoke(items::imp::impl_concrete_trait)]
749 fn impl_concrete_trait(&self, impl_id: ImplId) -> Maybe<ConcreteTraitId>;
750 #[salsa::invoke(items::imp::impl_def_trait)]
753 fn impl_def_trait(&self, impl_def_id: ImplDefId) -> Maybe<TraitId>;
754 #[salsa::invoke(items::imp::priv_impl_declaration_data)]
756 #[salsa::cycle(items::imp::priv_impl_declaration_data_cycle)]
757 fn priv_impl_declaration_data(
758 &self,
759 impl_def_id: ImplDefId,
760 ) -> Maybe<items::imp::ImplDeclarationData>;
761
762 #[salsa::invoke(items::imp::impl_semantic_definition_diagnostics)]
764 fn impl_semantic_definition_diagnostics(
765 &self,
766 impl_def_id: ImplDefId,
767 ) -> Diagnostics<SemanticDiagnostic>;
768 #[salsa::invoke(items::imp::impl_item_by_name)]
770 fn impl_item_by_name(&self, impl_def_id: ImplDefId, name: SmolStr)
771 -> Maybe<Option<ImplItemId>>;
772 #[salsa::invoke(items::imp::impl_implicit_impl_by_name)]
774 fn impl_implicit_impl_by_name(
775 &self,
776 impl_def_id: ImplDefId,
777 name: SmolStr,
778 ) -> Maybe<Option<TraitImplId>>;
779 #[salsa::invoke(items::imp::impl_all_used_items)]
781 fn impl_all_used_items(
782 &self,
783 impl_def_id: ImplDefId,
784 ) -> Maybe<Arc<OrderedHashSet<LookupItemId>>>;
785 #[salsa::invoke(items::imp::impl_types)]
787 fn impl_types(
788 &self,
789 impl_def_id: ImplDefId,
790 ) -> Maybe<Arc<OrderedHashMap<ImplTypeDefId, ast::ItemTypeAlias>>>;
791 #[salsa::invoke(items::imp::impl_type_ids)]
793 fn impl_type_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplTypeDefId]>>;
794 #[salsa::invoke(items::imp::impl_type_by_id)]
796 fn impl_type_by_id(&self, impl_type_id: ImplTypeDefId) -> Maybe<Option<ast::ItemTypeAlias>>;
797 #[salsa::invoke(items::imp::impl_type_by_trait_type)]
799 fn impl_type_by_trait_type(
800 &self,
801 impl_def_id: ImplDefId,
802 trait_type_id: TraitTypeId,
803 ) -> Maybe<ImplTypeDefId>;
804
805 #[salsa::invoke(items::imp::impl_constants)]
807 fn impl_constants(
808 &self,
809 impl_def_id: ImplDefId,
810 ) -> Maybe<Arc<OrderedHashMap<ImplConstantDefId, ast::ItemConstant>>>;
811
812 #[salsa::invoke(items::imp::impl_impls)]
814 fn impl_impls(
815 &self,
816 impl_def_id: ImplDefId,
817 ) -> Maybe<Arc<OrderedHashMap<ImplImplDefId, ast::ItemImplAlias>>>;
818 #[salsa::invoke(items::imp::impl_impl_ids)]
820 fn impl_impl_ids(&self, impl_def_id: ImplDefId) -> Maybe<Arc<[ImplImplDefId]>>;
821 #[salsa::invoke(items::imp::impl_impl_by_id)]
823 fn impl_impl_by_id(&self, impl_impl_id: ImplImplDefId) -> Maybe<Option<ast::ItemImplAlias>>;
824 #[salsa::invoke(items::imp::impl_impl_by_trait_impl)]
826 fn impl_impl_by_trait_impl(
827 &self,
828 impl_def_id: ImplDefId,
829 trait_impl_id: TraitImplId,
830 ) -> Maybe<ImplImplDefId>;
831 #[salsa::invoke(items::imp::is_implicit_impl_impl)]
833 fn is_implicit_impl_impl(
834 &self,
835 impl_def_id: ImplDefId,
836 trait_impl_id: TraitImplId,
837 ) -> Maybe<bool>;
838
839 #[salsa::invoke(items::imp::impl_constant_by_trait_constant)]
841 fn impl_constant_by_trait_constant(
842 &self,
843 impl_def_id: ImplDefId,
844 trait_constant_id: TraitConstantId,
845 ) -> Maybe<ImplConstantDefId>;
846
847 #[salsa::invoke(items::imp::impl_functions)]
849 fn impl_functions(
850 &self,
851 impl_def_id: ImplDefId,
852 ) -> Maybe<OrderedHashMap<SmolStr, ImplFunctionId>>;
853 #[salsa::invoke(items::imp::impl_function_by_trait_function)]
858 fn impl_function_by_trait_function(
859 &self,
860 impl_def_id: ImplDefId,
861 trait_function_id: TraitFunctionId,
862 ) -> Maybe<Option<ImplFunctionId>>;
863 #[salsa::invoke(items::imp::priv_impl_definition_data)]
865 fn priv_impl_definition_data(
866 &self,
867 impl_def_id: ImplDefId,
868 ) -> Maybe<items::imp::ImplDefinitionData>;
869
870 #[salsa::invoke(items::imp::priv_impl_is_fully_concrete)]
872 fn priv_impl_is_fully_concrete(&self, impl_id: ImplId) -> bool;
873
874 #[salsa::invoke(items::imp::priv_impl_is_var_free)]
876 fn priv_impl_is_var_free(&self, impl_id: ImplId) -> bool;
877
878 #[salsa::invoke(items::imp::impl_type_def_semantic_diagnostics)]
882 fn impl_type_def_semantic_diagnostics(
883 &self,
884 impl_type_def_id: ImplTypeDefId,
885 ) -> Diagnostics<SemanticDiagnostic>;
886 #[salsa::invoke(items::imp::impl_type_def_resolved_type)]
888 #[salsa::cycle(items::imp::impl_type_def_resolved_type_cycle)]
889 fn impl_type_def_resolved_type(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<TypeId>;
890 #[salsa::invoke(items::imp::impl_type_def_generic_params)]
892 fn impl_type_def_generic_params(
893 &self,
894 impl_type_def_id: ImplTypeDefId,
895 ) -> Maybe<Vec<GenericParam>>;
896 #[salsa::invoke(items::imp::impl_type_def_attributes)]
898 fn impl_type_def_attributes(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<Vec<Attribute>>;
899 #[salsa::invoke(items::imp::impl_type_def_resolver_data)]
901 fn impl_type_def_resolver_data(
902 &self,
903 impl_type_def_id: ImplTypeDefId,
904 ) -> Maybe<Arc<ResolverData>>;
905 #[salsa::invoke(items::imp::impl_type_def_trait_type)]
907 fn impl_type_def_trait_type(&self, impl_type_def_id: ImplTypeDefId) -> Maybe<TraitTypeId>;
908
909 #[salsa::invoke(items::imp::priv_impl_type_semantic_data)]
911 #[salsa::cycle(items::imp::priv_impl_type_semantic_data_cycle)]
912 fn priv_impl_type_semantic_data(
913 &self,
914 impl_type_def_id: ImplTypeDefId,
915 in_cycle: bool,
916 ) -> Maybe<items::imp::ImplItemTypeData>;
917 #[salsa::invoke(items::imp::priv_impl_type_def_generic_params_data)]
919 fn priv_impl_type_def_generic_params_data(
920 &self,
921 impl_type_def_id: ImplTypeDefId,
922 ) -> Maybe<GenericParamsData>;
923
924 #[salsa::invoke(items::imp::impl_type_concrete_implized)]
930 #[salsa::cycle(items::imp::impl_type_concrete_implized_cycle)]
931 fn impl_type_concrete_implized(&self, impl_type_def_id: ImplTypeId) -> Maybe<TypeId>;
932
933 #[salsa::invoke(items::imp::impl_constant_def_semantic_diagnostics)]
937 fn impl_constant_def_semantic_diagnostics(
938 &self,
939 impl_constant_def_id: ImplConstantDefId,
940 ) -> Diagnostics<SemanticDiagnostic>;
941 #[salsa::invoke(items::imp::impl_constant_def_value)]
943 #[salsa::cycle(items::imp::impl_constant_def_value_cycle)]
944 fn impl_constant_def_value(
945 &self,
946 impl_constant_def_id: ImplConstantDefId,
947 ) -> Maybe<ConstValueId>;
948 #[salsa::invoke(items::imp::impl_constant_def_resolver_data)]
950 fn impl_constant_def_resolver_data(
951 &self,
952 impl_constant_def_id: ImplConstantDefId,
953 ) -> Maybe<Arc<ResolverData>>;
954 #[salsa::invoke(items::imp::impl_constant_def_trait_constant)]
956 fn impl_constant_def_trait_constant(
957 &self,
958 impl_constant_def_id: ImplConstantDefId,
959 ) -> Maybe<TraitConstantId>;
960
961 #[salsa::invoke(items::imp::priv_impl_constant_semantic_data)]
963 #[salsa::cycle(items::imp::priv_impl_constant_semantic_data_cycle)]
964 fn priv_impl_constant_semantic_data(
965 &self,
966 impl_constant_def_id: ImplConstantDefId,
967 in_cycle: bool,
968 ) -> Maybe<items::imp::ImplItemConstantData>;
969
970 #[salsa::invoke(items::imp::impl_constant_implized_by_context)]
974 #[salsa::cycle(items::imp::impl_constant_implized_by_context_cycle)]
975 fn impl_constant_implized_by_context(
976 &self,
977 impl_constant_id: ImplConstantId,
978 impl_def_id: ImplDefId,
979 ) -> Maybe<ConstValueId>;
980 #[salsa::invoke(items::imp::impl_constant_concrete_implized_value)]
983 #[salsa::cycle(items::imp::impl_constant_concrete_implized_value_cycle)]
984 fn impl_constant_concrete_implized_value(
985 &self,
986 impl_constant_id: ImplConstantId,
987 ) -> Maybe<ConstValueId>;
988 #[salsa::invoke(items::imp::impl_constant_concrete_implized_type)]
991 #[salsa::cycle(items::imp::impl_constant_concrete_implized_type_cycle)]
992 fn impl_constant_concrete_implized_type(
993 &self,
994 impl_constant_id: ImplConstantId,
995 ) -> Maybe<TypeId>;
996
997 #[salsa::invoke(items::imp::impl_impl_def_semantic_diagnostics)]
1001 fn impl_impl_def_semantic_diagnostics(
1002 &self,
1003 impl_impl_def_id: ImplImplDefId,
1004 ) -> Diagnostics<SemanticDiagnostic>;
1005 #[salsa::invoke(items::imp::impl_impl_def_resolver_data)]
1007 fn impl_impl_def_resolver_data(
1008 &self,
1009 impl_impl_def_id: ImplImplDefId,
1010 ) -> Maybe<Arc<ResolverData>>;
1011 #[salsa::invoke(items::imp::impl_impl_def_trait_impl)]
1013 fn impl_impl_def_trait_impl(&self, impl_impl_def_id: ImplImplDefId) -> Maybe<TraitImplId>;
1014
1015 #[salsa::invoke(items::imp::impl_impl_def_impl)]
1017 #[salsa::cycle(items::imp::impl_impl_def_impl_cycle)]
1018 fn impl_impl_def_impl(&self, impl_impl_def_id: ImplImplDefId, in_cycle: bool) -> Maybe<ImplId>;
1019
1020 #[salsa::invoke(items::imp::priv_impl_impl_semantic_data)]
1022 #[salsa::cycle(items::imp::priv_impl_impl_semantic_data_cycle)]
1023 fn priv_impl_impl_semantic_data(
1024 &self,
1025 impl_impl_def_id: ImplImplDefId,
1026 in_cycle: bool,
1027 ) -> Maybe<items::imp::ImplItemImplData>;
1028
1029 #[salsa::invoke(items::imp::priv_impl_impl_def_generic_params_data)]
1031 fn priv_impl_impl_def_generic_params_data(
1032 &self,
1033 impl_impl_def_id: ImplImplDefId,
1034 ) -> Maybe<GenericParamsData>;
1035
1036 #[salsa::invoke(items::imp::implicit_impl_impl_semantic_diagnostics)]
1038 fn implicit_impl_impl_semantic_diagnostics(
1039 &self,
1040 impl_def_id: ImplDefId,
1041 trait_impl_id: TraitImplId,
1042 ) -> Diagnostics<SemanticDiagnostic>;
1043
1044 #[salsa::invoke(items::imp::implicit_impl_impl_impl)]
1046 #[salsa::cycle(items::imp::implicit_impl_impl_impl_cycle)]
1047 fn implicit_impl_impl_impl(
1048 &self,
1049 impl_def_id: ImplDefId,
1050 trait_impl_id: TraitImplId,
1051 in_cycle: bool,
1052 ) -> Maybe<ImplId>;
1053 #[salsa::invoke(items::imp::priv_implicit_impl_impl_semantic_data)]
1055 #[salsa::cycle(items::imp::priv_implicit_impl_impl_semantic_data_cycle)]
1056 fn priv_implicit_impl_impl_semantic_data(
1057 &self,
1058 impl_def_id: ImplDefId,
1059 trait_impl_id: TraitImplId,
1060 in_cycle: bool,
1061 ) -> Maybe<ImplicitImplImplData>;
1062
1063 #[salsa::invoke(items::imp::impl_impl_implized_by_context)]
1067 #[salsa::cycle(items::imp::impl_impl_implized_by_context_cycle)]
1068 fn impl_impl_implized_by_context(
1069 &self,
1070 impl_impl_id: ImplImplId,
1071 impl_def_id: ImplDefId,
1072 in_cycle: bool,
1073 ) -> Maybe<ImplId>;
1074 #[salsa::invoke(items::imp::impl_impl_concrete_implized)]
1076 #[salsa::cycle(items::imp::impl_impl_concrete_implized_cycle)]
1077 fn impl_impl_concrete_implized(&self, impl_impl_id: ImplImplId) -> Maybe<ImplId>;
1078 #[salsa::invoke(items::imp::impl_impl_concrete_trait)]
1080 fn impl_impl_concrete_trait(&self, impl_impl_id: ImplImplId) -> Maybe<ConcreteTraitId>;
1081
1082 #[salsa::invoke(items::imp::impl_function_declaration_diagnostics)]
1086 fn impl_function_declaration_diagnostics(
1087 &self,
1088 impl_function_id: ImplFunctionId,
1089 ) -> Diagnostics<SemanticDiagnostic>;
1090 #[salsa::invoke(items::imp::impl_function_signature)]
1092 fn impl_function_signature(
1093 &self,
1094 impl_function_id: ImplFunctionId,
1095 ) -> Maybe<semantic::Signature>;
1096 #[salsa::invoke(items::imp::impl_function_generic_params)]
1098 fn impl_function_generic_params(
1099 &self,
1100 impl_function_id: ImplFunctionId,
1101 ) -> Maybe<Vec<GenericParam>>;
1102 #[salsa::invoke(items::imp::priv_impl_function_generic_params_data)]
1104 fn priv_impl_function_generic_params_data(
1105 &self,
1106 impl_function_id: ImplFunctionId,
1107 ) -> Maybe<GenericParamsData>;
1108 #[salsa::invoke(items::imp::impl_function_attributes)]
1110 fn impl_function_attributes(&self, impl_function_id: ImplFunctionId) -> Maybe<Vec<Attribute>>;
1111 #[salsa::invoke(items::imp::impl_function_resolver_data)]
1113 fn impl_function_resolver_data(
1114 &self,
1115 impl_function_id: ImplFunctionId,
1116 ) -> Maybe<Arc<ResolverData>>;
1117 #[salsa::invoke(items::imp::impl_function_declaration_inline_config)]
1119 fn impl_function_declaration_inline_config(
1120 &self,
1121 impl_function_id: ImplFunctionId,
1122 ) -> Maybe<InlineConfiguration>;
1123 #[salsa::invoke(items::imp::impl_function_declaration_implicit_precedence)]
1125 fn impl_function_declaration_implicit_precedence(
1126 &self,
1127 impl_function_id: ImplFunctionId,
1128 ) -> Maybe<ImplicitPrecedence>;
1129 #[salsa::invoke(items::imp::impl_function_declaration_implicits)]
1131 fn impl_function_declaration_implicits(
1132 &self,
1133 impl_function_id: ImplFunctionId,
1134 ) -> Maybe<Vec<TypeId>>;
1135 #[salsa::invoke(items::imp::impl_function_trait_function)]
1137 fn impl_function_trait_function(
1138 &self,
1139 impl_function_id: ImplFunctionId,
1140 ) -> Maybe<TraitFunctionId>;
1141 #[salsa::invoke(items::imp::priv_impl_function_declaration_data)]
1143 fn priv_impl_function_declaration_data(
1144 &self,
1145 impl_function_id: ImplFunctionId,
1146 ) -> Maybe<items::imp::ImplFunctionDeclarationData>;
1147
1148 #[salsa::invoke(items::imp::impl_function_body_diagnostics)]
1150 fn impl_function_body_diagnostics(
1151 &self,
1152 impl_function_id: ImplFunctionId,
1153 ) -> Diagnostics<SemanticDiagnostic>;
1154 #[salsa::invoke(items::imp::impl_function_body)]
1156 fn impl_function_body(&self, impl_function_id: ImplFunctionId) -> Maybe<Arc<FunctionBody>>;
1157 #[salsa::invoke(items::imp::impl_function_body_resolver_data)]
1159 fn impl_function_body_resolver_data(
1160 &self,
1161 impl_function_id: ImplFunctionId,
1162 ) -> Maybe<Arc<ResolverData>>;
1163 #[salsa::invoke(items::imp::priv_impl_function_body_data)]
1165 fn priv_impl_function_body_data(
1166 &self,
1167 impl_function_id: ImplFunctionId,
1168 ) -> Maybe<items::function_with_body::FunctionBodyData>;
1169
1170 #[salsa::invoke(items::implization::trait_type_implized_by_context)]
1176 #[salsa::cycle(items::implization::trait_type_implized_by_context_cycle)]
1177 fn trait_type_implized_by_context(
1178 &self,
1179 trait_type_def_id: TraitTypeId,
1180 impl_def_id: ImplDefId,
1181 ) -> Maybe<TypeId>;
1182
1183 #[salsa::invoke(items::free_function::free_function_declaration_diagnostics)]
1187 fn free_function_declaration_diagnostics(
1188 &self,
1189 free_function_id: FreeFunctionId,
1190 ) -> Diagnostics<SemanticDiagnostic>;
1191 #[salsa::invoke(items::free_function::free_function_signature)]
1193 fn free_function_signature(
1194 &self,
1195 free_function_id: FreeFunctionId,
1196 ) -> Maybe<semantic::Signature>;
1197 #[salsa::invoke(items::free_function::free_function_declaration_implicits)]
1199 fn free_function_declaration_implicits(
1200 &self,
1201 free_function_id: FreeFunctionId,
1202 ) -> Maybe<Vec<TypeId>>;
1203 #[salsa::invoke(items::free_function::free_function_declaration_implicit_precedence)]
1205 fn free_function_declaration_implicit_precedence(
1206 &self,
1207 free_function_id: FreeFunctionId,
1208 ) -> Maybe<ImplicitPrecedence>;
1209 #[salsa::invoke(items::free_function::free_function_generic_params)]
1211 fn free_function_generic_params(
1212 &self,
1213 free_function_id: FreeFunctionId,
1214 ) -> Maybe<Vec<GenericParam>>;
1215 #[salsa::invoke(items::free_function::free_function_generic_params_data)]
1217 fn free_function_generic_params_data(
1218 &self,
1219 free_function_id: FreeFunctionId,
1220 ) -> Maybe<GenericParamsData>;
1221 #[salsa::invoke(items::free_function::free_function_declaration_resolver_data)]
1223 fn free_function_declaration_resolver_data(
1224 &self,
1225 free_function_id: FreeFunctionId,
1226 ) -> Maybe<Arc<ResolverData>>;
1227 #[salsa::invoke(items::free_function::free_function_declaration_inline_config)]
1229 fn free_function_declaration_inline_config(
1230 &self,
1231 free_function_id: FreeFunctionId,
1232 ) -> Maybe<InlineConfiguration>;
1233 #[salsa::invoke(items::free_function::priv_free_function_declaration_data)]
1236 fn priv_free_function_declaration_data(
1237 &self,
1238 function_id: FreeFunctionId,
1239 ) -> Maybe<items::functions::FunctionDeclarationData>;
1240
1241 #[salsa::invoke(items::free_function::free_function_body_diagnostics)]
1243 fn free_function_body_diagnostics(
1244 &self,
1245 free_function_id: FreeFunctionId,
1246 ) -> Diagnostics<SemanticDiagnostic>;
1247 #[salsa::invoke(items::free_function::free_function_body_resolver_data)]
1249 fn free_function_body_resolver_data(
1250 &self,
1251 free_function_id: FreeFunctionId,
1252 ) -> Maybe<Arc<ResolverData>>;
1253 #[salsa::invoke(items::free_function::priv_free_function_body_data)]
1255 fn priv_free_function_body_data(
1256 &self,
1257 free_function_id: FreeFunctionId,
1258 ) -> Maybe<items::function_with_body::FunctionBodyData>;
1259
1260 #[salsa::invoke(items::function_with_body::function_declaration_diagnostics)]
1264 fn function_declaration_diagnostics(
1265 &self,
1266 function_id: FunctionWithBodyId,
1267 ) -> Diagnostics<SemanticDiagnostic>;
1268 #[salsa::invoke(items::function_with_body::function_declaration_inline_config)]
1270 fn function_declaration_inline_config(
1271 &self,
1272 function_id: FunctionWithBodyId,
1273 ) -> Maybe<InlineConfiguration>;
1274 #[salsa::invoke(items::function_with_body::function_declaration_implicit_precedence)]
1276 fn function_declaration_implicit_precedence(
1277 &self,
1278 function_id: FunctionWithBodyId,
1279 ) -> Maybe<ImplicitPrecedence>;
1280 #[salsa::invoke(items::function_with_body::function_with_body_signature)]
1282 fn function_with_body_signature(
1283 &self,
1284 function_id: FunctionWithBodyId,
1285 ) -> Maybe<semantic::Signature>;
1286 #[salsa::invoke(items::function_with_body::function_with_body_generic_params)]
1288 fn function_with_body_generic_params(
1289 &self,
1290 function_id: FunctionWithBodyId,
1291 ) -> Maybe<Vec<GenericParam>>;
1292 #[salsa::invoke(items::function_with_body::function_with_body_attributes)]
1294 fn function_with_body_attributes(
1295 &self,
1296 function_id: FunctionWithBodyId,
1297 ) -> Maybe<Vec<Attribute>>;
1298
1299 #[salsa::invoke(items::function_with_body::function_body_diagnostics)]
1301 fn function_body_diagnostics(
1302 &self,
1303 function_id: FunctionWithBodyId,
1304 ) -> Diagnostics<SemanticDiagnostic>;
1305 #[salsa::invoke(items::function_with_body::function_body_expr)]
1307 fn function_body_expr(&self, function_id: FunctionWithBodyId) -> Maybe<semantic::ExprId>;
1308 #[salsa::invoke(items::function_with_body::function_body)]
1310 fn function_body(&self, function_id: FunctionWithBodyId) -> Maybe<Arc<FunctionBody>>;
1311
1312 #[salsa::invoke(items::extern_function::priv_extern_function_declaration_data)]
1317 fn priv_extern_function_declaration_data(
1318 &self,
1319 function_id: ExternFunctionId,
1320 ) -> Maybe<items::functions::FunctionDeclarationData>;
1321 #[salsa::invoke(items::extern_function::extern_function_declaration_inline_config)]
1323 fn extern_function_declaration_inline_config(
1324 &self,
1325 extern_function_id: ExternFunctionId,
1326 ) -> Maybe<InlineConfiguration>;
1327 #[salsa::invoke(items::extern_function::extern_function_declaration_diagnostics)]
1330 fn extern_function_declaration_diagnostics(
1331 &self,
1332 extern_function_id: ExternFunctionId,
1333 ) -> Diagnostics<SemanticDiagnostic>;
1334 #[salsa::invoke(items::extern_function::extern_function_signature)]
1336 fn extern_function_signature(
1337 &self,
1338 extern_function_id: ExternFunctionId,
1339 ) -> Maybe<semantic::Signature>;
1340 #[salsa::invoke(items::extern_function::extern_function_declaration_generic_params)]
1342 fn extern_function_declaration_generic_params(
1343 &self,
1344 extern_function_id: ExternFunctionId,
1345 ) -> Maybe<Vec<GenericParam>>;
1346 #[salsa::invoke(items::extern_function::extern_function_declaration_generic_params_data)]
1348 fn extern_function_declaration_generic_params_data(
1349 &self,
1350 extern_function_id: ExternFunctionId,
1351 ) -> Maybe<GenericParamsData>;
1352 #[salsa::invoke(items::extern_function::extern_function_declaration_implicits)]
1354 fn extern_function_declaration_implicits(
1355 &self,
1356 extern_function_id: ExternFunctionId,
1357 ) -> Maybe<Vec<TypeId>>;
1358 #[salsa::invoke(items::extern_function::extern_function_declaration_refs)]
1360 fn extern_function_declaration_refs(
1361 &self,
1362 extern_function_id: ExternFunctionId,
1363 ) -> Maybe<Vec<Parameter>>;
1364 #[salsa::invoke(items::extern_function::extern_function_declaration_resolver_data)]
1366 fn extern_function_declaration_resolver_data(
1367 &self,
1368 extern_function_id: ExternFunctionId,
1369 ) -> Maybe<Arc<ResolverData>>;
1370
1371 #[salsa::invoke(items::extern_type::priv_extern_type_declaration_data)]
1376 fn priv_extern_type_declaration_data(
1377 &self,
1378 type_id: ExternTypeId,
1379 ) -> Maybe<items::extern_type::ExternTypeDeclarationData>;
1380 #[salsa::invoke(items::extern_type::extern_type_declaration_diagnostics)]
1383 fn extern_type_declaration_diagnostics(
1384 &self,
1385 extern_type_id: ExternTypeId,
1386 ) -> Diagnostics<SemanticDiagnostic>;
1387 #[salsa::invoke(items::extern_type::extern_type_declaration_generic_params)]
1389 fn extern_type_declaration_generic_params(
1390 &self,
1391 extern_type_id: ExternTypeId,
1392 ) -> Maybe<Vec<GenericParam>>;
1393 #[salsa::invoke(items::extern_type::extern_type_declaration_generic_params_data)]
1395 fn extern_type_declaration_generic_params_data(
1396 &self,
1397 extern_type_id: ExternTypeId,
1398 ) -> Maybe<GenericParamsData>;
1399
1400 #[salsa::invoke(items::extern_type::extern_type_attributes)]
1402 fn extern_type_attributes(&self, extern_type_id: ExternTypeId) -> Maybe<Vec<Attribute>>;
1403
1404 #[salsa::invoke(items::functions::function_title_signature)]
1409 fn function_title_signature(
1410 &self,
1411 function_title_id: FunctionTitleId,
1412 ) -> Maybe<semantic::Signature>;
1413
1414 #[salsa::invoke(items::functions::function_title_generic_params)]
1417 fn function_title_generic_params(
1418 &self,
1419 function_title_id: FunctionTitleId,
1420 ) -> Maybe<Vec<GenericParam>>;
1421
1422 #[salsa::invoke(items::functions::concrete_function_signature)]
1427 fn concrete_function_signature(&self, function_id: FunctionId) -> Maybe<semantic::Signature>;
1428
1429 #[salsa::invoke(types::generic_type_generic_params)]
1433 fn generic_type_generic_params(&self, generic_type: GenericTypeId) -> Maybe<Vec<GenericParam>>;
1434
1435 #[salsa::invoke(items::generics::generic_param_semantic)]
1439 fn generic_param_semantic(&self, generic_param: GenericParamId) -> Maybe<GenericParam>;
1440 #[salsa::invoke(items::generics::generic_param_diagnostics)]
1442 fn generic_param_diagnostics(
1443 &self,
1444 generic_param: GenericParamId,
1445 ) -> Diagnostics<SemanticDiagnostic>;
1446 #[salsa::invoke(items::generics::generic_param_resolver_data)]
1448 fn generic_param_resolver_data(
1449 &self,
1450 generic_param: GenericParamId,
1451 ) -> Maybe<Arc<ResolverData>>;
1452 #[salsa::invoke(items::generics::generic_impl_param_trait)]
1455 fn generic_impl_param_trait(&self, generic_param_id: GenericParamId) -> Maybe<TraitId>;
1456 #[salsa::invoke(items::generics::priv_generic_param_data)]
1458 #[salsa::cycle(items::generics::priv_generic_param_data_cycle)]
1459 fn priv_generic_param_data(
1460 &self,
1461 generic_param: GenericParamId,
1462 in_cycle: bool,
1463 ) -> Maybe<GenericParamData>;
1464
1465 #[salsa::invoke(types::single_value_type)]
1472 fn single_value_type(&self, ty: types::TypeId) -> Maybe<bool>;
1473
1474 #[salsa::invoke(types::type_size_info)]
1476 #[salsa::cycle(types::type_size_info_cycle)]
1477 fn type_size_info(&self, ty: types::TypeId) -> Maybe<TypeSizeInformation>;
1478
1479 #[salsa::invoke(types::type_info)]
1482 fn type_info(
1483 &self,
1484 lookup_context: ImplLookupContext,
1485 ty: types::TypeId,
1486 ) -> Maybe<types::TypeInfo>;
1487
1488 #[salsa::invoke(types::priv_type_is_fully_concrete)]
1490 fn priv_type_is_fully_concrete(&self, ty: types::TypeId) -> bool;
1491
1492 #[salsa::invoke(types::priv_type_is_var_free)]
1494 fn priv_type_is_var_free(&self, ty: types::TypeId) -> bool;
1495
1496 #[salsa::invoke(types::priv_type_short_name)]
1498 fn priv_type_short_name(&self, ty: types::TypeId) -> String;
1499
1500 #[salsa::invoke(items::function_with_body::expr_semantic)]
1504 fn expr_semantic(
1505 &self,
1506 function_id: FunctionWithBodyId,
1507 id: semantic::ExprId,
1508 ) -> semantic::Expr;
1509 #[salsa::invoke(items::function_with_body::pattern_semantic)]
1511 fn pattern_semantic(
1512 &self,
1513 function_id: FunctionWithBodyId,
1514 id: semantic::PatternId,
1515 ) -> semantic::Pattern;
1516 #[salsa::invoke(items::function_with_body::statement_semantic)]
1518 fn statement_semantic(
1519 &self,
1520 function_id: FunctionWithBodyId,
1521 id: semantic::StatementId,
1522 ) -> semantic::Statement;
1523
1524 fn lookup_resolved_generic_item_by_ptr(
1527 &self,
1528 id: LookupItemId,
1529 ptr: ast::TerminalIdentifierPtr,
1530 ) -> Option<ResolvedGenericItem>;
1531 fn lookup_resolved_concrete_item_by_ptr(
1532 &self,
1533 id: LookupItemId,
1534 ptr: ast::TerminalIdentifierPtr,
1535 ) -> Option<ResolvedConcreteItem>;
1536
1537 fn module_semantic_diagnostics(
1541 &self,
1542 module_id: ModuleId,
1543 ) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1544
1545 fn file_semantic_diagnostics(&self, file_id: FileId) -> Maybe<Diagnostics<SemanticDiagnostic>>;
1547
1548 #[salsa::invoke(corelib::core_crate)]
1551 fn core_crate(&self) -> CrateId;
1552 #[salsa::invoke(corelib::core_module)]
1553 fn core_module(&self) -> ModuleId;
1554 #[salsa::invoke(corelib::core_felt252_ty)]
1555 fn core_felt252_ty(&self) -> semantic::TypeId;
1556
1557 #[salsa::input]
1560 fn analyzer_plugins(&self) -> Vec<Arc<dyn AnalyzerPlugin>>;
1561
1562 fn declared_allows(&self) -> Arc<OrderedHashSet<String>>;
1565
1566 #[salsa::invoke(lsp_helpers::methods_in_module)]
1570 fn methods_in_module(
1571 &self,
1572 module_id: ModuleId,
1573 type_filter: lsp_helpers::TypeFilter,
1574 ) -> Arc<[TraitFunctionId]>;
1575 #[salsa::invoke(lsp_helpers::methods_in_crate)]
1577 fn methods_in_crate(
1578 &self,
1579 crate_id: CrateId,
1580 type_filter: lsp_helpers::TypeFilter,
1581 ) -> Arc<[TraitFunctionId]>;
1582 #[salsa::invoke(lsp_helpers::visible_traits_from_module)]
1584 fn visible_traits_from_module(
1585 &self,
1586 module_id: ModuleFileId,
1587 ) -> Option<Arc<OrderedHashMap<TraitId, String>>>;
1588 #[salsa::invoke(lsp_helpers::visible_traits_in_module)]
1592 fn visible_traits_in_module(
1593 &self,
1594 module_id: ModuleId,
1595 user_module_file_id: ModuleFileId,
1596 include_parent: bool,
1597 ) -> Arc<[(TraitId, String)]>;
1598 #[salsa::invoke(lsp_helpers::visible_traits_in_crate)]
1601 fn visible_traits_in_crate(
1602 &self,
1603 crate_id: CrateId,
1604 user_module_file_id: ModuleFileId,
1605 ) -> Arc<[(TraitId, String)]>;
1606}
1607
1608impl<T: Upcast<dyn SemanticGroup + 'static>> Elongate for T {
1609 fn elongate(&self) -> &(dyn SemanticGroup + 'static) {
1610 self.upcast()
1611 }
1612}
1613
1614fn module_semantic_diagnostics(
1615 db: &dyn SemanticGroup,
1616 module_id: ModuleId,
1617) -> Maybe<Diagnostics<SemanticDiagnostic>> {
1618 let mut diagnostics = DiagnosticsBuilder::default();
1619 for (_module_file_id, plugin_diag) in db.module_plugin_diagnostics(module_id)?.iter().cloned() {
1620 diagnostics.add(SemanticDiagnostic::new(
1621 StableLocation::new(plugin_diag.stable_ptr),
1622 SemanticDiagnosticKind::PluginDiagnostic(plugin_diag),
1623 ));
1624 }
1625 let data = db.priv_module_semantic_data(module_id)?;
1626 diagnostics.extend(data.diagnostics.clone());
1627 for item in db.module_items(module_id)?.iter() {
1630 match item {
1631 ModuleItemId::Constant(const_id) => {
1632 diagnostics.extend(db.constant_semantic_diagnostics(*const_id));
1633 }
1634 ModuleItemId::Use(use_id) => {
1636 diagnostics.extend(db.use_semantic_diagnostics(*use_id));
1637 }
1638 ModuleItemId::FreeFunction(free_function) => {
1639 diagnostics.extend(db.free_function_declaration_diagnostics(*free_function));
1640 diagnostics.extend(db.free_function_body_diagnostics(*free_function));
1641 }
1642 ModuleItemId::Struct(struct_id) => {
1643 diagnostics.extend(db.struct_declaration_diagnostics(*struct_id));
1644 diagnostics.extend(db.struct_definition_diagnostics(*struct_id));
1645 }
1646 ModuleItemId::Enum(enum_id) => {
1647 diagnostics.extend(db.enum_definition_diagnostics(*enum_id));
1648 diagnostics.extend(db.enum_declaration_diagnostics(*enum_id));
1649 }
1650 ModuleItemId::Trait(trait_id) => {
1651 diagnostics.extend(db.trait_semantic_declaration_diagnostics(*trait_id));
1652 diagnostics.extend(db.trait_semantic_definition_diagnostics(*trait_id));
1653 }
1654 ModuleItemId::Impl(impl_def_id) => {
1655 diagnostics.extend(db.impl_semantic_declaration_diagnostics(*impl_def_id));
1656 diagnostics.extend(db.impl_semantic_definition_diagnostics(*impl_def_id));
1657 }
1658 ModuleItemId::Submodule(submodule_id) => {
1659 if let Ok(file_id) = db.module_main_file(ModuleId::Submodule(*submodule_id)) {
1661 if db.file_content(file_id).is_none() {
1662 let path = match file_id.lookup_intern(db) {
1666 FileLongId::OnDisk(path) => path.display().to_string(),
1667 FileLongId::Virtual(_) | FileLongId::External(_) => {
1668 panic!("Expected OnDisk file.")
1669 }
1670 };
1671
1672 let stable_location =
1673 StableLocation::new(submodule_id.stable_ptr(db.upcast()).untyped());
1674 diagnostics.add(SemanticDiagnostic::new(
1675 stable_location,
1676 SemanticDiagnosticKind::ModuleFileNotFound(path),
1677 ));
1678 }
1679 }
1680 }
1681 ModuleItemId::ExternType(extern_type) => {
1682 diagnostics.extend(db.extern_type_declaration_diagnostics(*extern_type));
1683 }
1684 ModuleItemId::ExternFunction(extern_function) => {
1685 diagnostics.extend(db.extern_function_declaration_diagnostics(*extern_function));
1686 }
1687 ModuleItemId::TypeAlias(type_alias) => {
1688 diagnostics.extend(db.module_type_alias_semantic_diagnostics(*type_alias));
1689 }
1690 ModuleItemId::ImplAlias(type_alias) => {
1691 diagnostics.extend(db.impl_alias_semantic_diagnostics(*type_alias));
1692 }
1693 }
1694 }
1695 for global_use in db.module_global_uses(module_id)?.keys() {
1696 diagnostics.extend(db.global_use_semantic_diagnostics(*global_use));
1697 }
1698 add_unused_item_diagnostics(db, module_id, &data, &mut diagnostics);
1699 for analyzer_plugin in db.analyzer_plugins().iter() {
1700 for diag in analyzer_plugin.diagnostics(db, module_id) {
1701 diagnostics.add(SemanticDiagnostic::new(
1702 StableLocation::new(diag.stable_ptr),
1703 SemanticDiagnosticKind::PluginDiagnostic(diag),
1704 ));
1705 }
1706 }
1707
1708 Ok(diagnostics.build())
1709}
1710
1711fn declared_allows(db: &dyn SemanticGroup) -> Arc<OrderedHashSet<String>> {
1712 Arc::new(OrderedHashSet::from_iter(
1713 db.analyzer_plugins().into_iter().flat_map(|plugin| plugin.declared_allows()),
1714 ))
1715}
1716
1717fn add_unused_item_diagnostics(
1721 db: &dyn SemanticGroup,
1722 module_id: ModuleId,
1723 data: &ModuleSemanticData,
1724 diagnostics: &mut DiagnosticsBuilder<SemanticDiagnostic>,
1725) {
1726 let Ok(all_used_items) = db.module_all_used_items(module_id) else {
1727 return;
1728 };
1729 for info in data.items.values() {
1730 if info.visibility == Visibility::Public {
1731 continue;
1732 }
1733 if let ModuleItemId::Use(use_id) = info.item_id {
1734 add_unused_import_diagnostics(db, &all_used_items, use_id, diagnostics);
1735 };
1736 }
1737}
1738
1739fn add_unused_import_diagnostics(
1741 db: &dyn SemanticGroup,
1742 all_used_items: &OrderedHashSet<LookupItemId>,
1743 use_id: UseId,
1744 diagnostics: &mut DiagnosticsBuilder<SemanticDiagnostic>,
1745) {
1746 let _iife = (|| {
1747 let item = db.use_resolved_item(use_id).ok()?;
1748 require(!matches!(
1751 item,
1752 ResolvedGenericItem::Impl(_) | ResolvedGenericItem::GenericImplAlias(_)
1753 ))?;
1754 require(!all_used_items.contains(&LookupItemId::ModuleItem(ModuleItemId::Use(use_id))))?;
1755 let resolver_data = db.use_resolver_data(use_id).ok()?;
1756 require(!resolver_data.feature_config.allow_unused_imports)?;
1757 Some(diagnostics.add(SemanticDiagnostic::new(
1758 StableLocation::new(use_id.untyped_stable_ptr(db.upcast())),
1759 SemanticDiagnosticKind::UnusedImport(use_id),
1760 )))
1761 })();
1762}
1763
1764fn file_semantic_diagnostics(
1765 db: &dyn SemanticGroup,
1766 file_id: FileId,
1767) -> Maybe<Diagnostics<SemanticDiagnostic>> {
1768 let mut diagnostics = DiagnosticsBuilder::default();
1769 for module_id in db.file_modules(file_id)?.iter().copied() {
1770 if let Ok(module_diagnostics) = db.module_semantic_diagnostics(module_id) {
1771 diagnostics.extend(module_diagnostics)
1772 }
1773 }
1774 Ok(diagnostics.build())
1775}
1776
1777pub fn lookup_resolved_generic_item_by_ptr(
1778 db: &dyn SemanticGroup,
1779 id: LookupItemId,
1780 ptr: ast::TerminalIdentifierPtr,
1781) -> Option<ResolvedGenericItem> {
1782 get_resolver_data_options(id, db)
1783 .into_iter()
1784 .find_map(|resolver_data| resolver_data.resolved_items.generic.get(&ptr).cloned())
1785}
1786
1787pub fn lookup_resolved_concrete_item_by_ptr(
1788 db: &dyn SemanticGroup,
1789 id: LookupItemId,
1790 ptr: ast::TerminalIdentifierPtr,
1791) -> Option<ResolvedConcreteItem> {
1792 get_resolver_data_options(id, db)
1793 .into_iter()
1794 .find_map(|resolver_data| resolver_data.resolved_items.concrete.get(&ptr).cloned())
1795}
1796
1797pub fn get_resolver_data_options(
1798 id: LookupItemId,
1799 db: &dyn SemanticGroup,
1800) -> Vec<Arc<ResolverData>> {
1801 match id {
1802 LookupItemId::ModuleItem(module_item) => match module_item {
1803 ModuleItemId::Constant(id) => vec![db.constant_resolver_data(id)],
1804 ModuleItemId::Submodule(_) => vec![],
1805 ModuleItemId::Use(id) => vec![db.use_resolver_data(id)],
1806 ModuleItemId::FreeFunction(id) => vec![
1807 db.free_function_declaration_resolver_data(id),
1808 db.free_function_body_resolver_data(id),
1809 ],
1810 ModuleItemId::Struct(id) => vec![
1811 db.struct_declaration_resolver_data(id),
1812 db.struct_definition_resolver_data(id),
1813 ],
1814 ModuleItemId::Enum(id) => {
1815 vec![db.enum_definition_resolver_data(id), db.enum_declaration_resolver_data(id)]
1816 }
1817 ModuleItemId::TypeAlias(id) => vec![db.module_type_alias_resolver_data(id)],
1818 ModuleItemId::ImplAlias(id) => vec![db.impl_alias_resolver_data(id)],
1819 ModuleItemId::Trait(_) => vec![],
1820 ModuleItemId::Impl(id) => vec![db.impl_def_resolver_data(id)],
1821 ModuleItemId::ExternType(_) => vec![],
1822 ModuleItemId::ExternFunction(id) => {
1823 vec![db.extern_function_declaration_resolver_data(id)]
1824 }
1825 },
1826 LookupItemId::TraitItem(id) => match id {
1827 cairo_lang_defs::ids::TraitItemId::Function(id) => {
1828 let mut res = vec![db.trait_function_resolver_data(id)];
1829 if let Ok(Some(body)) = db.priv_trait_function_body_data(id) {
1830 res.push(Ok(body.resolver_data));
1831 }
1832 res
1833 }
1834 cairo_lang_defs::ids::TraitItemId::Type(id) => vec![db.trait_type_resolver_data(id)],
1835 cairo_lang_defs::ids::TraitItemId::Constant(id) => {
1836 vec![db.trait_constant_resolver_data(id)]
1837 }
1838 cairo_lang_defs::ids::TraitItemId::Impl(id) => vec![db.trait_impl_resolver_data(id)],
1839 },
1840 LookupItemId::ImplItem(id) => match id {
1841 cairo_lang_defs::ids::ImplItemId::Function(id) => {
1842 vec![db.impl_function_resolver_data(id), db.impl_function_body_resolver_data(id)]
1843 }
1844 cairo_lang_defs::ids::ImplItemId::Type(id) => vec![db.impl_type_def_resolver_data(id)],
1845 cairo_lang_defs::ids::ImplItemId::Constant(id) => {
1846 vec![db.impl_constant_def_resolver_data(id)]
1847 }
1848 cairo_lang_defs::ids::ImplItemId::Impl(id) => vec![db.impl_impl_def_resolver_data(id)],
1849 },
1850 }
1851 .into_iter()
1852 .flatten()
1853 .collect()
1854}