pipeline_script/plugin/
builtin.rs

1use crate::ast::r#type::Type;
2use crate::core::builtin::{
3    cmd, now, panic, println, read_double, read_float, read_int64, read_line, read_string, sleep,
4    spawn0, string_equal, wait, workspace,
5};
6use crate::core::engine::Engine;
7use crate::llvm::global::Global;
8use crate::llvm::value::fucntion::FunctionValue;
9use crate::llvm::value::LLVMValue;
10use crate::plugin::Plugin;
11use crate::register_external_fn;
12
13pub struct BuiltinPlugin;
14impl Plugin for BuiltinPlugin {
15    fn apply(self, e: &mut Engine) {
16        // 使用宏来注册外部函数
17        register_external_fn!(e, "stringEqual", string_equal);
18        register_external_fn!(e, "println", println);
19        register_external_fn!(e, "cmd", cmd);
20        register_external_fn!(e, "workspace0", workspace);
21        register_external_fn!(e, "panic", panic);
22        register_external_fn!(e, "now", now);
23        register_external_fn!(e, "spawnWithString0", spawn0);
24        register_external_fn!(e, "wait", wait);
25        register_external_fn!(e, "sleep", sleep);
26        register_external_fn!(e, "readLine", read_line);
27        register_external_fn!(e, "readString", read_string);
28        register_external_fn!(e, "readInt64", read_int64);
29        register_external_fn!(e, "readDouble", read_double);
30        register_external_fn!(e, "readFloat", read_float);
31        e.register_builtin_symbol_type(
32            "sizeof",
33            Type::Function(Box::new(Type::Int64), vec![], false),
34        );
35        let reference = Global::unit_type().get_undef().as_llvm_value_ref();
36        let sizeof_reference = LLVMValue::Function(FunctionValue::new(
37            reference,
38            "sizeof".into(),
39            Box::new(Global::const_i32(0).into()),
40            vec![],
41        ));
42        e.register_builtin_symbol("sizeof", sizeof_reference);
43        e.register_precluded_scripts(&["extern fn cmd(key: String, cmd: String)
44            extern fn println(obj:..Any)
45            extern fn workspace0(key: String, path: String)
46            extern fn panic(msg: String)
47            extern fn printf(format: String, ...)
48            extern fn now() -> Int64
49            extern fn spawnWithString0(f: Fn(),name:String)
50            extern fn wait()
51            extern fn stringEqual(l:String,r:String)->Bool
52            extern fn sleep(ms: Int64)
53            extern fn readLine() -> String
54            extern fn readString() -> String
55            extern fn readInt64() -> Int64
56            extern fn readFloat() -> Float
57            extern fn readDouble() -> Double
58        "]);
59    }
60}