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
Implement ExplicitNonNullaryApply #14
Conversation
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From https://gitter.im/scalameta/scalameta?at=5e86fbe5c79eff2492ff4b61, maybe go down the route of invoking the presentation compiler to discover override info?
Or take code from scalameta/metals#1487
rewrites/src/main/scala/fix/scala213/ExplicitNonNullaryApply.scala
Outdated
Show resolved
Hide resolved
This comment has been minimized.
This comment has been minimized.
Two problems: * ScalaMeta's SymbolInformation seems to record asInstanceOf as nilary instead of nullary, so the rewrite erroneously rewrites the _definitions_ propNullAs and methNullAs, into invalid code... :( I could move the definitions into another file, but I just decided to drop it, also because... * Infix invocation of nilary methods seems to be no longer valid in 2.13, for example: [error] /d/scala-rewrites/output/src/main/scala/fix/scala213/ExplicitNonNullaryApply.scala:30:42: no arguments allowed for nullary method methNullAs: ()A [error] def def_this_methNullAs_m_in = this methNullAs () [error] ^ Also, "nullAs" is the closest and only method I could think of that is nilary (actually I normally define "nullAs" as nullary) and takes no term arguments but makes legitimate use of the type parameter. So maybe the whole edge-case is a pointless variation.
What we'd like is to leave any call to a method that was defined in Java (or any "universal" method, like ##, eq, isInstanceOf) to be exempt. It appears Scalameta/Semanticdb/Scalafix doesn't capture that information, and thus basically all of them get parens... :( Apparently in Metals they use the presentation compiler to recover all the missing info and I know in ScalaClean they have their own nsc Traverser, I'm guessing for the same reason.
Fortunately not necessary: I was able to use ScalafixGlobal to implement a "isJavaDefined" so any method defined in Java is invoked as it is (with or without Need to review the diff as a whole now before declaring it ready. |
Heavily inspired by Olaf's scalacenter/scalafix#204.