rubocop / rubocop-performance

An extension of RuboCop focused on code performance checks.
https://docs.rubocop.org/rubocop-performance
MIT License
674 stars 79 forks source link

Make `Performance/Detect` aware of safe navigation operator #399

Closed ydakuka closed 9 months ago

ydakuka commented 9 months ago

Describe the solution you'd like

# bad
def my_method
  outcome.select do |r|
    r[:points].present? && r[:points] <= score
  end&.first
end

# bad
def my_method
  outcome&.select do |r|
    r[:points].present? && r[:points] <= score
  end&.first
end

Rubocop

ydakuka@yauhenid:~/Work/project$ bin/rails_docker rubocop -V
1.57.2 (using Parser 3.2.2.4, rubocop-ast 1.29.0, running on ruby 2.7.8) [x86_64-linux]
  - rubocop-capybara 2.19.0
  - rubocop-factory_bot 2.24.0
  - rubocop-performance 1.19.1
  - rubocop-rails 2.22.0
  - rubocop-rake 0.6.0
  - rubocop-rspec 2.25.0
  - rubocop-thread_safety 0.5.1
ydakuka commented 9 months ago

For some reasons, in the following code (without safe navigation operator) rubocop does not find any offenses too:

def my_method
  outcome.select do |r|
    # TODO: some code
  end.first
end
koic commented 9 months ago

I will close this as it seems to be a corner case and also appears to deviate from the semantics.

ydakuka commented 9 months ago

it seems to be a corner case

I fully disagree with this. It’s a common case for me to write code like this.