ruby / syntax_suggest

Searching for unexpected `end` syntax errors takes a lot of time. Let this gem do it for you!

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Improve error message on trailing comma in method definition

schneems opened this issue · comments

The error produced by this (invalid) code is confusing and not helpful:

def run_build_script(
   workspace_dir: ARGV[0],
   output_dir: ARGV[1],
   cache_dir: ARGV[2],
   stack: ENV.fetch("STACK"),
   ruby_version: ENV.fetch("STACK"),
   io: STDOUT,
)
 end
$ exe/syntax_suggest /tmp/bad.rb
--> /tmp/bad.rb

syntax error, unexpected ':', expecting end-of-input

  1  def run_build_script(
> 2     workspace_dir: ARGV[0],
> 3     output_dir: ARGV[1],
> 4     cache_dir: ARGV[2],
> 5     stack: ENV.fetch("STACK"),
> 6     ruby_version: ENV.fetch("STACK"),
> 7     io: STDOUT,
  8  )

The problem is that there's a trailing comma. This code works (when you remove the comma after STDOUT):

$ cat /tmp/bad.rb
def run_build_script(
   workspace_dir: ARGV[0],
   output_dir: ARGV[1],
   cache_dir: ARGV[2],
   stack: ENV.fetch("STACK"),
   ruby_version: ENV.fetch("STACK"),
   io: STDOUT
)
 end
$ exe/syntax_suggest /tmp/bad.rb
Syntax OK

Fix Idea(s)

I'm not sure how to approach this. Possibly we could check for some variation of this regex https://rubular.com/r/aocG0GtGFjEiG2 as a brute force check. There may be a more elegant option.

Sidebar: I would love to see trailing commas allowed in method definitions. I think adding this behavior is an issue for positional args as you want that feedback that your airity is off. Idea: Allow it if and only if the method ends in a kwarg (instead of a positional arg). I don't know if it's been discussed or not.