Add methods from arrays classes in ir builtins map

This commit is contained in:
Ivan Kylchik
2020-06-10 19:11:58 +03:00
parent 3ab7c263d0
commit 45555d681d
3 changed files with 100 additions and 59 deletions
+36 -31
View File
@@ -9,10 +9,12 @@ import org.jetbrains.kotlin.backend.common.interpreter.builtins.compileTimeAnnot
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
@@ -21,11 +23,9 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.util.ConstantValueGenerator
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.utils.Printer
import java.io.File
@@ -46,9 +46,9 @@ fun generateMap(): String {
p.println("/** This file is generated by org.jetbrains.kotlin.backend.common.interpreter.builtins.GenerateBuiltInsMap.generateMap(). DO NOT MODIFY MANUALLY */")
p.println()
val unaryOperationsMap = mutableMapOf<CallableDescriptor, List<KotlinType>>()
val binaryOperationsMap = mutableMapOf<CallableDescriptor, List<KotlinType>>()
val ternaryOperationsMap = mutableMapOf<CallableDescriptor, List<KotlinType>>()
val unaryOperationsMap = mutableMapOf<CallableDescriptor, Pair<String, String>>()
val binaryOperationsMap = mutableMapOf<CallableDescriptor, Pair<String, String>>()
val ternaryOperationsMap = mutableMapOf<CallableDescriptor, Pair<String, String>>()
val builtIns = DefaultBuiltIns.Instance
//save common built ins
@@ -56,26 +56,38 @@ fun generateMap(): String {
val allPrimitiveTypes = builtIns.builtInsPackageScope.getContributedDescriptors()
.filter { it is ClassDescriptor && KotlinBuiltIns.isPrimitiveType(it.defaultType) } as List<ClassDescriptor>
for (descriptor in allPrimitiveTypes + builtIns.string) {
val arrays = listOf(builtIns.array) + PrimitiveType.values().map { builtIns.getPrimitiveArrayClassDescriptor(it) }
for (descriptor in allPrimitiveTypes + builtIns.string + arrays) {
val typeParameters = descriptor.typeConstructor.parameters.map { it.name.asString() }
val typeParametersAsAny = if (typeParameters.isNotEmpty()) typeParameters.joinToString(prefix = "<", postfix = ">") { "Any?" } else ""
val descriptorType = descriptor.defaultType
@Suppress("UNCHECKED_CAST")
val functions = descriptor.getMemberScope(listOf()).getContributedDescriptors()
.filter { it is CallableDescriptor && it.annotations.hasAnnotation(compileTimeAnnotation) } as List<CallableDescriptor>
.filter {
it is CallableDescriptor &&
(it as? FunctionDescriptor)?.kind != CallableMemberDescriptor.Kind.FAKE_OVERRIDE &&
(it.annotations.hasAnnotation(compileTimeAnnotation) || descriptor.annotations.hasAnnotation(compileTimeAnnotation))
} as List<CallableDescriptor>
for (function in functions) {
val parametersTypes = function.valueParameters.map { TypeUtils.makeNotNullable(it.type) } + listOf(descriptorType)
val operationArguments = (listOf(descriptorType) + function.valueParameters.map { it.type }).joinToString { "\"" + it + "\"" }
when (parametersTypes.size) {
1 -> unaryOperationsMap[function] = parametersTypes
2 -> binaryOperationsMap[function] = parametersTypes
3 -> ternaryOperationsMap[function] = parametersTypes
val functionTypeParameters = (listOf(descriptorType.constructor.toString() + typeParametersAsAny) +
function.valueParameters.map { if (typeParameters.contains(it.type.toString())) "Any?" else it.type.toString() })
.joinToString(prefix = "<", postfix = ">")
when (function.valueParameters.size + 1) { // +1 for receiver
1 -> unaryOperationsMap[function] = functionTypeParameters to operationArguments
2 -> binaryOperationsMap[function] = functionTypeParameters to operationArguments
3 -> ternaryOperationsMap[function] = functionTypeParameters to operationArguments
else -> throw IllegalStateException("Couldn't add following method from builtins to operations map: ${function.name} in class ${descriptor.name}")
}
}
}
//save ir built ins
val binaryIrOperationsMap = mutableMapOf<CallableDescriptor, List<KotlinType>>()
val binaryIrOperationsMap = mutableMapOf<CallableDescriptor, Pair<String, String>>()
val irBuiltIns = getIrBuiltIns()
val irFunSymbols =
(irBuiltIns.lessFunByOperandType.values +
@@ -91,33 +103,30 @@ fun generateMap(): String {
.filter { it.annotations.hasAnnotation(compileTimeAnnotation) }
for (function in irFunSymbols) {
val parametersTypes = function.valueParameters.map { TypeUtils.makeNotNullable(it.type) }
val parametersTypes = function.valueParameters.map { it.type }
val operationArguments = parametersTypes.joinToString { "\"" + it + "\"" }
val functionTypeParameters = parametersTypes.joinToString(prefix = "<", postfix = ">")
check(parametersTypes.size == 2) { "Couldn't add following method from ir builtins to operations map: ${function.name}" }
binaryIrOperationsMap[function] = parametersTypes
binaryIrOperationsMap[function] = functionTypeParameters to operationArguments
}
//save to file
p.println("val unaryFunctions = mapOf<CompileTimeFunction, Function1<Any?, Any>>(")
p.println("val unaryFunctions = mapOf<CompileTimeFunction, Function1<Any?, Any?>>(")
val unaryBody = unaryOperationsMap.entries.joinToString(",\n") { (function, parameters) ->
val receiverType = parameters.last().toString()
val methodName = "${function.name}"
val parentheses = if (function is FunctionDescriptor) "()" else ""
" unaryOperation<$receiverType>(\"$methodName\", \"$receiverType\") { a -> a.$methodName$parentheses }"
" unaryOperation${parameters.first}(\"$methodName\", ${parameters.second}) { a -> a.$methodName$parentheses }"
}
p.println(unaryBody)
p.println(")")
p.println()
p.println("val binaryFunctions = mapOf<CompileTimeFunction, Function2<Any?, Any?, Any>>(")
p.println("val binaryFunctions = mapOf<CompileTimeFunction, Function2<Any?, Any?, Any?>>(")
val binaryBody = binaryOperationsMap.entries.joinToString(",\n", postfix = ",\n") { (function, parameters) ->
val receiverType = parameters.last().toString()
val parameter = parameters.first().toString()
val methodName = "${function.name}"
" binaryOperation<$receiverType, $parameter>(\"$methodName\", \"$receiverType\", \"$parameter\") { a, b -> a.$methodName(b) }"
" binaryOperation${parameters.first}(\"$methodName\", ${parameters.second}) { a, b -> a.$methodName(b) }"
} + binaryIrOperationsMap.entries.joinToString(",\n") { (function, parameters) ->
val firstParameterType = parameters.last().toString()
val secondParameterType = parameters.first().toString()
val methodName = "${function.name}"
val methodSymbol = when (methodName) {
IrBuiltIns.OperatorNames.LESS -> "<"
@@ -131,19 +140,15 @@ fun generateMap(): String {
IrBuiltIns.OperatorNames.OROR -> "||"
else -> throw UnsupportedOperationException("Unknown ir operation \"$methodName\"")
}
" binaryOperation<$firstParameterType, $secondParameterType>(\"$methodName\", \"$firstParameterType\", \"$secondParameterType\") { a, b -> a $methodSymbol b }"
" binaryOperation${parameters.first}(\"$methodName\", ${parameters.second}) { a, b -> a $methodSymbol b }"
}
p.println(binaryBody)
p.println(")")
p.println("val ternaryFunctions = mapOf<CompileTimeFunction, Function3<Any?, Any?, Any?, Any>>(")
p.println("val ternaryFunctions = mapOf<CompileTimeFunction, Function3<Any?, Any?, Any?, Any?>>(")
val ternaryBody = ternaryOperationsMap.entries.joinToString(",\n") { (function, parameters) ->
val receiverType = parameters.last().toString()
val firstParameter = parameters[0].toString()
val secondParameter = parameters[1].toString()
val methodName = "${function.name}"
" ternaryOperation<$receiverType, $firstParameter, $secondParameter>" +
"(\"$methodName\", \"$receiverType\", \"$firstParameter\", \"$secondParameter\") { a, b, c -> a.$methodName(b, c) }"
" ternaryOperation${parameters.first}(\"$methodName\", ${parameters.second}) { a, b, c -> a.$methodName(b, c) }"
}
p.println(ternaryBody)
p.println(")")