diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformer.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformer.kt index 58cd0ac5b67..2803e89257e 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformer.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/KaptAnonymousTypeTransformer.kt @@ -9,19 +9,15 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.kotlin.resolve.DeclarationSignatureAnonymousTypeTransformer -import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.DescriptorUtils.isAnonymousObject -import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns -import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny +import org.jetbrains.kotlin.resolve.DescriptorUtils.* import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeProjectionImpl import org.jetbrains.kotlin.types.replace import org.jetbrains.kotlin.types.typeUtil.builtIns -import org.jetbrains.kotlin.types.typeUtil.isAnyOrNullableAny class KaptAnonymousTypeTransformer : DeclarationSignatureAnonymousTypeTransformer { override fun transformAnonymousType(descriptor: DeclarationDescriptorWithVisibility, type: KotlinType): KotlinType? { - if (DescriptorUtils.isLocal(descriptor)) + if (isLocal(descriptor)) return type return convertPossiblyAnonymousType(type) @@ -41,7 +37,17 @@ class KaptAnonymousTypeTransformer : DeclarationSignatureAnonymousTypeTransforme } val actualType = when { - isAnonymousObject(declaration) -> findMostSuitableParentForAnonymousType(declaration) + isAnonymousObject(declaration) -> { + if (type.constructor.supertypes.size == 1) { + type.constructor.supertypes.iterator().next() + } else { + /* + Frontend reports an error on public properties in this case, + but we ignore errors when making stubs, so there should be a reasonable fallback. + */ + type.builtIns.anyType + } + } else -> type } @@ -56,18 +62,4 @@ class KaptAnonymousTypeTransformer : DeclarationSignatureAnonymousTypeTransforme return actualType.replace(newArguments = arguments) } - - private fun findMostSuitableParentForAnonymousType(descriptor: ClassDescriptor): KotlinType { - descriptor.getSuperClassNotAny()?.let { return it.defaultType } - - val sortedSuperTypes = descriptor.typeConstructor.supertypes - .sortedBy { it.constructor.declarationDescriptor?.name?.asString() ?: "" } - - for (candidate in sortedSuperTypes) { - if (!candidate.isAnyOrNullableAny()) - return candidate - } - - return descriptor.builtIns.anyType - } } \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java index 7aef1fe2833..854fde82059 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java @@ -129,6 +129,11 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi runTest("plugins/kapt3/kapt3-compiler/testData/converter/ignoredMembers.kt"); } + @TestMetadata("implicitReturnTypes.kt") + public void testImplicitReturnTypes() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/implicitReturnTypes.kt"); + } + @TestMetadata("importsForErrorTypes.kt") public void testImportsForErrorTypes() throws Exception { runTest("plugins/kapt3/kapt3-compiler/testData/converter/importsForErrorTypes.kt"); @@ -154,6 +159,11 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi runTest("plugins/kapt3/kapt3-compiler/testData/converter/innerClassesWithTypeParameters.kt"); } + @TestMetadata("interfaceImplementation.kt") + public void testInterfaceImplementation() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/interfaceImplementation.kt"); + } + @TestMetadata("invalidFieldName.kt") public void testInvalidFieldName() throws Exception { runTest("plugins/kapt3/kapt3-compiler/testData/converter/invalidFieldName.kt"); diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/implicitReturnTypes.kt b/plugins/kapt3/kapt3-compiler/testData/converter/implicitReturnTypes.kt new file mode 100644 index 00000000000..7093167bf75 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/implicitReturnTypes.kt @@ -0,0 +1,37 @@ +// WITH_RUNTIME + +// FILE: lib/Prop.java +package lib; + +public abstract class Prop { + public abstract int get(T key); + public abstract void set(T key, int value); +} + +// FILE: test.kt +package test + +import lib.Prop + +class Cl(var name: String) + +val TEST = object : Prop() { + override fun get(key: Cl) = key.name.length + override fun set(key: Cl, value: Int) { + key.name = " ".repeat(value) + } +} + +val TESTS_ARRAY = arrayOf(object : Prop() { + override fun get(key: Cl) = key.name.length + override fun set(key: Cl, value: Int) { + key.name = " ".repeat(value) + } +}) + +val TESTS_LIST = listOf(object : Prop() { + override fun get(key: Cl) = key.name.length + override fun set(key: Cl, value: Int) { + key.name = " ".repeat(value) + } +}) \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/implicitReturnTypes.txt b/plugins/kapt3/kapt3-compiler/testData/converter/implicitReturnTypes.txt new file mode 100644 index 00000000000..c8072353f9f --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/implicitReturnTypes.txt @@ -0,0 +1,73 @@ +package lib; + +public abstract class Prop { + + public Prop() { + super(); + } + + public abstract int get(T key); + + public abstract void set(T key, int value); +} + +//////////////////// + +package test; + +import java.lang.System; + +@kotlin.Metadata() +public final class Cl { + @org.jetbrains.annotations.NotNull() + private java.lang.String name; + + @org.jetbrains.annotations.NotNull() + public final java.lang.String getName() { + return null; + } + + public final void setName(@org.jetbrains.annotations.NotNull() + java.lang.String p0) { + } + + public Cl(@org.jetbrains.annotations.NotNull() + java.lang.String name) { + super(); + } +} + +//////////////////// + +package test; + +import java.lang.System; + +@kotlin.Metadata() +public final class TestKt { + + public TestKt() { + super(); + } + @org.jetbrains.annotations.NotNull() + private static final lib.Prop TEST = null; + @org.jetbrains.annotations.NotNull() + private static final lib.Prop[] TESTS_ARRAY = null; + @org.jetbrains.annotations.NotNull() + private static final java.util.List> TESTS_LIST = null; + + @org.jetbrains.annotations.NotNull() + public static final lib.Prop getTEST() { + return null; + } + + @org.jetbrains.annotations.NotNull() + public static final lib.Prop[] getTESTS_ARRAY() { + return null; + } + + @org.jetbrains.annotations.NotNull() + public static final java.util.List> getTESTS_LIST() { + return null; + } +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/interfaceImplementation.kt b/plugins/kapt3/kapt3-compiler/testData/converter/interfaceImplementation.kt new file mode 100644 index 00000000000..0023c203a4c --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/interfaceImplementation.kt @@ -0,0 +1,11 @@ +interface Named { + val name: String? +} + +class Product2 : Named { + override var name: String? = null + + constructor(otherName: String) { + this.name = otherName + } +} \ No newline at end of file diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/interfaceImplementation.txt b/plugins/kapt3/kapt3-compiler/testData/converter/interfaceImplementation.txt new file mode 100644 index 00000000000..fe33cd8aad0 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/interfaceImplementation.txt @@ -0,0 +1,34 @@ +import java.lang.System; + +@kotlin.Metadata() +public abstract interface Named { + + @org.jetbrains.annotations.Nullable() + public abstract java.lang.String getName(); +} + +//////////////////// + + +import java.lang.System; + +@kotlin.Metadata() +public final class Product2 implements Named { + @org.jetbrains.annotations.Nullable() + private java.lang.String name; + + @org.jetbrains.annotations.Nullable() + @java.lang.Override() + public java.lang.String getName() { + return null; + } + + public void setName(@org.jetbrains.annotations.Nullable() + java.lang.String p0) { + } + + public Product2(@org.jetbrains.annotations.NotNull() + java.lang.String otherName) { + super(); + } +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/kt14997.txt b/plugins/kapt3/kapt3-compiler/testData/converter/kt14997.txt index 14e29bd17c0..90369e68d5a 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/kt14997.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/kt14997.txt @@ -28,12 +28,12 @@ public final class Kt14997Kt { } @org.jetbrains.annotations.NotNull() - public static final java.lang.Runnable b() { + public static final java.lang.Object b() { return null; } @org.jetbrains.annotations.NotNull() - public static final CrashMe c() { + public static final java.lang.Object c() { return null; } diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/kt18682.txt b/plugins/kapt3/kapt3-compiler/testData/converter/kt18682.txt index 39563c4644d..96dc6d92509 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/kt18682.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/kt18682.txt @@ -36,7 +36,7 @@ public final class Kt18682Kt { } @org.jetbrains.annotations.NotNull() - public static final java.util.List test4() { + public static final java.util.List test4() { return null; } }