-
Notifications
You must be signed in to change notification settings - Fork 3.1k
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
Eta-expand 0-arity method if expected type is Function0 #7660
Conversation
Do you need to redo #7614 too? |
Yep, thanks! |
The PR to undo is the one where |
PRs to implement |
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
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.
I think I addressed all review comments. |
@adriaanm we should un-deprecate in 2.12.9, then? |
Good point: #7740 |
needed in recent 2.13 nightlies because of the combination of scala/scala#7660 and scala/scala#7263
It warns on usual usages of
|
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
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
@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 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