-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
Forbid variable assignment in function call #14722
Comments
My 2 cents is I think this is somewhat unlikely to be changed, but maybe a "no assignment in call" rule would be a possibility for ameba. EDIT: My reasoning is this would ofc be a breaking change so would have to wait for Crystal 2.0, and because I think having this is somewhat helpful. E.g. in my specs I frequently do like: collection.add "foo", foo = ART::Route.new "/foo" so that later on in the spec I can use |
This syntax is necessary for very basic things like the class Foo
# this is how the macro call really looks like, even though
# most of the time `getter` is never used with parentheses
getter(x = 1)
end Unfortunately this also means Ameba shouldn't detect this, as it takes a semantic pass to determine whether Instead, when there are multiple optional parameters, personally I'd make all of them named: def foo(*, bar = true, baz = false)
end
foo(baz = true) # not allowed
foo(baz: true) # okay
foo(baz: baz = true) # okay
foo(bar: baz = true) # okay |
Crap, I didn't think of that. Is it possible to get that at the compiler level then? def foo(bar = true, baz = false)
end
foo(bar = false) # no warning
foo(baz = true) # compiler warning
That's what we will use in the future, I guess. |
This seems like a perfect feature for a linter. The linter needs access to the semantic stage, so ameba currently cannot implement that. But it could be a future expansion (if not for ameba, then as a separate tool). Semantic linting is certainly useful in general. |
Don't think there's really anything actionable here anymore. I'd maybe open an issue in the Ameba repo, as this could be a good candidate for that when/if it gets semantic linting capabilities. |
This issue has been mentioned on Crystal Forum. There might be relevant details there: |
While reviewing some code, and with the help of @Blacksmoke16, I learned that it is possible to assign a local variable in a function call, like so:
In my opinion, this is a potential footgun, and should result in a compiler error.
The confusion between
param = value
(for function declaration) andparam: value
(for function calls) is easy to make, especially when coming from/switching with other languages, such as Python. The reason why I'm mentioning that is that it happened to an experienced Crystal programmer.The text was updated successfully, but these errors were encountered: