Use descriptors for building SAM constructors

It helps to get rid of semantics duplicating and fixes known bugs

- SOE in OnlyAbstractMethodFinder.find
- type enhancement for SAM constructors

 #KT-11287 Fixed
 #KT-11322 Fixed
 EA-77989 Fixed
This commit is contained in:
Denis Zharkov
2016-03-07 17:49:03 +03:00
parent b8b48c5f98
commit 151e55b2fa
22 changed files with 234 additions and 258 deletions
@@ -0,0 +1,27 @@
// FILE: J.java
import org.jetbrains.annotations.*;
public interface J {
@NotNull
String foo(@Nullable String x);
}
// FILE: J2.java
import org.jetbrains.annotations.Nullable;
public interface J2 extends J {
String foo(String x);
}
// FILE: main.kt
fun main() {
J { <!EXPECTED_PARAMETER_TYPE_MISMATCH!>s: String<!> -> s} // should be prohibited, because SAM value parameter has nullable type
J { "" + it<!UNSAFE_CALL!>.<!>length }
J { <!NULL_FOR_NONNULL_TYPE!>null<!> }
J { <!TYPE_MISMATCH!>it?.length?.toString()<!> }
J2 { <!EXPECTED_PARAMETER_TYPE_MISMATCH!>s: String<!> -> s}
J2 { "" + it<!UNSAFE_CALL!>.<!>length }
J2 { <!NULL_FOR_NONNULL_TYPE!>null<!> }
J2 { <!TYPE_MISMATCH!>it?.length?.toString()<!> }
}
@@ -0,0 +1,19 @@
package
public /*synthesized*/ fun J(/*0*/ function: (kotlin.String?) -> kotlin.String): J
public /*synthesized*/ fun J2(/*0*/ function: (kotlin.String?) -> kotlin.String): J2
public fun main(): kotlin.Unit
public interface J {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@org.jetbrains.annotations.NotNull() public abstract fun foo(/*0*/ @org.jetbrains.annotations.Nullable() x: kotlin.String?): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface J2 : J {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract override /*1*/ fun foo(/*0*/ x: kotlin.String?): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}