From 341f8e9b9f35ce9fe21af7ab0aacfaf38159ee0e Mon Sep 17 00:00:00 2001 From: peefy Date: Tue, 30 Jul 2024 21:06:58 +0800 Subject: [PATCH] feat: add file.current function Signed-off-by: peefy --- kclvm/api/src/service/service_impl.rs | 6 +-- .../kclvm_loader__tests__builtin_call_0.snap | 14 +++--- .../kclvm_loader__tests__builtin_call_1.snap | 42 +++++++++--------- .../kclvm_loader__tests__builtin_call_2.snap | 42 +++++++++--------- kclvm/runtime/src/_kclvm.bc | Bin 14528 -> 14564 bytes kclvm/runtime/src/_kclvm.h | 2 + kclvm/runtime/src/_kclvm.ll | 2 + kclvm/runtime/src/_kclvm.rs | 1 + kclvm/runtime/src/_kclvm_addr.rs | 1 + kclvm/runtime/src/_kclvm_api_spec.rs | 4 ++ kclvm/runtime/src/file/mod.rs | 13 ++++++ kclvm/sema/src/builtin/system_module.rs | 8 ++++ test/grammar/builtins/file/current/main.k | 3 ++ .../builtins/file/current/stdout.golden | 1 + 14 files changed, 87 insertions(+), 52 deletions(-) create mode 100644 test/grammar/builtins/file/current/main.k create mode 100644 test/grammar/builtins/file/current/stdout.golden diff --git a/kclvm/api/src/service/service_impl.rs b/kclvm/api/src/service/service_impl.rs index 33bc7d977..32a98ef1c 100644 --- a/kclvm/api/src/service/service_impl.rs +++ b/kclvm/api/src/service/service_impl.rs @@ -220,9 +220,9 @@ impl KclvmServiceImpl { /// assert_eq!(result.type_errors.len(), 0); /// assert_eq!(result.symbols.len(), 12); /// assert_eq!(result.scopes.len(), 3); - /// assert_eq!(result.node_symbol_map.len(), 178); - /// assert_eq!(result.symbol_node_map.len(), 178); - /// assert_eq!(result.fully_qualified_name_map.len(), 188); + /// assert_eq!(result.node_symbol_map.len(), 179); + /// assert_eq!(result.symbol_node_map.len(), 179); + /// assert_eq!(result.fully_qualified_name_map.len(), 189); /// assert_eq!(result.pkg_scope_map.len(), 3); /// ``` #[inline] diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_0.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_0.snap index 8f93e0d4b..8b0d7b133 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_0.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_0.snap @@ -88,13 +88,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 137, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 138, @@ -291,6 +284,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 166, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_1.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_1.snap index 57997ab95..d434b79b8 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_1.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_1.snap @@ -180,13 +180,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 137, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 138, @@ -383,6 +376,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 166, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, @@ -422,13 +422,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 137, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 138, @@ -625,6 +618,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 166, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, @@ -664,13 +664,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 137, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 138, @@ -867,6 +860,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 166, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, diff --git a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_2.snap b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_2.snap index aea2c6e25..e43dc4009 100644 --- a/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_2.snap +++ b/kclvm/loader/src/snapshots/kclvm_loader__tests__builtin_call_2.snap @@ -382,13 +382,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 137, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 138, @@ -585,6 +578,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 166, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, @@ -624,13 +624,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 137, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 138, @@ -827,6 +820,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 166, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, @@ -866,13 +866,6 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, ), attrs: [ - SymbolRef { - id: Index { - index: 137, - generation: 0, - }, - kind: Function, - }, SymbolRef { id: Index { index: 138, @@ -1069,6 +1062,13 @@ expression: "format!(\"{:#?}\", p.symbols.values())" }, kind: Function, }, + SymbolRef { + id: Index { + index: 166, + generation: 0, + }, + kind: Function, + }, ], is_global: false, }, diff --git a/kclvm/runtime/src/_kclvm.bc b/kclvm/runtime/src/_kclvm.bc index e6ed679004714d6ca99e8dd2ba51520f7950c6af..b65c79d9977e97a38d86aaa5af9a5f28f0b2cb14 100644 GIT binary patch delta 4027 zcmZWsYfO_@82)-uq$LHbr3?kDYXvJ{#XI1JfEiY&Qtc4tv|iYfW^+g?1iXBobM?kd z%CL%yW3$2(rU{DZrYKT_*DagIPA1Ojl+D#(W+u~m2|FLq^6{MWr^(@P-sgFr=Y8Mv zon3u@wL>eaIHGgP*#TojVkWRG+(_pOS(aED*kR5x>9t)dmvm6y7AM-g&=8jr9M-qR zNJ45hEaH?J!PdYC)9E7`U8-O!#84&6+c%2~Y_SXzVaaU2>@H_SflbD6)=|6Lj>uFg z@_C4i4X;9EGLj(kh;w>&lO5*z$PxMB(-o*6JhpJfa90TC=P4*BK=l@6Y zOE~E6rR{`c)*tL+F}s!We%WRDsAlyyNa9RF#ySR6C{o9n0i5}gJbNre-Ts%|i{MmG z)9gX10>DIw#Py_MFB!cI+`Mf7+}3etev24xyOY25 zB@@tswz<2aga}DAvYiH}w zpUG6Bd-a6@ zqbB(%6{`PD$EenhErP~M`13vg_fQk2w{-;7^Y6Yn2lMfOtti3H8k3pdgvC5wdomx2 zSrx0a8dwFCsp&1ZK1jp#Ez*=WYL_9`qqCM@;rb5o4Oq2XT8Ot9-*y}EwpXKMjTdpeX@g!(5s3fZ&S6f#o>*k&Jn+o2ZsAQPdewix-@Tb!*So=O|X!oQy6Mt77y)2Z*K08FD*QAQsEN zHH^o$9nf<8<-Ln{Q=9ZU4=}L!r_0A_Nx_=H4#N;{{y1fDwbbt>{!av7=3b7%H*s#} zE5tV;rjm66K=YSF7R(j^e8^vNQ2nQg9*7B+&>E z^9^8S)?rMt^=Rw+Vlu(}iyvV5IhOIF{;wwe^|-y**N^7}MsN>*qS?iIsJ($nTFToZ zl3D8O!nV|6!#e(DoB>~|DxX?C0*G0=O5%LnJo50>J?Pj`rQV>S0iDdojho0dkVvBZDHzX43kSH z{x??hk`u`X`5CR&kWoQ$n5YOF_30ULS!i!Q-wR{FE KR&R-2681l^Np4mE delta 4002 zcmZWsdrVVT9KLPQN{a=H1)_+hqf;vkbYr?QrJ@q7uYsV&7ow7EopEB&Ii1`t5fxAa z!Qx|+%}yLtm+^>?F&Y73Gu=aBFr9Bj-NQ6f2~O+WcJ3{0uiv?U+$JZd=X}5K`+kpm zC%+}XEJjpOueHkAqOl?|<9k+EqO+dK(!~M36{dxmuKQ0_6)?oVWD#x8jEgk{hWM8l zNl@)(Q<+jNSQ;FW;i$h5V-PF_B^eeiaZ;54?h!trkoNapPnIl(?W7rpOHJ&VT4)>$u!ELynvR!8IgJVb# z;{0eMY*Y2NSs@15k2Jeg@&&>eSdQL>;hL$4?kjnv4vsTlFFK}zTdNn~v#C+@Nj zD1Uz6D)1-ofa-%1w5M^BR0sC7Zc)4?l$KAN$WPFovHCfJ#3AvM%qc9eAT-Axj1~fQ z|4bq4u~W$Gi=$O=dCDb4ZEKU_|aPns-%#v@z5k<$LKD*=&RzCt0hHl3{i zL1pjnppda{#d3gV4~^MyZhUlqyQrzO(4u5|?zGpAQm0Nk8k2V66G}i=&SsAGed|I53;tqfh7fvYCj$ zC3BE+*<@5rmn6M=mN*HIyQa;p z#?uy8)Lq7+)H^HfFK-yU{zQJeJEm$A#Gxuyo_`bKFsBxO5oHlzA*RzF-9}aZ`GIkM zl06(BS5oC6U(4E%!s1o_p2ec<030__B=!v8>6V znQ0)F@o3blU=2EBWJ8U+bN*=Ccqib<2 zxmsVd5J`S1d(Eq&7iT)%r?GYWfn@8luzAo;bX~Dj3vS5v)pbw&qy?XAtTE%QPqPh^ z;8y$axG4YhLRca7PPHdYH4>z?&z0{PYT;S)yomLz_L*2GoMDUP)Ev4b5!0x#P^teE?9mLyi@yCo+7YfIXH^waiyeV}-iAltT9SYpQ5> z6yzc@{rxtqP(2rmkQ4LCQodpPN&`pnmhdbAG#*({s_}7YX)sW3{kNks)Zo#cf0Ht!nRfO{pjxm-5~}#{uzt+X zdlyyC zs46v8Y7k&1aX9DqQmNcpli!J%{8M)gb@7L0QvsB7U3MbXYkJL@ocnzq;HKmUJyaX4 zKAw(JKFVH&_P3t;7ELDGxLeo;`LX562=tgP{#hb51&v#?G+FS~NW7>V8Bnr3iecJU zHfD{KOJ2J-Uj2{dxon6ReZHD>H$ve=MTlmbL%b_^fX-z>3{yUsVU&`+8yfdU-4ARm LAG;uge5U>n_mgdo diff --git a/kclvm/runtime/src/_kclvm.h b/kclvm/runtime/src/_kclvm.h index 8fdafb7c7..304278b2d 100644 --- a/kclvm/runtime/src/_kclvm.h +++ b/kclvm/runtime/src/_kclvm.h @@ -295,6 +295,8 @@ kclvm_value_ref_t* kclvm_file_append(kclvm_context_t* ctx, kclvm_value_ref_t* ar kclvm_value_ref_t* kclvm_file_cp(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); +kclvm_value_ref_t* kclvm_file_current(kclvm_context_t* ctx, kclvm_value_ref_t* _args, kclvm_value_ref_t* _kwargs); + kclvm_value_ref_t* kclvm_file_delete(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); kclvm_value_ref_t* kclvm_file_exists(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); diff --git a/kclvm/runtime/src/_kclvm.ll b/kclvm/runtime/src/_kclvm.ll index e3d876de6..01c666f0a 100644 --- a/kclvm/runtime/src/_kclvm.ll +++ b/kclvm/runtime/src/_kclvm.ll @@ -258,6 +258,8 @@ declare %kclvm_value_ref_t* @kclvm_file_append(%kclvm_context_t* %ctx, %kclvm_va declare %kclvm_value_ref_t* @kclvm_file_cp(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); +declare %kclvm_value_ref_t* @kclvm_file_current(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %_args, %kclvm_value_ref_t* %_kwargs); + declare %kclvm_value_ref_t* @kclvm_file_delete(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); declare %kclvm_value_ref_t* @kclvm_file_exists(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); diff --git a/kclvm/runtime/src/_kclvm.rs b/kclvm/runtime/src/_kclvm.rs index 516dd8484..1dfa96440 100644 --- a/kclvm/runtime/src/_kclvm.rs +++ b/kclvm/runtime/src/_kclvm.rs @@ -140,6 +140,7 @@ pub enum ApiFunc { kclvm_file_abs, kclvm_file_append, kclvm_file_cp, + kclvm_file_current, kclvm_file_delete, kclvm_file_exists, kclvm_file_glob, diff --git a/kclvm/runtime/src/_kclvm_addr.rs b/kclvm/runtime/src/_kclvm_addr.rs index 8a63bde71..b5b0befc2 100644 --- a/kclvm/runtime/src/_kclvm_addr.rs +++ b/kclvm/runtime/src/_kclvm_addr.rs @@ -145,6 +145,7 @@ pub fn _kclvm_get_fn_ptr_by_name(name: &str) -> u64 { "kclvm_file_abs" => crate::kclvm_file_abs as *const () as u64, "kclvm_file_append" => crate::kclvm_file_append as *const () as u64, "kclvm_file_cp" => crate::kclvm_file_cp as *const () as u64, + "kclvm_file_current" => crate::kclvm_file_current as *const () as u64, "kclvm_file_delete" => crate::kclvm_file_delete as *const () as u64, "kclvm_file_exists" => crate::kclvm_file_exists as *const () as u64, "kclvm_file_glob" => crate::kclvm_file_glob as *const () as u64, diff --git a/kclvm/runtime/src/_kclvm_api_spec.rs b/kclvm/runtime/src/_kclvm_api_spec.rs index 326c2d554..ff6623724 100644 --- a/kclvm/runtime/src/_kclvm_api_spec.rs +++ b/kclvm/runtime/src/_kclvm_api_spec.rs @@ -1218,6 +1218,10 @@ // api-spec(c): kclvm_value_ref_t* kclvm_file_workdir(kclvm_context_t* ctx, kclvm_value_ref_t* _args, kclvm_value_ref_t* _kwargs); // api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_file_workdir(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %_args, %kclvm_value_ref_t* %_kwargs); +// api-spec: kclvm_file_current +// api-spec(c): kclvm_value_ref_t* kclvm_file_current(kclvm_context_t* ctx, kclvm_value_ref_t* _args, kclvm_value_ref_t* _kwargs); +// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_file_current(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %_args, %kclvm_value_ref_t* %_kwargs); + // api-spec: kclvm_file_exists // api-spec(c): kclvm_value_ref_t* kclvm_file_exists(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs); // api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_file_exists(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs); diff --git a/kclvm/runtime/src/file/mod.rs b/kclvm/runtime/src/file/mod.rs index fba39e5bb..311f6981a 100644 --- a/kclvm/runtime/src/file/mod.rs +++ b/kclvm/runtime/src/file/mod.rs @@ -78,6 +78,19 @@ pub extern "C" fn kclvm_file_workdir( s.into_raw(ctx) } +/// Read the path of the current script or module that is being executed +#[no_mangle] +#[runtime_fn] +pub extern "C" fn kclvm_file_current( + ctx: *mut kclvm_context_t, + _args: *const kclvm_value_ref_t, + _kwargs: *const kclvm_value_ref_t, +) -> *const kclvm_value_ref_t { + let ctx = mut_ptr_as_ref(ctx); + let s = ValueRef::str(ctx.panic_info.kcl_file.as_ref()); + s.into_raw(ctx) +} + /// Whether this file path exists. Returns true if the path points at /// an existing entity. This function will traverse symbolic links to /// query information about the destination file. diff --git a/kclvm/sema/src/builtin/system_module.rs b/kclvm/sema/src/builtin/system_module.rs index e674c3cca..5e439bbfa 100644 --- a/kclvm/sema/src/builtin/system_module.rs +++ b/kclvm/sema/src/builtin/system_module.rs @@ -1610,6 +1610,14 @@ register_file_member! { false, None, ) + current => Type::function( + None, + Type::str_ref(), + &[], + r#"Read the path of the current script or module that is being executed"#, + false, + None, + ) exists => Type::function( None, Type::bool_ref(), diff --git a/test/grammar/builtins/file/current/main.k b/test/grammar/builtins/file/current/main.k new file mode 100644 index 000000000..cf804e61c --- /dev/null +++ b/test/grammar/builtins/file/current/main.k @@ -0,0 +1,3 @@ +import file + +a = file.current().endswith("main.k") diff --git a/test/grammar/builtins/file/current/stdout.golden b/test/grammar/builtins/file/current/stdout.golden new file mode 100644 index 000000000..b4563830e --- /dev/null +++ b/test/grammar/builtins/file/current/stdout.golden @@ -0,0 +1 @@ +a: true \ No newline at end of file