From 4e2b1d68cf89a53c8aab58dda7b00b82a4249853 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 23 Jun 2016 18:46:15 +0300 Subject: [PATCH] KT-2752: deprecate parameter of @native annotation, prohibit simultaneous usage of parameterized @native and @JsName --- .../testsWithJsStdLib/name/jsNameAndNamedNative.kt | 1 + .../testsWithJsStdLib/name/jsNameAndNamedNative.txt | 8 ++++++++ .../checkers/DiagnosticsTestWithJsStdLibGenerated.java | 6 ++++++ .../js/resolve/diagnostics/DefaultErrorMessagesJs.kt | 1 + .../jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java | 1 + .../kotlin/js/resolve/diagnostics/JsNameChecker.kt | 7 +++++++ .../kotlin/js/translate/utils/AnnotationsUtils.java | 2 +- js/js.libraries/src/core/annotations.kt | 2 +- 8 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndNamedNative.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndNamedNative.txt diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndNamedNative.kt b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndNamedNative.kt new file mode 100644 index 00000000000..64f6e3f0638 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndNamedNative.kt @@ -0,0 +1 @@ +@native("B") @JsName("C") class A diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndNamedNative.txt b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndNamedNative.txt new file mode 100644 index 00000000000..9e060ce04ba --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndNamedNative.txt @@ -0,0 +1,8 @@ +package + +@kotlin.js.native(name = "B") @kotlin.js.JsName(name = "C") public final class A { + public constructor A() + 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/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java index 83564cb5330..0ac7efe2fc5 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -313,6 +313,12 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes doTest(fileName); } + @TestMetadata("jsNameAndNamedNative.kt") + public void testJsNameAndNamedNative() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndNamedNative.kt"); + doTest(fileName); + } + @TestMetadata("jsNameAndOverridden.kt") public void testJsNameAndOverridden() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameAndOverridden.kt"); diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt index 812a9fef24d..bca04fd7413 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/DefaultErrorMessagesJs.kt @@ -46,6 +46,7 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by lazy { put(ErrorsJs.JS_NAME_IS_NOT_ON_ALL_ACCESSORS, "@JsName should be on all of the property accessors") put(ErrorsJs.JS_NAME_PROHIBITED_FOR_OVERRIDE, "@JsName is prohibited for overridden members") put(ErrorsJs.JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY, "@JsName is prohibited for extension properties") + put(ErrorsJs.JS_NAME_PROHIBITED_FOR_NAMED_NATIVE, "@JsName is prohibited for @native declaration with explicit name") this } diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java index 259d916e8f6..22a3bfdabca 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/ErrorsJs.java @@ -51,6 +51,7 @@ public interface ErrorsJs { DiagnosticFactory0 JS_NAME_IS_NOT_ON_ALL_ACCESSORS = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE_OR_DEFAULT); DiagnosticFactory0 JS_NAME_PROHIBITED_FOR_OVERRIDE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 JS_NAME_PROHIBITED_FOR_NAMED_NATIVE = DiagnosticFactory0.create(ERROR); @SuppressWarnings("UnusedDeclaration") Object _initializer = new Object() { diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameChecker.kt index 1bc3476a538..0c4abc55b53 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsNameChecker.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.js.resolve.diagnostics import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.DiagnosticSink +import org.jetbrains.kotlin.js.PredefinedAnnotation import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.BindingContext @@ -38,6 +39,12 @@ object JsNameChecker : SimpleDeclarationChecker { if (AnnotationsUtils.getJsName(descriptor) == null) return val jsNamePsi = AnnotationsUtils.getJsNameAnnotationPsi(bindingContext, declaration, descriptor) ?: return + if (AnnotationsUtils.isNativeObject(descriptor) && + AnnotationsUtils.getNameForAnnotatedObject(descriptor, PredefinedAnnotation.NATIVE) != null + ) { + diagnosticHolder.report(ErrorsJs.JS_NAME_PROHIBITED_FOR_NAMED_NATIVE.on(jsNamePsi)) + } + if (descriptor is CallableMemberDescriptor && descriptor.overriddenDescriptors.isNotEmpty()) { diagnosticHolder.report(ErrorsJs.JS_NAME_PROHIBITED_FOR_OVERRIDE.on(jsNamePsi)) } diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java b/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java index 46ac44d2377..cb7f3efbcd4 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/translate/utils/AnnotationsUtils.java @@ -68,7 +68,7 @@ public final class AnnotationsUtils { } @Nullable - private static String getNameForAnnotatedObject(@NotNull DeclarationDescriptor declarationDescriptor, + public static String getNameForAnnotatedObject(@NotNull DeclarationDescriptor declarationDescriptor, @NotNull PredefinedAnnotation annotation) { if (!hasAnnotation(declarationDescriptor, annotation)) { return null; diff --git a/js/js.libraries/src/core/annotations.kt b/js/js.libraries/src/core/annotations.kt index 8b3b276e40d..993e6b88cf3 100644 --- a/js/js.libraries/src/core/annotations.kt +++ b/js/js.libraries/src/core/annotations.kt @@ -20,7 +20,7 @@ import kotlin.annotation.AnnotationTarget.* @native @Target(CLASS, FUNCTION, PROPERTY, CONSTRUCTOR, VALUE_PARAMETER, PROPERTY_GETTER, PROPERTY_SETTER) -public annotation class native(public val name: String = "") +public annotation class native(@Deprecated public val name: String = "") @native @Target(FUNCTION)