feat: 对象字面量 spread({...obj} 展开可枚举自有属性)

This commit is contained in:
爱特每羊队
2026-08-08 11:24:09 +08:00
parent 2777b00c82
commit 6c7b10d6c5
10 changed files with 251 additions and 63 deletions
+34
View File
@@ -152,3 +152,37 @@ fn object_literal_setter_updates_receiver() {
fn object_literal_getter_setter_pair() {
assert_eq!(eval("var o={ get x(){ return this.y }, set x(v){ this.y=v } }; o.x=9; o.x"), "9");
}
fn eval_string(source: &str) -> String {
let allocator = Allocator::default();
let mut vm = Vm::new();
let program = oxide_parser::parse(&allocator, source).expect("parse failed");
let module = Compiler::new().compile(&program).expect("compile failed");
let result = vm.run(&module).expect("vm run failed");
vm.lookup_str(result).unwrap_or_default()
}
#[test]
fn object_literal_spread_copies_own_properties() {
assert_eq!(eval_string("JSON.stringify({a:0,...{x:1,y:2}})"), r#"{"a":0,"x":1,"y":2}"#);
}
#[test]
fn object_literal_spread_later_definitions_override() {
assert_eq!(eval("({...{a:1},a:9}).a"), "9");
assert_eq!(eval("({a:1,...{a:9}}).a"), "9");
}
#[test]
fn object_literal_spread_nullish_is_empty() {
assert_eq!(eval_string("JSON.stringify({...null})"), "{}");
assert_eq!(eval_string("JSON.stringify({...undefined})"), "{}");
assert_eq!(eval_string("JSON.stringify({...42})"), "{}");
}
#[test]
fn object_literal_spread_string_indexes_and_getters() {
assert_eq!(eval_string("JSON.stringify({...'ab'})"), r#"{"0":"a","1":"b"}"#);
assert_eq!(eval("({...{get x(){return 5}}}).x"), "5");
assert_eq!(eval_string("JSON.stringify({...[],a:1})"), r#"{"a":1}"#);
}