From 64eeb479aabc864c925685d2e4d2121f81d4708e Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Mon, 31 Jul 2017 09:34:02 +0300 Subject: [PATCH] Take nullability annotations into account in QF correcting override So Java NotNull annotated is converted to `Type` and Java Nullable annotated to `Type?` accordingly So #KT-19299 Fixed --- .../ChangeMemberFunctionSignatureFix.kt | 15 +++++++- .../overrideJavaMethodWithAnnotation.test | 38 +++++++++++++++++++ .../QuickFixMultiFileTestGenerated.java | 6 +++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 idea/testData/quickfix/override/nothingToOverride/overrideJavaMethodWithAnnotation.test diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt index bc188e0d499..320e7324d5d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt @@ -35,6 +35,9 @@ import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.incremental.components.NoLookupLocation +import org.jetbrains.kotlin.load.java.NOT_NULL_ANNOTATIONS +import org.jetbrains.kotlin.load.java.NULLABLE_ANNOTATIONS +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtParameterList @@ -202,8 +205,7 @@ class ChangeMemberFunctionSignatureFix private constructor( SourceElement.NO_SOURCE ) - val parameters = newParameters.withIndex().map { - val (index, parameter) = it + val parameters = newParameters.withIndex().map { (index, parameter) -> ValueParameterDescriptorImpl( descriptor, null, index, parameter.annotations, parameter.name, parameter.returnType!!, parameter.declaresDefaultValue(), @@ -319,6 +321,15 @@ class ChangeMemberFunctionSignatureFix private constructor( ShortenReferences.DEFAULT.process(newTypeRef) } + patternFunction.valueParameters.forEach { param -> + param.annotationEntries.forEach { a -> + a.typeReference?.run { + val fqName = FqName(this.text) + if (fqName in (NULLABLE_ANNOTATIONS + NOT_NULL_ANNOTATIONS)) a.delete() + } + } + } + val newParameterList = function.valueParameterList!!.replace(patternFunction.valueParameterList!!) as KtParameterList ShortenReferences.DEFAULT.process(newParameterList) } diff --git a/idea/testData/quickfix/override/nothingToOverride/overrideJavaMethodWithAnnotation.test b/idea/testData/quickfix/override/nothingToOverride/overrideJavaMethodWithAnnotation.test new file mode 100644 index 00000000000..9832ec4c50a --- /dev/null +++ b/idea/testData/quickfix/override/nothingToOverride/overrideJavaMethodWithAnnotation.test @@ -0,0 +1,38 @@ +// FILE: test.before.kt +// "Change function signature to 'fun foo(a: String, b: String?, c: String?)'" "true" +// ERROR: 'foo' overrides nothing +package foo + +class KotlinClass : JavaClass() { + override fun foo() { + } +} + +// FILE: foo/JavaClass.java +package foo; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class JavaClass { + void foo(@NotNull String a, + @Nullable String b, + @JavaAnnotation String c) { + } +} + +// FILE: foo/JavaAnnotation.java +package foo; + +public @interface JavaAnnotation { +} + +// FILE: test.after.kt +// "Change function signature to 'fun foo(a: String, b: String?, c: String?)'" "true" +// ERROR: 'foo' overrides nothing +package foo + +class KotlinClass : JavaClass() { + override fun foo(a: String, b: String?, @JavaAnnotation c: String?) { + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index 9b923a7dfff..c2937a2ba40 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -1855,6 +1855,12 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes doTestWithExtraFile(fileName); } + @TestMetadata("overrideJavaMethodWithAnnotation.test") + public void testOverrideJavaMethodWithAnnotation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/override/nothingToOverride/overrideJavaMethodWithAnnotation.test"); + doTestWithExtraFile(fileName); + } + @TestMetadata("twoPackages.before.Main.kt") public void testTwoPackages() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/override/nothingToOverride/twoPackages.before.Main.kt");