use std::collections::BTreeMap;
use mago_algebra::assertion_set::Conjunction;
use mago_atom::Atom;
use mago_codex::assertion::Assertion;
use crate::plugin::context::InvocationInfo;
use crate::plugin::context::ProviderContext;
use crate::plugin::provider::Provider;
use crate::plugin::provider::function::FunctionTarget;
use crate::plugin::provider::method::MethodTarget;
#[derive(Debug, Clone, Default)]
pub struct InvocationAssertions {
pub type_assertions: BTreeMap<Atom, Conjunction<Assertion>>,
pub if_true: BTreeMap<Atom, Conjunction<Assertion>>,
pub if_false: BTreeMap<Atom, Conjunction<Assertion>>,
}
impl InvocationAssertions {
#[inline]
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[inline]
#[must_use]
pub fn is_empty(&self) -> bool {
self.type_assertions.is_empty() && self.if_true.is_empty() && self.if_false.is_empty()
}
pub fn add_immediate(&mut self, variable: Atom, assertions: Conjunction<Assertion>) {
self.type_assertions.insert(variable, assertions);
}
pub fn add_if_true(&mut self, variable: Atom, assertions: Conjunction<Assertion>) {
self.if_true.insert(variable, assertions);
}
pub fn add_if_false(&mut self, variable: Atom, assertions: Conjunction<Assertion>) {
self.if_false.insert(variable, assertions);
}
}
pub trait FunctionAssertionProvider: Provider {
fn targets() -> FunctionTarget
where
Self: Sized;
fn get_assertions(
&self,
context: &ProviderContext<'_, '_, '_>,
invocation: &InvocationInfo<'_, '_, '_>,
) -> Option<InvocationAssertions>;
}
pub trait MethodAssertionProvider: Provider {
fn targets() -> &'static [MethodTarget]
where
Self: Sized;
fn get_assertions(
&self,
context: &ProviderContext<'_, '_, '_>,
class_name: &str,
method_name: &str,
invocation: &InvocationInfo<'_, '_, '_>,
) -> Option<InvocationAssertions>;
}