diff --git a/src/emit/mod.rs b/src/emit/mod.rs index 2c1a105..d052418 100644 --- a/src/emit/mod.rs +++ b/src/emit/mod.rs @@ -147,7 +147,7 @@ fn emit_ast_expr( *jump = new_jump as isize; } else { panic!("Got an else without a previous if?"); - }; + } if let Some(expression) = expression { let emit_slot = machine.reserve_slot(); @@ -167,6 +167,15 @@ fn emit_ast_expr( } } + if let Some(previous_jump) = previous_jump.take() { + let new_jump = eval.len() - previous_jump - 1; + let Instruction::JumpIfNotTrue { jump, .. } = &mut eval[previous_jump] else { + panic!("Jump slot had something that is not a jump?!"); + }; + + *jump = new_jump as isize; + } + if let Some(ws) = previous_post_whitespace_content { eval.push(Instruction::AppendContent { content: ws.source().clone(), diff --git a/tests/cases/1-parsed@if_else_if.snap b/tests/cases/1-parsed@if_else_if.snap new file mode 100644 index 0000000..287fce6 --- /dev/null +++ b/tests/cases/1-parsed@if_else_if.snap @@ -0,0 +1,36 @@ +--- +source: tests/file_tests.rs +expression: parsed +input_file: tests/cases/if_else_if.nomo +--- +ParsedTemplate { + tokens: [ + [LeftDelim]"{{" (0..2), + [Whitespace]" " (2..3), + [ConditionalIf]"if" (3..5), + [Whitespace]" " (5..6), + [Ident]"test" (6..10), + [Whitespace]" " (10..11), + [RightDelim]"}}" (11..13), + [Whitespace]"\n " (13..18), + [Content]"Not Hello World! :C" (18..37), + [Whitespace]"\n" (37..38), + [LeftDelim]"{{" (38..40), + [Whitespace]" " (40..41), + [ConditionalElse]"else" (41..45), + [Whitespace]" " (45..46), + [ConditionalIf]"if" (46..48), + [Whitespace]" " (48..49), + [Ident]"another_test" (49..61), + [Whitespace]" " (61..62), + [RightDelim]"}}" (62..64), + [Whitespace]"\n " (64..69), + [Content]"Hello World!" (69..81), + [Whitespace]"\n" (81..82), + [LeftDelim]"{{" (82..84), + [Whitespace]" " (84..85), + [End]"end" (85..88), + [Whitespace]" " (88..89), + [RightDelim]"}}" (89..91), + ], +} diff --git a/tests/cases/2-ast@if_else_if.snap b/tests/cases/2-ast@if_else_if.snap new file mode 100644 index 0000000..3bc850b --- /dev/null +++ b/tests/cases/2-ast@if_else_if.snap @@ -0,0 +1,60 @@ +--- +source: tests/file_tests.rs +expression: ast +input_file: tests/cases/if_else_if.nomo +--- +TemplateAst { + root: [ + ConditionalChain { + chain: [ + Block { + prev_whitespace_content: None, + expression: IfConditional { + expression: VariableAccess( + [Ident]"test" (6..10), + ), + }, + post_whitespace_content: Some( + [Whitespace]"\n " (13..18), + ), + }, + ConditionalContent { + content: [ + StaticContent( + [Content]"Not Hello World! :C" (18..37), + ), + ], + }, + Block { + prev_whitespace_content: Some( + [Whitespace]"\n" (37..38), + ), + expression: ElseConditional { + expression: Some( + VariableAccess( + [Ident]"another_test" (49..61), + ), + ), + }, + post_whitespace_content: Some( + [Whitespace]"\n " (64..69), + ), + }, + ConditionalContent { + content: [ + StaticContent( + [Content]"Hello World!" (69..81), + ), + ], + }, + Block { + prev_whitespace_content: Some( + [Whitespace]"\n" (81..82), + ), + expression: EndBlock, + post_whitespace_content: None, + }, + ], + }, + ], +} diff --git a/tests/cases/3-instructions@condition.snap b/tests/cases/3-instructions@condition.snap index 56d187e..943c455 100644 --- a/tests/cases/3-instructions@condition.snap +++ b/tests/cases/3-instructions@condition.snap @@ -14,7 +14,7 @@ input_file: tests/cases/condition.nomo emit_slot: VariableSlot { index: 0, }, - jump: 9223372036854775807, + jump: 5, }, AppendContent { content: "\n " (13..18), diff --git a/tests/cases/3-instructions@if_else_if.snap b/tests/cases/3-instructions@if_else_if.snap new file mode 100644 index 0000000..14b47e7 --- /dev/null +++ b/tests/cases/3-instructions@if_else_if.snap @@ -0,0 +1,61 @@ +--- +source: tests/file_tests.rs +expression: emit +input_file: tests/cases/if_else_if.nomo +--- +[ + LoadFromContextToSlot { + name: "test" (6..10), + slot: VariableSlot { + index: 0, + }, + }, + JumpIfNotTrue { + emit_slot: VariableSlot { + index: 0, + }, + jump: 5, + }, + AppendContent { + content: "\n " (13..18), + }, + AppendContent { + content: "Not Hello World! :C" (18..37), + }, + Jump { + jump: 9, + }, + AppendContent { + content: "\n " (13..18), + }, + AppendContent { + content: "\n" (37..38), + }, + LoadFromContextToSlot { + name: "another_test" (49..61), + slot: VariableSlot { + index: 1, + }, + }, + JumpIfNotTrue { + emit_slot: VariableSlot { + index: 1, + }, + jump: 5, + }, + AppendContent { + content: "\n " (64..69), + }, + AppendContent { + content: "Hello World!" (69..81), + }, + Jump { + jump: 2, + }, + AppendContent { + content: "\n " (64..69), + }, + AppendContent { + content: "\n" (81..82), + }, +] diff --git a/tests/cases/4-output@if_else_if.snap b/tests/cases/4-output@if_else_if.snap new file mode 100644 index 0000000..bee69fc --- /dev/null +++ b/tests/cases/4-output@if_else_if.snap @@ -0,0 +1,6 @@ +--- +source: tests/file_tests.rs +expression: output +input_file: tests/cases/if_else_if.nomo +--- +"\n\n Hello World!\n" diff --git a/tests/cases/if_else_if.nomo b/tests/cases/if_else_if.nomo new file mode 100644 index 0000000..befa0fe --- /dev/null +++ b/tests/cases/if_else_if.nomo @@ -0,0 +1,11 @@ +{ + "test": false, + "another_test": true, + "stuff": "more" +} +--- +{{ if test }} + Not Hello World! :C +{{ else if another_test }} + Hello World! +{{ end }} \ No newline at end of file