From 79e90b32e8511ed53e871e35eb730904167b83bb Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 17 Nov 2016 16:08:49 +0100 Subject: [PATCH] @JvmOverloads on local declarations is now an error --- .../kotlin/resolve/jvm/checkers/declarationCheckers.kt | 6 ++++-- .../resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java | 3 ++- .../kotlin/resolve/jvm/diagnostics/ErrorsJvm.java | 1 + .../annotations/jvmOverloads/jvmOverloadsOnPrivate.kt | 9 ++++++--- .../jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt | 1 + 5 files changed, 14 insertions(+), 6 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 00087d699a9..67e8d9b8e30 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 @@ -198,8 +198,10 @@ class OverloadsAnnotationChecker: SimpleDeclarationChecker { if (descriptor is FunctionDescriptor && descriptor.modality == Modality.ABSTRACT) { diagnosticHolder.report(ErrorsJvm.OVERLOADS_ABSTRACT.on(annotationEntry)) } - else if ((!descriptor.visibility.isPublicAPI && descriptor.visibility != Visibilities.INTERNAL) || - DescriptorUtils.isLocal(descriptor)) { + else if (DescriptorUtils.isLocal(descriptor)) { + diagnosticHolder.report(ErrorsJvm.OVERLOADS_LOCAL.on(annotationEntry)) + } + else if (!descriptor.visibility.isPublicAPI && descriptor.visibility != Visibilities.INTERNAL) { diagnosticHolder.report(ErrorsJvm.OVERLOADS_PRIVATE.on(annotationEntry)) } else if (descriptor.valueParameters.none { it.declaresDefaultValue() }) { 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 1027c8cb022..37374fbebee 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,7 +62,8 @@ 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_PRIVATE, "'@JvmOverloads' annotation has no effect on private and local declarations"); + 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"); MAP.put(ErrorsJvm.ILLEGAL_JVM_NAME, "Illegal JVM name"); MAP.put(ErrorsJvm.VOLATILE_ON_VALUE, "'@Volatile' annotation cannot be used on immutable properties"); 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 83e627296cc..17812b94397 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 @@ -60,6 +60,7 @@ public interface ErrorsJvm { DiagnosticFactory0 OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 OVERLOADS_ABSTRACT = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 OVERLOADS_PRIVATE = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 OVERLOADS_LOCAL = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT = DiagnosticFactory0.create(ERROR, ABSTRACT_MODIFIER); DiagnosticFactory0 EXTERNAL_DECLARATION_CANNOT_HAVE_BODY = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnPrivate.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnPrivate.kt index c4e706acaa8..533b155eb7d 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnPrivate.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmOverloads/jvmOverloadsOnPrivate.kt @@ -8,13 +8,16 @@ class C { } fun foo() { + @kotlin.jvm.JvmOverloads fun quux(s: String = "OK") { + } + class D { - @kotlin.jvm.JvmOverloads fun foo(s: String = "OK") { + @kotlin.jvm.JvmOverloads fun foo(s: String = "OK") { } } val x = object { - @kotlin.jvm.JvmOverloads fun foo(s: String = "OK") { - } + @kotlin.jvm.JvmOverloads fun foo(s: String = "OK") { + } } } \ 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 17f73cb91ad..7b1ad8e1e44 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -447,6 +447,7 @@ class QuickFixRegistrar : QuickFixContributor { OVERLOADS_ABSTRACT.registerFactory(RemoveAnnotationFix.JvmOverloads) OVERLOADS_PRIVATE.registerFactory(RemoveAnnotationFix.JvmOverloads) + OVERLOADS_LOCAL.registerFactory(RemoveAnnotationFix.JvmOverloads) OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS.registerFactory(RemoveAnnotationFix.JvmOverloads) } }