Skip to content

Commit 0a237d8

Browse files
committed
fix: error in if-chain
1 parent 889a49f commit 0a237d8

File tree

4 files changed

+54
-33
lines changed

4 files changed

+54
-33
lines changed

src/modules/command/modifier.rs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ impl CommandModifier {
3232
self.is_expr = true;
3333
self
3434
}
35+
36+
fn flip_unsafe(&mut self, meta: &mut ParserMetadata, is_unsafe: bool) {
37+
if is_unsafe {
38+
swap(&mut self.is_unsafe, &mut meta.context.is_unsafe_ctx);
39+
}
40+
}
3541
}
3642

3743
impl SyntaxModule<ParserMetadata> for CommandModifier {
@@ -79,30 +85,36 @@ impl SyntaxModule<ParserMetadata> for CommandModifier {
7985
}
8086
sequence = sequence.trim().to_string();
8187
let is_unsafe = self.is_unsafe;
82-
if is_unsafe {
83-
swap(&mut self.is_unsafe, &mut meta.context.is_unsafe_ctx);
84-
}
88+
self.flip_unsafe(meta, is_unsafe);
8589
if self.is_expr {
86-
syntax(meta, &mut *self.expr)?;
90+
if let Err(err) = syntax(meta, &mut *self.expr) {
91+
self.flip_unsafe(meta, is_unsafe);
92+
return Err(err)
93+
}
8794
if !matches!(self.expr.value, Some(ExprType::CommandExpr(_) | ExprType::FunctionInvocation(_))) {
95+
self.flip_unsafe(meta, is_unsafe);
8896
return error!(meta, tok, format!("Expected command or function call, after '{sequence}' command modifiers."));
8997
}
9098
} else {
9199
match token(meta, "{") {
92100
Ok(_) => {
93-
syntax(meta, &mut *self.block)?;
101+
if let Err(err) = syntax(meta, &mut *self.block) {
102+
self.flip_unsafe(meta, is_unsafe);
103+
return Err(err)
104+
}
94105
token(meta, "}")?;
95106
},
96107
Err(_) => {
97108
let mut statement = Statement::new();
98-
syntax(meta, &mut statement)?;
109+
if let Err(err) = syntax(meta, &mut statement) {
110+
self.flip_unsafe(meta, is_unsafe);
111+
return Err(err)
112+
}
99113
self.block.push_statement(statement);
100114
}
101115
}
102116
}
103-
if is_unsafe {
104-
swap(&mut self.is_unsafe, &mut meta.context.is_unsafe_ctx);
105-
}
117+
self.flip_unsafe(meta, is_unsafe);
106118
Ok(())
107119
}
108120
}

src/modules/condition/failed.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ impl SyntaxModule<ParserMetadata> for Failed {
6161
self.is_parsed = true;
6262
return Ok(());
6363
} else {
64+
dbg!("FAILED");
6465
return error!(meta, tok, "Failed expression must be followed by a block or statement")
6566
}
6667
}

src/modules/condition/ifchain.rs

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ impl SyntaxModule<ParserMetadata> for IfChain {
2222
}
2323

2424
fn parse(&mut self, meta: &mut ParserMetadata) -> SyntaxResult {
25-
let mut is_else = false;
2625
token(meta, "if")?;
2726
// Parse true block
2827
token(meta, "{")?;
@@ -35,11 +34,26 @@ impl SyntaxModule<ParserMetadata> for IfChain {
3534
}
3635
// Handle else keyword
3736
if token(meta, "else").is_ok() {
38-
is_else = true;
39-
break
37+
match token(meta, "{") {
38+
Ok(_) => {
39+
let mut false_block = Box::new(Block::new());
40+
syntax(meta, &mut *false_block)?;
41+
self.false_block = Some(false_block);
42+
token(meta, "}")?;
43+
}
44+
Err(_) => {
45+
let mut statement = Statement::new();
46+
token(meta, ":")?;
47+
syntax(meta, &mut statement)?;
48+
self.false_block = Some(Box::new(Block::new()));
49+
self.false_block.as_mut().unwrap().push_statement(statement);
50+
}
51+
}
52+
token(meta, "}")?;
53+
return Ok(())
4054
}
4155
if token(meta, "}").is_ok() {
42-
break
56+
return Ok(())
4357
}
4458
// Handle end of the if chain
4559
if let Err(err) = syntax(meta, &mut cond) {
@@ -60,26 +74,6 @@ impl SyntaxModule<ParserMetadata> for IfChain {
6074
}
6175
}
6276
}
63-
// Parse false block
64-
if is_else {
65-
match token(meta, "{") {
66-
Ok(_) => {
67-
let mut false_block = Box::new(Block::new());
68-
syntax(meta, &mut *false_block)?;
69-
self.false_block = Some(false_block);
70-
token(meta, "}")?;
71-
}
72-
Err(_) => {
73-
let mut statement = Statement::new();
74-
token(meta, ":")?;
75-
syntax(meta, &mut statement)?;
76-
self.false_block = Some(Box::new(Block::new()));
77-
self.false_block.as_mut().unwrap().push_statement(statement);
78-
}
79-
}
80-
}
81-
token(meta, "}")?;
82-
Ok(())
8377
}
8478
}
8579

src/tests/validity.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,20 @@ fn if_statements_else() {
208208

209209
#[test]
210210
fn if_statement_chain() {
211+
let code = "
212+
let x = 42
213+
let y = 42
214+
if {
215+
x == y {
216+
echo x
217+
}
218+
}
219+
";
220+
test_amber!(code, "42");
221+
}
222+
223+
#[test]
224+
fn if_statement_chain_else() {
211225
let code = "
212226
let x = 42
213227
let y = 24

0 commit comments

Comments
 (0)