From 3f2e554e6979ef3ef9e10d12d9744118f1b5853c Mon Sep 17 00:00:00 2001 From: kaankacar Date: Sat, 24 Jan 2026 13:42:37 +0300 Subject: [PATCH 1/5] Add cov-mark coverage for type-checker error dedup --- Cargo.toml | 1 + core/type-checker/Cargo.toml | 1 + core/type-checker/src/type_checker.rs | 2 ++ tests/Cargo.toml | 1 + tests/src/type_checker/error_recovery.rs | 11 +++++------ 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index aa8e63d..38e73ed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,6 +58,7 @@ tree-sitter-inference = "0.0.38" anyhow = "1.0.100" thiserror = "2.0.18" serde = { version = "1.0.228", features = ["derive", "rc"] } +cov-mark = "2.2.0" leb128 = "0.2.5" rustc-hash = "2.1.1" inkwell = { version = "0.8.0", features = ["llvm21-1"] } diff --git a/core/type-checker/Cargo.toml b/core/type-checker/Cargo.toml index dc41e17..9321f74 100644 --- a/core/type-checker/Cargo.toml +++ b/core/type-checker/Cargo.toml @@ -11,3 +11,4 @@ inference-ast.workspace = true anyhow.workspace = true thiserror.workspace = true rustc-hash.workspace = true +cov-mark.workspace = true diff --git a/core/type-checker/src/type_checker.rs b/core/type-checker/src/type_checker.rs index 82de1b2..9f7bee7 100644 --- a/core/type-checker/src/type_checker.rs +++ b/core/type-checker/src/type_checker.rs @@ -2092,8 +2092,10 @@ impl TypeChecker { }; if let Some(key) = key { if self.reported_error_keys.contains(&key) { + cov_mark::hit!(type_checker_error_dedup_skips_duplicate); return; } + cov_mark::hit!(type_checker_error_dedup_first_occurrence); self.reported_error_keys.insert(key); } self.errors.push(error); diff --git a/tests/Cargo.toml b/tests/Cargo.toml index 47e3b0a..02fb9bd 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -10,6 +10,7 @@ repository = { workspace = true } anyhow.workspace = true serde_json = "1.0.99" wasmtime="40.0.0" +cov-mark.workspace = true inference-ast.workspace = true inference-wasm-codegen.workspace = true diff --git a/tests/src/type_checker/error_recovery.rs b/tests/src/type_checker/error_recovery.rs index 512cf47..cb17765 100644 --- a/tests/src/type_checker/error_recovery.rs +++ b/tests/src/type_checker/error_recovery.rs @@ -101,6 +101,7 @@ mod error_recovery_tests { return helper(10); } "#; + cov_mark::check!(type_checker_error_dedup_first_occurrence); let result = try_type_check(source); assert!( result.is_err(), @@ -125,14 +126,12 @@ mod error_recovery_tests { #[test] fn test_error_deduplication() { let source = r#" - struct Container { - value: UnknownType; - } - fn test(c: Container) -> UnknownType { - let x: UnknownType = c.value; - return x; + fn test(a: UnknownType, b: UnknownType) -> UnknownType { + let x: UnknownType = a; + return b; } "#; + cov_mark::check!(type_checker_error_dedup_skips_duplicate); let result = try_type_check(source); assert!( result.is_err(), From 34771f411d914892dc4f13d778ecb93cddefe389 Mon Sep 17 00:00:00 2001 From: Kaan Kacar Date: Wed, 28 Jan 2026 01:21:29 +0300 Subject: [PATCH 2/5] Update tests/src/type_checker/error_recovery.rs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Kaan Kacar --- tests/src/type_checker/error_recovery.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/type_checker/error_recovery.rs b/tests/src/type_checker/error_recovery.rs index cb17765..642b25d 100644 --- a/tests/src/type_checker/error_recovery.rs +++ b/tests/src/type_checker/error_recovery.rs @@ -101,8 +101,8 @@ mod error_recovery_tests { return helper(10); } "#; - cov_mark::check!(type_checker_error_dedup_first_occurrence); let result = try_type_check(source); + cov_mark::check!(type_checker_error_dedup_first_occurrence); assert!( result.is_err(), "Type checker should report unknown type error" From c918cae799664a487bd98e78d5be4365961f3102 Mon Sep 17 00:00:00 2001 From: Georgii Plotnikov Date: Fri, 20 Feb 2026 09:06:32 +0900 Subject: [PATCH 3/5] fix: improve error deduplication in type checker tests --- tests/src/type_checker/error_recovery.rs | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tests/src/type_checker/error_recovery.rs b/tests/src/type_checker/error_recovery.rs index 642b25d..33bbaff 100644 --- a/tests/src/type_checker/error_recovery.rs +++ b/tests/src/type_checker/error_recovery.rs @@ -101,8 +101,8 @@ mod error_recovery_tests { return helper(10); } "#; - let result = try_type_check(source); cov_mark::check!(type_checker_error_dedup_first_occurrence); + let result = try_type_check(source); assert!( result.is_err(), "Type checker should report unknown type error" @@ -126,9 +126,8 @@ mod error_recovery_tests { #[test] fn test_error_deduplication() { let source = r#" - fn test(a: UnknownType, b: UnknownType) -> UnknownType { - let x: UnknownType = a; - return b; + fn test(a: UnknownType, b: UnknownType) -> i32 { + return 0; } "#; cov_mark::check!(type_checker_error_dedup_skips_duplicate); @@ -141,10 +140,9 @@ mod error_recovery_tests { if let Err(error) = result { let error_msg = error.to_string(); let unknown_type_count = error_msg.matches("unknown type `UnknownType`").count(); - assert!( - unknown_type_count <= 3, - "UnknownType error should not be excessively duplicated (found {} occurrences), got: {}", - unknown_type_count, + assert_eq!( + unknown_type_count, 1, + "UnknownType error should appear exactly once due to deduplication, got: {}", error_msg ); } From 51c8c4044bd48c047d618ef3782a2c1c2c140789 Mon Sep 17 00:00:00 2001 From: Georgii Plotnikov Date: Fri, 20 Feb 2026 09:52:10 +0900 Subject: [PATCH 4/5] fix: update dependencies and enhance error deduplication tests --- Cargo.toml | 2 +- tests/Cargo.toml | 6 +++-- tests/src/type_checker/error_recovery.rs | 32 ++++++++++++++++++++++-- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 32badf5..2ed1439 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,7 +58,7 @@ tree-sitter-inference = "0.0.38" anyhow = "1.0.101" thiserror = "2.0.18" serde = { version = "1.0.228", features = ["derive", "rc"] } -cov-mark = "2.2.0" +cov-mark = { version = "2.2.0", default-features = false } leb128 = "0.2.5" rustc-hash = "2.1.1" diff --git a/tests/Cargo.toml b/tests/Cargo.toml index 02fb9bd..0f0c8cb 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -9,8 +9,7 @@ repository = { workspace = true } [dependencies] anyhow.workspace = true serde_json = "1.0.99" -wasmtime="40.0.0" -cov-mark.workspace = true +wasmtime="41.0.3" inference-ast.workspace = true inference-wasm-codegen.workspace = true @@ -20,3 +19,6 @@ inf-wasmparser.workspace = true tree-sitter.workspace = true tree-sitter-inference.workspace = true rustc-hash.workspace = true + +[dev-dependencies] +cov-mark = { workspace = true, features = ["enable"] } diff --git a/tests/src/type_checker/error_recovery.rs b/tests/src/type_checker/error_recovery.rs index 33bbaff..dd4b131 100644 --- a/tests/src/type_checker/error_recovery.rs +++ b/tests/src/type_checker/error_recovery.rs @@ -101,7 +101,6 @@ mod error_recovery_tests { return helper(10); } "#; - cov_mark::check!(type_checker_error_dedup_first_occurrence); let result = try_type_check(source); assert!( result.is_err(), @@ -130,7 +129,6 @@ mod error_recovery_tests { return 0; } "#; - cov_mark::check!(type_checker_error_dedup_skips_duplicate); let result = try_type_check(source); assert!( result.is_err(), @@ -148,6 +146,36 @@ mod error_recovery_tests { } } + /// Structural coverage: verifies that the first occurrence of a deduplicated + /// error type hits the `type_checker_error_dedup_first_occurrence` branch in + /// `push_error_dedup`. Uses a source with exactly one `UnknownType` so the + /// mark fires exactly once. + #[test] + fn test_error_dedup_first_occurrence() { + let source = r#"fn test(x: UnknownType) -> i32 { return 0; }"#; + cov_mark::check_count!(type_checker_error_dedup_first_occurrence, 1); + let result = try_type_check(source); + assert!( + result.is_err(), + "Type checker should report unknown type error" + ); + } + + /// Structural coverage: verifies that the second occurrence of the same + /// deduplicated error type hits the `type_checker_error_dedup_skips_duplicate` + /// branch in `push_error_dedup`. Uses a source where `UnknownType` appears + /// exactly twice: one first_occurrence hit, one skips_duplicate hit. + #[test] + fn test_error_dedup_skips_duplicate() { + let source = r#"fn test(a: UnknownType, b: UnknownType) -> i32 { return 0; }"#; + cov_mark::check_count!(type_checker_error_dedup_skips_duplicate, 1); + let result = try_type_check(source); + assert!( + result.is_err(), + "Type checker should report unknown type error" + ); + } + #[test] fn test_method_call_on_non_struct_infers_arguments() { let source = r#" From 9d2393821f0c93507532642fbe124c829da2b108 Mon Sep 17 00:00:00 2001 From: Georgii Plotnikov Date: Fri, 20 Feb 2026 06:04:52 +0500 Subject: [PATCH 5/5] Update tests/src/type_checker/error_recovery.rs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Georgii Plotnikov --- tests/src/type_checker/error_recovery.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/src/type_checker/error_recovery.rs b/tests/src/type_checker/error_recovery.rs index dd4b131..8ec6279 100644 --- a/tests/src/type_checker/error_recovery.rs +++ b/tests/src/type_checker/error_recovery.rs @@ -164,7 +164,10 @@ mod error_recovery_tests { /// Structural coverage: verifies that the second occurrence of the same /// deduplicated error type hits the `type_checker_error_dedup_skips_duplicate` /// branch in `push_error_dedup`. Uses a source where `UnknownType` appears - /// exactly twice: one first_occurrence hit, one skips_duplicate hit. + /// exactly twice so that the first occurrence hits + /// `type_checker_error_dedup_first_occurrence` and the second occurrence + /// hits `type_checker_error_dedup_skips_duplicate`; this test specifically + /// asserts only on the skips-duplicate path. #[test] fn test_error_dedup_skips_duplicate() { let source = r#"fn test(a: UnknownType, b: UnknownType) -> i32 { return 0; }"#;