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::ast::ExprPath;
5use cairo_lang_utils::try_extract_matches;
6
7use crate::db::SemanticGroup;
8use crate::diagnostic::SemanticDiagnosticKind::NotATrait;
9use crate::diagnostic::{NotFoundItemType, SemanticDiagnostics, SemanticDiagnosticsBuilder};
10use crate::resolve::{ResolvedGenericItem, Resolver};
11
12pub mod attribute;
13pub mod constant;
14pub mod enm;
15pub mod extern_function;
16pub mod extern_type;
17pub mod feature_kind;
18pub mod fmt;
19pub mod free_function;
20pub mod function_with_body;
21pub mod functions;
22pub mod generics;
23pub mod imp;
24pub mod impl_alias;
25pub mod implization;
26pub mod modifiers;
27pub mod module;
28pub mod module_type_alias;
29pub mod structure;
30pub mod trt;
31pub mod type_aliases;
32pub mod us;
33pub mod visibility;
34
35#[cfg(test)]
36mod test;
37
38/// Tries to resolve a trait path. Reports a diagnostic if the path doesn't point to a trait.
39fn resolve_trait_path(
40    diagnostics: &mut SemanticDiagnostics,
41    resolver: &mut Resolver<'_>,
42    trait_path_syntax: &ExprPath,
43) -> Maybe<TraitId> {
44    try_extract_matches!(
45        resolver.resolve_generic_path_with_args(
46            diagnostics,
47            trait_path_syntax,
48            NotFoundItemType::Trait,
49            None,
50        )?,
51        ResolvedGenericItem::Trait
52    )
53    .ok_or_else(|| diagnostics.report(trait_path_syntax, NotATrait))
54}
55
56/// A context of a trait or an impl, if in any of those. This is used in the resolver to resolve
57/// "Self::" paths.
58#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
59pub enum TraitOrImplContext {
60    /// No trait/impl context.
61    None,
62    /// The context is of a trait.
63    Trait(TraitId),
64    /// The context is of an impl.
65    Impl(ImplDefId),
66}
67
68impl DebugWithDb<dyn SemanticGroup> for TraitOrImplContext {
69    fn fmt(
70        &self,
71        f: &mut std::fmt::Formatter<'_>,
72        db: &(dyn SemanticGroup + 'static),
73    ) -> std::fmt::Result {
74        match self {
75            TraitOrImplContext::None => write!(f, "None"),
76            TraitOrImplContext::Trait(trait_ctx) => write!(f, "{:?}", trait_ctx.debug(db)),
77            TraitOrImplContext::Impl(impl_ctx) => write!(f, "{:?}", impl_ctx.debug(db)),
78        }
79    }
80}