From 681a42847335636bc8c08a275c42c292689931e1 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 16 Jun 2016 16:08:59 +0300 Subject: [PATCH] KT-2752: prohibit JSName on extension properties --- .../name/jsNameOnPropertyAndAccessor.kt | 3 --- .../name/jsNameOnPropertyAndAccessor.txt | 1 - .../name/jsNameProhibitedOnExtensionProperty.kt | 9 +++++++++ .../name/jsNameProhibitedOnExtensionProperty.txt | 13 +++++++++++++ .../DiagnosticsTestWithJsStdLibGenerated.java | 6 ++++++ .../resolve/diagnostics/DefaultErrorMessagesJs.kt | 1 + .../kotlin/js/resolve/diagnostics/ErrorsJs.java | 1 + .../kotlin/js/resolve/diagnostics/JsNameChecker.kt | 7 +++++++ 8 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameProhibitedOnExtensionProperty.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameProhibitedOnExtensionProperty.txt diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameOnPropertyAndAccessor.kt b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameOnPropertyAndAccessor.kt index 7d44c5f08dd..5b8802261e1 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameOnPropertyAndAccessor.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameOnPropertyAndAccessor.kt @@ -19,6 +19,3 @@ class A { @JsName("mm_") var mm: Int @JsName("get_mm") get() = 23 @JsName("set_mm") set(value) {} - -@JsName("ext_") val A.ext: Int - @JsName("get_ext") get() = 23 \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameOnPropertyAndAccessor.txt b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameOnPropertyAndAccessor.txt index f17c07f5638..43003848b1d 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameOnPropertyAndAccessor.txt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameOnPropertyAndAccessor.txt @@ -4,7 +4,6 @@ package foo { @kotlin.js.JsName(name = "mm_") public var mm: kotlin.Int @kotlin.js.JsName(name = "xx_") public val xx: kotlin.Int @kotlin.js.JsName(name = "yy_") public val yy: kotlin.Int = 0 - @kotlin.js.JsName(name = "ext_") public val foo.A.ext: kotlin.Int public final class A { public constructor A() diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameProhibitedOnExtensionProperty.kt b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameProhibitedOnExtensionProperty.kt new file mode 100644 index 00000000000..4b405f34394 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameProhibitedOnExtensionProperty.kt @@ -0,0 +1,9 @@ +package foo + +class A + +@JsName("xx") val A.x: Int + get() = 23 + +@property:JsName("yy") val A.y: Int + get() = 42 \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameProhibitedOnExtensionProperty.txt b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameProhibitedOnExtensionProperty.txt new file mode 100644 index 00000000000..dd90243bbbe --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameProhibitedOnExtensionProperty.txt @@ -0,0 +1,13 @@ +package + +package foo { + @kotlin.js.JsName(name = "xx") public val foo.A.x: kotlin.Int + @property:kotlin.js.JsName(name = "yy") public val foo.A.y: kotlin.Int + + 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 2e85e3a646f..83564cb5330 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -361,6 +361,12 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes doTest(fileName); } + @TestMetadata("jsNameProhibitedOnExtensionProperty.kt") + public void testJsNameProhibitedOnExtensionProperty() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameProhibitedOnExtensionProperty.kt"); + doTest(fileName); + } + @TestMetadata("jsNameUseTargetOnProperty.kt") public void testJsNameUseTargetOnProperty() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/name/jsNameUseTargetOnProperty.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 db73cce4c31..812a9fef24d 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 @@ -45,6 +45,7 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by lazy { put(ErrorsJs.JS_NAME_ON_ACCESSOR_AND_PROPERTY, "@JsName can be either on a property or its accessors, not both of them") 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") 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 e91f0167745..f18fe31c05e 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 @@ -49,6 +49,7 @@ public interface ErrorsJs { DiagnosticFactory0 JS_NAME_ON_ACCESSOR_AND_PROPERTY = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 JS_NAME_IS_NOT_ON_ALL_ACCESSORS = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 JS_NAME_PROHIBITED_FOR_OVERRIDE = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY = 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 65fe5b455d0..1bc3476a538 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 @@ -21,6 +21,8 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.DeclarationChecker +import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.SimpleDeclarationChecker object JsNameChecker : SimpleDeclarationChecker { @@ -51,6 +53,11 @@ object JsNameChecker : SimpleDeclarationChecker { diagnosticHolder.report(ErrorsJs.JS_NAME_ON_ACCESSOR_AND_PROPERTY.on(jsNamePsi)) } } + is PropertyDescriptor -> { + if (descriptor.isExtension) { + diagnosticHolder.report(ErrorsJs.JS_NAME_PROHIBITED_FOR_EXTENSION_PROPERTY.on(jsNamePsi)) + } + } } } } \ No newline at end of file