109 lines
3.4 KiB
Rust
109 lines
3.4 KiB
Rust
|
|
/*!
|
|||
|
|
* StringUtils arity suffix 自動補完テスト(Phase 21.7++)
|
|||
|
|
*
|
|||
|
|
* 目的:
|
|||
|
|
* - VM の execute_global_function で arity が欠落している場合に
|
|||
|
|
* args.len() から自動補完される機能を検証する。
|
|||
|
|
*
|
|||
|
|
* 背景:
|
|||
|
|
* - MIR 関数は "BoxName.method/arity" 形式で格納される
|
|||
|
|
* - 呼び出し側が arity なしで "BoxName.method" を指定した場合、
|
|||
|
|
* 自動的に "/arity" を追加して検索する
|
|||
|
|
*
|
|||
|
|
* 修正内容(2025-11-21):
|
|||
|
|
* 1. lang/src/llvm_ir/hako_module.toml の TOML パースエラーを修正
|
|||
|
|
* 2. src/backend/mir_interpreter/handlers/calls/global.rs で arity 自動補完実装
|
|||
|
|
*
|
|||
|
|
* 注意:
|
|||
|
|
* - このテストは using 解決をテストするものではなく、arity 自動補完のみをテストする
|
|||
|
|
* - using 解決のテストは CLI 経由で実施(apps/tests/json_lint_stringutils_min.hako)
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
use crate::ast::ASTNode;
|
|||
|
|
use crate::backend::VM;
|
|||
|
|
use crate::mir::MirCompiler;
|
|||
|
|
use crate::parser::NyashParser;
|
|||
|
|
|
|||
|
|
fn ensure_stage3_env() {
|
|||
|
|
std::env::set_var("NYASH_PARSER_STAGE3", "1");
|
|||
|
|
std::env::set_var("HAKO_PARSER_STAGE3", "1");
|
|||
|
|
std::env::set_var("NYASH_PARSER_ALLOW_SEMICOLON", "1");
|
|||
|
|
std::env::set_var("NYASH_DISABLE_PLUGINS", "1");
|
|||
|
|
std::env::set_var("HAKO_MIR_BUILDER_METHODIZE", "0");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#[test]
|
|||
|
|
fn json_lint_stringutils_min_vm() {
|
|||
|
|
ensure_stage3_env();
|
|||
|
|
|
|||
|
|
// arity 自動補完をテストするため、using を使わずに static box で直接実装
|
|||
|
|
let src = r#"
|
|||
|
|
static box StringUtils {
|
|||
|
|
starts_with(text, prefix) {
|
|||
|
|
local text_len = text.length()
|
|||
|
|
local prefix_len = prefix.length()
|
|||
|
|
if prefix_len > text_len { return 0 }
|
|||
|
|
local i = 0
|
|||
|
|
loop(i < prefix_len) {
|
|||
|
|
if text.substring(i, i + 1) != prefix.substring(i, i + 1) {
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
return 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ends_with(text, suffix) {
|
|||
|
|
local text_len = text.length()
|
|||
|
|
local suffix_len = suffix.length()
|
|||
|
|
if suffix_len > text_len { return 0 }
|
|||
|
|
local offset = text_len - suffix_len
|
|||
|
|
local i = 0
|
|||
|
|
loop(i < suffix_len) {
|
|||
|
|
if text.substring(offset + i, offset + i + 1) != suffix.substring(i, i + 1) {
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
i = i + 1
|
|||
|
|
}
|
|||
|
|
return 1
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static box Main {
|
|||
|
|
main() {
|
|||
|
|
if StringUtils.starts_with("abc", "a") and StringUtils.ends_with("abc", "c") {
|
|||
|
|
print("OK")
|
|||
|
|
} else {
|
|||
|
|
print("ERROR")
|
|||
|
|
}
|
|||
|
|
return 0
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
"#;
|
|||
|
|
|
|||
|
|
let ast: ASTNode = NyashParser::parse_from_string(src).expect("parse");
|
|||
|
|
let mut mc = MirCompiler::with_options(false);
|
|||
|
|
let cr = mc.compile(ast).expect("compile");
|
|||
|
|
|
|||
|
|
let mut vm = VM::new();
|
|||
|
|
let result = vm.execute_module(&cr.module);
|
|||
|
|
|
|||
|
|
// ✅ arity 自動補完により StringUtils.starts_with → StringUtils.starts_with/2 に解決されることを確認
|
|||
|
|
match result {
|
|||
|
|
Ok(_v) => {
|
|||
|
|
eprintln!("[json_lint_stringutils_min] VM executed successfully");
|
|||
|
|
// Success - arity auto-completion worked!
|
|||
|
|
}
|
|||
|
|
Err(e) => {
|
|||
|
|
panic!("VM should execute successfully, but got error: {:?}", e);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// cleanup
|
|||
|
|
std::env::remove_var("NYASH_PARSER_STAGE3");
|
|||
|
|
std::env::remove_var("HAKO_PARSER_STAGE3");
|
|||
|
|
std::env::remove_var("NYASH_PARSER_ALLOW_SEMICOLON");
|
|||
|
|
std::env::remove_var("NYASH_DISABLE_PLUGINS");
|
|||
|
|
std::env::remove_var("HAKO_MIR_BUILDER_METHODIZE");
|
|||
|
|
}
|