diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-27 18:07:48 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-27 18:07:48 +0000 |
commit | e20baee820ea2c76ee16980a98e8080f255d9035 (patch) | |
tree | 6e13a73bee42b7ef310850d03982faebea17a0b1 /rubocop | |
parent | 71c5863d7b1ca9836a7d7703f35750cd726a9846 (diff) | |
download | gitlab-ce-e20baee820ea2c76ee16980a98e8080f255d9035.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'rubocop')
-rw-r--r-- | rubocop/cop/performance/readlines_each.rb | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/rubocop/cop/performance/readlines_each.rb b/rubocop/cop/performance/readlines_each.rb new file mode 100644 index 00000000000..cb4ffaca6e9 --- /dev/null +++ b/rubocop/cop/performance/readlines_each.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + module Performance + class ReadlinesEach < RuboCop::Cop::Cop + MESSAGE = 'Avoid `IO.readlines.each`, since it reads contents into memory in full. ' \ + 'Use `IO.each_line` or `IO.each` instead.' + + def_node_matcher :full_file_read_via_class?, <<~PATTERN + (send + (send (const nil? {:IO :File}) :readlines _) :each) + PATTERN + + def_node_matcher :full_file_read_via_instance?, <<~PATTERN + (... (... :readlines) :each) + PATTERN + + def on_send(node) + full_file_read_via_class?(node) { add_offense(node, location: :selector, message: MESSAGE) } + full_file_read_via_instance?(node) { add_offense(node, location: :selector, message: MESSAGE) } + end + + def autocorrect(node) + lambda do |corrector| + corrector.replace(node.loc.expression, node.source.gsub('readlines.each', 'each_line')) + end + end + end + end + end +end |