Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DoubleNegation w/allowed_in_returns incorrectly reports offenses inside returned conditional clauses #10474

Closed
nevans opened this issue Mar 24, 2022 · 0 comments · Fixed by #10477
Labels

Comments

@nevans
Copy link
Contributor

nevans commented Mar 24, 2022

Assuming the default configuration for Style/DoubleNegation, where EnforcedStyle: allowed_in_returns...

Expected behavior

Double negation should be valid inside hash literals or array literals which are used as return values.

(ideally, I'd also prefer a more lax EnforcedStyle: disallow_in_conditionals, but that needs a feature ticket...)

Actual behavior and steps to reproduce the problem

with example.rb:

def bangbang_inside_a_hash
  { foo: etc, bar: !!baz } # => okay
end

def bangbang_inside_an_array
  [!!foo0, bar0, baz0]  # => okay
end

def bangbang_inside_an_array_inside_an_if_elsif_else
  if foo?
    [!!foo0, bar0, baz0]  # => incorrectly triggers Style/DoubleNegation
  elsif bar?
    [foo1, !!bar1, baz1]  # => incorrectly triggers Style/DoubleNegation
  elsif baz?
    [foo2, bar2, !!baz2]  # => incorrectly triggers Style/DoubleNegation
  else
    [foo3, !!bar3, baz3]  # => but this is okay
  end
end

def bangbang_inside_an_if_elsif_else_inside_a_hash
  if foo?
    { foo: !!foo0, bar: bar0, baz: baz0 }  # => incorrectly triggers Style/DoubleNegation
  elsif bar?
    { foo: !!foo1, bar: bar1, baz: baz1 }  # => incorrectly triggers Style/DoubleNegation
  elsif baz?
    { foo: !!foo2, bar: bar2, baz: baz2 }  # => incorrectly triggers Style/DoubleNegation
  else
    { foo: !!foo3, bar: bar3, baz: baz3 }  # => but this is okay
  end
end

def bangbang_inside_an_case_when_inside_a_hash
  case foobar
  when Foo
    { foo: !!foo0, bar: bar0, baz: baz0 }  # => incorrectly triggers Style/DoubleNegation
  when Boo
    { foo: !!foo1, bar: bar1, baz: baz1 }  # => incorrectly triggers Style/DoubleNegation
  when FooBar
    { foo: !!foo2, bar: bar2, baz: baz2 }  # => incorrectly triggers Style/DoubleNegation
  else
    { foo: !!foo3, bar: bar3, baz: baz3 }  # => but this is okay
  end
end

def bangbang_inside_an_case_when_inside_a_hash
  case foobar
  in Foo
    { foo: !!foo0, bar: bar0, baz: baz0 }  # => incorrectly triggers Style/DoubleNegation
  in Boo
    { foo: !!foo1, bar: bar1, baz: baz1 }  # => incorrectly triggers Style/DoubleNegation
  in FooBar
    { foo: !!foo2, bar: bar2, baz: baz2 }  # => incorrectly triggers Style/DoubleNegation
  else
    { foo: !!foo3, bar: bar3, baz: baz3 }  # => but this is okay
  end
end

The following command:

rubocop --only Style/DoubleNegation --force-default-config --cache false --debug example.rb

Returns the following offenses:

Default configuration from /home/nick/.rbenv/versions/2.7.4/lib/ruby/gems/2.7.0/gems/rubocop-1.26.1/config/default.yml
Inspecting 1 file
Scanning /home/nick/src/mailstrom/tmp/example.rb
C

Offenses:

example.rb:13:6: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    [!!foo0, bar0, baz0]  # => incorrectly triggers Style/DoubleNegation
     ^
example.rb:15:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    [foo1, !!bar1, baz1]  # => incorrectly triggers Style/DoubleNegation
           ^
example.rb:17:18: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    [foo2, bar2, !!baz2]  # => incorrectly triggers Style/DoubleNegation
                 ^
example.rb:25:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    { foo: !!foo0, bar: bar0, baz: baz0 }  # => incorrectly triggers Style/DoubleNegation
           ^
example.rb:27:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    { foo: !!foo1, bar: bar1, baz: baz1 }  # => incorrectly triggers Style/DoubleNegation
           ^
example.rb:29:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    { foo: !!foo2, bar: bar2, baz: baz2 }  # => incorrectly triggers Style/DoubleNegation
           ^
example.rb:38:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    { foo: !!foo0, bar: bar0, baz: baz0 }  # => incorrectly triggers Style/DoubleNegation
           ^
example.rb:40:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    { foo: !!foo1, bar: bar1, baz: baz1 }  # => incorrectly triggers Style/DoubleNegation
           ^
example.rb:42:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    { foo: !!foo2, bar: bar2, baz: baz2 }  # => incorrectly triggers Style/DoubleNegation
           ^
example.rb:51:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    { foo: !!foo0, bar: bar0, baz: baz0 }  # => incorrectly triggers Style/DoubleNegation
           ^
example.rb:53:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    { foo: !!foo1, bar: bar1, baz: baz1 }  # => incorrectly triggers Style/DoubleNegation
           ^
example.rb:55:12: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    { foo: !!foo2, bar: bar2, baz: baz2 }  # => incorrectly triggers Style/DoubleNegation
           ^

1 file inspected, 12 offenses detected, 12 offenses auto-correctable

RuboCop version

$ rubocop --force-default-config -V
1.26.1 (using Parser 3.1.1.0, rubocop-ast 1.16.0, running on ruby 2.7.4 x86_64-linux)
@nevans nevans changed the title DoubleNegation allowed_in_returns inside conditionals DoubleNegation allowed_in_returns incorrectly reports offenses inside returned conditional clauses Mar 24, 2022
@nevans nevans changed the title DoubleNegation allowed_in_returns incorrectly reports offenses inside returned conditional clauses DoubleNegation w/allowed_in_returns incorrectly reports offenses inside returned conditional clauses Mar 24, 2022
@koic koic added the bug label Mar 25, 2022
ydah added a commit to ydah/rubocop that referenced this issue Mar 25, 2022
…ith `EnforcedStyle: allowed_in_returns` when inside returned conditional clauses
koic added a commit that referenced this issue Mar 26, 2022
…turns

[Fix #10474] Fix a false positive for `Style/DoubleNegation` with `EnforcedStyle: allowed_in_returns` when inside returned conditional clauses
koic added a commit to koic/rubocop that referenced this issue Apr 9, 2022
This PR fixes the following false positive for `Style/DoubleNegation`
when inside returned conditional clauses with Ruby 2.7's pattern matching.

The following is a reproduction case.

```ruby
def foo?
  case condition
  in foo
    !!foo
  in bar
    !!bar
  else
    !!baz
  end
end
```

It is expected that an offense will not be registered, but in actually
an offense will be registered.

```console
% bundle exec rubocop --only Style/DoubleNegation
(snip)

Inspecting 2 files
C.

Offenses:

example.rb:4:5: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    !!foo
    ^
example.rb:6:5: C: [Correctable] Style/DoubleNegation: Avoid the use of double negation (!!).
    !!bar
    ^

2 files inspected, 2 offenses detected, 2 offenses auto-correctable
```

This is a follow-up to the same issue as rubocop#10474 and requires RuboCop AST 1.7 to fix.
Therefore it bumps RuboCop AST required to use rubocop/rubocop-ast#227
to 1.7 or higher.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
2 participants