diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/CallInterceptor.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/CallInterceptor.kt index 1f964dbf671..bfa7cdb8fc8 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/CallInterceptor.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/CallInterceptor.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl -import org.jetbrains.kotlin.ir.interpreter.builtins.evaluateIntrinsicAnnotation import org.jetbrains.kotlin.ir.interpreter.builtins.interpretBinaryFunction import org.jetbrains.kotlin.ir.interpreter.builtins.interpretTernaryFunction import org.jetbrains.kotlin.ir.interpreter.builtins.interpretUnaryFunction diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt index 9d3ab9fade0..8f43a4f10f0 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt @@ -8,16 +8,14 @@ package org.jetbrains.kotlin.ir.interpreter import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.UnsignedType -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.expressions.impl.IrErrorExpressionImpl -import org.jetbrains.kotlin.ir.interpreter.builtins.evaluateIntrinsicAnnotation -import org.jetbrains.kotlin.ir.interpreter.state.* import org.jetbrains.kotlin.ir.interpreter.proxy.Proxy import org.jetbrains.kotlin.ir.interpreter.proxy.wrap +import org.jetbrains.kotlin.ir.interpreter.state.* import org.jetbrains.kotlin.ir.interpreter.state.reflection.KTypeState import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.types.* @@ -29,7 +27,10 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly import java.lang.invoke.MethodType -import kotlin.math.min + +val compileTimeAnnotation = FqName("kotlin.CompileTimeCalculation") +val evaluateIntrinsicAnnotation = FqName("kotlin.EvaluateIntrinsic") +val contractsDslAnnotation = FqName("kotlin.internal.ContractsDsl") internal fun IrFunction.getDispatchReceiver(): IrValueParameterSymbol? = this.dispatchReceiverParameter?.symbol @@ -37,8 +38,6 @@ internal fun IrFunction.getExtensionReceiver(): IrValueParameterSymbol? = this.e internal fun IrFunction.getReceiver(): IrSymbol? = this.getDispatchReceiver() ?: this.getExtensionReceiver() -internal fun IrFunctionAccessExpression.getBody(): IrBody? = this.symbol.owner.body - internal fun IrFunctionAccessExpression.getThisReceiver(): IrValueSymbol = this.symbol.owner.parentAsClass.thisReceiver!!.symbol internal fun State.toIrExpression(expression: IrExpression): IrExpression { @@ -180,7 +179,12 @@ fun IrFunctionAccessExpression.getVarargType(index: Int): IrType? { internal fun IrFunction.getCapitalizedFileName() = this.file.name.replace(".kt", "Kt").capitalizeAsciiOnly() -internal fun IrType.isUnsigned() = this.isUByte() || this.isUShort() || this.isUInt() || this.isULong() +internal fun IrType.isUnsigned() = this.getUnsignedType() != null +internal fun IrType.isFunction() = this.getClass()?.fqNameWhenAvailable?.asString()?.startsWith("kotlin.Function") ?: false +internal fun IrType.isKFunction() = this.getClass()?.fqNameWhenAvailable?.asString()?.startsWith("kotlin.reflect.KFunction") ?: false +internal fun IrType.isTypeParameter() = classifierOrNull is IrTypeParameterSymbol +internal fun IrType.isThrowable() = this.getClass()?.fqNameWhenAvailable?.asString() == "kotlin.Throwable" + internal fun IrType.isUnsignedArray(): Boolean { if (this !is IrSimpleType || classifier !is IrClassSymbol) return false val fqName = (classifier.owner as IrDeclarationWithName).fqNameWhenAvailable?.asString() @@ -191,34 +195,7 @@ internal fun IrType.isPrimitiveArray(): Boolean { return this.getClass()?.fqNameWhenAvailable?.toUnsafe()?.let { StandardNames.isPrimitiveArray(it) } ?: false } -internal fun IrType.isFunction() = this.getClass()?.fqNameWhenAvailable?.asString()?.startsWith("kotlin.Function") ?: false -internal fun IrType.isKFunction() = this.getClass()?.fqNameWhenAvailable?.asString()?.startsWith("kotlin.reflect.KFunction") ?: false - -internal fun IrType.isTypeParameter() = classifierOrNull is IrTypeParameterSymbol - -internal fun IrType.isInterface() = classOrNull?.owner?.kind == ClassKind.INTERFACE - -internal fun IrType.isThrowable() = this.getClass()?.fqNameWhenAvailable?.asString() == "kotlin.Throwable" - -internal fun IrType.renderType(): String { - var renderedType = this.render() - do { - val index = renderedType.indexOf(" of ") - if (index == -1) break - val replaceUntilComma = renderedType.indexOf(',', index) - val replaceUntilTriangle = renderedType.indexOf('>', index) - val replaceUntil = when { - replaceUntilComma == -1 && replaceUntilTriangle == -1 -> renderedType.length - replaceUntilComma == -1 -> replaceUntilTriangle - replaceUntilTriangle == -1 -> replaceUntilComma - else -> min(replaceUntilComma, replaceUntilTriangle) - } - renderedType = renderedType.replaceRange(index, replaceUntil, "") - } while (true) - return renderedType -} - -fun IrClass.internalName(): String { +internal fun IrClass.internalName(): String { val internalName = StringBuilder(this.name.asString()) generateSequence(this as? IrDeclarationParent) { (it as? IrDeclaration)?.parent } .drop(1) @@ -287,4 +264,4 @@ internal fun IrFunction.getArgsForMethodInvocation( } return argsValues -} \ No newline at end of file +} diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/CompileTimeUtils.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/CompileTimeUtils.kt deleted file mode 100644 index 3d97e04a4ed..00000000000 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/CompileTimeUtils.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.ir.interpreter.builtins - -import org.jetbrains.kotlin.name.FqName - -val compileTimeAnnotation = FqName("kotlin.CompileTimeCalculation") -val evaluateIntrinsicAnnotation = FqName("kotlin.EvaluateIntrinsic") -val contractsDslAnnotation = FqName("kotlin.internal.ContractsDsl") diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt index 6f1739321e6..dd0ebe93a9e 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.interpreter.* -import org.jetbrains.kotlin.ir.interpreter.builtins.evaluateIntrinsicAnnotation +import org.jetbrains.kotlin.ir.interpreter.evaluateIntrinsicAnnotation import org.jetbrains.kotlin.ir.interpreter.stack.Variable import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.types.* diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/KTypeState.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/KTypeState.kt index a94b354a9ee..30961549bc7 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/KTypeState.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/KTypeState.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.ir.interpreter.CallInterceptor import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KClassProxy import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KTypeParameterProxy import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KTypeProxy -import org.jetbrains.kotlin.ir.interpreter.renderType import org.jetbrains.kotlin.ir.interpreter.state.Wrapper import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.types.Variance diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/ReflectionState.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/ReflectionState.kt index b5060fbb37f..b886543e492 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/ReflectionState.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/reflection/ReflectionState.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.expressions.IrCall -import org.jetbrains.kotlin.ir.interpreter.renderType import org.jetbrains.kotlin.ir.interpreter.stack.Variable import org.jetbrains.kotlin.ir.interpreter.state.State import org.jetbrains.kotlin.ir.types.IrSimpleType @@ -20,6 +19,8 @@ import org.jetbrains.kotlin.ir.types.typeOrNull import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.nameForIrSerialization import org.jetbrains.kotlin.ir.util.parentClassOrNull +import org.jetbrains.kotlin.ir.util.render +import kotlin.math.min internal abstract class ReflectionState : State { override val fields: MutableList = mutableListOf() @@ -76,4 +77,22 @@ internal abstract class ReflectionState : State { val returnType = property.getter!!.returnType.renderType() return "$prefix $receivers${property.name}: $returnType" } + + protected fun IrType.renderType(): String { + var renderedType = this.render() + do { + val index = renderedType.indexOf(" of ") + if (index == -1) break + val replaceUntilComma = renderedType.indexOf(',', index) + val replaceUntilTriangle = renderedType.indexOf('>', index) + val replaceUntil = when { + replaceUntilComma == -1 && replaceUntilTriangle == -1 -> renderedType.length + replaceUntilComma == -1 -> replaceUntilTriangle + replaceUntilTriangle == -1 -> replaceUntilComma + else -> min(replaceUntilComma, replaceUntilTriangle) + } + renderedType = renderedType.replaceRange(index, replaceUntil, "") + } while (true) + return renderedType + } }