From 6ee8a23dddf769ddd8de50c1e12ced686543f840 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 16 Dec 2016 22:03:03 +0300 Subject: [PATCH] JS: Drop native map get/set intrinsics altogether. MutableMap.set extension operator is now common among stdlib and stdlib-js. #KT-2323 --- js/js.libraries/src/core/core.kt | 1 - .../js/test/semantics/BoxJsTestGenerated.java | 6 -- .../functions/factories/TopLevelFIF.java | 97 ------------------- .../testData/box/native/kt2323.js | 1 - .../testData/box/native/kt2323.kt | 11 --- .../stdlib/src/kotlin/collections/Maps.kt | 8 ++ .../stdlib/src/kotlin/collections/MapsJVM.kt | 9 +- 7 files changed, 9 insertions(+), 124 deletions(-) delete mode 100644 js/js.translator/testData/box/native/kt2323.js delete mode 100644 js/js.translator/testData/box/native/kt2323.kt diff --git a/js/js.libraries/src/core/core.kt b/js/js.libraries/src/core/core.kt index 2a8a202349e..1530c863590 100644 --- a/js/js.libraries/src/core/core.kt +++ b/js/js.libraries/src/core/core.kt @@ -7,7 +7,6 @@ public external fun eval(expr: String): dynamic = noImpl public external val undefined: Nothing? = noImpl -inline operator fun MutableMap.set(key: K, value: V): V? = asDynamic().set(key, value) @library public fun println() {} diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 63f0a15cd78..b8e1da4ad3e 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -5723,12 +5723,6 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } - @TestMetadata("kt2323.kt") - public void testKt2323() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/kt2323.kt"); - doTest(fileName); - } - @TestMetadata("library.kt") public void testLibrary() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/library.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java index ddf9d080094..6d2f81e592f 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java @@ -91,53 +91,6 @@ public final class TopLevelFIF extends CompositeFIF { } }; - private static final FunctionIntrinsic NATIVE_MAP_GET = new NativeMapGetSet() { - @NotNull - @Override - protected String operationName() { - return "get"; - } - - @Nullable - @Override - protected ExpressionReceiver getExpressionReceiver(@NotNull ResolvedCall resolvedCall) { - ReceiverValue result = resolvedCall.getDispatchReceiver(); - return result instanceof ExpressionReceiver ? (ExpressionReceiver) result : null; - } - - @Override - protected JsExpression asArrayAccess( - @NotNull JsExpression receiver, - @NotNull List arguments, - @NotNull TranslationContext context - ) { - return ArrayFIF.GET_INTRINSIC.apply(receiver, arguments, context); - } - }; - - private static final FunctionIntrinsic NATIVE_MAP_SET = new NativeMapGetSet() { - @NotNull - @Override - protected String operationName() { - return "put"; - } - - @Nullable - @Override - protected ExpressionReceiver getExpressionReceiver(@NotNull ResolvedCall resolvedCall) { - ReceiverValue result = resolvedCall.getExtensionReceiver(); - return result instanceof ExpressionReceiver ? (ExpressionReceiver) result : null; - } - - @Override - protected JsExpression asArrayAccess( - @NotNull JsExpression receiver, - @NotNull List arguments, - @NotNull TranslationContext context - ) { - return ArrayFIF.SET_INTRINSIC.apply(receiver, arguments, context); - } - }; private static final JsExpression getReferenceToOnlyTypeParameter( @NotNull CallInfo callInfo, @NotNull TranslationContext context @@ -218,9 +171,6 @@ public final class TopLevelFIF extends CompositeFIF { add(pattern("kotlin", "arrayOfNulls"), new KotlinFunctionIntrinsic("nullArray")); add(pattern("kotlin", "iterator").isExtensionOf(FQ_NAMES.iterator.asString()), RETURN_RECEIVER_INTRINSIC); - add(pattern("kotlin.collections", "Map", "get").checkOverridden(), NATIVE_MAP_GET); - add(pattern("kotlin.js", "set").isExtensionOf(FQ_NAMES.mutableMap.asString()), NATIVE_MAP_SET); - add(pattern("kotlin.js", "Json", "get"), ArrayFIF.GET_INTRINSIC); add(pattern("kotlin.js", "Json", "set"), ArrayFIF.SET_INTRINSIC); @@ -230,51 +180,4 @@ public final class TopLevelFIF extends CompositeFIF { add(pattern("kotlin", "enumValueOf"), ENUM_VALUE_OF_INTRINSIC); } - private abstract static class NativeMapGetSet extends CallParametersAwareFunctionIntrinsic { - @NotNull - protected abstract String operationName(); - - @Nullable - protected abstract ExpressionReceiver getExpressionReceiver(@NotNull ResolvedCall resolvedCall); - - protected abstract JsExpression asArrayAccess( - @NotNull JsExpression receiver, - @NotNull List arguments, - @NotNull TranslationContext context - ); - - @NotNull - @Override - public JsExpression apply(@NotNull CallInfo callInfo, @NotNull List arguments, @NotNull TranslationContext context) { - ExpressionReceiver expressionReceiver = getExpressionReceiver(callInfo.getResolvedCall()); - JsExpression thisOrReceiver = getThisOrReceiverOrNull(callInfo); - assert thisOrReceiver != null; - if (expressionReceiver != null) { - KtExpression expression = expressionReceiver.getExpression(); - KtReferenceExpression referenceExpression = null; - if (expression instanceof KtReferenceExpression) { - referenceExpression = (KtReferenceExpression) expression; - } - else if (expression instanceof KtQualifiedExpression) { - KtExpression candidate = ((KtQualifiedExpression) expression).getReceiverExpression(); - if (candidate instanceof KtReferenceExpression) { - referenceExpression = (KtReferenceExpression) candidate; - } - } - - if (referenceExpression != null) { - DeclarationDescriptor candidate = BindingUtils.getDescriptorForReferenceExpression(context.bindingContext(), - referenceExpression); - if (candidate instanceof PropertyDescriptor && AnnotationsUtils.isNativeObject(candidate)) { - return asArrayAccess(thisOrReceiver, arguments, context); - } - } - } - - String mangledName = getStableMangledNameForDescriptor(JsPlatform.INSTANCE.getBuiltIns().getMutableMap(), operationName()); - - return new JsInvocation(JsAstUtils.pureFqn(mangledName, thisOrReceiver), arguments); - } - } - } diff --git a/js/js.translator/testData/box/native/kt2323.js b/js/js.translator/testData/box/native/kt2323.js deleted file mode 100644 index 56857253173..00000000000 --- a/js/js.translator/testData/box/native/kt2323.js +++ /dev/null @@ -1 +0,0 @@ -var classes = {"answer": 42}, classesMutable = {}; diff --git a/js/js.translator/testData/box/native/kt2323.kt b/js/js.translator/testData/box/native/kt2323.kt deleted file mode 100644 index 811697cacda..00000000000 --- a/js/js.translator/testData/box/native/kt2323.kt +++ /dev/null @@ -1,11 +0,0 @@ -package foo - - -external val classes: Map = noImpl - -external val classesMutable: HashMap = noImpl - -fun box(): String { - classesMutable.set("why", "?") - return if (classes.get("answer") == 42 && classesMutable.get("why") == "?") "OK" else "fail" -} \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/collections/Maps.kt b/libraries/stdlib/src/kotlin/collections/Maps.kt index fba51344181..d5d58e83bcd 100644 --- a/libraries/stdlib/src/kotlin/collections/Maps.kt +++ b/libraries/stdlib/src/kotlin/collections/Maps.kt @@ -130,6 +130,14 @@ public inline operator fun <@kotlin.internal.OnlyInputTypes K, V> Map. public inline operator fun <@kotlin.internal.OnlyInputTypes K, V> Map.get(key: K): V? = @Suppress("UNCHECKED_CAST") (this as Map).get(key) +/** + * Allows to use the index operator for storing values in a mutable map. + */ +@kotlin.internal.InlineOnly +public inline operator fun MutableMap.set(key: K, value: V): Unit { + put(key, value) +} + /** * Returns `true` if the map contains the specified [key]. * diff --git a/libraries/stdlib/src/kotlin/collections/MapsJVM.kt b/libraries/stdlib/src/kotlin/collections/MapsJVM.kt index cd4a82605f0..3d7e1c44118 100644 --- a/libraries/stdlib/src/kotlin/collections/MapsJVM.kt +++ b/libraries/stdlib/src/kotlin/collections/MapsJVM.kt @@ -11,14 +11,7 @@ import java.util.SortedMap import java.util.TreeMap import java.util.concurrent.ConcurrentMap -/** - * Allows to use the index operator for storing values in a mutable map. - */ -// this code is JVM-specific, because JS has native set function -@kotlin.internal.InlineOnly -public inline operator fun MutableMap.set(key: K, value: V): Unit { - put(key, value) -} + /** * Concurrent getOrPut, that is safe for concurrent maps.