cairo_lang_semantic/items/
mod.rs1use cairo_lang_debug::DebugWithDb;
2use cairo_lang_defs::ids::{ImplDefId, TraitId};
3use cairo_lang_diagnostics::Maybe;
4use cairo_lang_syntax::node::TypedSyntaxNode;
5use cairo_lang_syntax::node::ast::ExprPath;
6use cairo_lang_utils::try_extract_matches;
7use salsa::Database;
8
9use crate::diagnostic::SemanticDiagnosticKind::NotATrait;
10use crate::diagnostic::{NotFoundItemType, SemanticDiagnostics, SemanticDiagnosticsBuilder};
11use crate::resolve::{ResolutionContext, ResolvedGenericItem, Resolver};
12
13pub mod attribute;
14pub mod constant;
15pub mod enm;
16pub mod extern_function;
17pub mod extern_type;
18pub mod feature_kind;
19pub mod fmt;
20pub mod free_function;
21pub mod function_with_body;
22pub mod functions;
23pub mod generics;
24pub mod imp;
25pub mod impl_alias;
26pub mod implization;
27pub mod macro_call;
28pub mod macro_declaration;
29pub mod modifiers;
30pub mod module;
31pub mod module_type_alias;
32pub mod structure;
33pub mod trt;
34pub mod type_aliases;
35pub mod us;
36pub mod visibility;
37
38#[cfg(test)]
39mod test;
40
41fn resolve_trait_path<'db>(
43 db: &'db dyn Database,
44 diagnostics: &mut SemanticDiagnostics<'db>,
45 resolver: &mut Resolver<'db>,
46 trait_path_syntax: &ExprPath<'db>,
47) -> Maybe<TraitId<'db>> {
48 try_extract_matches!(
49 resolver.resolve_generic_path_with_args(
50 diagnostics,
51 trait_path_syntax,
52 NotFoundItemType::Trait,
53 ResolutionContext::Default,
54 )?,
55 ResolvedGenericItem::Trait
56 )
57 .ok_or_else(|| diagnostics.report(trait_path_syntax.stable_ptr(db), NotATrait))
58}
59
60#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, salsa::Update)]
63pub enum TraitOrImplContext<'db> {
64 None,
66 Trait(TraitId<'db>),
68 Impl(ImplDefId<'db>),
70}
71
72impl<'db> DebugWithDb<'db> for TraitOrImplContext<'db> {
73 type Db = dyn Database;
74
75 fn fmt(&self, f: &mut std::fmt::Formatter<'_>, db: &'db dyn Database) -> std::fmt::Result {
76 match self {
77 TraitOrImplContext::None => write!(f, "None"),
78 TraitOrImplContext::Trait(trait_ctx) => {
79 write!(f, "{:?}", trait_ctx.debug(db))
80 }
81 TraitOrImplContext::Impl(impl_ctx) => write!(f, "{:?}", impl_ctx.debug(db)),
82 }
83 }
84}