Skip to content

Add utility `rubocop-parse`

Peter Leitzen requested to merge scripts/rubocop-parse into master

What does this MR do and why?

This MR adds a new utility rubocop-parse to be used instead of ruby-parse.

In certain situations ruby-parse emits different AST than what RuboCop emits internally. This is because RuboCop maps nodes emitted by parser gem which leads to differences like:

ruby-parse

ruby-parse -e 'with(foo: 1)'
(send nil :with
  (kwargs
    (pair
      (sym :foo)
      (int 1))))

rubocop-parse

scripts/rubocop-parse -e 'with(foo: 1)'
(send nil :with
  (hash
    (pair
      (sym :foo)
      (int 1))))

Note that kwargshash.

Examples

$ scripts/rubocop-parse -h
Usage: scripts/rubocop-parse [-e code] [FILE...]
    -e, --eval FRAGEMENT             Process a fragment of Ruby code
    -v, --ruby-version RUBY_VERSION  Parse as Ruby would. Defaults to RuboCop TargetRubyVersion setting.
    -h, --help

scripts/rubocop-parse -e "puts hello"
(send nil :puts
  (send nil :hello))

scripts/rubocop-parse -e "puts hello" -v 3.0
(send nil :puts
  (send nil :hello))

scripts/rubocop-parse app/models/project.rb | head
(begin
  (send nil :require
    (str "carrierwave/orm/activerecord"))
  (class
    (const nil :Project)
    (const nil :ApplicationRecord)
    (begin
      (send nil :include
        (const
          (const nil :Gitlab) :ConfigHelper))
...

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Peter Leitzen

Merge request reports