cairo_lang_semantic/items/
mod.rs

1use 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
41/// Tries to resolve a trait path. Reports a diagnostic if the path doesn't point to a trait.
42fn 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/// A context of a trait or an impl, if in any of those. This is used in the resolver to resolve
61/// "Self::" paths.
62#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, salsa::Update)]
63pub enum TraitOrImplContext<'db> {
64    /// No trait/impl context.
65    None,
66    /// The context is of a trait.
67    Trait(TraitId<'db>),
68    /// The context is of an impl.
69    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}