use mago_codex::ttype::atomic::TAtomic;
use mago_codex::ttype::atomic::object::TObject;
use mago_codex::ttype::atomic::object::named::TNamedObject;
use mago_codex::ttype::union::TUnion;
use crate::plugin::context::InvocationInfo;
use crate::plugin::context::ProviderContext;
use crate::plugin::provider::Provider;
use crate::plugin::provider::ProviderMeta;
use crate::plugin::provider::method::MethodReturnTypeProvider;
use crate::plugin::provider::method::MethodTarget;
static META: ProviderMeta = ProviderMeta::new(
"psr::container::get",
"ContainerInterface::get",
"Returns the object type matching the class-string argument",
);
static TARGETS: [MethodTarget; 1] = [MethodTarget::any_class("get")];
#[derive(Default)]
pub struct ContainerGetProvider;
impl Provider for ContainerGetProvider {
fn meta() -> &'static ProviderMeta {
&META
}
}
impl MethodReturnTypeProvider for ContainerGetProvider {
fn targets() -> &'static [MethodTarget] {
&TARGETS
}
fn get_return_type(
&self,
context: &ProviderContext<'_, '_, '_>,
class_name: &str,
_method_name: &str,
invocation: &InvocationInfo<'_, '_, '_>,
) -> Option<TUnion> {
if !context.is_instance_of(class_name, "Psr\\Container\\ContainerInterface") {
return None;
}
let id_arg = invocation.get_argument(0, &["id"])?;
let id_type = context.get_expression_type(id_arg)?;
let service_class = id_type.get_single_class_string_value()?;
Some(TUnion::from_atomic(TAtomic::Object(TObject::Named(TNamedObject::new(service_class)))))
}
}