Eta-expand 0-arity method if expected type is Function0#7660
Merged
adriaanm merged 3 commits intoscala:2.13.xfrom Feb 11, 2019
Merged
Eta-expand 0-arity method if expected type is Function0#7660adriaanm merged 3 commits intoscala:2.13.xfrom
adriaanm merged 3 commits intoscala:2.13.xfrom
Conversation
This was referenced Jan 17, 2019
Member
|
Do you need to redo #7614 too? |
Contributor
Author
|
Yep, thanks! |
Contributor
|
The PR to undo is the one where |
Contributor
Author
|
PRs to implement |
Contributor
Author
|
Interesting issues in future-spec -- the other two test fails are due to a bug this introduces under |
This comment has been minimized.
This comment has been minimized.
8b47517 to
0da9315
Compare
adriaanm
commented
Feb 6, 2019
retronym
reviewed
Feb 7, 2019
retronym
reviewed
Feb 7, 2019
retronym
reviewed
Feb 7, 2019
som-snytt
reviewed
Feb 7, 2019
Assume 2.11 or higher source level.
Reverse course from the deprecation introduced in 2.12.
(4.3) condition for eta-expansion by -Xsource level:
- until 2.13:
- for arity > 0: function or sam type is expected
- for arity == 0: Function0 is expected -- SAM types do not eta-expand
because it could be an accidental SAM scala/bug#9489
- 2.14:
- for arity > 0: unconditional
- for arity == 0: a function-ish type of arity 0 is expected (including SAM)
warnings:
- 2.12: eta-expansion of zero-arg methods was deprecated (scala/bug#7187)
- 2.13: deprecation dropped in favor of setting the scene for uniform eta-expansion in 3.0
warning still available under -Xlint:eta-zero
- 2.14: expected type is a SAM that is not annotated with `@FunctionalInterface`
if it's a Java-defined interface (under `-Xlint:eta-sam`)
(4.2) condition for auto-application by -Xsource level:
- until 2.14: none (assuming condition for (4.3) was not met)
- in 3.0: `meth.isJavaDefined`
TODO decide -- currently the condition is more involved to give slack to
Scala methods overriding Java-defined ones; I think we should resolve that
by introducing slack in overriding e.g. a Java-defined `def toString()`
by a Scala-defined `def toString`. This also works better for dealing
with accessors overriding Java-defined methods.
The current strategy in methodSig is problematic:
> // Add a () parameter section if this overrides some method with () parameters
> val vparamSymssOrEmptyParamsFromOverride =
This means an accessor that overrides a Java-defined method gets a
MethodType instead of a `NullaryMethodType`, which breaks lots of
assumptions about accessors
This comment has been minimized.
This comment has been minimized.
Contributor
Author
|
I think I addressed all review comments. |
retronym
approved these changes
Feb 11, 2019
Member
|
@adriaanm we should un-deprecate in 2.12.9, then? |
Contributor
Author
|
Good point: #7740 |
SethTisue
added a commit
to scalacommunitybuild/scalaz
that referenced
this pull request
Feb 26, 2019
needed in recent 2.13 nightlies because of the combination of scala/scala#7660 and scala/scala#7263
Contributor
|
It warns on usual usages of |
eed3si9n
added a commit
to eed3si9n/scala
that referenced
this pull request
Jun 2, 2020
Ref scala bug 12006 scalagh-7660 added `-Xsource:2.14` mode that eta-expands on SAM types. This confuses `URL#openStream` to be treated as SAM when `Function0[InputStream]` is expected, and get a weird error message: error: type mismatch; found : java.io.InputStream required: Int
This was referenced Jun 2, 2020
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.
Reverse course from the deprecation introduced in 2.12.
(4.3) condition for eta-expansion by -Xsource level:
because it could be an accidental SAM Sammy gets confused with Java classes bug#9489
warnings:
warning still available under -Xlint:eta-zero
@FunctionalInterfaceif it's a Java-defined interface (under
-Xlint:eta-sam)(4.2) condition for auto-application by -Xsource level:
until 2.14: none (assuming condition for (4.3) was not met)
in 3.0:
meth.isJavaDefinedTODO decide -- currently the condition is more involved to give slack to
Scala methods overriding Java-defined ones; I think we should resolve that
by introducing slack in overriding e.g. a Java-defined
def toString()by a Scala-defined
def toString. This also works better for dealingwith accessors overriding Java-defined methods.
The current strategy in methodSig is problematic:
This means an accessor that overrides a Java-defined method gets a
MethodType instead of a
NullaryMethodType, which breaks lots ofassumptions about accessors