IR: remove type parameter in visitConst

Co-authored-by: mcpiroman <mcpiroman@gmail.com>
This commit is contained in:
Alexander Udalov
2022-01-10 22:20:24 +01:00
parent 81106526b1
commit 6445a29893
15 changed files with 40 additions and 32 deletions
@@ -75,7 +75,7 @@ class CheckIrElementVisitor(
} }
} }
override fun <T> visitConst(expression: IrConst<T>) { override fun visitConst(expression: IrConst<*>) {
super.visitConst(expression) super.visitConst(expression)
@Suppress("UNUSED_VARIABLE") @Suppress("UNUSED_VARIABLE")
@@ -25,7 +25,6 @@ import org.jetbrains.kotlin.ir.util.isUnsigned
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
class ConstTransformer(private val context: JsIrBackendContext) : IrElementTransformerVoid() { class ConstTransformer(private val context: JsIrBackendContext) : IrElementTransformerVoid() {
private fun <C> lowerConst( private fun <C> lowerConst(
irClass: IrClassSymbol, irClass: IrClassSymbol,
@@ -44,7 +43,7 @@ class ConstTransformer(private val context: JsIrBackendContext) : IrElementTrans
private fun createLong(v: Long): IrExpression = private fun createLong(v: Long): IrExpression =
lowerConst(context.intrinsics.longClassSymbol, IrConstImpl.Companion::int, v.toInt(), (v shr 32).toInt()) lowerConst(context.intrinsics.longClassSymbol, IrConstImpl.Companion::int, v.toInt(), (v shr 32).toInt())
override fun <T> visitConst(expression: IrConst<T>): IrExpression { override fun visitConst(expression: IrConst<*>): IrExpression {
with(context.intrinsics) { with(context.intrinsics) {
if (expression.type.isUnsigned() && expression.kind != IrConstKind.Null) { if (expression.type.isUnsigned() && expression.kind != IrConstKind.Null) {
return when (expression.type.classifierOrNull) { return when (expression.type.classifierOrNull) {
@@ -8,7 +8,10 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs
import org.jetbrains.kotlin.backend.common.compilationException import org.jetbrains.kotlin.backend.common.compilationException
import org.jetbrains.kotlin.backend.common.ir.isElseBranch import org.jetbrains.kotlin.backend.common.ir.isElseBranch
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.backend.js.utils.* import org.jetbrains.kotlin.ir.backend.js.utils.JsGenerationContext
import org.jetbrains.kotlin.ir.backend.js.utils.Namer
import org.jetbrains.kotlin.ir.backend.js.utils.emptyScope
import org.jetbrains.kotlin.ir.backend.js.utils.getJsNameOrKotlinName
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.types.isString import org.jetbrains.kotlin.ir.types.isString
@@ -50,7 +53,7 @@ class IrElementToJsExpressionTransformer : BaseIrElementToJsNodeTransformer<JsEx
return irFunction.accept(IrFunctionToJsTransformer(), context).apply { name = null } return irFunction.accept(IrFunctionToJsTransformer(), context).apply { name = null }
} }
override fun <T> visitConst(expression: IrConst<T>, context: JsGenerationContext): JsExpression { override fun visitConst(expression: IrConst<*>, context: JsGenerationContext): JsExpression {
val kind = expression.kind val kind = expression.kind
return when (kind) { return when (kind) {
is IrConstKind.String -> JsStringLiteral(kind.valueOf(expression)) is IrConstKind.String -> JsStringLiteral(kind.valueOf(expression))
@@ -89,7 +89,7 @@ fun foldString(expression: IrExpression, context: JsIrBackendContext): String? {
expression.acceptChildrenVoid(this) expression.acceptChildrenVoid(this)
} }
override fun <T> visitConst(expression: IrConst<T>) { override fun visitConst(expression: IrConst<*>) {
builder.append(expression.kind.valueOf(expression)) builder.append(expression.kind.valueOf(expression))
} }
@@ -792,7 +792,7 @@ class ExpressionCodegen(
return unitValue return unitValue
} }
override fun <T> visitConst(expression: IrConst<T>, data: BlockInfo): PromisedValue { override fun visitConst(expression: IrConst<*>, data: BlockInfo): PromisedValue {
expression.markLineNumber(startOffset = true) expression.markLineNumber(startOffset = true)
when (val value = expression.value) { when (val value = expression.value) {
is Boolean -> { is Boolean -> {
@@ -12,7 +12,10 @@ import org.jetbrains.kotlin.backend.common.ir.isOverridable
import org.jetbrains.kotlin.backend.common.ir.returnType import org.jetbrains.kotlin.backend.common.ir.returnType
import org.jetbrains.kotlin.backend.wasm.WasmBackendContext import org.jetbrains.kotlin.backend.wasm.WasmBackendContext
import org.jetbrains.kotlin.backend.wasm.WasmSymbols import org.jetbrains.kotlin.backend.wasm.WasmSymbols
import org.jetbrains.kotlin.backend.wasm.utils.* import org.jetbrains.kotlin.backend.wasm.utils.getWasmArrayAnnotation
import org.jetbrains.kotlin.backend.wasm.utils.getWasmOpAnnotation
import org.jetbrains.kotlin.backend.wasm.utils.hasWasmNoOpCastAnnotation
import org.jetbrains.kotlin.backend.wasm.utils.isCanonical
import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.IrBuiltIns
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.backend.js.utils.findUnitGetInstanceFunction import org.jetbrains.kotlin.ir.backend.js.utils.findUnitGetInstanceFunction
@@ -21,7 +24,10 @@ import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.getInlineClassBackingField
import org.jetbrains.kotlin.ir.util.isInterface
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.wasm.ir.* import org.jetbrains.kotlin.wasm.ir.*
@@ -99,7 +105,7 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV
} }
} }
override fun <T> visitConst(expression: IrConst<T>) { override fun visitConst(expression: IrConst<*>) {
when (val kind = expression.kind) { when (val kind = expression.kind) {
is IrConstKind.Null -> generateDefaultInitializerForType(context.transformType(expression.type), body) is IrConstKind.Null -> generateDefaultInitializerForType(context.transformType(expression.type), body)
is IrConstKind.Boolean -> body.buildConstI32(if (kind.valueOf(expression)) 1 else 0) is IrConstKind.Boolean -> body.buildConstI32(if (kind.valueOf(expression)) 1 else 0)
@@ -13,7 +13,8 @@ import org.jetbrains.kotlin.ir.interpreter.accessesTopLevelOrObjectField
import org.jetbrains.kotlin.ir.interpreter.fqName import org.jetbrains.kotlin.ir.interpreter.fqName
import org.jetbrains.kotlin.ir.interpreter.isAccessToObject import org.jetbrains.kotlin.ir.interpreter.isAccessToObject
import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.statements
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
class IrCompileTimeChecker( class IrCompileTimeChecker(
@@ -84,7 +85,7 @@ class IrCompileTimeChecker(
return body.kind == IrSyntheticBodyKind.ENUM_VALUES || body.kind == IrSyntheticBodyKind.ENUM_VALUEOF return body.kind == IrSyntheticBodyKind.ENUM_VALUES || body.kind == IrSyntheticBodyKind.ENUM_VALUEOF
} }
override fun <T> visitConst(expression: IrConst<T>, data: Nothing?): Boolean { override fun visitConst(expression: IrConst<*>, data: Nothing?): Boolean {
if (expression.type.getUnsignedType() != null) { if (expression.type.getUnsignedType() != null) {
val constructor = expression.type.classOrNull?.owner?.constructors?.singleOrNull() ?: return false val constructor = expression.type.classOrNull?.owner?.constructors?.singleOrNull() ?: return false
return mode.canEvaluateFunction(constructor) return mode.canEvaluateFunction(constructor)
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import java.util.*
inline fun <reified T : IrElement> T.deepCopyWithSymbols( inline fun <reified T : IrElement> T.deepCopyWithSymbols(
initialParent: IrDeclarationParent? = null, initialParent: IrDeclarationParent? = null,
@@ -408,7 +407,7 @@ open class DeepCopyIrTreeWithSymbols(
override fun visitExpression(expression: IrExpression): IrExpression = override fun visitExpression(expression: IrExpression): IrExpression =
throw IllegalArgumentException("Unsupported expression type: $expression") throw IllegalArgumentException("Unsupported expression type: $expression")
override fun <T> visitConst(expression: IrConst<T>): IrConst<T> = override fun visitConst(expression: IrConst<*>): IrConst<*> =
expression.shallowCopy().copyAttributes(expression) expression.shallowCopy().copyAttributes(expression)
override fun visitConstantObject(expression: IrConstantObject): IrConstantValue = override fun visitConstantObject(expression: IrConstantObject): IrConstantValue =
@@ -560,7 +560,7 @@ class RenderIrElementVisitor(private val normalizeNames: Boolean = false, privat
override fun visitExpression(expression: IrExpression, data: Nothing?): String = override fun visitExpression(expression: IrExpression, data: Nothing?): String =
"? ${expression::class.java.simpleName} type=${expression.type.render()}" "? ${expression::class.java.simpleName} type=${expression.type.render()}"
override fun <T> visitConst(expression: IrConst<T>, data: Nothing?): String = override fun visitConst(expression: IrConst<*>, data: Nothing?): String =
"CONST ${expression.kind} type=${expression.type.render()} value=${expression.value?.escapeIfRequired()}" "CONST ${expression.kind} type=${expression.type.render()} value=${expression.value?.escapeIfRequired()}"
private fun Any.escapeIfRequired() = private fun Any.escapeIfRequired() =
@@ -1180,7 +1180,7 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption
} }
} }
override fun <T> visitConst(expression: IrConst<T>, data: IrDeclaration?) { override fun visitConst(expression: IrConst<*>, data: IrDeclaration?) {
val kind = expression.kind val kind = expression.kind
val (prefix, postfix) = when (kind) { val (prefix, postfix) = when (kind) {
@@ -79,9 +79,9 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
return expression return expression
} }
override fun <T> visitConst(expression: IrConst<T>, data: D) = visitExpression(expression, data) override fun visitConst(expression: IrConst<*>, data: D) = visitExpression(expression, data)
override fun visitVararg(expression: IrVararg, data: D) = visitExpression(expression, data) override fun visitVararg(expression: IrVararg, data: D) = visitExpression(expression, data)
override fun visitConstantValue(expression: IrConstantValue, data: D) : IrConstantValue { override fun visitConstantValue(expression: IrConstantValue, data: D): IrConstantValue {
expression.transformChildren(this, data) expression.transformChildren(this, data)
return expression return expression
} }
@@ -134,10 +134,10 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
final override fun visitExpression(expression: IrExpression, data: Nothing?): IrExpression = visitExpression(expression) final override fun visitExpression(expression: IrExpression, data: Nothing?): IrExpression = visitExpression(expression)
open fun <T> visitConst(expression: IrConst<T>) = visitExpression(expression) open fun visitConst(expression: IrConst<*>) = visitExpression(expression)
final override fun <T> visitConst(expression: IrConst<T>, data: Nothing?) = visitConst(expression) final override fun visitConst(expression: IrConst<*>, data: Nothing?) = visitConst(expression)
open fun visitConstantValue(expression: IrConstantValue) : IrConstantValue { open fun visitConstantValue(expression: IrConstantValue): IrConstantValue {
expression.transformChildren(this, null) expression.transformChildren(this, null)
return expression return expression
} }
@@ -52,7 +52,7 @@ interface IrElementVisitor<out R, in D> {
fun visitSuspensionPoint(expression: IrSuspensionPoint, data: D) = visitExpression(expression, data) fun visitSuspensionPoint(expression: IrSuspensionPoint, data: D) = visitExpression(expression, data)
fun visitExpression(expression: IrExpression, data: D) = visitElement(expression, data) fun visitExpression(expression: IrExpression, data: D) = visitElement(expression, data)
fun <T> visitConst(expression: IrConst<T>, data: D) = visitExpression(expression, data) fun visitConst(expression: IrConst<*>, data: D) = visitExpression(expression, data)
fun visitConstantValue(expression: IrConstantValue, data: D) = visitExpression(expression, data) fun visitConstantValue(expression: IrConstantValue, data: D) = visitExpression(expression, data)
fun visitConstantObject(expression: IrConstantObject, data: D) = visitConstantValue(expression, data) fun visitConstantObject(expression: IrConstantObject, data: D) = visitConstantValue(expression, data)
fun visitConstantPrimitive(expression: IrConstantPrimitive, data: D) = visitConstantValue(expression, data) fun visitConstantPrimitive(expression: IrConstantPrimitive, data: D) = visitConstantValue(expression, data)
@@ -104,8 +104,8 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
fun visitExpression(expression: IrExpression) = visitElement(expression) fun visitExpression(expression: IrExpression) = visitElement(expression)
override fun visitExpression(expression: IrExpression, data: Nothing?) = visitExpression(expression) override fun visitExpression(expression: IrExpression, data: Nothing?) = visitExpression(expression)
fun <T> visitConst(expression: IrConst<T>) = visitExpression(expression) fun visitConst(expression: IrConst<*>) = visitExpression(expression)
override fun <T> visitConst(expression: IrConst<T>, data: Nothing?) = visitConst(expression) override fun visitConst(expression: IrConst<*>, data: Nothing?) = visitConst(expression)
fun visitConstantValue(expression: IrConstantValue) = visitExpression(expression) fun visitConstantValue(expression: IrConstantValue) = visitExpression(expression)
override fun visitConstantValue(expression: IrConstantValue, data: Nothing?) = visitConstantValue(expression) override fun visitConstantValue(expression: IrConstantValue, data: Nothing?) = visitConstantValue(expression)
@@ -17,9 +17,6 @@ import org.jetbrains.kotlin.backend.konan.ir.isUnconditional
import org.jetbrains.kotlin.backend.konan.ir.isVirtualCall import org.jetbrains.kotlin.backend.konan.ir.isVirtualCall
import org.jetbrains.kotlin.backend.konan.logMultiple import org.jetbrains.kotlin.backend.konan.logMultiple
import org.jetbrains.kotlin.backend.konan.lower.* import org.jetbrains.kotlin.backend.konan.lower.*
import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_FILE_GLOBAL_INITIALIZER
import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_FILE_STANDALONE_THREAD_LOCAL_INITIALIZER
import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_FILE_THREAD_LOCAL_INITIALIZER
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
@@ -29,7 +26,10 @@ import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyClass
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import java.util.* import java.util.*
/* /*
@@ -310,7 +310,7 @@ internal object FileInitializersOptimization {
override fun visitDeclaration(declaration: IrDeclarationBase, data: BitSet): BitSet = TODO(declaration.render()) override fun visitDeclaration(declaration: IrDeclarationBase, data: BitSet): BitSet = TODO(declaration.render())
override fun visitTypeOperator(expression: IrTypeOperatorCall, data: BitSet) = expression.argument.accept(this, data) override fun visitTypeOperator(expression: IrTypeOperatorCall, data: BitSet) = expression.argument.accept(this, data)
override fun <T> visitConst(expression: IrConst<T>, data: BitSet) = data override fun visitConst(expression: IrConst<*>, data: BitSet) = data
override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall, data: BitSet) = data override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall, data: BitSet) = data
override fun visitGetValue(expression: IrGetValue, data: BitSet) = data override fun visitGetValue(expression: IrGetValue, data: BitSet) = data