feat: 支持基础 class 声明表达式与原型方法

This commit is contained in:
爱特每羊队
2026-06-09 08:38:21 +08:00
parent 5d1d25074e
commit 85e78bd248
13 changed files with 535 additions and 31 deletions
@@ -325,3 +325,27 @@ fn compile_neg_infinity_ok() {
let module = compile_source("1 / -Infinity");
assert!(!module.bytecode.is_empty());
}
#[test]
fn compile_class_expression_emits_constructor_value() {
let module = compile_source("const C = class Foo { method() { return 2; } }; C");
assert_eq!(module.sub_modules.len(), 2, "expected constructor + method submodules");
assert!(
module
.bytecode
.iter()
.filter(|&&i| opcode::opcode(i) == OpCode::SET_PROP)
.count()
>= 3,
"class expression should wire method/constructor/prototype properties"
);
}
#[test]
fn compile_class_expression_default_constructor() {
let module = compile_source("class A {}; (class B {})");
assert!(
module.sub_modules.iter().any(|m| m.is_class_constructor),
"expected at least one class constructor submodule"
);
}
@@ -244,3 +244,37 @@ fn compile_large_adjacent_switches_do_not_collide_labels() {
"expected both large switches to compile with distinct case labels"
);
}
#[test]
fn compile_class_declaration_emits_constructor_and_prototype_setup() {
let module = compile_source("class A { m() { return 1; } }");
assert_eq!(module.sub_modules.len(), 2, "expected constructor + method submodules");
assert!(
module
.bytecode
.iter()
.filter(|&&i| opcode::opcode(i) == OpCode::NEW_OBJECT)
.count()
>= 1,
"class should allocate a prototype object"
);
assert!(
module
.bytecode
.iter()
.filter(|&&i| opcode::opcode(i) == OpCode::SET_PROP)
.count()
>= 3,
"class should assign method, constructor, and prototype properties"
);
}
#[test]
fn compile_class_declaration_default_constructor_creates_submodule() {
let module = compile_source("class A {}");
assert_eq!(module.sub_modules.len(), 1, "expected synthesized default constructor");
assert!(
module.sub_modules[0].is_class_constructor,
"default constructor submodule should be marked as class constructor"
);
}