ruby / rbs

Type Signature for Ruby
Other
1.91k stars 201 forks source link

Parsing errors occur in null-byte character type definitions #1344

Closed tmimura39 closed 6 months ago

tmimura39 commented 1 year ago

If a null-byte character (\u0000) is defined as a literal type, a parse error occurs.

# cat my_module.rb
class MyModule
  def self.string
    "\u0000"
  end
end

# rbs prototype rb my_module.rb -o sig --force
Processing `my_module.rb`...
  Generating RBS for `my_module.rb`...
    - Writing RBS to existing file `sig/my_module.rbs`...

# cat sig/my_module.rbs
class MyModule
  def self.string: () -> "\u0000"
end

# rbs -Isig validate --silent
/usr/local/bundle/gems/rbs-3.1.0/lib/rbs/parser_aux.rb:17:in `_parse_signature': sig/my_module.rbs:2:25...2:26: Syntax error: unexpected token for simple type, token=`"` (ErrorToken) (RBS::ParsingError)

    def self.string: () -> "\u0000"
                           ^

    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/parser_aux.rb:17:in `parse_signature'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:146:in `block (2 levels) in each_signature'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/file_finder.rb:13:in `each_file'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/file_finder.rb:26:in `block in each_file'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/file_finder.rb:25:in `each'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/file_finder.rb:25:in `each_file'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:140:in `block in each_signature'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:130:in `block in each_dir'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:129:in `each'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:129:in `each_dir'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:137:in `each_signature'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:101:in `load'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment.rb:172:in `block in from_loader'
    from <internal:kernel>:90:in `tap'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment.rb:171:in `from_loader'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/cli.rb:460:in `run_validate'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/cli.rb:137:in `run'
    from /usr/local/bundle/gems/rbs-3.1.0/exe/rbs:7:in `<top (required)>'
    from /usr/local/bundle/bin/rbs:25:in `load'
    from /usr/local/bundle/bin/rbs:25:in `<main>'

This is also true for constant definitions.

# cat my_module.rb
class MyModule
  NULL_BYTE = "\u0000"
end

# rbs prototype rb my_module.rb -o sig --force
Processing `my_module.rb`...
  Generating RBS for `my_module.rb`...
    - Writing RBS to existing file `sig/my_module.rbs`...

# cat sig/my_module.rbs
class MyModule
  NULL_BYTE: "\u0000"
end

# rbs -Isig validate --silent
/usr/local/bundle/gems/rbs-3.1.0/lib/rbs/parser_aux.rb:17:in `_parse_signature': sig/my_module.rbs:2:13...2:14: Syntax error: unexpected token for simple type, token=`"` (ErrorToken) (RBS::ParsingError)

    NULL_BYTE: "\u0000"
               ^

    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/parser_aux.rb:17:in `parse_signature'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:146:in `block (2 levels) in each_signature'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/file_finder.rb:13:in `each_file'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/file_finder.rb:26:in `block in each_file'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/file_finder.rb:25:in `each'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/file_finder.rb:25:in `each_file'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:140:in `block in each_signature'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:130:in `block in each_dir'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:129:in `each'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:129:in `each_dir'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:137:in `each_signature'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment_loader.rb:101:in `load'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment.rb:172:in `block in from_loader'
    from <internal:kernel>:90:in `tap'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/environment.rb:171:in `from_loader'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/cli.rb:460:in `run_validate'
    from /usr/local/bundle/gems/rbs-3.1.0/lib/rbs/cli.rb:137:in `run'
    from /usr/local/bundle/gems/rbs-3.1.0/exe/rbs:7:in `<top (required)>'
    from /usr/local/bundle/bin/rbs:25:in `load'
    from /usr/local/bundle/bin/rbs:25:in `<main>'

Is it a bug in the parser? Or is it an incorrect way of defining the null-byte character type (prototype bug)?

pocke commented 1 year ago

1316 will fix this problem by updating RBS::Writer.

soutaro commented 6 months ago

Fixed in #1685