Clean control flow code

This commit is contained in:
dkanus 2026-04-28 21:28:34 +07:00
commit 150bd2f5cf
13 changed files with 1307 additions and 838 deletions

View file

@ -685,23 +685,38 @@ pub(super) const FOR_HEADER_FIXTURES: &[Fixture] = &[
];
#[test]
fn check_for_header_fixture_counts() {
fn check_p0016_for_header_fixture_counts() {
let runs = run_fixtures(FOR_HEADER_FIXTURES);
assert_eq!(runs.get("files/P0016_01.uc").unwrap().len(), 3);
assert_eq!(runs.get("files/P0016_02.uc").unwrap().len(), 2);
assert_eq!(runs.get("files/P0016_03.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0016_06.uc").unwrap().len(), 3);
}
#[test]
fn check_p0017_for_header_fixture_counts() {
let runs = run_fixtures(FOR_HEADER_FIXTURES);
assert_eq!(runs.get("files/P0017_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0017_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0017_04.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0017_05.uc").unwrap().len(), 1);
}
#[test]
fn check_p0018_for_header_fixture_counts() {
let runs = run_fixtures(FOR_HEADER_FIXTURES);
assert_eq!(runs.get("files/P0018_01.uc").unwrap().len(), 2);
assert_eq!(runs.get("files/P0018_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0018_03.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0018_06.uc").unwrap().len(), 1);
}
#[test]
fn check_p0019_for_header_fixture_counts() {
let runs = run_fixtures(FOR_HEADER_FIXTURES);
assert_eq!(runs.get("files/P0019_01.uc").unwrap().len(), 2);
assert_eq!(runs.get("files/P0019_02.uc").unwrap().len(), 1);
@ -709,12 +724,22 @@ fn check_for_header_fixture_counts() {
assert_eq!(runs.get("files/P0019_04.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0019_06.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0019_07.uc").unwrap().len(), 1);
}
#[test]
fn check_p0020_for_header_fixture_counts() {
let runs = run_fixtures(FOR_HEADER_FIXTURES);
assert_eq!(runs.get("files/P0020_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0020_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0020_03.uc").unwrap().len(), 2);
assert_eq!(runs.get("files/P0020_04.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0020_08.uc").unwrap().len(), 1);
}
#[test]
fn check_p0021_for_header_fixture_counts() {
let runs = run_fixtures(FOR_HEADER_FIXTURES);
assert_eq!(runs.get("files/P0021_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0021_02.uc").unwrap().len(), 1);
@ -1493,7 +1518,7 @@ fn check_p0021_for_header_fixtures() {
}
#[test]
fn check_for_header_body_recovery_fixtures() {
fn check_p0013_for_header_body_recovery_fixtures() {
let runs = run_fixtures(FOR_HEADER_FIXTURES);
assert_diagnostic(
@ -1590,4 +1615,307 @@ fn check_for_header_body_recovery_fixtures() {
notes: &[],
},
);
}
pub(super) const P0022_FIXTURES: &[Fixture] = &[
Fixture {
label: "files/P0022_01.uc",
source: "return ] ;",
},
Fixture {
label: "files/P0022_02.uc",
source: "return\n ]\n;\n",
},
Fixture {
label: "files/P0022_03.uc",
source: "return\n}\n",
},
];
#[test]
fn check_p0022_fixtures() {
let runs = run_fixtures(P0022_FIXTURES);
assert_eq!(runs.get("files/P0022_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0022_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0022_03.uc").unwrap().len(), 1);
assert_diagnostic(
&runs.get_any("files/P0022_01.uc"),
&ExpectedDiagnostic {
headline: "expected return value expression or `;` after `return`, found `]`",
severity: Severity::Error,
code: Some("P0022"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(2),
end: TokenPosition(2),
},
message: "unexpected `]`",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0022_02.uc"),
&ExpectedDiagnostic {
headline: "expected return value expression or `;` after `return`, found `]`",
severity: Severity::Error,
code: Some("P0022"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(3),
end: TokenPosition(3),
},
message: "unexpected `]`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(0),
end: TokenPosition(0),
},
message: "after this `return`, a value expression or `;` was expected",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0022_03.uc"),
&ExpectedDiagnostic {
headline: "expected return value expression or `;` after `return`, found `}`",
severity: Severity::Error,
code: Some("P0022"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(2),
end: TokenPosition(2),
},
message: "unexpected `}`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(0),
end: TokenPosition(0),
},
message: "after this `return`, a value expression or `;` was expected",
}],
help: None,
notes: &[],
},
);
}
pub(super) const P0023_FIXTURES: &[Fixture] = &[
Fixture {
label: "files/P0023_01.uc",
source: "break ] ;",
},
Fixture {
label: "files/P0023_02.uc",
source: "break\n \n\n\n\n ]\n;\n",
},
Fixture {
label: "files/P0023_03.uc",
source: "break\n}\n",
},
];
#[test]
fn check_p0023_fixtures() {
let runs = run_fixtures(P0023_FIXTURES);
assert_eq!(runs.get("files/P0023_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0023_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0023_03.uc").unwrap().len(), 1);
assert_diagnostic(
&runs.get_any("files/P0023_01.uc"),
&ExpectedDiagnostic {
headline: "expected break value expression or `;` after `break`, found `]`",
severity: Severity::Error,
code: Some("P0023"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(2),
end: TokenPosition(2),
},
message: "unexpected `]`",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0023_02.uc"),
&ExpectedDiagnostic {
headline: "expected break value expression or `;` after `break`, found `]`",
severity: Severity::Error,
code: Some("P0023"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(8),
end: TokenPosition(8),
},
message: "unexpected `]`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(0),
end: TokenPosition(0),
},
message: "after this `break`, a value expression or `;` was expected",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0023_03.uc"),
&ExpectedDiagnostic {
headline: "expected break value expression or `;` after `break`, found `}`",
severity: Severity::Error,
code: Some("P0023"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(2),
end: TokenPosition(2),
},
message: "unexpected `}`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(0),
end: TokenPosition(0),
},
message: "after this `break`, a value expression or `;` was expected",
}],
help: None,
notes: &[],
},
);
}
pub(super) const P0024_FIXTURES: &[Fixture] = &[
Fixture {
label: "files/P0024_01.uc",
source: "goto;",
},
Fixture {
label: "files/P0024_02.uc",
source: "goto\n ;\n",
},
Fixture {
label: "files/P0024_03.uc",
source: "goto\n ]\n;\n",
},
Fixture {
label: "files/P0024_04.uc",
source: "goto",
},
];
#[test]
fn check_p0024_fixtures() {
let runs = run_fixtures(P0024_FIXTURES);
assert_eq!(runs.get("files/P0024_01.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0024_02.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0024_03.uc").unwrap().len(), 1);
assert_eq!(runs.get("files/P0024_04.uc").unwrap().len(), 1);
assert_diagnostic(
&runs.get_any("files/P0024_01.uc"),
&ExpectedDiagnostic {
headline: "expected label after `goto`, found `;`",
severity: Severity::Error,
code: Some("P0024"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(1),
end: TokenPosition(1),
},
message: "unexpected `;`",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0024_02.uc"),
&ExpectedDiagnostic {
headline: "expected label after `goto`, found `;`",
severity: Severity::Error,
code: Some("P0024"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(3),
end: TokenPosition(3),
},
message: "unexpected `;`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(0),
end: TokenPosition(0),
},
message: "after this `goto`, a label was expected",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0024_03.uc"),
&ExpectedDiagnostic {
headline: "expected label after `goto`, found `]`",
severity: Severity::Error,
code: Some("P0024"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(3),
end: TokenPosition(3),
},
message: "unexpected `]`",
}),
secondary_labels: &[ExpectedLabel {
span: TokenSpan {
start: TokenPosition(0),
end: TokenPosition(0),
},
message: "after this `goto`, a label was expected",
}],
help: None,
notes: &[],
},
);
assert_diagnostic(
&runs.get_any("files/P0024_04.uc"),
&ExpectedDiagnostic {
headline: "expected label after `goto`, found end of file",
severity: Severity::Error,
code: Some("P0024"),
primary_label: Some(ExpectedLabel {
span: TokenSpan {
start: TokenPosition(1),
end: TokenPosition(1),
},
message: "reached end of file here",
}),
secondary_labels: &[],
help: None,
notes: &[],
},
);
}