docs: explain match assertions and annotation type distinctions

This commit is contained in:
2026-11-15 19:14:55 +08:00
parent 903b3bbf9d
commit 57cd32eb5c
16 changed files with 58 additions and 6 deletions
+6
View File
@@ -106,6 +106,7 @@ fn source_parameters_are_contravariant_and_returns_covariant_at_class_creation()
"Number",
Value::Nil,
);
// 子方法缩窄参数可接受范围会破坏替换关系,必须在建类时报告覆盖违规。
assert!(matches!(
class(&mut vm, "Narrow", base, narrow),
Err(VmError::OverrideViolation {
@@ -133,6 +134,7 @@ fn source_parameters_are_contravariant_and_returns_covariant_at_class_creation()
"Object",
Value::Nil,
);
// 子方法放宽返回类型会破坏父方法承诺,必须在建类时拒绝。
assert!(matches!(
class(&mut vm, "Broad", numeric_type, broad),
Err(VmError::OverrideViolation {
@@ -305,6 +307,7 @@ fn global_rebinding_is_rechecked_before_the_source_body_and_recovers() {
vm.attach_type(receiver, child).unwrap();
vm.dict_set(globals, Value::Text("Actual".into()), Value::Object(other))
.unwrap();
// Actual 的全局类型绑定变化后,调用前重新检查覆盖关系,失败时不能运行方法体。
assert!(matches!(
vm.call(child_fn, &[Value::Object(receiver)]),
Err(VmError::OverrideViolation { .. })
@@ -404,6 +407,7 @@ fn native_overrides_preserve_union_inputs_and_do_not_expand_effects() {
vec![],
))
.unwrap();
// 只读父方法不能被已知有写效果的子方法替换,更新必须在提交前失败。
assert!(matches!(
vm.define_method(child, "check", effect_fn),
Err(VmError::OverrideViolation {
@@ -423,6 +427,7 @@ fn native_overrides_preserve_union_inputs_and_do_not_expand_effects() {
vec![],
))
.unwrap();
// 子方法仅接受 Number 会丢失父联合参数的 String 候选,不能缩窄父方法可接受的输入。
assert!(matches!(
vm.define_method(child, "check", narrow_fn),
Err(VmError::OverrideViolation {
@@ -498,6 +503,7 @@ fn unknown_forward_names_defer_until_call_without_entering_the_body() {
.unwrap();
vm.dict_set(globals, Value::Text("Later".into()), Value::Object(later))
.unwrap();
// Later 从未知名解析成不兼容名义类型后,错误应转为覆盖违规且仍在方法体前发生。
assert!(matches!(
vm.call(
child_fn,