From 18fb70b32f2dd7ced8804a6f967e627720e67e44 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 6 Mar 2017 15:59:06 +0300 Subject: [PATCH] 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. --- .../synthetic/SamAdapterFunctionsScope.kt | 5 +- .../tests/platformTypes/rawSamOverrides.kt | 41 +++++++++++ .../tests/platformTypes/rawSamOverrides.txt | 69 +++++++++++++++++++ .../checkers/DiagnosticsTestGenerated.java | 6 ++ 4 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index 1cfdf0fab9c..ae0b521d60d 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -167,10 +167,13 @@ class SamAdapterFunctionsScope( } } + override fun newCopyBuilder(substitutor: TypeSubstitutor): CopyConfiguration = + super.newCopyBuilder(substitutor).setOriginal(this.original) + override fun doSubstitute(configuration: CopyConfiguration): FunctionDescriptor? { val descriptor = super.doSubstitute(configuration) as MyFunctionDescriptor? ?: return null val original = configuration.original - ?: throw UnsupportedOperationException("doSubstitute with no original should not be called for synthetic extension") + ?: throw UnsupportedOperationException("doSubstitute with no original should not be called for synthetic extension $this") original as MyFunctionDescriptor assert(original.original == original) { "original in doSubstitute should have no other original" } diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.kt b/compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.kt new file mode 100644 index 00000000000..31d2a2d4ac6 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.kt @@ -0,0 +1,41 @@ +// (failed) attempt to reproduce exception in +// http://stackoverflow.com/questions/42571812/unsupportedoperationexception-while-building-a-kotlin-project-in-idea + +// FILE: Fun.java +public interface Fun { + public void invoke(T x); +} + +// FILE: A.java +public interface A { + public void foo(T x, Fun y); +} + +// FILE: B.java +public interface B extends A { + @Override + public void foo(Object x, Fun y); +} + +// FILE: C.java +public abstract class C { + public abstract void bar(Fun y); + + public static void aStaticMethod(T x, Fun y) {} + + public static abstract class D extends C { + @Override + public void bar(Fun y) {} + + public static void aStaticMethod(Object x, Fun y) {} + } +} + +// FILE: main.kt +class E1 : C.D(), B { + override fun foo(x: Any, y: Fun) {} +} + +class E2 : B { + override fun foo(x: Any, y: Fun) {} +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.txt b/compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.txt new file mode 100644 index 00000000000..44f82e8b786 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.txt @@ -0,0 +1,69 @@ +package + +public /*synthesized*/ fun A(/*0*/ function: (x: T!, y: Fun!) -> kotlin.Unit): A +public /*synthesized*/ fun B(/*0*/ function: (x: kotlin.Any!, y: Fun<(raw) kotlin.Any!>!) -> kotlin.Unit): B +public /*synthesized*/ fun Fun(/*0*/ function: (x: T!) -> kotlin.Unit): Fun + +public interface A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun foo(/*0*/ x: T!, /*1*/ y: Fun!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface B : A<(raw) kotlin.Any!> { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @java.lang.Override public abstract override /*1*/ fun foo(/*0*/ x: kotlin.Any!, /*1*/ y: Fun<(raw) kotlin.Any!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public abstract class C { + public constructor C() + public abstract fun bar(/*0*/ y: Fun!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public abstract class D : C { + public constructor D() + @java.lang.Override public open override /*1*/ fun bar(/*0*/ y: Fun!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final override /*1*/ /*fake_override*/ fun aStaticMethod(/*0*/ x: T!, /*1*/ y: ((x: T!) -> kotlin.Unit)!): kotlin.Unit + public final /*synthesized*/ fun aStaticMethod(/*0*/ x: kotlin.Any!, /*1*/ y: ((x: kotlin.Any!) -> kotlin.Unit)!): kotlin.Unit + public open fun aStaticMethod(/*0*/ x: kotlin.Any!, /*1*/ y: Fun<(raw) kotlin.Any!>!): kotlin.Unit + } + + // Static members + public final /*synthesized*/ fun aStaticMethod(/*0*/ x: T!, /*1*/ y: ((x: T!) -> kotlin.Unit)!): kotlin.Unit + public open fun aStaticMethod(/*0*/ x: T!, /*1*/ y: Fun!): kotlin.Unit +} + +public final class E1 : C.D, B { + public constructor E1() + @java.lang.Override public open override /*1*/ /*fake_override*/ fun bar(/*0*/ y: Fun!): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ fun foo(/*0*/ x: kotlin.Any, /*1*/ y: Fun): kotlin.Unit + public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class E2 : B { + public constructor E2() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(/*0*/ x: kotlin.Any, /*1*/ y: Fun): kotlin.Unit + @java.lang.Override public abstract override /*1*/ /*fake_override*/ fun foo(/*0*/ x: kotlin.Any!, /*1*/ y: Fun<(raw) kotlin.Any!>!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Fun { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract operator fun invoke(/*0*/ x: T!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 9a72cd3c6b1..823ce3cbce9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -14725,6 +14725,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("rawSamOverrides.kt") + public void testRawSamOverrides() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/rawSamOverrides.kt"); + doTest(fileName); + } + @TestMetadata("safeCall.kt") public void testSafeCall() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/safeCall.kt");