Skip to main content

mago_analyzer/plugin/libraries/stdlib/string/
strlen.rs

1//! `strlen()` return type provider.
2
3use mago_codex::ttype::get_literal_int;
4use mago_codex::ttype::union::TUnion;
5
6use crate::plugin::context::InvocationInfo;
7use crate::plugin::context::ProviderContext;
8use crate::plugin::provider::Provider;
9use crate::plugin::provider::ProviderMeta;
10use crate::plugin::provider::function::FunctionReturnTypeProvider;
11use crate::plugin::provider::function::FunctionTarget;
12
13static META: ProviderMeta =
14    ProviderMeta::new("php::string::strlen", "strlen", "Returns literal int for literal string");
15
16#[derive(Default)]
17pub struct StrlenProvider;
18
19impl Provider for StrlenProvider {
20    fn meta() -> &'static ProviderMeta {
21        &META
22    }
23}
24
25impl FunctionReturnTypeProvider for StrlenProvider {
26    fn targets() -> FunctionTarget {
27        FunctionTarget::Exact("strlen")
28    }
29
30    fn get_return_type(
31        &self,
32        context: &ProviderContext<'_, '_, '_>,
33        invocation: &InvocationInfo<'_, '_, '_>,
34    ) -> Option<TUnion> {
35        let string_argument = invocation.get_argument(0, &["string"])?;
36        let string_argument_type = context.get_expression_type(string_argument)?;
37        let string_literal = string_argument_type.get_single_literal_string_value()?;
38
39        Some(get_literal_int(string_literal.len() as i64))
40    }
41}