diff --git a/lib/syntax_tree/parser.rb b/lib/syntax_tree/parser.rb index 7e46e856..94ce115a 100644 --- a/lib/syntax_tree/parser.rb +++ b/lib/syntax_tree/parser.rb @@ -1327,6 +1327,11 @@ def on_else(statements) token.is_a?(Kw) && %w[end ensure].include?(token.value) end + if index.nil? + message = "Cannot find expected else ending" + raise ParseError.new(message, *find_token_error(keyword.location)) + end + node = tokens[index] ending = node.value == "end" ? tokens.delete_at(index) : node diff --git a/test/parser_test.rb b/test/parser_test.rb index fbff8ec2..6048cf11 100644 --- a/test/parser_test.rb +++ b/test/parser_test.rb @@ -55,5 +55,15 @@ def test_errors_on_missing_token_without_location def test_handles_strings_with_non_terminated_embedded_expressions assert_raises(Parser::ParseError) { SyntaxTree.parse('"#{"') } end + + def test_errors_on_else_missing_two_ends + assert_raises(Parser::ParseError) { SyntaxTree.parse(<<~RUBY) } + def foo + if something + else + call do + end + RUBY + end end end