JS backend: added expected receiver type for intrinsics.
This commit is contained in:
+2
-2
@@ -27,7 +27,7 @@ public final class StringOperationFIF extends CompositeFIF {
|
||||
|
||||
private StringOperationFIF() {
|
||||
add(pattern("kotlin", "String", "get"), new BuiltInFunctionIntrinsic("charAt"));
|
||||
add(pattern("js", "length").receiverExists(), LENGTH_PROPERTY_INTRINSIC);
|
||||
add(pattern("js", "isEmpty").receiverExists(), IS_EMPTY_INTRINSIC);
|
||||
add(pattern("js", "length").isExtensionOf("kotlin.CharSequence"), LENGTH_PROPERTY_INTRINSIC);
|
||||
add(pattern("js", "isEmpty").isExtensionOf("kotlin.CharSequence"), IS_EMPTY_INTRINSIC);
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -159,18 +159,18 @@ public final class TopLevelFIF extends CompositeFIF {
|
||||
|
||||
private TopLevelFIF() {
|
||||
add(EQUALS_IN_ANY, KOTLIN_EQUALS);
|
||||
add(pattern("kotlin", "toString").receiverExists(), TO_STRING);
|
||||
add(pattern("kotlin", "equals").receiverExists(), KOTLIN_EQUALS);
|
||||
add(pattern("kotlin", "identityEquals").receiverExists(), IDENTITY_EQUALS);
|
||||
add(pattern("kotlin", "toString").isExtensionOf("kotlin.Any"), TO_STRING);
|
||||
add(pattern("kotlin", "equals").isExtensionOf("kotlin.Any"), KOTLIN_EQUALS);
|
||||
add(pattern("kotlin", "identityEquals").isExtensionOf("kotlin.Any"), IDENTITY_EQUALS);
|
||||
add(HASH_CODE_IN_ANY, KOTLIN_HASH_CODE);
|
||||
add(pattern(NamePredicate.PRIMITIVE_NUMBERS, "equals"), KOTLIN_EQUALS);
|
||||
add(pattern("String|Boolean|Char|Number.equals"), KOTLIN_EQUALS);
|
||||
add(pattern("kotlin", "arrayOfNulls"), new KotlinFunctionIntrinsic("nullArray"));
|
||||
add(pattern("kotlin", "PropertyMetadataImpl", "<init>"), PROPERTY_METADATA_IMPL);
|
||||
add(pattern("kotlin", "iterator").receiverExists(), RETURN_RECEIVER_INTRINSIC);
|
||||
add(pattern("kotlin", "iterator").isExtensionOf("kotlin.Iterator"), RETURN_RECEIVER_INTRINSIC);
|
||||
|
||||
add(pattern("kotlin", "Map", "get").checkOverridden(), NATIVE_MAP_GET);
|
||||
add(pattern("js", "set").receiverExists(), NATIVE_MAP_SET);
|
||||
add(pattern("js", "set").isExtensionOf("kotlin.MutableMap"), NATIVE_MAP_SET);
|
||||
|
||||
add(pattern("java.util", "HashMap", "<init>"), new MapSelectImplementationIntrinsic(false));
|
||||
add(pattern("java.util", "HashSet", "<init>"), new MapSelectImplementationIntrinsic(true));
|
||||
|
||||
+11
-5
@@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||
import org.jetbrains.jet.lang.resolve.OverrideResolver;
|
||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||
import org.jetbrains.k2js.translate.context.Namer;
|
||||
import org.jetbrains.k2js.translate.utils.TranslationUtils;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -127,7 +128,7 @@ public final class PatternBuilder {
|
||||
public static class DescriptorPredicateImpl implements DescriptorPredicate {
|
||||
private final String[] names;
|
||||
|
||||
private boolean receiverParameterExists;
|
||||
private String receiverFqName;
|
||||
|
||||
private boolean checkOverridden;
|
||||
|
||||
@@ -135,8 +136,8 @@ public final class PatternBuilder {
|
||||
this.names = names;
|
||||
}
|
||||
|
||||
public DescriptorPredicateImpl receiverExists() {
|
||||
this.receiverParameterExists = true;
|
||||
public DescriptorPredicateImpl isExtensionOf(String receiverFqName) {
|
||||
this.receiverFqName = receiverFqName;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -167,8 +168,13 @@ public final class PatternBuilder {
|
||||
|
||||
@Override
|
||||
public boolean apply(@NotNull FunctionDescriptor functionDescriptor) {
|
||||
if ((functionDescriptor.getReceiverParameter() == null) == receiverParameterExists) {
|
||||
return false;
|
||||
ReceiverParameterDescriptor actualReceiver = functionDescriptor.getReceiverParameter();
|
||||
if (actualReceiver != null) {
|
||||
if (receiverFqName == null) return false;
|
||||
|
||||
String actualReceiverFqName = TranslationUtils.getJetTypeFqName(actualReceiver.getType());
|
||||
|
||||
if (!actualReceiverFqName.equals(receiverFqName)) return false;
|
||||
}
|
||||
|
||||
if (!(functionDescriptor.getContainingDeclaration() instanceof ClassDescriptor)) {
|
||||
|
||||
@@ -267,13 +267,13 @@ public final class TranslationUtils {
|
||||
|
||||
ReceiverParameterDescriptor receiverParameter = descriptor.getReceiverParameter();
|
||||
if (receiverParameter != null) {
|
||||
argTypes.append(getJetTypeName(receiverParameter.getType())).append(".");
|
||||
argTypes.append(getJetTypeFqName(receiverParameter.getType())).append(".");
|
||||
}
|
||||
|
||||
argTypes.append(StringUtil.join(descriptor.getValueParameters(), new Function<ValueParameterDescriptor, String>() {
|
||||
@Override
|
||||
public String fun(ValueParameterDescriptor descriptor) {
|
||||
return getJetTypeName(descriptor.getType());
|
||||
return getJetTypeFqName(descriptor.getType());
|
||||
}
|
||||
}, ","));
|
||||
|
||||
@@ -281,12 +281,12 @@ public final class TranslationUtils {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String getJetTypeName(@NotNull JetType jetType) {
|
||||
public static String getJetTypeFqName(@NotNull JetType jetType) {
|
||||
ClassifierDescriptor declaration = jetType.getConstructor().getDeclarationDescriptor();
|
||||
assert declaration != null;
|
||||
|
||||
if (declaration instanceof TypeParameterDescriptor) {
|
||||
return getJetTypeName(((TypeParameterDescriptor) declaration).getUpperBoundsAsType());
|
||||
return getJetTypeFqName(((TypeParameterDescriptor) declaration).getUpperBoundsAsType());
|
||||
}
|
||||
|
||||
return getFqName(declaration).asString();
|
||||
|
||||
Reference in New Issue
Block a user