slovo/compiler/src/std_runtime.rs

796 lines
27 KiB
Rust

use crate::{diag::Diagnostic, token::Span, types::Type};
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum RuntimeType {
I32,
I64,
U32,
U64,
F64,
Bool,
String,
ResultI32I32,
ResultI64I32,
ResultU32I32,
ResultU64I32,
ResultF64I32,
ResultBoolI32,
ResultStringI32,
VecI32,
VecI64,
VecF64,
VecBool,
VecString,
Unit,
}
impl RuntimeType {
pub fn to_type(self) -> Type {
match self {
Self::I32 => Type::I32,
Self::I64 => Type::I64,
Self::U32 => Type::U32,
Self::U64 => Type::U64,
Self::F64 => Type::F64,
Self::Bool => Type::Bool,
Self::String => Type::String,
Self::ResultI32I32 => Type::Result(Box::new(Type::I32), Box::new(Type::I32)),
Self::ResultI64I32 => Type::Result(Box::new(Type::I64), Box::new(Type::I32)),
Self::ResultU32I32 => Type::Result(Box::new(Type::U32), Box::new(Type::I32)),
Self::ResultU64I32 => Type::Result(Box::new(Type::U64), Box::new(Type::I32)),
Self::ResultF64I32 => Type::Result(Box::new(Type::F64), Box::new(Type::I32)),
Self::ResultBoolI32 => Type::Result(Box::new(Type::Bool), Box::new(Type::I32)),
Self::ResultStringI32 => Type::Result(Box::new(Type::String), Box::new(Type::I32)),
Self::VecI32 => Type::Vec(Box::new(Type::I32)),
Self::VecI64 => Type::Vec(Box::new(Type::I64)),
Self::VecF64 => Type::Vec(Box::new(Type::F64)),
Self::VecBool => Type::Vec(Box::new(Type::Bool)),
Self::VecString => Type::Vec(Box::new(Type::String)),
Self::Unit => Type::Unit,
}
}
}
#[derive(Debug, Copy, Clone)]
pub struct RuntimeFunction {
pub source_name: &'static str,
pub runtime_symbol: &'static str,
pub params: &'static [RuntimeType],
pub return_type: RuntimeType,
pub promoted: bool,
}
const I32_PARAM: &[RuntimeType] = &[RuntimeType::I32];
const I64_PARAM: &[RuntimeType] = &[RuntimeType::I64];
const U32_PARAM: &[RuntimeType] = &[RuntimeType::U32];
const U64_PARAM: &[RuntimeType] = &[RuntimeType::U64];
const F64_PARAM: &[RuntimeType] = &[RuntimeType::F64];
const BOOL_PARAM: &[RuntimeType] = &[RuntimeType::Bool];
const STRING_PARAM: &[RuntimeType] = &[RuntimeType::String];
const STRING_STRING_PARAMS: &[RuntimeType] = &[RuntimeType::String, RuntimeType::String];
const I32_STRING_PARAMS: &[RuntimeType] = &[RuntimeType::I32, RuntimeType::String];
const VEC_I32_PARAM: &[RuntimeType] = &[RuntimeType::VecI32];
const VEC_I32_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecI32, RuntimeType::I32];
const VEC_I64_PARAM: &[RuntimeType] = &[RuntimeType::VecI64];
const VEC_I64_I64_PARAMS: &[RuntimeType] = &[RuntimeType::VecI64, RuntimeType::I64];
const VEC_I64_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecI64, RuntimeType::I32];
const VEC_F64_PARAM: &[RuntimeType] = &[RuntimeType::VecF64];
const VEC_F64_F64_PARAMS: &[RuntimeType] = &[RuntimeType::VecF64, RuntimeType::F64];
const VEC_F64_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecF64, RuntimeType::I32];
const VEC_BOOL_PARAM: &[RuntimeType] = &[RuntimeType::VecBool];
const VEC_BOOL_BOOL_PARAMS: &[RuntimeType] = &[RuntimeType::VecBool, RuntimeType::Bool];
const VEC_BOOL_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecBool, RuntimeType::I32];
const VEC_STRING_PARAM: &[RuntimeType] = &[RuntimeType::VecString];
const VEC_STRING_STRING_PARAMS: &[RuntimeType] = &[RuntimeType::VecString, RuntimeType::String];
const VEC_STRING_I32_PARAMS: &[RuntimeType] = &[RuntimeType::VecString, RuntimeType::I32];
pub const FUNCTIONS: &[RuntimeFunction] = &[
RuntimeFunction {
source_name: "print_i32",
runtime_symbol: "print_i32",
params: I32_PARAM,
return_type: RuntimeType::Unit,
promoted: false,
},
RuntimeFunction {
source_name: "print_string",
runtime_symbol: "print_string",
params: STRING_PARAM,
return_type: RuntimeType::Unit,
promoted: false,
},
RuntimeFunction {
source_name: "print_bool",
runtime_symbol: "print_bool",
params: BOOL_PARAM,
return_type: RuntimeType::Unit,
promoted: false,
},
RuntimeFunction {
source_name: "string_len",
runtime_symbol: "string_len",
params: STRING_PARAM,
return_type: RuntimeType::I32,
promoted: false,
},
RuntimeFunction {
source_name: "std.io.print_i32",
runtime_symbol: "print_i32",
params: I32_PARAM,
return_type: RuntimeType::Unit,
promoted: true,
},
RuntimeFunction {
source_name: "std.io.print_f64",
runtime_symbol: "print_f64",
params: F64_PARAM,
return_type: RuntimeType::Unit,
promoted: true,
},
RuntimeFunction {
source_name: "std.io.print_i64",
runtime_symbol: "print_i64",
params: I64_PARAM,
return_type: RuntimeType::Unit,
promoted: true,
},
RuntimeFunction {
source_name: "std.io.print_u32",
runtime_symbol: "print_u32",
params: U32_PARAM,
return_type: RuntimeType::Unit,
promoted: true,
},
RuntimeFunction {
source_name: "std.io.print_u64",
runtime_symbol: "print_u64",
params: U64_PARAM,
return_type: RuntimeType::Unit,
promoted: true,
},
RuntimeFunction {
source_name: "std.io.print_string",
runtime_symbol: "print_string",
params: STRING_PARAM,
return_type: RuntimeType::Unit,
promoted: true,
},
RuntimeFunction {
source_name: "std.io.print_bool",
runtime_symbol: "print_bool",
params: BOOL_PARAM,
return_type: RuntimeType::Unit,
promoted: true,
},
RuntimeFunction {
source_name: "std.string.len",
runtime_symbol: "string_len",
params: STRING_PARAM,
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.string.concat",
runtime_symbol: "__glagol_string_concat",
params: STRING_STRING_PARAMS,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.string.parse_i32_result",
runtime_symbol: "__glagol_string_parse_i32_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.string.parse_i64_result",
runtime_symbol: "__glagol_string_parse_i64_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultI64I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.string.parse_u32_result",
runtime_symbol: "__glagol_string_parse_u32_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultU32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.string.parse_u64_result",
runtime_symbol: "__glagol_string_parse_u64_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultU64I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.string.parse_f64_result",
runtime_symbol: "__glagol_string_parse_f64_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultF64I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.string.parse_bool_result",
runtime_symbol: "__glagol_string_parse_bool_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultBoolI32,
promoted: true,
},
RuntimeFunction {
source_name: "std.json.quote_string",
runtime_symbol: "__glagol_json_quote_string",
params: STRING_PARAM,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.io.eprint",
runtime_symbol: "__glagol_io_eprint",
params: STRING_PARAM,
return_type: RuntimeType::Unit,
promoted: true,
},
RuntimeFunction {
source_name: "std.io.read_stdin_result",
runtime_symbol: "__glagol_io_read_stdin_result",
params: &[],
return_type: RuntimeType::ResultStringI32,
promoted: true,
},
RuntimeFunction {
source_name: "std.process.argc",
runtime_symbol: "__glagol_process_argc",
params: &[],
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.process.arg",
runtime_symbol: "__glagol_process_arg",
params: I32_PARAM,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.process.arg_result",
runtime_symbol: "__glagol_process_arg_result",
params: I32_PARAM,
return_type: RuntimeType::ResultStringI32,
promoted: true,
},
RuntimeFunction {
source_name: "std.env.get",
runtime_symbol: "__glagol_env_get",
params: STRING_PARAM,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.env.get_result",
runtime_symbol: "__glagol_env_get_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultStringI32,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.read_text",
runtime_symbol: "__glagol_fs_read_text",
params: STRING_PARAM,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.read_text_result",
runtime_symbol: "__glagol_fs_read_text_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultStringI32,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.write_text",
runtime_symbol: "__glagol_fs_write_text",
params: STRING_STRING_PARAMS,
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.write_text_result",
runtime_symbol: "__glagol_fs_write_text_result",
params: STRING_STRING_PARAMS,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.exists",
runtime_symbol: "__glagol_fs_exists",
params: STRING_PARAM,
return_type: RuntimeType::Bool,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.is_file",
runtime_symbol: "__glagol_fs_is_file",
params: STRING_PARAM,
return_type: RuntimeType::Bool,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.is_dir",
runtime_symbol: "__glagol_fs_is_dir",
params: STRING_PARAM,
return_type: RuntimeType::Bool,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.remove_file_result",
runtime_symbol: "__glagol_fs_remove_file_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.create_dir_result",
runtime_symbol: "__glagol_fs_create_dir_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.open_text_read_result",
runtime_symbol: "__glagol_fs_open_text_read_result",
params: STRING_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.read_open_text_result",
runtime_symbol: "__glagol_fs_read_open_text_result",
params: I32_PARAM,
return_type: RuntimeType::ResultStringI32,
promoted: true,
},
RuntimeFunction {
source_name: "std.fs.close_result",
runtime_symbol: "__glagol_fs_close_result",
params: I32_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.net.tcp_connect_loopback_result",
runtime_symbol: "__glagol_net_tcp_connect_loopback_result",
params: I32_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.net.tcp_listen_loopback_result",
runtime_symbol: "__glagol_net_tcp_listen_loopback_result",
params: I32_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.net.tcp_bound_port_result",
runtime_symbol: "__glagol_net_tcp_bound_port_result",
params: I32_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.net.tcp_accept_result",
runtime_symbol: "__glagol_net_tcp_accept_result",
params: I32_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.net.tcp_read_all_result",
runtime_symbol: "__glagol_net_tcp_read_all_result",
params: I32_PARAM,
return_type: RuntimeType::ResultStringI32,
promoted: true,
},
RuntimeFunction {
source_name: "std.net.tcp_write_text_result",
runtime_symbol: "__glagol_net_tcp_write_text_result",
params: I32_STRING_PARAMS,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.net.tcp_close_result",
runtime_symbol: "__glagol_net_tcp_close_result",
params: I32_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.i32.empty",
runtime_symbol: "__glagol_vec_i32_empty",
params: &[],
return_type: RuntimeType::VecI32,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.i32.append",
runtime_symbol: "__glagol_vec_i32_append",
params: VEC_I32_I32_PARAMS,
return_type: RuntimeType::VecI32,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.i32.len",
runtime_symbol: "__glagol_vec_i32_len",
params: VEC_I32_PARAM,
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.i32.index",
runtime_symbol: "__glagol_vec_i32_index",
params: VEC_I32_I32_PARAMS,
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.i64.empty",
runtime_symbol: "__glagol_vec_i64_empty",
params: &[],
return_type: RuntimeType::VecI64,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.i64.append",
runtime_symbol: "__glagol_vec_i64_append",
params: VEC_I64_I64_PARAMS,
return_type: RuntimeType::VecI64,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.i64.len",
runtime_symbol: "__glagol_vec_i64_len",
params: VEC_I64_PARAM,
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.i64.index",
runtime_symbol: "__glagol_vec_i64_index",
params: VEC_I64_I32_PARAMS,
return_type: RuntimeType::I64,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.f64.empty",
runtime_symbol: "__glagol_vec_f64_empty",
params: &[],
return_type: RuntimeType::VecF64,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.f64.append",
runtime_symbol: "__glagol_vec_f64_append",
params: VEC_F64_F64_PARAMS,
return_type: RuntimeType::VecF64,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.f64.len",
runtime_symbol: "__glagol_vec_f64_len",
params: VEC_F64_PARAM,
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.f64.index",
runtime_symbol: "__glagol_vec_f64_index",
params: VEC_F64_I32_PARAMS,
return_type: RuntimeType::F64,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.bool.empty",
runtime_symbol: "__glagol_vec_bool_empty",
params: &[],
return_type: RuntimeType::VecBool,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.bool.append",
runtime_symbol: "__glagol_vec_bool_append",
params: VEC_BOOL_BOOL_PARAMS,
return_type: RuntimeType::VecBool,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.bool.len",
runtime_symbol: "__glagol_vec_bool_len",
params: VEC_BOOL_PARAM,
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.bool.index",
runtime_symbol: "__glagol_vec_bool_index",
params: VEC_BOOL_I32_PARAMS,
return_type: RuntimeType::Bool,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.string.empty",
runtime_symbol: "__glagol_vec_string_empty",
params: &[],
return_type: RuntimeType::VecString,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.string.append",
runtime_symbol: "__glagol_vec_string_append",
params: VEC_STRING_STRING_PARAMS,
return_type: RuntimeType::VecString,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.string.len",
runtime_symbol: "__glagol_vec_string_len",
params: VEC_STRING_PARAM,
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.vec.string.index",
runtime_symbol: "__glagol_vec_string_index",
params: VEC_STRING_I32_PARAMS,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.time.monotonic_ms",
runtime_symbol: "__glagol_time_monotonic_ms",
params: &[],
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.time.sleep_ms",
runtime_symbol: "__glagol_time_sleep_ms",
params: I32_PARAM,
return_type: RuntimeType::Unit,
promoted: true,
},
RuntimeFunction {
source_name: "std.random.i32",
runtime_symbol: "__glagol_random_i32",
params: &[],
return_type: RuntimeType::I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.i32_to_i64",
runtime_symbol: "std.num.i32_to_i64",
params: I32_PARAM,
return_type: RuntimeType::I64,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.i32_to_f64",
runtime_symbol: "std.num.i32_to_f64",
params: I32_PARAM,
return_type: RuntimeType::F64,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.i64_to_f64",
runtime_symbol: "std.num.i64_to_f64",
params: I64_PARAM,
return_type: RuntimeType::F64,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.u32_to_u64",
runtime_symbol: "std.num.u32_to_u64",
params: U32_PARAM,
return_type: RuntimeType::U64,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.u32_to_i64",
runtime_symbol: "std.num.u32_to_i64",
params: U32_PARAM,
return_type: RuntimeType::I64,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.u32_to_f64",
runtime_symbol: "std.num.u32_to_f64",
params: U32_PARAM,
return_type: RuntimeType::F64,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.u64_to_f64",
runtime_symbol: "std.num.u64_to_f64",
params: U64_PARAM,
return_type: RuntimeType::F64,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.i64_to_i32_result",
runtime_symbol: "std.num.i64_to_i32_result",
params: I64_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.i32_to_u32_result",
runtime_symbol: "std.num.i32_to_u32_result",
params: I32_PARAM,
return_type: RuntimeType::ResultU32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.i64_to_u64_result",
runtime_symbol: "std.num.i64_to_u64_result",
params: I64_PARAM,
return_type: RuntimeType::ResultU64I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.u64_to_i64_result",
runtime_symbol: "std.num.u64_to_i64_result",
params: U64_PARAM,
return_type: RuntimeType::ResultI64I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.f64_to_i32_result",
runtime_symbol: "std.num.f64_to_i32_result",
params: F64_PARAM,
return_type: RuntimeType::ResultI32I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.f64_to_i64_result",
runtime_symbol: "std.num.f64_to_i64_result",
params: F64_PARAM,
return_type: RuntimeType::ResultI64I32,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.i32_to_string",
runtime_symbol: "__glagol_num_i32_to_string",
params: I32_PARAM,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.i64_to_string",
runtime_symbol: "__glagol_num_i64_to_string",
params: I64_PARAM,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.u32_to_string",
runtime_symbol: "__glagol_num_u32_to_string",
params: U32_PARAM,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.u64_to_string",
runtime_symbol: "__glagol_num_u64_to_string",
params: U64_PARAM,
return_type: RuntimeType::String,
promoted: true,
},
RuntimeFunction {
source_name: "std.num.f64_to_string",
runtime_symbol: "__glagol_num_f64_to_string",
params: F64_PARAM,
return_type: RuntimeType::String,
promoted: true,
},
];
const RESERVED_HELPER_SYMBOLS: &[&str] = &[
"std.result.is_ok",
"std.result.is_err",
"std.result.unwrap_ok",
"std.result.unwrap_err",
"__glagol_string_eq",
"__glagol_array_bounds_trap",
"__glagol_unwrap_some_trap",
"__glagol_unwrap_ok_trap",
"__glagol_unwrap_err_trap",
"__glagol_process_init",
"__glagol_io_read_stdin_result",
"__glagol_process_arg_trap",
"__glagol_process_arg_result",
"__glagol_env_get_result",
"__glagol_fs_read_trap",
"__glagol_fs_read_text_result",
"__glagol_fs_write_text_result",
"__glagol_fs_exists",
"__glagol_fs_is_file",
"__glagol_fs_is_dir",
"__glagol_fs_remove_file_result",
"__glagol_fs_create_dir_result",
"__glagol_fs_open_text_read_result",
"__glagol_fs_read_open_text_result",
"__glagol_fs_close_result",
"__glagol_net_tcp_connect_loopback_result",
"__glagol_net_tcp_listen_loopback_result",
"__glagol_net_tcp_bound_port_result",
"__glagol_net_tcp_accept_result",
"__glagol_net_tcp_read_all_result",
"__glagol_net_tcp_write_text_result",
"__glagol_net_tcp_close_result",
"__glagol_vec_i32_eq",
"__glagol_vec_i32_allocation_trap",
"__glagol_vec_i32_index_trap",
"__glagol_vec_i64_eq",
"__glagol_vec_i64_allocation_trap",
"__glagol_vec_i64_index_trap",
"__glagol_vec_string_eq",
"__glagol_vec_string_allocation_trap",
"__glagol_vec_string_index_trap",
"__glagol_time_monotonic_unavailable_trap",
"__glagol_time_sleep_negative_trap",
"__glagol_time_sleep_failed_trap",
"__glagol_string_parse_i32_result",
"__glagol_string_parse_i64_result",
"__glagol_string_parse_u32_result",
"__glagol_string_parse_u64_result",
"__glagol_string_parse_f64_result",
"__glagol_string_parse_bool_result",
"__glagol_json_quote_string",
"__glagol_num_u32_to_string",
"__glagol_num_u64_to_string",
"__glagol_num_f64_to_string",
"print_f64",
"print_u32",
"print_u64",
"print_i64",
];
pub fn function(source_name: &str) -> Option<&'static RuntimeFunction> {
FUNCTIONS
.iter()
.find(|function| function.source_name == source_name)
}
pub fn is_promoted_source_name(source_name: &str) -> bool {
function(source_name).is_some_and(|function| function.promoted)
}
pub fn is_reserved_name(name: &str) -> bool {
FUNCTIONS
.iter()
.any(|function| function.source_name == name || function.runtime_symbol == name)
|| RESERVED_HELPER_SYMBOLS.contains(&name)
}
pub fn is_standard_path(source_name: &str) -> bool {
source_name.starts_with("std.")
}
pub fn runtime_symbol(source_name: &str) -> Option<&'static str> {
function(source_name).map(|function| function.runtime_symbol)
}
pub fn unsupported_standard_library_call(file: &str, span: Span, source_name: &str) -> Diagnostic {
Diagnostic::new(
file,
"UnsupportedStandardLibraryCall",
format!("standard library call `{}` is not supported", source_name),
)
.with_span(span)
.expected("std.io.print_i32, std.io.print_u32, std.io.print_i64, std.io.print_u64, std.io.print_f64, std.io.print_string, std.io.print_bool, std.io.eprint, std.io.read_stdin_result, std.string.len, std.string.concat, std.string.parse_i32_result, std.string.parse_u32_result, std.string.parse_i64_result, std.string.parse_u64_result, std.string.parse_f64_result, std.string.parse_bool_result, std.json.quote_string, std.process.argc, std.process.arg, std.process.arg_result, std.env.get, std.env.get_result, std.fs.read_text, std.fs.read_text_result, std.fs.write_text, std.fs.write_text_result, std.fs.exists, std.fs.is_file, std.fs.is_dir, std.fs.remove_file_result, std.fs.create_dir_result, std.fs.open_text_read_result, std.fs.read_open_text_result, std.fs.close_result, std.vec.i32.empty, std.vec.i32.append, std.vec.i32.len, std.vec.i32.index, std.vec.i64.empty, std.vec.i64.append, std.vec.i64.len, std.vec.i64.index, std.vec.f64.empty, std.vec.f64.append, std.vec.f64.len, std.vec.f64.index, std.vec.bool.empty, std.vec.bool.append, std.vec.bool.len, std.vec.bool.index, std.vec.string.empty, std.vec.string.append, std.vec.string.len, std.vec.string.index, std.time.monotonic_ms, std.time.sleep_ms, std.random.i32, std.num.i32_to_i64, std.num.i32_to_f64, std.num.i64_to_f64, std.num.i64_to_i32_result, std.num.f64_to_i32_result, std.num.f64_to_i64_result, std.num.i32_to_string, std.num.u32_to_string, std.num.i64_to_string, std.num.u64_to_string, std.num.f64_to_string, std.result.is_ok, std.result.is_err, std.result.unwrap_ok, or std.result.unwrap_err")
.found(source_name)
.hint("use a promoted standard-runtime name or a legacy intrinsic alias")
}