From b8525de726c58a7cee85e5ab35f39975038a7fa2 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 17 Nov 2016 16:20:10 +0100 Subject: [PATCH] Disallow @JvmOverloads on any interface methods #KT-12224 Fixed --- .../kotlin/resolve/jvm/checkers/declarationCheckers.kt | 5 ++++- .../resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java | 1 + .../jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java | 1 + .../annotations/jvmOverloads/JvmOverloadWithNoDefaults.kt | 2 +- .../jvmOverloads/jvmOverloadsOnAbstractMethods.kt | 5 ++++- .../jvmOverloads/jvmOverloadsOnAbstractMethods.txt | 1 + .../org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt | 1 + 7 files changed, 13 insertions(+), 3 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt index 67e8d9b8e30..dff8b7dfc79 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt @@ -195,7 +195,10 @@ class OverloadsAnnotationChecker: SimpleDeclarationChecker { if (descriptor !is CallableDescriptor) { return } - if (descriptor is FunctionDescriptor && descriptor.modality == Modality.ABSTRACT) { + if ((descriptor.containingDeclaration as? ClassDescriptor)?.kind == ClassKind.INTERFACE) { + diagnosticHolder.report(ErrorsJvm.OVERLOADS_INTERFACE.on(annotationEntry)) + } + else if (descriptor is FunctionDescriptor && descriptor.modality == Modality.ABSTRACT) { diagnosticHolder.report(ErrorsJvm.OVERLOADS_ABSTRACT.on(annotationEntry)) } else if (DescriptorUtils.isLocal(descriptor)) { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java index 37374fbebee..0a6f95cb946 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java @@ -62,6 +62,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC, "Override member cannot be '@JvmStatic' in object"); MAP.put(ErrorsJvm.OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS, "'@JvmOverloads' annotation has no effect for methods without default arguments"); MAP.put(ErrorsJvm.OVERLOADS_ABSTRACT, "'@JvmOverloads' annotation cannot be used on abstract methods"); + MAP.put(ErrorsJvm.OVERLOADS_INTERFACE, "'@JvmOverloads' annotation cannot be used on interface methods"); MAP.put(ErrorsJvm.OVERLOADS_PRIVATE, "'@JvmOverloads' annotation has no effect on private declarations"); MAP.put(ErrorsJvm.OVERLOADS_LOCAL, "'@JvmOverloads' annotation cannot be used on local declarations"); MAP.put(ErrorsJvm.INAPPLICABLE_JVM_NAME, "'@JvmName' annotation is not applicable to this declaration"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index 17812b94397..6c560cda173 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -59,6 +59,7 @@ public interface ErrorsJvm { DiagnosticFactory0 OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 OVERLOADS_ABSTRACT = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 OVERLOADS_INTERFACE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 OVERLOADS_PRIVATE = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 OVERLOADS_LOCAL = DiagnosticFactory0.create(ERROR); diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/JvmOverloadWithNoDefaults.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/JvmOverloadWithNoDefaults.kt index 67cff340322..289c28f7c0e 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/JvmOverloadWithNoDefaults.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/JvmOverloadWithNoDefaults.kt @@ -3,5 +3,5 @@ class C { @kotlin.jvm.JvmOverloads constructor() { } - @kotlin.jvm.JvmOverloads1 fun foo(s: String) {} + @kotlin.jvm.JvmOverloads fun foo(s: String) {} } \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnAbstractMethods.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnAbstractMethods.kt index 4b53347c431..d6ce7d76e21 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnAbstractMethods.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnAbstractMethods.kt @@ -1,5 +1,8 @@ interface T { - @kotlin.jvm.JvmOverloads fun foo(s: String = "OK") + @kotlin.jvm.JvmOverloads fun foo(s: String = "OK") + + @kotlin.jvm.JvmOverloads fun bar(s: String = "OK") { + } } diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnAbstractMethods.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnAbstractMethods.txt index e47fa67a3d0..cbc95e4a921 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnAbstractMethods.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnAbstractMethods.txt @@ -9,6 +9,7 @@ public abstract class C { } public interface T { + @kotlin.jvm.JvmOverloads public open fun bar(/*0*/ s: kotlin.String = ...): kotlin.Unit public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean @kotlin.jvm.JvmOverloads public abstract fun foo(/*0*/ s: kotlin.String = ...): kotlin.Unit public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 7b1ad8e1e44..85d7daa5c40 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -446,6 +446,7 @@ class QuickFixRegistrar : QuickFixContributor { INAPPLICABLE_LATEINIT_MODIFIER.registerFactory(RemoveNullableFix.LATEINIT_FACTORY) OVERLOADS_ABSTRACT.registerFactory(RemoveAnnotationFix.JvmOverloads) + OVERLOADS_INTERFACE.registerFactory(RemoveAnnotationFix.JvmOverloads) OVERLOADS_PRIVATE.registerFactory(RemoveAnnotationFix.JvmOverloads) OVERLOADS_LOCAL.registerFactory(RemoveAnnotationFix.JvmOverloads) OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS.registerFactory(RemoveAnnotationFix.JvmOverloads)