From 30832ed774a9416895fc55f8a65d49c9c15ff71a Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Wed, 11 Mar 2015 14:11:55 +0300 Subject: [PATCH] Properly report diagnostics on platformStatic annotations #KT-6937 Fixed --- .../load/kotlin/KotlinJvmCheckerProvider.kt | 19 +++++---- .../diagnostics/DefaultErrorMessagesJvm.java | 2 +- .../resolve/jvm/diagnostics/ErrorsJvm.java | 2 +- .../platformStatic/finalAndAbstract.kt | 35 ++++++++++++++++ .../platformStatic/finalAndAbstract.txt | 40 +++++++++++++++++++ .../annotations/platformStatic/property.kt | 6 +-- ...JetDiagnosticsTestWithStdLibGenerated.java | 6 +++ 7 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/finalAndAbstract.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/finalAndAbstract.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt index 617d5a0379d..f9f5f111b08 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt @@ -18,14 +18,11 @@ package org.jetbrains.kotlin.load.kotlin import org.jetbrains.kotlin.resolve.AdditionalCheckerProvider import org.jetbrains.kotlin.resolve.AnnotationChecker -import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.resolve.annotations.hasPlatformStaticAnnotation -import org.jetbrains.kotlin.psi.JetNamedFunction import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm import org.jetbrains.kotlin.lexer.JetTokens -import org.jetbrains.kotlin.psi.JetProperty import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.resolve.annotations.hasInlineAnnotation @@ -36,14 +33,11 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils -import org.jetbrains.kotlin.psi.JetTypeParameter import org.jetbrains.kotlin.resolve.annotations.hasIntrinsicAnnotation import org.jetbrains.kotlin.load.kotlin.nativeDeclarations.NativeFunChecker -import org.jetbrains.kotlin.psi.JetPropertyAccessor import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.resolve.jvm.calls.checkers.NeedSyntheticChecker import org.jetbrains.kotlin.resolve.calls.checkers.AdditionalTypeChecker -import org.jetbrains.kotlin.psi.JetExpression import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext import org.jetbrains.kotlin.types.TypeUtils @@ -53,14 +47,14 @@ import org.jetbrains.kotlin.types.isFlexible import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.NullabilityInformationSource import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor +import org.jetbrains.kotlin.lexer.JetModifierKeywordToken +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.resolve.calls.context.CallResolutionContext import org.jetbrains.kotlin.resolve.calls.smartcasts.Nullability -import org.jetbrains.kotlin.psi.JetPostfixExpression -import org.jetbrains.kotlin.psi.JetBinaryExpression import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.expressions.SenselessComparisonChecker @@ -111,8 +105,13 @@ public class PlatformStaticAnnotationChecker : AnnotationChecker { diagnosticHolder.report(ErrorsJvm.PLATFORM_STATIC_NOT_IN_OBJECT.on(declaration)); } - if (insideObject && descriptor is MemberDescriptor && descriptor.getModality().isOverridable()) { - diagnosticHolder.report(ErrorsJvm.OPEN_CANNOT_BE_STATIC.on(declaration)); + val checkDeclaration = when(declaration) { + is JetPropertyAccessor -> declaration.getParent() as JetProperty + else -> declaration + } + + if (insideObject && checkDeclaration.getModifierList()?.hasModifier(JetTokens.OVERRIDE_KEYWORD) == true) { + diagnosticHolder.report(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC.on(declaration)); } } } 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 b0962188e7a..c3bc9f63b21 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 @@ -46,7 +46,7 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { MAP.put(ErrorsJvm.CONFLICTING_JVM_DECLARATIONS, "Platform declaration clash: {0}", CONFLICTING_JVM_DECLARATIONS_DATA); MAP.put(ErrorsJvm.ACCIDENTAL_OVERRIDE, "Accidental override: {0}", CONFLICTING_JVM_DECLARATIONS_DATA); MAP.put(ErrorsJvm.PLATFORM_STATIC_NOT_IN_OBJECT, "Only functions in named objects and default objects of classes can be annotated with 'platformStatic'"); - MAP.put(ErrorsJvm.OPEN_CANNOT_BE_STATIC, "Open member cannot be 'platformStatic' in object"); + MAP.put(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC, "Override member cannot be 'platformStatic' in object"); MAP.put(ErrorsJvm.PLATFORM_STATIC_ILLEGAL_USAGE, "This declaration does not support ''platformStatic''", DescriptorRenderer.SHORT_NAMES_IN_TYPES); MAP.put(ErrorsJvm.NATIVE_DECLARATION_CANNOT_BE_ABSTRACT, "Native declaration can not be abstract"); MAP.put(ErrorsJvm.NATIVE_DECLARATION_CANNOT_HAVE_BODY, "Native declaration can not have a body"); 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 a38fc90dff3..4f7a82b32a3 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 @@ -37,7 +37,7 @@ public interface ErrorsJvm { DiagnosticFactory1 ACCIDENTAL_OVERRIDE = DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT); - DiagnosticFactory0 OPEN_CANNOT_BE_STATIC = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); + DiagnosticFactory0 OVERRIDE_CANNOT_BE_STATIC = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory0 PLATFORM_STATIC_NOT_IN_OBJECT = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE); DiagnosticFactory1 PLATFORM_STATIC_ILLEGAL_USAGE = DiagnosticFactory1.create(ERROR, DECLARATION_SIGNATURE); diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/finalAndAbstract.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/finalAndAbstract.kt new file mode 100644 index 00000000000..6997830106d --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/finalAndAbstract.kt @@ -0,0 +1,35 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE +import kotlin.platform.platformStatic + +abstract class A { + + open fun a() {} + + abstract fun b() + + open fun c() {} +} + +object B: A() { + + [platformStatic] override fun a() {} + + [platformStatic] override fun b() {} + + [platformStatic] final override fun c() {} + + [platformStatic] open fun d() {} +} + +class C { + + default object: A() { + [platformStatic] override fun a() {} + + [platformStatic] override fun b() {} + + [platformStatic] final override fun c() {} + + [platformStatic] open fun d() {} + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/finalAndAbstract.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/finalAndAbstract.txt new file mode 100644 index 00000000000..e5c1c4b5273 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/finalAndAbstract.txt @@ -0,0 +1,40 @@ +package + +internal abstract class A { + public constructor A() + internal open fun a(): kotlin.Unit + internal abstract fun b(): kotlin.Unit + internal open fun c(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal object B : A { + private constructor B() + kotlin.platform.platformStatic() internal open override /*1*/ fun a(): kotlin.Unit + kotlin.platform.platformStatic() internal open override /*1*/ fun b(): kotlin.Unit + kotlin.platform.platformStatic() internal final override /*1*/ fun c(): kotlin.Unit + kotlin.platform.platformStatic() internal open fun d(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +internal final class C { + public constructor C() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + internal default object Default : A { + private constructor Default() + kotlin.platform.platformStatic() internal open override /*1*/ fun a(): kotlin.Unit + kotlin.platform.platformStatic() internal open override /*1*/ fun b(): kotlin.Unit + kotlin.platform.platformStatic() internal final override /*1*/ fun c(): kotlin.Unit + kotlin.platform.platformStatic() internal open fun d(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/property.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/property.kt index 5d9b7c8e319..22a9686f629 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/property.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/property.kt @@ -29,12 +29,12 @@ class A { [platformStatic] val z = 1; - [platformStatic] override val base1: Int = 0 + [platformStatic] override val base1: Int = 0 - platformStatic open fun f() {} + platformStatic open fun f() {} override val base2: Int = 0 - [platformStatic] get + [platformStatic] get } var p:Int = 1 diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java index 0a158b886ac..6d519b84964 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -158,6 +158,12 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("finalAndAbstract.kt") + public void testFinalAndAbstract() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/finalAndAbstract.kt"); + doTest(fileName); + } + @TestMetadata("functions.kt") public void testFunctions() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/platformStatic/functions.kt");