From 403753f5b5b99a24e48c7916e401f213d0277814 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Mon, 19 Dec 2016 14:06:14 +0300 Subject: [PATCH] JS: prohibit inline external declarations. See KT-15307 --- .../testsWithJsStdLib/native/inline.kt | 19 +++++++++++++++++++ .../testsWithJsStdLib/native/inline.txt | 15 +++++++++++++++ .../DiagnosticsTestWithJsStdLibGenerated.java | 6 ++++++ .../diagnostics/DefaultErrorMessagesJs.kt | 1 + .../js/resolve/diagnostics/ErrorsJs.java | 2 ++ .../resolve/diagnostics/JsExternalChecker.kt | 5 +++++ js/js.libraries/src/core/concurrent.kt | 2 +- 7 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/native/inline.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/native/inline.txt diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/inline.kt b/compiler/testData/diagnostics/testsWithJsStdLib/native/inline.kt new file mode 100644 index 00000000000..33e00459c88 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/inline.kt @@ -0,0 +1,19 @@ +// !DIAGNOSTICS: -NOTHING_TO_INLINE + +inline external fun foo(): Unit + +inline external val bar: Int + get() = noImpl + +external val baz: Int + inline get() = noImpl + +external class A { + inline fun foo(): Unit + + inline val bar: Int + get() = noImpl + + val baz: Int + inline get() = noImpl +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/native/inline.txt b/compiler/testData/diagnostics/testsWithJsStdLib/native/inline.txt new file mode 100644 index 00000000000..7558c460933 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/native/inline.txt @@ -0,0 +1,15 @@ +package + +public external val bar: kotlin.Int +public external val baz: kotlin.Int +public external inline fun foo(): kotlin.Unit + +public external final class A { + public constructor A() + public final val bar: kotlin.Int + public final val baz: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final inline fun foo(): kotlin.Unit + 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 38d112604f7..b88d89db08f 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithJsStdLibGenerated.java @@ -581,6 +581,12 @@ public class DiagnosticsTestWithJsStdLibGenerated extends AbstractDiagnosticsTes doTest(fileName); } + @TestMetadata("inline.kt") + public void testInline() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/native/inline.kt"); + doTest(fileName); + } + @TestMetadata("innerClass.kt") public void testInnerClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/native/innerClass.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 e78fb69530d..6e3c387c986 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 @@ -72,6 +72,7 @@ private val DIAGNOSTIC_FACTORY_TO_RENDERER by lazy { put(ErrorsJs.OVERRIDING_EXTERNAL_FUN_WITH_OPTIONAL_PARAMS_WITH_FAKE, "Overriding `external` function with optional parameters by declaration from superclass: {0}", Renderers.COMPACT) put(ErrorsJs.IMPLEMENTING_FUNCTION_INTERFACE, "Implementing function interface is prohibited in JavaScript") + put(ErrorsJs.INLINE_EXTERNAL_DECLARATION, "Inline external declaration") 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 3475859f375..93c5bf26d64 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 @@ -76,6 +76,8 @@ public interface ErrorsJs { DiagnosticFactory1.create(ERROR, PositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT); DiagnosticFactory0 IMPLEMENTING_FUNCTION_INTERFACE = DiagnosticFactory0.create( ERROR, PositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT); + DiagnosticFactory0 INLINE_EXTERNAL_DECLARATION = DiagnosticFactory0.create( + ERROR, PositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT); @SuppressWarnings("UnusedDeclaration") Object _initializer = new Object() { diff --git a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsExternalChecker.kt b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsExternalChecker.kt index 5b28cc6f00b..9ca91125a02 100644 --- a/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsExternalChecker.kt +++ b/js/js.frontend/src/org/jetbrains/kotlin/js/resolve/diagnostics/JsExternalChecker.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.js.resolve.diagnostics import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.annotations.isInlineOnlyOrReified import org.jetbrains.kotlin.diagnostics.DiagnosticSink import org.jetbrains.kotlin.js.PredefinedAnnotation import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils @@ -75,6 +76,10 @@ object JsExternalChecker : SimpleDeclarationChecker { diagnosticHolder.report(ErrorsJs.EXTERNAL_TYPE_EXTENDS_NON_EXTERNAL_TYPE.on(declaration)) } } + + if (descriptor is FunctionDescriptor && descriptor.isInline) { + diagnosticHolder.report(ErrorsJs.INLINE_EXTERNAL_DECLARATION.on(declaration)) + } } private fun isDirectlyExternal(declaration: KtDeclaration, descriptor: DeclarationDescriptor): Boolean { diff --git a/js/js.libraries/src/core/concurrent.kt b/js/js.libraries/src/core/concurrent.kt index 822b769287a..24a322f003f 100644 --- a/js/js.libraries/src/core/concurrent.kt +++ b/js/js.libraries/src/core/concurrent.kt @@ -35,4 +35,4 @@ public annotation class Volatile @Retention(AnnotationRetention.SOURCE) public annotation class Synchronized -public external inline fun synchronized(lock: Any, crossinline block: () -> R): R = block() +public inline fun synchronized(lock: Any, crossinline block: () -> R): R = block()