diff --git a/ChangeLog.md b/ChangeLog.md index 4f7eecd77dc..e113db29f87 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -395,6 +395,7 @@ - [`KT-11328`](https://youtrack.jetbrains.com/issue/KT-11328) "New Kotlin class": generates packages when fully qualified name is specified - [`KT-11778`](https://youtrack.jetbrains.com/issue/KT-11778) Exception in Lombok plugin: Rewrite at slice FUNCTION - [`KT-11708`](https://youtrack.jetbrains.com/issue/KT-11708) "Go to declaration" doesn't work on a call to function with SAM conversion on a derived type +- [`KT-12381`](https://youtrack.jetbrains.com/issue/KT-12381) Prefer not-nullable return type when overriding Java method without nullability annotation ### Reflection diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt index 860a6e8c9a3..99a679da06e 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/overrideImplement/OverrideMemberChooserObject.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.findDocComment.findDocComment import org.jetbrains.kotlin.renderer.* import org.jetbrains.kotlin.resolve.descriptorUtil.setSingleOverridden +import org.jetbrains.kotlin.types.typeUtil.makeNotNullable interface OverrideMemberChooserObject : ClassMember { enum class BodyType { @@ -155,9 +156,12 @@ private fun generateConstructorParameter(project: Project, descriptor: PropertyD } private fun generateFunction(project: Project, descriptor: FunctionDescriptor, bodyType: OverrideMemberChooserObject.BodyType): KtNamedFunction { - val newDescriptor = descriptor.copy(descriptor.containingDeclaration, Modality.OPEN, descriptor.visibility, - descriptor.kind, /* copyOverrides = */ true) - newDescriptor.setSingleOverridden(descriptor) + val newDescriptor = object : FunctionDescriptor by descriptor { + override fun getModality() = Modality.OPEN + override fun getReturnType() = descriptor.returnType?.makeNotNullable() + override fun getOverriddenDescriptors() = listOf(descriptor) + override fun accept(visitor: DeclarationDescriptorVisitor, data: D) = visitor.visitFunctionDescriptor(this, data) + } val returnType = descriptor.returnType val returnsNotUnit = returnType != null && !KotlinBuiltIns.isUnit(returnType) diff --git a/idea/testData/codeInsight/overrideImplement/implementJavaRawSubclass/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/implementJavaRawSubclass/foo/Impl.kt.after index 8bd8ff37b9a..03c1f03707e 100644 --- a/idea/testData/codeInsight/overrideImplement/implementJavaRawSubclass/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/implementJavaRawSubclass/foo/Impl.kt.after @@ -2,7 +2,7 @@ import foo.A import foo.B class C : A() { - override fun foo(x: MutableList?, y: String?): B<*>? { + override fun foo(x: MutableList?, y: String?): B<*> { throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. } } diff --git a/idea/testData/codeInsight/overrideImplement/javaInterfaceMethod/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/javaInterfaceMethod/foo/Impl.kt.after index 5c086eeaf7d..7ad9f73f122 100644 --- a/idea/testData/codeInsight/overrideImplement/javaInterfaceMethod/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaInterfaceMethod/foo/Impl.kt.after @@ -1,7 +1,7 @@ import foo.Intf class Impl(): Intf { - override fun getFooBar(): String? { + override fun getFooBar(): String { throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. } } diff --git a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after index 93d18984e63..426680954d9 100644 --- a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageProtectedVisibility/foo/Impl.kt.after @@ -3,7 +3,7 @@ package foo import foo.Intf class Impl(): Intf() { - override fun getFooBar(): String? { + override fun getFooBar(): String { return super.getFooBar() } } diff --git a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after index 93d18984e63..426680954d9 100644 --- a/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaMethodWithPackageVisibility/foo/Impl.kt.after @@ -3,7 +3,7 @@ package foo import foo.Intf class Impl(): Intf() { - override fun getFooBar(): String? { + override fun getFooBar(): String { return super.getFooBar() } } diff --git a/idea/testData/codeInsight/overrideImplement/platformTypes/foo/A.java b/idea/testData/codeInsight/overrideImplement/platformTypes/foo/A.java new file mode 100644 index 00000000000..51005a0e12c --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/platformTypes/foo/A.java @@ -0,0 +1,7 @@ +package foo; + +public class A { + public String foo(String s) { + return null; + } +} diff --git a/idea/testData/codeInsight/overrideImplement/platformTypes/foo/Impl.kt b/idea/testData/codeInsight/overrideImplement/platformTypes/foo/Impl.kt new file mode 100644 index 00000000000..4cfd67ae82c --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/platformTypes/foo/Impl.kt @@ -0,0 +1,5 @@ +import foo.A + +class B : A() { + +} diff --git a/idea/testData/codeInsight/overrideImplement/platformTypes/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/platformTypes/foo/Impl.kt.after new file mode 100644 index 00000000000..3e805299ba2 --- /dev/null +++ b/idea/testData/codeInsight/overrideImplement/platformTypes/foo/Impl.kt.after @@ -0,0 +1,7 @@ +import foo.A + +class B : A() { + override fun foo(s: String?): String { + return super.foo(s) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt index 14f16852e59..4556ebac337 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/OverrideImplementTest.kt @@ -243,4 +243,8 @@ class OverrideImplementTest : AbstractOverrideImplementTest() { fun testConvertJavaDoc() { doOverrideDirectoryTest("foo") } + + fun testPlatformTypes() { + doOverrideDirectoryTest("foo") + } }