diff --git a/CHANGELOG.md b/CHANGELOG.md index e7567a9ed22..235f53a4e3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## master (unreleased) +### Bug fixes + +* [#8627](https://github.com/rubocop-hq/rubocop/issues/8627): Fix a false positive for `Lint/DuplicateRequire` when same feature argument but different require method. ([@koic][]) + ## 0.90.0 (2020-09-01) ### New features diff --git a/docs/modules/ROOT/pages/cops_lint.adoc b/docs/modules/ROOT/pages/cops_lint.adoc index 3d1030febdb..a842e8d9aaf 100644 --- a/docs/modules/ROOT/pages/cops_lint.adoc +++ b/docs/modules/ROOT/pages/cops_lint.adoc @@ -805,6 +805,10 @@ require 'foo' # good require 'foo' require 'bar' + +# good +require 'foo' +require_relative 'foo' ---- == Lint/DuplicateRescueException diff --git a/lib/rubocop/cop/lint/duplicate_require.rb b/lib/rubocop/cop/lint/duplicate_require.rb index 81f13998a2e..9f4aed20683 100644 --- a/lib/rubocop/cop/lint/duplicate_require.rb +++ b/lib/rubocop/cop/lint/duplicate_require.rb @@ -15,6 +15,10 @@ module Lint # require 'foo' # require 'bar' # + # # good + # require 'foo' + # require_relative 'foo' + # class DuplicateRequire < Base MSG = 'Duplicate `%s` detected.' REQUIRE_METHODS = %i[require require_relative].freeze @@ -31,7 +35,7 @@ def on_new_investigation def on_send(node) return unless REQUIRE_METHODS.include?(node.method_name) && require_call?(node) - return if @required[node.parent].add?(node.first_argument) + return if @required[node.parent].add?("#{node.method_name}#{node.first_argument}") add_offense(node, message: format(MSG, method: node.method_name)) end diff --git a/spec/rubocop/cop/lint/duplicate_require_spec.rb b/spec/rubocop/cop/lint/duplicate_require_spec.rb index 8767d4c5b25..175411ddf46 100644 --- a/spec/rubocop/cop/lint/duplicate_require_spec.rb +++ b/spec/rubocop/cop/lint/duplicate_require_spec.rb @@ -73,6 +73,13 @@ def m RUBY end + it 'does not register an offense when same feature argument but different require method' do + expect_no_offenses(<<~RUBY) + require 'feature' + require_relative 'feature' + RUBY + end + it 'does not register an offense when calling user-defined `require` method' do expect_no_offenses(<<~RUBY) params.require(:user)