Some progress
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CollectionLiteralResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CollectionLiteralResolver.kt
index 6502466..51bfb98 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CollectionLiteralResolver.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CollectionLiteralResolver.kt
@@ -127,10 +127,12 @@
return ArrayFqNames.ARRAY_OF_FUNCTION
}
+ val primitiveElementType = KotlinBuiltIns.getPrimitiveArrayElementType(expectedType)
+ if (primitiveElementType != null) return ArrayFqNames.PRIMITIVE_TYPE_TO_ARRAY[primitiveElementType]!!
+
val descriptor = expectedType.constructor.declarationDescriptor ?: return ArrayFqNames.ARRAY_OF_FUNCTION
- return ArrayFqNames.PRIMITIVE_TYPE_TO_ARRAY[KotlinBuiltIns.getPrimitiveArrayType(descriptor)]
- ?: UnsignedTypes.unsignedArrayTypeToArrayCall[UnsignedTypes.toUnsignedArrayType(descriptor)]
+ return UnsignedTypes.unsignedArrayTypeToArrayCall[UnsignedTypes.toUnsignedArrayType(descriptor)]
?: ArrayFqNames.ARRAY_OF_FUNCTION
}
}
diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
index cb02751..1b0347d 100644
--- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
+++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/Ir.kt
@@ -51,7 +51,6 @@
get() = symbolTable
val iterator = getClass(Name.identifier("Iterator"), "kotlin", "collections")
- val vArrayIterator = getClass(Name.identifier("VArrayIterator"), "kotlin")
val charSequence = getClass(Name.identifier("CharSequence"), "kotlin")
val string = getClass(Name.identifier("String"), "kotlin")
@@ -134,14 +133,17 @@
val doubleArray get() = irBuiltIns.doubleArray
val booleanArray get() = irBuiltIns.booleanArray
- val byteArrayType get() = byteArray.owner.defaultType
- val charArrayType get() = charArray.owner.defaultType
- val shortArrayType get() = shortArray.owner.defaultType
- val intArrayType get() = intArray.owner.defaultType
- val longArrayType get() = longArray.owner.defaultType
- val floatArrayType get() = floatArray.owner.defaultType
- val doubleArrayType get() = doubleArray.owner.defaultType
- val booleanArrayType get() = booleanArray.owner.defaultType
+ val byteArrayType get() = primitiveArrayType(irBuiltIns.byteType, irBuiltIns.byteArray)
+ val charArrayType get() = primitiveArrayType(irBuiltIns.charType, irBuiltIns.charArray)
+ val shortArrayType get() = primitiveArrayType(irBuiltIns.shortType, irBuiltIns.shortArray)
+ val intArrayType get() = primitiveArrayType(irBuiltIns.intType, irBuiltIns.intArray)
+ val longArrayType get() = primitiveArrayType(irBuiltIns.longType, irBuiltIns.longArray)
+ val floatArrayType get() = primitiveArrayType(irBuiltIns.floatType, irBuiltIns.floatArray)
+ val doubleArrayType get() = primitiveArrayType(irBuiltIns.doubleType, irBuiltIns.doubleArray)
+ val booleanArrayType get() = primitiveArrayType(irBuiltIns.booleanType, irBuiltIns.booleanArray)
+
+ private fun primitiveArrayType(elementType: IrType, arrayClass: IrClassSymbol?) =
+ arrayClass?.owner?.defaultType ?: vArray!!.typeWith(elementType)
val primitiveTypesToPrimitiveArrays get() = irBuiltIns.primitiveTypesToPrimitiveArrays
val primitiveArraysToPrimitiveTypes get() = irBuiltIns.primitiveArraysToPrimitiveTypes
diff --git a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt
index bd3cbde..df10dbb 100644
--- a/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt
+++ b/compiler/ir/backend.jvm/codegen/src/org/jetbrains/kotlin/backend/jvm/intrinsics/IrIntrinsicMethods.kt
@@ -61,6 +61,7 @@
Key(kotlinFqn, null, "enumValueOf", listOf(stringFqn)) to EnumValueOf,
Key(kotlinFqn, stringFqn, "plus", listOf(anyFqn)) to StringPlus,
Key(kotlinReflectFqn, null, "typeOf", listOf()) to TypeOf,
+ Key(StandardNames.FqNames.vArrayIterator.toSafe(), null, "next", listOf()) to VArrayIteratorNext,
irBuiltIns.eqeqSymbol.toKey()!! to Equals(KtTokens.EQEQ),
irBuiltIns.eqeqeqSymbol.toKey()!! to Equals(KtTokens.EQEQEQ),
irBuiltIns.ieee754equalsFunByOperandType[irBuiltIns.floatClass]!!.toKey()!! to Ieee754Equals(Type.FLOAT_TYPE),
@@ -85,7 +86,6 @@
symbols.jvmDebuggerInvokeSpecialIntrinsic.toKey()!! to JvmDebuggerInvokeSpecial,
symbols.intPostfixIncrDecr.toKey()!! to IntIncr(isPrefix = false),
symbols.intPrefixIncrDecr.toKey()!! to IntIncr(isPrefix = true),
- createKeyMapping(VArrayIteratorNext, symbols.vArrayIterator, "next"),
) +
numberConversionMethods() +
unaryFunForPrimitives("plus", UnaryPlus) +
diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt
index 9e850c7..d956d98 100644
--- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt
+++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/descriptors/IrBuiltInsOverDescriptors.kt
@@ -375,14 +375,14 @@
override val primitiveIrTypesWithComparisons = listOf(charType, byteType, shortType, intType, floatType, longType, doubleType)
override val primitiveFloatingPointIrTypes = listOf(floatType, doubleType)
- override val byteArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.BYTE).toIrSymbol()
- override val charArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.CHAR).toIrSymbol()
- override val shortArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.SHORT).toIrSymbol()
- override val intArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.INT).toIrSymbol()
- override val longArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.LONG).toIrSymbol()
- override val floatArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.FLOAT).toIrSymbol()
- override val doubleArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.DOUBLE).toIrSymbol()
- override val booleanArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.BOOLEAN).toIrSymbol()
+ override val byteArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.BYTE)?.toIrSymbol()
+ override val charArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.CHAR)?.toIrSymbol()
+ override val shortArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.SHORT)?.toIrSymbol()
+ override val intArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.INT)?.toIrSymbol()
+ override val longArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.LONG)?.toIrSymbol()
+ override val floatArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.FLOAT)?.toIrSymbol()
+ override val doubleArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.DOUBLE)?.toIrSymbol()
+ override val booleanArray = builtIns.getPrimitiveArrayClassDescriptor(PrimitiveType.BOOLEAN)?.toIrSymbol()
override val primitiveArraysToPrimitiveTypes =
PrimitiveType.values().associate { builtIns.getPrimitiveArrayClassDescriptor(it).toIrSymbol() to it }
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrBuiltIns.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrBuiltIns.kt
index 24e90199..74911d3 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrBuiltIns.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/IrBuiltIns.kt
@@ -101,14 +101,14 @@
abstract val primitiveIrTypesWithComparisons: List<IrType>
abstract val primitiveFloatingPointIrTypes: List<IrType>
- abstract val byteArray: IrClassSymbol
- abstract val charArray: IrClassSymbol
- abstract val shortArray: IrClassSymbol
- abstract val intArray: IrClassSymbol
- abstract val longArray: IrClassSymbol
- abstract val floatArray: IrClassSymbol
- abstract val doubleArray: IrClassSymbol
- abstract val booleanArray: IrClassSymbol
+ abstract val byteArray: IrClassSymbol?
+ abstract val charArray: IrClassSymbol?
+ abstract val shortArray: IrClassSymbol?
+ abstract val intArray: IrClassSymbol?
+ abstract val longArray: IrClassSymbol?
+ abstract val floatArray: IrClassSymbol?
+ abstract val doubleArray: IrClassSymbol?
+ abstract val booleanArray: IrClassSymbol?
abstract val primitiveArraysToPrimitiveTypes: Map<IrClassSymbol, PrimitiveType>
abstract val primitiveTypesToPrimitiveArrays: Map<PrimitiveType, IrClassSymbol>
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt b/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt
index 887f80a..78303e2 100644
--- a/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt
+++ b/core/compiler.common/src/org/jetbrains/kotlin/builtins/StandardNames.kt
@@ -97,6 +97,7 @@
@JvmField val string: FqNameUnsafe = fqNameUnsafe("String")
@JvmField val array: FqNameUnsafe = fqNameUnsafe("Array")
@JvmField val vArray: FqNameUnsafe = fqNameUnsafe("VArray")
+ @JvmField val vArrayIterator : FqNameUnsafe = fqNameUnsafe("VArrayIterator")
@JvmField val _boolean: FqNameUnsafe = fqNameUnsafe("Boolean")
@JvmField val _char: FqNameUnsafe = fqNameUnsafe("Char")
diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java
index ef28949..b752aa3 100644
--- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java
+++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java
@@ -26,6 +26,7 @@
import org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt;
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
import org.jetbrains.kotlin.storage.MemoizedFunctionToNotNull;
+import org.jetbrains.kotlin.storage.MemoizedFunctionToNullable;
import org.jetbrains.kotlin.storage.NotNullLazyValue;
import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.types.*;
@@ -44,7 +45,7 @@
private final NotNullLazyValue<Primitives> primitives;
private final NotNullLazyValue<Collection<PackageViewDescriptor>> builtInPackagesImportedByDefault;
- private final MemoizedFunctionToNotNull<Name, ClassDescriptor> builtInClassesByName;
+ private final MemoizedFunctionToNullable<Name, ClassifierDescriptor> builtInClassifiersByName;
private final StorageManager storageManager;
@@ -57,10 +58,10 @@
@Override
public Collection<PackageViewDescriptor> invoke() {
return Arrays.asList(
- getBuiltInsModule().getPackage(BUILT_INS_PACKAGE_FQ_NAME),
- getBuiltInsModule().getPackage(COLLECTIONS_PACKAGE_FQ_NAME),
- getBuiltInsModule().getPackage(RANGES_PACKAGE_FQ_NAME),
- getBuiltInsModule().getPackage(ANNOTATION_PACKAGE_FQ_NAME)
+ getBuiltInsModule().getPackage(BUILT_INS_PACKAGE_FQ_NAME),
+ getBuiltInsModule().getPackage(COLLECTIONS_PACKAGE_FQ_NAME),
+ getBuiltInsModule().getPackage(RANGES_PACKAGE_FQ_NAME),
+ getBuiltInsModule().getPackage(ANNOTATION_PACKAGE_FQ_NAME)
);
}
});
@@ -73,7 +74,7 @@
Map<SimpleType, SimpleType> kotlinArrayTypeToPrimitiveKotlinType = new HashMap<SimpleType, SimpleType>();
for (PrimitiveType primitive : PrimitiveType.values()) {
SimpleType type = getBuiltInTypeByClassName(primitive.getTypeName().asString());
- SimpleType arrayType = getBuiltInTypeByClassName(primitive.getArrayTypeName().asString());
+ SimpleType arrayType = getBuiltInArrayType(primitive);
primitiveTypeToArrayKotlinType.put(primitive, arrayType);
primitiveKotlinTypeToKotlinArrayType.put(type, arrayType);
@@ -85,16 +86,13 @@
}
});
- this.builtInClassesByName = storageManager.createMemoizedFunction(new Function1<Name, ClassDescriptor>() {
- @Override
- public ClassDescriptor invoke(Name name) {
- ClassifierDescriptor classifier = getBuiltInsPackageScope().getContributedClassifier(name, NoLookupLocation.FROM_BUILTINS);
- if (classifier != null && !(classifier instanceof ClassDescriptor)) {
- throw new AssertionError("Must be a class descriptor " + name + ", but was " + classifier);
- }
- return (ClassDescriptor) classifier;
- }
- });
+ this.builtInClassifiersByName =
+ storageManager.createMemoizedFunctionWithNullableValues(new Function1<Name, ClassifierDescriptor>() {
+ @Override
+ public ClassifierDescriptor invoke(Name name) {
+ return getBuiltInsPackageScope().getContributedClassifier(name, NoLookupLocation.FROM_BUILTINS);
+ }
+ });
}
protected void createBuiltInsModule(boolean isFallback) {
@@ -179,7 +177,7 @@
/**
* Checks if the given descriptor is declared in the deserialized built-in package fragment, i.e. if it was loaded as a part of
* loading .kotlin_builtins definition files.
- *
+ * <p>
* NOTE: this method returns false for descriptors loaded from .class files or other binaries, even if they are "built-in" in some
* other sense! For example, it returns false for the class descriptor of `kotlin.IntRange` loaded from `kotlin/IntRange.class`.
* In case you need to check if the class is "built-in" in another sense, you should probably do it by inspecting its FQ name,
@@ -217,15 +215,35 @@
@NotNull
private ClassDescriptor getBuiltInClassByName(@NotNull String simpleName) {
- ClassDescriptor classDescriptor = builtInClassesByName.invoke(Name.identifier(simpleName));
- if (classDescriptor == null) {
+ ClassDescriptor descriptor = getBuiltInClassByNameOrNull(simpleName);
+ if (descriptor == null) {
throw new AssertionError("Built-in class " + BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier(simpleName)) + " is not found");
}
- return classDescriptor;
+ return descriptor;
+ }
+
+ @NotNull
+ private SimpleType getBuiltInArrayType(@NotNull PrimitiveType primitive) {
+ ClassifierDescriptor arrayClassifier = builtInClassifiersByName.invoke(Name.identifier(primitive.getArrayTypeName().asString()));
+ SimpleType arrayType;
+ if (arrayClassifier instanceof ClassDescriptor) {
+ arrayType = arrayClassifier.getDefaultType();
+ }
+ else if (arrayClassifier instanceof TypeAliasDescriptor) {
+ arrayType = ((TypeAliasDescriptor) arrayClassifier).getExpandedType();
+ }
+ else {
+ throw new AssertionError("Unsupported array type classifier for " + primitive + ": " + arrayClassifier);
+ }
+ return arrayType;
}
private ClassDescriptor getBuiltInClassByNameOrNull(@NotNull String simpleName) {
- return builtInClassesByName.invoke(Name.identifier(simpleName));
+ ClassifierDescriptor classifier = builtInClassifiersByName.invoke(Name.identifier(simpleName));
+ if (classifier != null && !(classifier instanceof ClassDescriptor)) {
+ throw new AssertionError("Must be a class descriptor " + simpleName + ", but was " + classifier);
+ }
+ return (ClassDescriptor) classifier;
}
@NotNull
@@ -292,9 +310,8 @@
return getBuiltInClassByNameOrNull("VArray");
}
- @NotNull
public ClassDescriptor getPrimitiveArrayClassDescriptor(@NotNull PrimitiveType type) {
- return getBuiltInClassByName(type.getArrayTypeName().asString());
+ return getBuiltInClassByNameOrNull(type.getArrayTypeName().asString());
}
@NotNull
@@ -472,7 +489,8 @@
@NotNull
public ClassDescriptor getMutableMapEntry() {
- ClassDescriptor classDescriptor = DescriptorUtils.getInnerClassByName(getMutableMap(), "MutableEntry", NoLookupLocation.FROM_BUILTINS);
+ ClassDescriptor classDescriptor =
+ DescriptorUtils.getInnerClassByName(getMutableMap(), "MutableEntry", NoLookupLocation.FROM_BUILTINS);
assert classDescriptor != null : "Can't find MutableMap.MutableEntry";
return classDescriptor;
}
@@ -584,7 +602,7 @@
@NotNull
public KotlinType getArrayElementType(@NotNull KotlinType arrayType) {
- if (isArray(arrayType)) {
+ if (isArray(arrayType) || isVArray(arrayType)) {
if (arrayType.getArguments().size() != 1) {
throw new IllegalStateException();
}
@@ -671,6 +689,16 @@
: null;
}
+ @Nullable
+ public static PrimitiveType getPrimitiveArrayElementType(@NotNull KotlinType type) {
+ if (isPrimitiveVArray(type)) {
+ Name primitiveTypeName =
+ type.getArguments().get(0).getType().getConstructor().getDeclarationDescriptor().getName();
+ return FqNames.fqNameToPrimitiveType.get(BUILT_INS_PACKAGE_FQ_NAME.child(primitiveTypeName).toUnsafe());
+ }
+ return getPrimitiveArrayType(type.getConstructor().getDeclarationDescriptor());
+ }
+
@NotNull
public SimpleType getArrayType(@NotNull Variance projectionType, @NotNull KotlinType argument, @NotNull Annotations annotations) {
List<TypeProjectionImpl> types = Collections.singletonList(new TypeProjectionImpl(projectionType, argument));
@@ -713,15 +741,18 @@
return isArray(type) || isPrimitiveArray(type);
}
- public static boolean isPrimitiveArray(@NotNull KotlinType type) {
- ClassifierDescriptor descriptor = type.getConstructor().getDeclarationDescriptor();
- return descriptor != null && getPrimitiveArrayType(descriptor) != null;
+ public static boolean isPrimitiveVArray(@NotNull KotlinType type) {
+ if (isVArray(type)) {
+ TypeProjection elementType = type.getArguments().get(0);
+ return elementType.getProjectionKind() == Variance.INVARIANT && isPrimitiveType(elementType.getType());
+ }
+ return false;
}
- @Nullable
- public static PrimitiveType getPrimitiveArrayElementType(@NotNull KotlinType type) {
+ public static boolean isPrimitiveArray(@NotNull KotlinType type) {
+ if (isPrimitiveVArray(type)) return true;
ClassifierDescriptor descriptor = type.getConstructor().getDeclarationDescriptor();
- return descriptor == null ? null : getPrimitiveArrayType(descriptor);
+ return descriptor != null && getPrimitiveArrayType(descriptor) != null;
}
@Nullable
@@ -917,8 +948,9 @@
assert functionReturnType != null : "Function return typed type must be resolved.";
boolean mayReturnNonUnitValue = !isUnit(functionReturnType);
for (FunctionDescriptor overriddenDescriptor : descriptor.getOriginal().getOverriddenDescriptors()) {
- if (mayReturnNonUnitValue)
+ if (mayReturnNonUnitValue) {
break;
+ }
KotlinType overriddenFunctionReturnType = overriddenDescriptor.getReturnType();
assert overriddenFunctionReturnType != null : "Function return typed type must be resolved.";
mayReturnNonUnitValue = !isUnit(overriddenFunctionReturnType);