From 9593e76ac2cfd9366b8b904df3fc3e1047af3aee Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Wed, 12 Jun 2019 15:23:47 +0900 Subject: Ripper::Lexer: fallback parse error token to the previous one --- ext/ripper/lib/ripper/lexer.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'ext') diff --git a/ext/ripper/lib/ripper/lexer.rb b/ext/ripper/lib/ripper/lexer.rb index 696471a75d..3a2138f310 100644 --- a/ext/ripper/lib/ripper/lexer.rb +++ b/ext/ripper/lib/ripper/lexer.rb @@ -103,7 +103,17 @@ class Ripper # parse the code and returns elements including errors. def scan - (parse() + errors + @stack.flatten).uniq.sort_by {|e| [*e.pos, (e.message ? -1 : 0)]} + result = (parse() + errors + @stack.flatten).uniq.sort_by {|e| [*e.pos, (e.message ? -1 : 0)]} + result.each_with_index do |e, i| + if e.event == :on_parse_error and e.tok.empty? and (pre = result[i-1]) and + pre.pos[0] == e.pos[0] and (pre.pos[1] + pre.tok.size) == e.pos[1] + e.tok = pre.tok + e.pos[1] = pre.pos[1] + result[i-1] = e + result[i] = pre + end + end + result end def parse -- cgit v1.2.3