Skip to content

Commit c27302f

Browse files
authored
Merge pull request #97 from DanChianucci/fix/labeled_if
Correctly parse labeled "end if"
2 parents ff2059c + a920ebf commit c27302f

File tree

1 file changed

+86
-1
lines changed

1 file changed

+86
-1
lines changed

vhdl_lang/src/syntax/sequential_statement.rs

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ fn parse_if_statement_known_keyword(
126126
},
127127
End => {
128128
stream.expect_kind(If)?;
129+
stream.pop_if_kind(Identifier)?;
129130
conditionals.push(conditional);
130131
break;
131132
}
@@ -1238,6 +1239,33 @@ end if;
12381239
)
12391240
);
12401241
}
1242+
#[test]
1243+
fn parse_labeled_if_statement() {
1244+
let (code, statement) = parse(
1245+
"\
1246+
mylabel: if cond = true then
1247+
foo(1,2);
1248+
x := 1;
1249+
end if mylabel;
1250+
",
1251+
);
1252+
assert_eq!(
1253+
statement,
1254+
with_label(
1255+
Some(code.s1("mylabel").ident()),
1256+
SequentialStatement::If(IfStatement {
1257+
conditionals: vec![Conditional {
1258+
condition: code.s1("cond = true").expr(),
1259+
item: vec![
1260+
code.s1("foo(1,2);").sequential_statement(),
1261+
code.s1("x := 1;").sequential_statement()
1262+
]
1263+
}],
1264+
else_item: None
1265+
})
1266+
)
1267+
);
1268+
}
12411269

12421270
#[test]
12431271
fn parse_if_else_statement() {
@@ -1265,6 +1293,31 @@ end if;
12651293
);
12661294
}
12671295

1296+
#[test]
1297+
fn parse_labeled_if_else_statement() {
1298+
let (code, statement) = parse(
1299+
"\
1300+
mylabel: if cond = true then
1301+
foo(1,2);
1302+
else
1303+
x := 1;
1304+
end if mylabel;
1305+
",
1306+
);
1307+
assert_eq!(
1308+
statement,
1309+
with_label(
1310+
Some(code.s1("mylabel").ident()),
1311+
SequentialStatement::If(IfStatement {
1312+
conditionals: vec![Conditional {
1313+
condition: code.s1("cond = true").expr(),
1314+
item: vec![code.s1("foo(1,2);").sequential_statement()]
1315+
}],
1316+
else_item: Some(vec![code.s1("x := 1;").sequential_statement()])
1317+
})
1318+
)
1319+
);
1320+
}
12681321
#[test]
12691322
fn parse_if_elsif_else_statement() {
12701323
let (code, statement) = parse(
@@ -1298,7 +1351,39 @@ end if;
12981351
)
12991352
);
13001353
}
1301-
1354+
#[test]
1355+
fn parse_labeled_if_elsif_else_statement() {
1356+
let (code, statement) = parse(
1357+
"\
1358+
mylabel: if cond = true then
1359+
foo(1,2);
1360+
elsif cond2 = false then
1361+
y := 2;
1362+
else
1363+
x := 1;
1364+
end if mylabel;
1365+
",
1366+
);
1367+
assert_eq!(
1368+
statement,
1369+
with_label(
1370+
Some(code.s1("mylabel").ident()),
1371+
SequentialStatement::If(IfStatement {
1372+
conditionals: vec![
1373+
Conditional {
1374+
condition: code.s1("cond = true").expr(),
1375+
item: vec![code.s1("foo(1,2);").sequential_statement()]
1376+
},
1377+
Conditional {
1378+
condition: code.s1("cond2 = false").expr(),
1379+
item: vec![code.s1("y := 2;").sequential_statement()]
1380+
}
1381+
],
1382+
else_item: Some(vec![code.s1("x := 1;").sequential_statement()])
1383+
})
1384+
)
1385+
);
1386+
}
13021387
#[test]
13031388
fn parse_case_statement() {
13041389
let (code, statement) = parse(

0 commit comments

Comments
 (0)