Skip to main content

mago_codex/
lib.rs

1#![allow(clippy::wildcard_imports)]
2#![allow(clippy::exhaustive_enums)]
3#![allow(clippy::float_arithmetic)]
4#![allow(clippy::pub_use)]
5#![allow(clippy::else_if_without_else)]
6#![allow(clippy::match_wildcard_for_single_variants)]
7
8use mago_database::file::File;
9use mago_span::Span;
10use mago_word::Word;
11use mago_word::concat_word;
12use mago_word::u32_word;
13
14pub mod assertion;
15pub mod consts;
16pub mod context;
17pub mod diff;
18pub mod differ;
19pub mod flags;
20pub mod identifier;
21pub mod issue;
22pub mod metadata;
23pub mod misc;
24pub mod populator;
25pub mod reference;
26pub mod scanner;
27pub mod signature;
28pub mod signature_builder;
29pub mod symbol;
30pub mod ttype;
31pub mod visibility;
32
33mod utils;
34
35/// Builds the synthetic display name for an anonymous construct (closure,
36/// arrow function, or anonymous class).
37///
38/// Format: `{<prefix>:<workspace-relative path>:<line>:<column>}`, where the
39/// line and column are 1-based and computed from the span's start offset.
40/// Matches PHP's own `{closure:...}` stringification.
41#[must_use]
42pub fn build_synthetic_name(prefix: &str, file: &File, span: Span) -> Word {
43    let line = file.line_number(span.start.offset).saturating_add(1);
44    let column = file.column_number(span.start.offset).saturating_add(1);
45
46    concat_word!(b"{", prefix.as_bytes(), b":", file.name.as_ref(), b":", u32_word(line), b":", u32_word(column), b"}",)
47}
48
49#[must_use]
50pub fn get_anonymous_class_name(file: &File, span: Span) -> Word {
51    build_synthetic_name("anonymous-class", file, span)
52}