diff --git a/lib/liquid/block.rb b/lib/liquid/block.rb index f6698442..9d7b7521 100644 --- a/lib/liquid/block.rb +++ b/lib/liquid/block.rb @@ -29,6 +29,11 @@ module Liquid end def unknown_tag(tag, _params, _tokens) + Block.raise_unknown_tag(tag, block_name, block_delimiter, parse_context) + end + + # @api private + def self.raise_unknown_tag(tag, block_name, block_delimiter, parse_context) if tag == 'else' raise SyntaxError, parse_context.locale.t("errors.syntax.unexpected_else", block_name: block_name) diff --git a/lib/liquid/block_body.rb b/lib/liquid/block_body.rb index 67ddf363..973450e4 100644 --- a/lib/liquid/block_body.rb +++ b/lib/liquid/block_body.rb @@ -54,21 +54,20 @@ module Liquid end # @api private - def self.unknown_tag_in_liquid_tag(end_tag_name, end_tag_markup) - yield end_tag_name, end_tag_markup - ensure - Usage.increment("liquid_tag_contains_outer_tag") unless $ERROR_INFO.is_a?(SyntaxError) + def self.unknown_tag_in_liquid_tag(tag, parse_context) + Block.raise_unknown_tag(tag, 'liquid', '%}', parse_context) end - private def parse_liquid_tag(markup, parse_context, &block) + private def parse_liquid_tag(markup, parse_context) liquid_tag_tokenizer = Tokenizer.new(markup, line_number: parse_context.line_number, for_liquid_tag: true) - parse_for_liquid_tag(liquid_tag_tokenizer, parse_context) do |end_tag_name, end_tag_markup| - next unless end_tag_name - self.class.unknown_tag_in_liquid_tag(end_tag_name, end_tag_markup, &block) + parse_for_liquid_tag(liquid_tag_tokenizer, parse_context) do |end_tag_name, _end_tag_markup| + if end_tag_name + BlockBody.unknown_tag_in_liquid_tag(end_tag_name, parse_context) + end end end - private def parse_for_document(tokenizer, parse_context, &block) + private def parse_for_document(tokenizer, parse_context) while (token = tokenizer.shift) next if token.empty? case @@ -87,7 +86,7 @@ module Liquid end if tag_name == 'liquid' - parse_liquid_tag(markup, parse_context, &block) + parse_liquid_tag(markup, parse_context) next end diff --git a/test/integration/tags/liquid_tag_test.rb b/test/integration/tags/liquid_tag_test.rb index c1c267ea..b8eb8816 100644 --- a/test/integration/tags/liquid_tag_test.rb +++ b/test/integration/tags/liquid_tag_test.rb @@ -82,15 +82,13 @@ class LiquidTagTest < Minitest::Test end def test_nested_liquid_tag - assert_usage_increment("liquid_tag_contains_outer_tag", times: 0) do - assert_template_result('good', <<~LIQUID) - {%- if true %} - {%- liquid - echo "good" - %} - {%- endif -%} - LIQUID - end + assert_template_result('good', <<~LIQUID) + {%- if true %} + {%- liquid + echo "good" + %} + {%- endif -%} + LIQUID end def test_cannot_open_blocks_living_past_a_liquid_tag @@ -102,14 +100,12 @@ class LiquidTagTest < Minitest::Test LIQUID end - def test_quirk_can_close_blocks_created_before_a_liquid_tag - assert_usage_increment("liquid_tag_contains_outer_tag") do - assert_template_result("42", <<~LIQUID) - {%- if true -%} - 42 - {%- liquid endif -%} - LIQUID - end + def test_cannot_close_blocks_created_before_a_liquid_tag + assert_match_syntax_error("syntax error (line 3): 'endif' is not a valid delimiter for liquid tags. use %}", <<~LIQUID) + {%- if true -%} + 42 + {%- liquid endif -%} + LIQUID end def test_liquid_tag_in_raw