use crate::ir::ast::StoredDefinition;
use std::sync::LazyLock;
const BUILTIN_SOURCE: &str = r#"
// Complex number operator record (Modelica 3.4+ built-in)
// This is a simplified version - the full version includes operator overloading
operator record Complex "Complex number with overloaded operators"
Real re "Real part of complex number";
Real im "Imaginary part of complex number";
end Complex;
// ModelicaServices stub - provides tool-specific types
// This is a minimal implementation to allow MSL models to compile
package ModelicaServices "ModelicaServices (default implementation)"
package Types "Type definitions"
type SolverMethod = String "Solver method for clocked partitions";
end Types;
end ModelicaServices;
"#;
static BUILTIN_DEFS: LazyLock<Option<StoredDefinition>> =
LazyLock::new(|| crate::compiler::parse_source_simple(BUILTIN_SOURCE, "<builtins>"));
pub fn get_builtin_definitions() -> Option<&'static StoredDefinition> {
BUILTIN_DEFS.as_ref()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builtin_source_parses() {
let defs = get_builtin_definitions();
assert!(defs.is_some(), "Built-in source should parse successfully");
let defs = defs.unwrap();
assert!(
defs.class_list.contains_key("Complex"),
"Should contain Complex type"
);
let complex = &defs.class_list["Complex"];
assert!(
complex.components.contains_key("re"),
"Complex should have 're' component"
);
assert!(
complex.components.contains_key("im"),
"Complex should have 'im' component"
);
assert!(
defs.class_list.contains_key("ModelicaServices"),
"Should contain ModelicaServices package"
);
let modelica_services = &defs.class_list["ModelicaServices"];
assert!(
modelica_services.classes.contains_key("Types"),
"ModelicaServices should have 'Types' nested package"
);
let types_pkg = &modelica_services.classes["Types"];
assert!(
types_pkg.classes.contains_key("SolverMethod"),
"Types should have 'SolverMethod' nested type"
);
}
}