mago_analyzer/plugin/libraries/stdlib/enum/
cases.rs1use mago_codex::ttype::atomic::TAtomic;
4use mago_codex::ttype::atomic::array::TArray;
5use mago_codex::ttype::atomic::array::list::TList;
6use mago_codex::ttype::atomic::object::TObject;
7use mago_codex::ttype::atomic::object::r#enum::TEnum;
8use mago_codex::ttype::union::TUnion;
9
10use crate::plugin::context::InvocationInfo;
11use crate::plugin::context::ProviderContext;
12use crate::plugin::provider::Provider;
13use crate::plugin::provider::ProviderMeta;
14use crate::plugin::provider::method::MethodReturnTypeProvider;
15use crate::plugin::provider::method::MethodTarget;
16
17static META: ProviderMeta =
18 ProviderMeta::new("php::enum::cases", "UnitEnum::cases", "Returns non-empty-list for enums with at least one case");
19
20static TARGETS: [MethodTarget; 1] = [MethodTarget::any_class("cases")];
22
23#[derive(Default)]
28pub struct EnumCasesProvider;
29
30impl Provider for EnumCasesProvider {
31 fn meta() -> &'static ProviderMeta {
32 &META
33 }
34}
35
36impl MethodReturnTypeProvider for EnumCasesProvider {
37 fn targets() -> &'static [MethodTarget] {
38 &TARGETS
39 }
40
41 fn get_return_type(
42 &self,
43 _context: &ProviderContext<'_, '_, '_>,
44 _class_name: &str,
45 _method_name: &str,
46 invocation_info: &InvocationInfo<'_, '_, '_>,
47 ) -> Option<TUnion> {
48 let class_metadata = invocation_info.invocation.target.get_method_context()?.class_like_metadata;
49
50 if !class_metadata.kind.is_enum() {
51 return None;
52 }
53
54 let enum_type = TUnion::from_atomic(TAtomic::Object(TObject::Enum(TEnum {
55 name: class_metadata.original_name,
56 case: None,
57 })));
58
59 if class_metadata.enum_cases.is_empty() {
60 Some(TUnion::from_atomic(TAtomic::Array(TArray::List(TList::new(Box::new(enum_type))))))
61 } else {
62 Some(TUnion::from_atomic(TAtomic::Array(TArray::List(TList::new_non_empty(Box::new(enum_type))))))
63 }
64 }
65}