1
0
Fork 0
mirror of https://github.com/imjasonh/nescript synced 2026-07-10 17:52:51 +00:00

Analyzer: W0104 warn on dead code after terminator

When a block contains a statement after \`return\`, \`break\`,
\`continue\`, or \`transition\`, the trailing statement is unreachable
and the analyzer now emits W0104 pointing at it. The warning includes
a secondary label on the terminator showing where execution stops.

Adds \`Statement::span\` helper to the AST so diagnostics can point at
arbitrary statements cleanly.

https://claude.ai/code/session_01W6eQFStA66EuMKHUFo2rx3
This commit is contained in:
Claude 2026-04-12 11:08:14 +00:00
parent e688397594
commit f8743cf95e
No known key found for this signature in database
3 changed files with 112 additions and 0 deletions

View file

@ -298,6 +298,64 @@ fn analyze_return_wrong_type() {
);
}
#[test]
fn analyze_dead_code_after_break() {
let src = r#"
game "Test" { mapper: NROM }
var x: u8 = 0
on frame {
loop {
break
x += 1
}
}
start Main
"#;
let errors = analyze_errors(src);
assert!(
errors.contains(&ErrorCode::W0104),
"code after break should trigger W0104, got: {errors:?}"
);
}
#[test]
fn analyze_dead_code_after_transition() {
let src = r#"
game "Test" { mapper: NROM }
state A {
on frame {
transition B
wait_frame
}
}
state B { on frame { wait_frame } }
start A
"#;
let errors = analyze_errors(src);
assert!(
errors.contains(&ErrorCode::W0104),
"code after transition should trigger W0104, got: {errors:?}"
);
}
#[test]
fn analyze_dead_code_after_return_in_fn() {
let src = r#"
game "Test" { mapper: NROM }
fun foo() -> u8 {
return 5
return 6
}
on frame { wait_frame }
start Main
"#;
let errors = analyze_errors(src);
assert!(
errors.contains(&ErrorCode::W0104),
"code after return should trigger W0104, got: {errors:?}"
);
}
#[test]
fn analyze_ram_overflow_emits_e0301() {
// Two arrays totalling >2 KB cannot fit in NES RAM, triggering