Add test for generation builtins map for interpreter
This commit is contained in:
@@ -31,7 +31,7 @@ dependencies {
|
|||||||
|
|
||||||
builtinsApi("org.jetbrains.kotlin:kotlin-stdlib:$bootstrapKotlinVersion") { isTransitive = false }
|
builtinsApi("org.jetbrains.kotlin:kotlin-stdlib:$bootstrapKotlinVersion") { isTransitive = false }
|
||||||
evaluateApi(project(":core:deserialization"))
|
evaluateApi(project(":core:deserialization"))
|
||||||
evaluateApi(project(":compiler:ir.serialization.jvm")) // used to get ir builtins
|
evaluateApi(project(":compiler:ir.tree"))
|
||||||
evaluateApi(project(":compiler:ir.backend.common"))
|
evaluateApi(project(":compiler:ir.backend.common"))
|
||||||
|
|
||||||
testCompile(builtinsSourceSet.output)
|
testCompile(builtinsSourceSet.output)
|
||||||
@@ -90,6 +90,5 @@ val generateKeywordStrings by generator("org.jetbrains.kotlin.generators.fronten
|
|||||||
|
|
||||||
val generateBuiltins by generator("org.jetbrains.kotlin.generators.builtins.generateBuiltIns.GenerateBuiltInsKt", builtinsSourceSet)
|
val generateBuiltins by generator("org.jetbrains.kotlin.generators.builtins.generateBuiltIns.GenerateBuiltInsKt", builtinsSourceSet)
|
||||||
val generateOperationsMap by generator("org.jetbrains.kotlin.generators.evaluate.GenerateOperationsMapKt", evaluateSourceSet)
|
val generateOperationsMap by generator("org.jetbrains.kotlin.generators.evaluate.GenerateOperationsMapKt", evaluateSourceSet)
|
||||||
val generateInterpreterBuiltinsMap by generator("org.jetbrains.kotlin.generators.evaluate.GenerateBuiltInsMapKt", evaluateSourceSet)
|
|
||||||
|
|
||||||
testsJar()
|
testsJar()
|
||||||
|
|||||||
@@ -6,35 +6,20 @@
|
|||||||
package org.jetbrains.kotlin.generators.evaluate
|
package org.jetbrains.kotlin.generators.evaluate
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.common.interpreter.builtins.compileTimeAnnotation
|
import org.jetbrains.kotlin.backend.common.interpreter.builtins.compileTimeAnnotation
|
||||||
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.PrimitiveType
|
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.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
|
||||||
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmManglerDesc
|
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
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.Name
|
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
|
||||||
import org.jetbrains.kotlin.utils.Printer
|
import org.jetbrains.kotlin.utils.Printer
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
val DESTINATION = File("compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/builtins/IrBuiltInsMapGenerated.kt")
|
val DESTINATION = File("compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/builtins/IrBuiltInsMapGenerated.kt")
|
||||||
|
|
||||||
fun main() {
|
fun generateMap(irBuiltIns: IrBuiltIns): String {
|
||||||
DESTINATION.writeText(generateMap())
|
|
||||||
}
|
|
||||||
|
|
||||||
fun generateMap(): String {
|
|
||||||
val sb = StringBuilder()
|
val sb = StringBuilder()
|
||||||
val p = Printer(sb)
|
val p = Printer(sb)
|
||||||
p.println(File("license/COPYRIGHT.txt").readText())
|
p.println(File("license/COPYRIGHT.txt").readText())
|
||||||
@@ -49,11 +34,11 @@ fun generateMap(): String {
|
|||||||
val binaryOperationsMap = getOperationMap(2)
|
val binaryOperationsMap = getOperationMap(2)
|
||||||
val ternaryOperationsMap = getOperationMap(3)
|
val ternaryOperationsMap = getOperationMap(3)
|
||||||
|
|
||||||
val binaryIrOperationsMap = getBinaryIrOperationMap()
|
val binaryIrOperationsMap = getBinaryIrOperationMap(irBuiltIns)
|
||||||
|
|
||||||
//save to file
|
//save to file
|
||||||
p.println("val unaryFunctions = mapOf<CompileTimeFunction, Function1<Any?, Any?>>(")
|
p.println("val unaryFunctions = mapOf<CompileTimeFunction, Function1<Any?, Any?>>(")
|
||||||
p.println(generateUnaryBody(unaryOperationsMap))
|
p.println(generateUnaryBody(unaryOperationsMap, irBuiltIns))
|
||||||
p.println(")")
|
p.println(")")
|
||||||
p.println()
|
p.println()
|
||||||
|
|
||||||
@@ -106,7 +91,7 @@ private fun getOperationMap(argumentsCount: Int): MutableMap<CallableDescriptor,
|
|||||||
if (classTypeParameters.isNotEmpty()) classTypeParameters.joinToString(prefix = "<", postfix = ">") { "Any?" } else ""
|
if (classTypeParameters.isNotEmpty()) classTypeParameters.joinToString(prefix = "<", postfix = ">") { "Any?" } else ""
|
||||||
val classType = classDescriptor.defaultType
|
val classType = classDescriptor.defaultType
|
||||||
|
|
||||||
val compileTimeFunctions = classDescriptor.getMemberScope(listOf()).getContributedDescriptors()
|
val compileTimeFunctions = classDescriptor.unsubstitutedMemberScope.getContributedDescriptors()
|
||||||
.filterIsInstance<CallableDescriptor>()
|
.filterIsInstance<CallableDescriptor>()
|
||||||
.filter { it.isCompileTime(classDescriptor) }
|
.filter { it.isCompileTime(classDescriptor) }
|
||||||
|
|
||||||
@@ -125,8 +110,7 @@ private fun getOperationMap(argumentsCount: Int): MutableMap<CallableDescriptor,
|
|||||||
return operationMap
|
return operationMap
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getBinaryIrOperationMap(): MutableMap<CallableDescriptor, Pair<String, String>> {
|
private fun getBinaryIrOperationMap(irBuiltIns: IrBuiltIns): MutableMap<CallableDescriptor, Pair<String, String>> {
|
||||||
val irBuiltIns = getIrBuiltIns()
|
|
||||||
val operationMap = mutableMapOf<CallableDescriptor, Pair<String, String>>()
|
val operationMap = mutableMapOf<CallableDescriptor, Pair<String, String>>()
|
||||||
val irFunSymbols =
|
val irFunSymbols =
|
||||||
(irBuiltIns.lessFunByOperandType.values + irBuiltIns.lessOrEqualFunByOperandType.values +
|
(irBuiltIns.lessFunByOperandType.values + irBuiltIns.lessOrEqualFunByOperandType.values +
|
||||||
@@ -148,8 +132,8 @@ private fun getBinaryIrOperationMap(): MutableMap<CallableDescriptor, Pair<Strin
|
|||||||
return operationMap
|
return operationMap
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun generateUnaryBody(unaryOperationsMap: Map<CallableDescriptor, Pair<String, String>>): String {
|
private fun generateUnaryBody(unaryOperationsMap: Map<CallableDescriptor, Pair<String, String>>, irBuiltIns: IrBuiltIns): String {
|
||||||
val irNullCheck = getIrBuiltIns().checkNotNullSymbol.descriptor
|
val irNullCheck = irBuiltIns.checkNotNullSymbol.descriptor
|
||||||
return unaryOperationsMap.entries.joinToString(separator = ",\n", postfix = ",\n") { (function, parameters) ->
|
return unaryOperationsMap.entries.joinToString(separator = ",\n", postfix = ",\n") { (function, parameters) ->
|
||||||
val methodName = "${function.name}"
|
val methodName = "${function.name}"
|
||||||
val parentheses = if (function is FunctionDescriptor) "()" else ""
|
val parentheses = if (function is FunctionDescriptor) "()" else ""
|
||||||
@@ -197,19 +181,3 @@ private fun getIrMethodSymbolByName(methodName: String): String {
|
|||||||
else -> throw UnsupportedOperationException("Unknown ir operation \"$methodName\"")
|
else -> throw UnsupportedOperationException("Unknown ir operation \"$methodName\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getIrBuiltIns(): IrBuiltIns {
|
|
||||||
val builtIns = DefaultBuiltIns.Instance
|
|
||||||
val languageSettings = LanguageVersionSettingsImpl(LanguageVersion.KOTLIN_1_3, ApiVersion.KOTLIN_1_3)
|
|
||||||
|
|
||||||
val moduleDescriptor = ModuleDescriptorImpl(Name.special("<test-module>"), LockBasedStorageManager(""), builtIns)
|
|
||||||
val mangler = JvmManglerDesc()
|
|
||||||
val signaturer = JvmIdSignatureDescriptor(mangler)
|
|
||||||
val symbolTable = SymbolTable(signaturer)
|
|
||||||
val constantValueGenerator = ConstantValueGenerator(moduleDescriptor, symbolTable)
|
|
||||||
val typeTranslator = TypeTranslator(symbolTable, languageSettings, builtIns)
|
|
||||||
constantValueGenerator.typeTranslator = typeTranslator
|
|
||||||
typeTranslator.constantValueGenerator = constantValueGenerator
|
|
||||||
|
|
||||||
return IrBuiltIns(builtIns, typeTranslator, signaturer)
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2015 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.generators.test.evaluate
|
||||||
|
|
||||||
|
import junit.framework.TestCase
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
|
||||||
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
|
import org.jetbrains.kotlin.config.ApiVersion
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersion
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
|
import org.jetbrains.kotlin.generators.evaluate.DESTINATION
|
||||||
|
import org.jetbrains.kotlin.generators.evaluate.generateMap
|
||||||
|
import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmManglerDesc
|
||||||
|
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.Name
|
||||||
|
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
|
|
||||||
|
class GenerateBuiltInsMapTest : TestCase() {
|
||||||
|
fun testGeneratedDataIsUpToDate() {
|
||||||
|
val text = generateMap(getIrBuiltIns())
|
||||||
|
KotlinTestUtils.assertEqualsToFile(DESTINATION, text)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getIrBuiltIns(): IrBuiltIns {
|
||||||
|
val builtIns = DefaultBuiltIns.Instance
|
||||||
|
val languageSettings = LanguageVersionSettingsImpl(LanguageVersion.KOTLIN_1_3, ApiVersion.KOTLIN_1_3)
|
||||||
|
|
||||||
|
val moduleDescriptor = ModuleDescriptorImpl(Name.special("<test-module>"), LockBasedStorageManager(""), builtIns)
|
||||||
|
val mangler = JvmManglerDesc()
|
||||||
|
val signaturer = JvmIdSignatureDescriptor(mangler)
|
||||||
|
val symbolTable = SymbolTable(signaturer)
|
||||||
|
val constantValueGenerator = ConstantValueGenerator(moduleDescriptor, symbolTable)
|
||||||
|
val typeTranslator = TypeTranslator(symbolTable, languageSettings, builtIns)
|
||||||
|
constantValueGenerator.typeTranslator = typeTranslator
|
||||||
|
typeTranslator.constantValueGenerator = constantValueGenerator
|
||||||
|
|
||||||
|
return IrBuiltIns(builtIns, typeTranslator, symbolTable)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user