/*! * Call Resolution Utilities - Type-safe function call helpers * * ChatGPT5 Pro Design: Stateless helpers for compile-time function resolution * These utilities can be used across different parts of the compiler pipeline */ /// Check if function name is a built-in global function /// These functions are resolved at compile-time to Callee::Global pub fn is_builtin_function(name: &str) -> bool { matches!( name, // Core runtime functions "print" | "error" | "panic" | "exit" | "now" | // Type operation functions "isType" | "asType" | // Math functions (may be expanded) "abs" | "min" | "max" ) } /// Check if function name is an external/host function /// These functions are resolved to Callee::Extern and handled by runtime pub fn is_extern_function(name: &str) -> bool { name.starts_with("nyash.") // Host functions use nyash.* namespace } /// Get suggested resolution for unresolved function names /// Provides helpful error messages for common mistakes pub fn suggest_resolution(name: &str) -> String { match name { "print" | "error" | "panic" | "exit" => { format!("Consider using ::{}() for global function or check if you're in a box with a {} method", name, name) } name if name.starts_with("str") || name.starts_with("string") => { "Consider using StringBox methods or string.* functions".to_string() } name if name.starts_with("array") || name.starts_with("arr") => { "Consider using ArrayBox methods or array.* functions".to_string() } _ => { format!( "Function '{}' not found. Check spelling or add explicit scope qualifier", name ) } } } /// Check if a method name is commonly shadowed by global functions /// Used for generating warnings about potential self-recursion #[allow(dead_code)] pub fn is_commonly_shadowed_method(method: &str) -> bool { matches!( method, "print" | "error" | "log" | "panic" | // Console methods "length" | "size" | "count" | // Container methods "toString" | "valueOf" | // Conversion methods "equals" | "compare" // Comparison methods ) } /// Generate warning message for potential self-recursion #[allow(dead_code)] pub fn generate_self_recursion_warning(box_name: &str, method: &str) -> String { format!( "Warning: Potential self-recursion detected in {}.{}(). \ Consider using ::{}() for global function or {}.{}() for explicit self-call.", box_name, method, method, box_name, method ) } #[cfg(test)] mod tests { use super::*; #[test] fn test_builtin_function_detection() { assert!(is_builtin_function("print")); assert!(is_builtin_function("error")); assert!(is_builtin_function("panic")); assert!(is_builtin_function("isType")); assert!(!is_builtin_function("custom_function")); assert!(!is_builtin_function("nyash.console.log")); } #[test] fn test_extern_function_detection() { assert!(is_extern_function("nyash.console.log")); assert!(is_extern_function("nyash.fs.read")); assert!(!is_extern_function("print")); assert!(!is_extern_function("custom_function")); } #[test] fn test_shadowed_method_detection() { assert!(is_commonly_shadowed_method("print")); assert!(is_commonly_shadowed_method("length")); assert!(is_commonly_shadowed_method("toString")); assert!(!is_commonly_shadowed_method("custom_method")); } #[test] fn test_warning_generation() { let warning = generate_self_recursion_warning("ConsoleStd", "print"); assert!(warning.contains("ConsoleStd.print()")); assert!(warning.contains("::print()")); assert!(warning.contains("self-recursion")); } }