Report warning on @JvmStatic in private companion objects
Deprecation cycle to prohibit in 1.5. ^KT-25114 In Progress
This commit is contained in:
+31
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.resolve.jvm.checkers
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
|
import org.jetbrains.kotlin.diagnostics.Errors.JVM_STATIC_IN_PRIVATE_COMPANION
|
||||||
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
|
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
|
||||||
|
import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker
|
||||||
|
import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext
|
||||||
|
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
|
class JvmStaticInPrivateCompanionChecker : DeclarationChecker {
|
||||||
|
override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
|
||||||
|
|
||||||
|
descriptor.containingDeclaration.safeAs<ClassDescriptor>()?.takeIf {
|
||||||
|
it.isCompanionObject && Visibilities.isPrivate(it.visibility.delegate)
|
||||||
|
} ?: return
|
||||||
|
|
||||||
|
val jvmStaticAnnotation = descriptor.annotations.findAnnotation(JVM_STATIC_ANNOTATION_FQ_NAME) ?: return
|
||||||
|
|
||||||
|
val reportTarget = jvmStaticAnnotation.source.safeAs<KotlinSourceElement>()?.psi ?: declaration
|
||||||
|
context.trace.report(JVM_STATIC_IN_PRIVATE_COMPANION.on(reportTarget))
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -95,6 +95,7 @@ object JvmPlatformConfigurator : PlatformConfiguratorBase(
|
|||||||
) {
|
) {
|
||||||
override fun configureModuleComponents(container: StorageComponentContainer) {
|
override fun configureModuleComponents(container: StorageComponentContainer) {
|
||||||
container.useImpl<JvmStaticChecker>()
|
container.useImpl<JvmStaticChecker>()
|
||||||
|
container.useImpl<JvmStaticInPrivateCompanionChecker>()
|
||||||
container.useImpl<JvmReflectionAPICallChecker>()
|
container.useImpl<JvmReflectionAPICallChecker>()
|
||||||
container.useImpl<JavaSyntheticScopes>()
|
container.useImpl<JavaSyntheticScopes>()
|
||||||
container.useImpl<SamConversionResolverImpl>()
|
container.useImpl<SamConversionResolverImpl>()
|
||||||
|
|||||||
@@ -285,6 +285,7 @@ public interface Errors {
|
|||||||
DiagnosticFactory1<PsiElement, String> EXPERIMENTAL_UNSIGNED_LITERALS_ERROR = DiagnosticFactory1.create(ERROR);
|
DiagnosticFactory1<PsiElement, String> EXPERIMENTAL_UNSIGNED_LITERALS_ERROR = DiagnosticFactory1.create(ERROR);
|
||||||
|
|
||||||
DiagnosticFactory0<PsiElement> NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<PsiElement> NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES = DiagnosticFactory0.create(ERROR);
|
||||||
|
DiagnosticFactory0<PsiElement> JVM_STATIC_IN_PRIVATE_COMPANION = DiagnosticFactory0.create(WARNING);
|
||||||
|
|
||||||
// Const
|
// Const
|
||||||
DiagnosticFactory0<PsiElement> CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT = DiagnosticFactory0.create(ERROR);
|
DiagnosticFactory0<PsiElement> CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT = DiagnosticFactory0.create(ERROR);
|
||||||
|
|||||||
+1
@@ -169,6 +169,7 @@ public class DefaultErrorMessages {
|
|||||||
MAP.put(EXPERIMENTAL_UNSIGNED_LITERALS_ERROR, "{0}", STRING);
|
MAP.put(EXPERIMENTAL_UNSIGNED_LITERALS_ERROR, "{0}", STRING);
|
||||||
|
|
||||||
MAP.put(NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES, "Non-parenthesized annotations on function types without receiver aren't yet supported (see KT-31734 for details)");
|
MAP.put(NON_PARENTHESIZED_ANNOTATIONS_ON_FUNCTIONAL_TYPES, "Non-parenthesized annotations on function types without receiver aren't yet supported (see KT-31734 for details)");
|
||||||
|
MAP.put(JVM_STATIC_IN_PRIVATE_COMPANION, "@JvmStatic is prohibited in private companion objects. This warning will become an error in the next major version");
|
||||||
|
|
||||||
MAP.put(REDUNDANT_MODIFIER, "Modifier ''{0}'' is redundant because ''{1}'' is present", TO_STRING, TO_STRING);
|
MAP.put(REDUNDANT_MODIFIER, "Modifier ''{0}'' is redundant because ''{1}'' is present", TO_STRING, TO_STRING);
|
||||||
MAP.put(REDUNDANT_OPEN_IN_INTERFACE, "Modifier 'open' is redundant for abstract interface members");
|
MAP.put(REDUNDANT_OPEN_IN_INTERFACE, "Modifier 'open' is redundant for abstract interface members");
|
||||||
|
|||||||
Vendored
+29
@@ -0,0 +1,29 @@
|
|||||||
|
// Issue: KT-25114
|
||||||
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
class WithPrivateCompanion {
|
||||||
|
private companion object {
|
||||||
|
@JvmStatic
|
||||||
|
val staticVal1: Int = 42
|
||||||
|
|
||||||
|
val staticVal2: Int
|
||||||
|
@JvmStatic get() = 42
|
||||||
|
|
||||||
|
@get:JvmStatic
|
||||||
|
val staticVal3: Int = 42
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
var staticVar1: Int = 42
|
||||||
|
|
||||||
|
var staticVar2: Int
|
||||||
|
@JvmStatic get() = 42
|
||||||
|
@JvmStatic set(value) {}
|
||||||
|
|
||||||
|
@get: JvmStatic
|
||||||
|
@set: JvmStatic
|
||||||
|
var staticVar3: Int = 42
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun staticFunction() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+9
-10
@@ -1,30 +1,29 @@
|
|||||||
// Issue: KT-25114
|
// Issue: KT-25114
|
||||||
// FIR_IDENTICAL
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
class WithPrivateCompanion {
|
class WithPrivateCompanion {
|
||||||
private companion object {
|
private companion object {
|
||||||
@JvmStatic
|
<!JVM_STATIC_IN_PRIVATE_COMPANION!>@JvmStatic<!>
|
||||||
val staticVal1: Int = 42
|
val staticVal1: Int = 42
|
||||||
|
|
||||||
val staticVal2: Int
|
val staticVal2: Int
|
||||||
@JvmStatic get() = 42
|
<!JVM_STATIC_IN_PRIVATE_COMPANION!>@JvmStatic<!> get() = 42
|
||||||
|
|
||||||
@get:JvmStatic
|
<!JVM_STATIC_IN_PRIVATE_COMPANION!>@get:JvmStatic<!>
|
||||||
val staticVal3: Int = 42
|
val staticVal3: Int = 42
|
||||||
|
|
||||||
@JvmStatic
|
<!JVM_STATIC_IN_PRIVATE_COMPANION!>@JvmStatic<!>
|
||||||
var staticVar1: Int = 42
|
var staticVar1: Int = 42
|
||||||
|
|
||||||
var staticVar2: Int
|
var staticVar2: Int
|
||||||
@JvmStatic get() = 42
|
<!JVM_STATIC_IN_PRIVATE_COMPANION!>@JvmStatic<!> get() = 42
|
||||||
@JvmStatic set(value) {}
|
<!JVM_STATIC_IN_PRIVATE_COMPANION!>@JvmStatic<!> set(value) {}
|
||||||
|
|
||||||
@get: JvmStatic
|
<!JVM_STATIC_IN_PRIVATE_COMPANION!>@get: JvmStatic<!>
|
||||||
@set: JvmStatic
|
<!JVM_STATIC_IN_PRIVATE_COMPANION!>@set: JvmStatic<!>
|
||||||
var staticVar3: Int = 42
|
var staticVar3: Int = 42
|
||||||
|
|
||||||
@JvmStatic
|
<!JVM_STATIC_IN_PRIVATE_COMPANION!>@JvmStatic<!>
|
||||||
fun staticFunction() {}
|
fun staticFunction() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user