Skip to content

Commit 18fb70b

Browse files
dnpetrovzarechenskiy
authored andcommitted
Potential fix for KT-16673
See also: http://stackoverflow.com/questions/42571812/unsupportedoperationexception-while-building-a-kotlin-project-in-idea 'original' for SamAdapterFunctionScope.MyFunctionDescriptor#doSubstitute should exactly match 'this.original', so we can just provide it by default in SamAdapterFunctionScope.MyFunctionDescriptor#newCopyBuilder.
1 parent 268f7b7 commit 18fb70b

File tree

4 files changed

+120
-1
lines changed

4 files changed

+120
-1
lines changed

compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,10 +167,13 @@ class SamAdapterFunctionsScope(
167167
}
168168
}
169169

170+
override fun newCopyBuilder(substitutor: TypeSubstitutor): CopyConfiguration =
171+
super.newCopyBuilder(substitutor).setOriginal(this.original)
172+
170173
override fun doSubstitute(configuration: CopyConfiguration): FunctionDescriptor? {
171174
val descriptor = super.doSubstitute(configuration) as MyFunctionDescriptor? ?: return null
172175
val original = configuration.original
173-
?: throw UnsupportedOperationException("doSubstitute with no original should not be called for synthetic extension")
176+
?: throw UnsupportedOperationException("doSubstitute with no original should not be called for synthetic extension $this")
174177

175178
original as MyFunctionDescriptor
176179
assert(original.original == original) { "original in doSubstitute should have no other original" }
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// (failed) attempt to reproduce exception in
2+
// http://stackoverflow.com/questions/42571812/unsupportedoperationexception-while-building-a-kotlin-project-in-idea
3+
4+
// FILE: Fun.java
5+
public interface Fun<T> {
6+
public void invoke(T x);
7+
}
8+
9+
// FILE: A.java
10+
public interface A<T> {
11+
public void foo(T x, Fun<? extends T> y);
12+
}
13+
14+
// FILE: B.java
15+
public interface B extends A {
16+
@Override
17+
public void foo(Object x, Fun y);
18+
}
19+
20+
// FILE: C.java
21+
public abstract class C {
22+
public abstract <T> void bar(Fun<T> y);
23+
24+
public static <T> void aStaticMethod(T x, Fun<T> y) {}
25+
26+
public static abstract class D extends C {
27+
@Override
28+
public <T> void bar(Fun<T> y) {}
29+
30+
public static void aStaticMethod(Object x, Fun y) {}
31+
}
32+
}
33+
34+
// FILE: main.kt
35+
class E1 : C.D(), B {
36+
override fun foo(x: Any, y: Fun<Any?>) {}
37+
}
38+
39+
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class E2<!> : B {
40+
<!NOTHING_TO_OVERRIDE!>override<!> fun foo(x: Any, y: Fun<String?>) {}
41+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package
2+
3+
public /*synthesized*/ fun </*0*/ T : kotlin.Any!> A(/*0*/ function: (x: T!, y: Fun<out T!>!) -> kotlin.Unit): A<T>
4+
public /*synthesized*/ fun B(/*0*/ function: (x: kotlin.Any!, y: Fun<(raw) kotlin.Any!>!) -> kotlin.Unit): B
5+
public /*synthesized*/ fun </*0*/ T : kotlin.Any!> Fun(/*0*/ function: (x: T!) -> kotlin.Unit): Fun<T>
6+
7+
public interface A</*0*/ T : kotlin.Any!> {
8+
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
9+
public abstract fun foo(/*0*/ x: T!, /*1*/ y: Fun<out T!>!): kotlin.Unit
10+
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
11+
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
12+
}
13+
14+
public interface B : A<(raw) kotlin.Any!> {
15+
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
16+
@java.lang.Override public abstract override /*1*/ fun foo(/*0*/ x: kotlin.Any!, /*1*/ y: Fun<(raw) kotlin.Any!>!): kotlin.Unit
17+
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
18+
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
19+
}
20+
21+
public abstract class C {
22+
public constructor C()
23+
public abstract fun </*0*/ T : kotlin.Any!> bar(/*0*/ y: Fun<T!>!): kotlin.Unit
24+
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
25+
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
26+
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
27+
28+
public abstract class D : C {
29+
public constructor D()
30+
@java.lang.Override public open override /*1*/ fun </*0*/ T : kotlin.Any!> bar(/*0*/ y: Fun<T!>!): kotlin.Unit
31+
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
32+
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
33+
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
34+
35+
// Static members
36+
public final override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> aStaticMethod(/*0*/ x: T!, /*1*/ y: ((x: T!) -> kotlin.Unit)!): kotlin.Unit
37+
public final /*synthesized*/ fun aStaticMethod(/*0*/ x: kotlin.Any!, /*1*/ y: ((x: kotlin.Any!) -> kotlin.Unit)!): kotlin.Unit
38+
public open fun aStaticMethod(/*0*/ x: kotlin.Any!, /*1*/ y: Fun<(raw) kotlin.Any!>!): kotlin.Unit
39+
}
40+
41+
// Static members
42+
public final /*synthesized*/ fun </*0*/ T : kotlin.Any!> aStaticMethod(/*0*/ x: T!, /*1*/ y: ((x: T!) -> kotlin.Unit)!): kotlin.Unit
43+
public open fun </*0*/ T : kotlin.Any!> aStaticMethod(/*0*/ x: T!, /*1*/ y: Fun<T!>!): kotlin.Unit
44+
}
45+
46+
public final class E1 : C.D, B {
47+
public constructor E1()
48+
@java.lang.Override public open override /*1*/ /*fake_override*/ fun </*0*/ T : kotlin.Any!> bar(/*0*/ y: Fun<T!>!): kotlin.Unit
49+
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
50+
public open override /*1*/ fun foo(/*0*/ x: kotlin.Any, /*1*/ y: Fun<kotlin.Any?>): kotlin.Unit
51+
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
52+
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
53+
}
54+
55+
public final class E2 : B {
56+
public constructor E2()
57+
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
58+
public open fun foo(/*0*/ x: kotlin.Any, /*1*/ y: Fun<kotlin.String?>): kotlin.Unit
59+
@java.lang.Override public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ x: kotlin.Any!, /*1*/ y: Fun<(raw) kotlin.Any!>!): kotlin.Unit
60+
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
61+
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
62+
}
63+
64+
public interface Fun</*0*/ T : kotlin.Any!> {
65+
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
66+
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
67+
public abstract operator fun invoke(/*0*/ x: T!): kotlin.Unit
68+
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
69+
}

compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14725,6 +14725,12 @@ public void testRawOverrides() throws Exception {
1472514725
doTest(fileName);
1472614726
}
1472714727

14728+
@TestMetadata("rawSamOverrides.kt")
14729+
public void testRawSamOverrides() throws Exception {
14730+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.kt");
14731+
doTest(fileName);
14732+
}
14733+
1472814734
@TestMetadata("safeCall.kt")
1472914735
public void testSafeCall() throws Exception {
1473014736
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/safeCall.kt");

0 commit comments

Comments
 (0)