Deprecate auto-application of (non-Java-defined) methods with a single empty parameter list#8833
Merged
dwijnand merged 1 commit intoscala:2.13.xfrom Jun 2, 2020
Conversation
40187f6 to
073c8ef
Compare
Member
|
Is there (or could we write) a scalafix rule supporting this change? Scalafix exists for 2.13.1. |
073c8ef to
0c40835
Compare
Member
|
Let's leave this one for 2.13.3. |
Member
Author
|
31fbcf6 to
d51c962
Compare
d51c962 to
c78ffa1
Compare
c78ffa1 to
f6c89f7
Compare
Auto-application is dropped in Scala 3: https://dotty.epfl.ch/docs/reference/dropped-features/auto-apply.html So it must be deprecated in 2.13 first. Also, AFAICT Object_clone is Java-defined: $ qscala Welcome to Scala 2.13.2-20200325-150327-bc1cad4 (OpenJDK 64-Bit Server VM, Java 11.0.6). Type in expressions for evaluation. Or try :help. scala> :power Power mode enabled. :phase is at typer. import scala.tools.nsc._, intp.global._, definitions._ Try :help or completions for vals._ and power._ scala> Object_clone.isJavaDefined val res0: Boolean = true
f6c89f7 to
c900df8
Compare
SethTisue
approved these changes
Jun 1, 2020
Member
SethTisue
left a comment
There was a problem hiding this comment.
force-pushed to bump the deprecated-since from 2.13.2 to 2.13.3. let's merge as soon as CI likes it again
This comment has been minimized.
This comment has been minimized.
rtyley
added a commit
to guardian/tagmanager
that referenced
this pull request
Oct 22, 2024
…`()` is deprecated Scala 2.13 deprecates (with PR scala/scala#8833) the old behaviour of Scala that zero-parameter methods could be called with either one or zero pairs of parenthesis - ie if you have a method `def foo()` you could call it as `foo()` or just `foo`. With Scala 3, you have to match the number of brackets *used in the method declaration* when you call it - so you'd _have_ to use `foo()` or you'd get an error like this: ``` [error] ~/code/presence-indicator/app/actor/OpenSocketActor.scala:79:7: Auto-application to `()` is deprecated. Supply the empty argument list `()` explicitly to invoke method sender, [error] or remove the empty argument list from its definition (Java-defined methods are exempt). [error] In Scala 3, an unapplied method like this will be eta-expanded into a function. [quickfixable] [error] sender ! Map(serverId -> (LiveActors(connectionPing, subscription))) [error] ^ ``` Java methods are exempt from this restriction - you can call either `hashCode()` (which, in Java, is how the method _has_ to be defined, with empty brackets) or just `hashCode` (which is how that method would have been declared if it was declared in Scala, in Scala methods with no side-effects should be declared without brackets: https://docs.scala-lang.org/style/method-invocation.html#arity-0). ## Automatically fixing this code issue There are two possible ways of automating this code fix - in this small project, they both produce the same code changes: ### Fixing if the project is already on Scala 2.13 - use `-quickfix` in `scalac` You can use the `-quickfix` support added to Scala 2.13.12 with scala/scala#10482: Add either of these to the `scalacOptions` in `build.sbt`: * `"-quickfix:any"` ...to apply *all* available quick fixes * `"-quickfix:msg=Auto-application"` ...to apply quick fixes where the message contains "Auto-application" Then run `compile` on the sbt console - the first compile will still fail, but it will subtly change the error message to say `[rewritten by -quickfix]` - your files have been edited to receive the fix: ``` [error] /Users/Roberto_Tyley/code/presence-indicator/app/actor/OpenSocketActor.scala:79:7: [rewritten by -quickfix] Auto-application to `()` is deprecated. Supply the empty argument list `()` explicitly to invoke method sender, [error] or remove the empty argument list from its definition (Java-defined methods are exempt). [error] In Scala 3, an unapplied method like this will be eta-expanded into a function. [error] sender ! Map(serverId -> (LiveActors(connectionPing, subscription))) [error] ^ ``` ...run `compile` a second time, and compiler will be much happier. Examples of other PRs using `-quickfix` to fix this code issue: * guardian/ophan#5719 ### Fixing while still on Scala 2.12 - use Scalafix Fixing this everywhere in a project can be tedious, but thankfully there is a `ExplicitNonNullaryApply` Scalafix rule to fix this in the https://github.com/lightbend-labs/scala-rewrites project. The Scalafix rule needs to be run while the project is still on Scala 2.12, not Scala 2.13 (otherwise sbt will say: "Error downloading ch.epfl.scala:sbt-scalafix;sbtVersion=1.0;scalaVersion=2.13:0.13.0"). Once the Scalafix plugin is made available to sbt (by adding `addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.13.0")` to either `project/plugins.sbt` or `~/.sbt/1.0/plugins.sbt`), you can run these commands on the sbt prompt to automatically generate the changes in this PR: ``` scalafixEnable scalafixAll dependency:fix.scala213.ExplicitNonNullaryApply@org.scala-lang:scala-rewrites:0.1.5 ``` Examples of other PRs using Scalafix to fix this code issue: * guardian/mobile-apps-api#2728 * guardian/presence-indicator#196 See also: * scalacenter/scalafix#204 * lightbend-labs/scala-rewrites#14
hamzaremmal
pushed a commit
to hamzaremmal/scala3
that referenced
this pull request
May 2, 2025
…-application Deprecate auto-application of (non-Java-defined) methods with a single empty parameter list
hamzaremmal
pushed a commit
to scala/scala3
that referenced
this pull request
May 7, 2025
…-application Deprecate auto-application of (non-Java-defined) methods with a single empty parameter list
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Auto-application is dropped in Scala 3:
https://dotty.epfl.ch/docs/reference/dropped-features/auto-apply.html
So it must be deprecated in 2.13 first.
Strongly related to deprecating overriding nullary (and the inverse, overriding nilary): #8846.
Example
How to fix
It is recommended to add the missing parens:
The change can be made manually or by using scala-rewrites'
ExplicitNonNullaryApply.How to suppress
Since 2.13.2, Scala offers
-Wconf:...and@nowarnfor warning suppression. You can suppress the new warning globally by passing-Wconf:cat=deprecation&msg=Auto-application:silentto the compiler, or you can suppress it locally by adding@nowarn("cat=deprecation&msg=Auto-application")at the call site.