Skip to content

YARD rake task crash #1603

@dvandersluis

Description

@dvandersluis

I am not exactly sure what the cause of this is, but the following code (simplified from real code) causes the YARD rake task to crash when in a file that's being evaluated:

class Test
  def foo
    x do
      next
    end
  end

  def bar
    y do |var|
      case var
      when :def
        next unless z?
      end
    end
  end
end
Crash backlog
rake aborted!
RangeError: cannot get the first element of beginless range (RangeError)
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/ruby/ruby_parser.rb:452:in 'Range#first'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/ruby/ruby_parser.rb:452:in 'YARD::Parser::Ruby::RipperParser#on_unless_mod'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/ruby/ruby_parser.rb:56:in 'Ripper#parse'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/ruby/ruby_parser.rb:56:in 'YARD::Parser::Ruby::RipperParser#parse'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/ruby/ruby_parser.rb:17:in 'YARD::Parser::Ruby::RubyParser#parse'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/source_parser.rb:442:in 'YARD::Parser::SourceParser#parse'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/source_parser.rb:45:in 'block in YARD::Parser::OrderedParser#parse'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/logging.rb:236:in 'YARD::Logger#capture'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/source_parser.rb:44:in 'YARD::Parser::OrderedParser#parse'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/source_parser.rb:371:in 'YARD::Parser::SourceParser.parse_in_order'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/source_parser.rb:114:in 'block in YARD::Parser::SourceParser.parse'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/logging.rb:145:in 'YARD::Logger#enter_level'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/parser/source_parser.rb:113:in 'YARD::Parser::SourceParser.parse'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard.rb:20:in 'YARD.parse'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/cli/yardoc.rb:259:in 'block in YARD::CLI::Yardoc#run'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/serializers/yardoc_serializer.rb:56:in 'YARD::Serializers::YardocSerializer#lock_for_writing'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/registry_store.rb:202:in 'YARD::RegistryStore#lock_for_writing'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/registry.rb:210:in 'YARD::Registry.lock_for_writing'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/cli/yardoc.rb:258:in 'YARD::CLI::Yardoc#run'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/yard-0.9.37/lib/yard/rake/yardoc_task.rb:74:in 'block in YARD::Rake::YardocTask#define'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/task.rb:281:in 'block in Rake::Task#execute'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/task.rb:281:in 'Array#each'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/task.rb:281:in 'Rake::Task#execute'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/task.rb:219:in 'block in Rake::Task#invoke_with_call_chain'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/task.rb:199:in 'Monitor#synchronize'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/task.rb:199:in 'Rake::Task#invoke_with_call_chain'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/task.rb:188:in 'Rake::Task#invoke'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/application.rb:182:in 'Rake::Application#invoke_task'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/application.rb:138:in 'block (2 levels) in Rake::Application#top_level'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/application.rb:138:in 'Array#each'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/application.rb:138:in 'block in Rake::Application#top_level'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/application.rb:147:in 'Rake::Application#run_with_threads'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/application.rb:132:in 'Rake::Application#top_level'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/application.rb:83:in 'block in Rake::Application#run'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/application.rb:208:in 'Rake::Application#standard_exception_handling'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/lib/rake/application.rb:80:in 'Rake::Application#run'
/Users/daniel/.rbenv/versions/3.4.1/lib/ruby/gems/3.4.0/gems/rake-13.1.0/exe/rake:27:in ''
/Users/daniel/.rbenv/versions/3.4.1/bin/rake:25:in 'Kernel#load'
/Users/daniel/.rbenv/versions/3.4.1/bin/rake:25:in ''

If the symbol on line 11 is changed from :def to something else, YARD no longer crashes. If either of the next keywords on lines 4 and 12 are changed, it no longer crashes either. If either method is removed, it no longer crashes as well.

I'm using YARD 0.9.37 on Ruby 3.4.1. My rake task setup looks like this:

YARD::Rake::YardocTask.new do |task|
  task.files = ['test.rb']
  task.options = ['--no-output']
end

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions