diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveAnnotationFix.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveAnnotationFix.kt new file mode 100644 index 00000000000..4e7189f888f --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveAnnotationFix.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.inspections + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction +import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory +import org.jetbrains.kotlin.psi.KtAnnotationEntry +import org.jetbrains.kotlin.psi.KtFile + +class RemoveAnnotationFix(private val name: String, annotationEntry: KtAnnotationEntry) + : KotlinQuickFixAction(annotationEntry) { + + override fun getText() = name + + override fun getFamilyName() = name + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + element?.delete() + } + + object JvmOverloads : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): RemoveAnnotationFix? { + val annotationEntry = diagnostic.psiElement as? KtAnnotationEntry ?: return null + return RemoveAnnotationFix("Remove @JvmOverloads annotation", annotationEntry) + } + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index c49218d61d3..17f73cb91ad 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -42,8 +42,7 @@ import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm -import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.NO_REFLECTION_IN_CLASS_PATH -import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION +import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.* class QuickFixRegistrar : QuickFixContributor { override fun registerQuickFixes(quickFixes: QuickFixes) { @@ -445,5 +444,9 @@ class QuickFixRegistrar : QuickFixContributor { INAPPLICABLE_LATEINIT_MODIFIER.registerFactory(ChangeVariableMutabilityFix.LATEINIT_VAL_FACTORY) INAPPLICABLE_LATEINIT_MODIFIER.registerFactory(RemoveNullableFix.LATEINIT_FACTORY) + + OVERLOADS_ABSTRACT.registerFactory(RemoveAnnotationFix.JvmOverloads) + OVERLOADS_PRIVATE.registerFactory(RemoveAnnotationFix.JvmOverloads) + OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS.registerFactory(RemoveAnnotationFix.JvmOverloads) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt index 95aad01d51d..8d1454228de 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeInfo.kt @@ -47,7 +47,7 @@ import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorUtils -import org.jetbrains.kotlin.resolve.jvm.annotations.hasJvmOverloadsAnnotation +import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList @@ -353,7 +353,7 @@ open class KotlinChangeInfo( fun matchOriginalAndCurrentMethods(currentPsiMethods: List): Map { if (!(isPrimaryMethodUpdated && originalBaseFunctionDescriptor is FunctionDescriptor - && originalBaseFunctionDescriptor.hasJvmOverloadsAnnotation())) { + && originalBaseFunctionDescriptor.findJvmOverloadsAnnotation() != null)) { return (originalPsiMethods.zip(currentPsiMethods)).toMap() } diff --git a/idea/testData/quickfix/removeAnnotation/jvmOverloads.kt b/idea/testData/quickfix/removeAnnotation/jvmOverloads.kt new file mode 100644 index 00000000000..7c81fbe8aca --- /dev/null +++ b/idea/testData/quickfix/removeAnnotation/jvmOverloads.kt @@ -0,0 +1,6 @@ +// "Remove @JvmOverloads annotation" "true" +// WITH_RUNTIME + +interface T { + @kotlin.jvm.JvmOverloads fun foo(s: String = "OK") +} diff --git a/idea/testData/quickfix/removeAnnotation/jvmOverloads.kt.after b/idea/testData/quickfix/removeAnnotation/jvmOverloads.kt.after new file mode 100644 index 00000000000..2a9a681db91 --- /dev/null +++ b/idea/testData/quickfix/removeAnnotation/jvmOverloads.kt.after @@ -0,0 +1,6 @@ +// "Remove @JvmOverloads annotation" "true" +// WITH_RUNTIME + +interface T { + fun foo(s: String = "OK") +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 857dbcb7bee..e3eb43a7e02 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7243,6 +7243,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/removeAnnotation") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RemoveAnnotation extends AbstractQuickFixTest { + public void testAllFilesPresentInRemoveAnnotation() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/removeAnnotation"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("jvmOverloads.kt") + public void testJvmOverloads() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeAnnotation/jvmOverloads.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/removeFinalUpperBound") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)