credo icon indicating copy to clipboard operation
credo copied to clipboard

Detect ambiguity in function calls without parentheses

Open Artur-Sulej opened this issue 6 months ago • 1 comments

Precheck

  • Proposals for new features should be submitted via: https://github.com/rrrene/credo-proposals
  • For bugs, please do a quick search and make sure the bug has not yet been reported here

Environment

  • Credo version (mix credo -v): 1.7.3
  • Erlang/Elixir version (elixir -v): 1.16.2/OTP 26
  • Operating system: MacOS

What were you trying to do?

I'm running mix credo --strict and getting this warning:

warning: missing parentheses for expression following "do:" keyword. Parentheses are required to solve ambiguity inside keywords.

This error happens when you have function calls without parentheses inside keywords. For example:

    function(arg, one: nested_call a, b, c)
    function(arg, one: if expr, do: :this, else: :that)

In the examples above, we don't know if the arguments "b" and "c" apply to the function "function" or "nested_call". Or if the keywords "do" and "else" apply to the function "function" or "if". You can solve this by explicitly adding parentheses:

    function(arg, one: if(expr, do: :this, else: :that))
    function(arg, one: nested_call(a, b, c))

Ambiguity found at:
└─ nofilename:5

It happens because of this piece of code:

foo do: rename table(:bar), :baz, to: :qux

Expected outcome

I'd like credo to detect this ambiguity issue and add a suggestion about it to its output. That would be especially useful because the warning doesn't contain a correct path to the problematic code.

Actual outcome

This issue doesn't appear in the output.

Artur-Sulej avatar Aug 02 '24 11:08 Artur-Sulej