JS: Drop native map get/set intrinsics altogether.
MutableMap.set extension operator is now common among stdlib and stdlib-js. #KT-2323
This commit is contained in:
@@ -7,7 +7,6 @@ public external fun eval(expr: String): dynamic = noImpl
|
|||||||
|
|
||||||
public external val undefined: Nothing? = noImpl
|
public external val undefined: Nothing? = noImpl
|
||||||
|
|
||||||
inline operator fun <K, V> MutableMap<K, V>.set(key: K, value: V): V? = asDynamic().set(key, value)
|
|
||||||
|
|
||||||
@library
|
@library
|
||||||
public fun println() {}
|
public fun println() {}
|
||||||
|
|||||||
@@ -5723,12 +5723,6 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("library.kt")
|
||||||
public void testLibrary() throws Exception {
|
public void testLibrary() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/library.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/native/library.kt");
|
||||||
|
|||||||
-97
@@ -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<JsExpression> 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<JsExpression> arguments,
|
|
||||||
@NotNull TranslationContext context
|
|
||||||
) {
|
|
||||||
return ArrayFIF.SET_INTRINSIC.apply(receiver, arguments, context);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private static final JsExpression getReferenceToOnlyTypeParameter(
|
private static final JsExpression getReferenceToOnlyTypeParameter(
|
||||||
@NotNull CallInfo callInfo, @NotNull TranslationContext context
|
@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", "arrayOfNulls"), new KotlinFunctionIntrinsic("nullArray"));
|
||||||
add(pattern("kotlin", "iterator").isExtensionOf(FQ_NAMES.iterator.asString()), RETURN_RECEIVER_INTRINSIC);
|
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", "get"), ArrayFIF.GET_INTRINSIC);
|
||||||
add(pattern("kotlin.js", "Json", "set"), ArrayFIF.SET_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);
|
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<JsExpression> arguments,
|
|
||||||
@NotNull TranslationContext context
|
|
||||||
);
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public JsExpression apply(@NotNull CallInfo callInfo, @NotNull List<JsExpression> 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
var classes = {"answer": 42}, classesMutable = {};
|
|
||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
package foo
|
|
||||||
|
|
||||||
|
|
||||||
external val classes: Map<String, Any> = noImpl
|
|
||||||
|
|
||||||
external val classesMutable: HashMap<String, String> = noImpl
|
|
||||||
|
|
||||||
fun box(): String {
|
|
||||||
classesMutable.set("why", "?")
|
|
||||||
return if (classes.get("answer") == 42 && classesMutable.get("why") == "?") "OK" else "fail"
|
|
||||||
}
|
|
||||||
@@ -130,6 +130,14 @@ public inline operator fun <@kotlin.internal.OnlyInputTypes K, V> Map<out K, V>.
|
|||||||
public inline operator fun <@kotlin.internal.OnlyInputTypes K, V> Map<out K, V>.get(key: K): V?
|
public inline operator fun <@kotlin.internal.OnlyInputTypes K, V> Map<out K, V>.get(key: K): V?
|
||||||
= @Suppress("UNCHECKED_CAST") (this as Map<K, V>).get(key)
|
= @Suppress("UNCHECKED_CAST") (this as Map<K, V>).get(key)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allows to use the index operator for storing values in a mutable map.
|
||||||
|
*/
|
||||||
|
@kotlin.internal.InlineOnly
|
||||||
|
public inline operator fun <K, V> MutableMap<K, V>.set(key: K, value: V): Unit {
|
||||||
|
put(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns `true` if the map contains the specified [key].
|
* Returns `true` if the map contains the specified [key].
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -11,14 +11,7 @@ import java.util.SortedMap
|
|||||||
import java.util.TreeMap
|
import java.util.TreeMap
|
||||||
import java.util.concurrent.ConcurrentMap
|
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 <K, V> MutableMap<K, V>.set(key: K, value: V): Unit {
|
|
||||||
put(key, value)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Concurrent getOrPut, that is safe for concurrent maps.
|
* Concurrent getOrPut, that is safe for concurrent maps.
|
||||||
|
|||||||
Reference in New Issue
Block a user