@@ -168,12 +168,13 @@ def colorize_code(code, complete: true, ignore_error: false, colorable: colorabl
168168 # IRB::ColorPrinter skips colorizing syntax invalid fragments
169169 return Reline ::Unicode . escape_for_print ( code ) if ignore_error && !result . success?
170170
171+ prism_node , prism_tokens = result . value
171172 errors = result . errors
173+
172174 unless complete
173- errors = errors . reject { | error | error . message =~ / \A expected a|unexpected end-of-input|unterminated/ }
175+ errors = filter_incomplete_code_errors ( errors , prism_tokens )
174176 end
175177
176- prism_node , prism_tokens = result . value
177178 visitor = ColorizeVisitor . new
178179 prism_node . accept ( visitor )
179180
@@ -282,6 +283,29 @@ def visit_symbol_node(node)
282283
283284 private
284285
286+ FILTERED_ERROR_TYPES = [
287+ :class_name , :module_name , # `class`, `class owner_module`
288+ :write_target_unexpected , # `a, b`
289+ :parameter_wild_loose_comma , # `def f(a,`
290+ :argument_no_forwarding_star , # `[*`
291+ :argument_no_forwarding_star_star , # `f(**`
292+ :argument_no_forwarding_ampersand , # `f(&`
293+ :def_endless , # `def f =`
294+ :embdoc_term , # `=begin`
295+ ]
296+
297+ # Filter out syntax errors that are likely to be caused by incomplete code, to avoid showing misleading error highlights to users.
298+ def filter_incomplete_code_errors ( errors , tokens )
299+ last_non_comment_space_token , = tokens . reverse_each . find do |t , |
300+ t . type != :COMMENT && t . type != :EOF && t . type != :IGNORED_NEWLINE && t . type != :NEWLINE
301+ end
302+ last_offset = last_non_comment_space_token ? last_non_comment_space_token . location . end_offset : 0
303+ errors . reject do |error |
304+ error . message . match? ( /\A expected a|unexpected end-of-input|unterminated/ ) ||
305+ ( error . location . end_offset == last_offset && FILTERED_ERROR_TYPES . include? ( error . type ) )
306+ end
307+ end
308+
285309 def without_circular_ref ( obj , seen :, &block )
286310 return false if seen . key? ( obj )
287311 seen [ obj ] = true
0 commit comments