Detailed "operator" convention information (for JS).
This commit is contained in:
committed by
Dmitry Petrov
parent
4a62a6b7c3
commit
64d630faa3
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
|
||||
|
||||
class Psi2IrTranslator(val configuration: Configuration = Configuration()) {
|
||||
class Configuration(
|
||||
val shouldInlineDesugaredBlocks: Boolean = true,
|
||||
val shouldInlineDesugaredBlocks: Boolean = false,
|
||||
val shouldFoldStringConcatenation: Boolean = true
|
||||
)
|
||||
|
||||
|
||||
@@ -161,11 +161,9 @@ class IrCallGenerator(val irStatementGenerator: IrStatementGenerator) : IrGenera
|
||||
val valueArgumentsInEvaluationOrder = resolvedCall.valueArguments.values
|
||||
val valueParameters = resolvedCall.resultingDescriptor.valueParameters
|
||||
|
||||
val irBlock = IrBlockExpressionImpl(ktExpression.startOffset, ktExpression.endOffset, resultType,
|
||||
hasResult = isUsedAsExpression(ktExpression),
|
||||
isDesugared = true)
|
||||
|
||||
|
||||
val hasResult = isUsedAsExpression(ktExpression)
|
||||
val irBlock = IrBlockExpressionImpl(ktExpression.startOffset, ktExpression.endOffset, resultType, hasResult,
|
||||
IrOperator.SYNTHETIC_BLOCK)
|
||||
|
||||
val valueArgumentsToValueParameters = HashMap<ResolvedValueArgument, ValueParameterDescriptor>()
|
||||
for ((index, valueArgument) in resolvedCall.valueArgumentsByIndex!!.withIndex()) {
|
||||
|
||||
+1
-1
@@ -150,7 +150,7 @@ class IrDeclarationGenerator(override val context: IrGeneratorContext) : IrGener
|
||||
if (ktBody is KtBlockExpression)
|
||||
irRhs
|
||||
else
|
||||
IrBlockExpressionImpl(ktBody.startOffset, ktBody.endOffset, null, hasResult = false, isDesugared = true).apply {
|
||||
IrBlockExpressionImpl(ktBody.startOffset, ktBody.endOffset, null, false).apply {
|
||||
addStatement(IrReturnExpressionImpl(ktBody.startOffset, ktBody.endOffset, scopeOwner, irRhs))
|
||||
}
|
||||
return IrExpressionBodyImpl(ktBody.startOffset, ktBody.endOffset, irExpressionBody)
|
||||
|
||||
+5
-4
@@ -17,11 +17,12 @@
|
||||
package org.jetbrains.kotlin.psi2ir.generators
|
||||
|
||||
import com.intellij.psi.tree.IElementType
|
||||
import org.jetbrains.kotlin.ir.expressions.IrBinaryOperator
|
||||
import org.jetbrains.kotlin.ir.expressions.IrOperator
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
|
||||
|
||||
fun getIrBinaryOperator(ktOperator: IElementType): IrOperator? =
|
||||
fun getIrBinaryOperator(ktOperator: IElementType): IrBinaryOperator? =
|
||||
KT_TOKEN_TO_IR_BINARY_OPERATOR[ktOperator]
|
||||
|
||||
fun getIrPrefixOperator(ktOperator: IElementType): IrOperator? =
|
||||
@@ -30,7 +31,7 @@ fun getIrPrefixOperator(ktOperator: IElementType): IrOperator? =
|
||||
fun getIrPostfixOperator(ktOperator: IElementType): IrOperator? =
|
||||
KT_TOKEN_TO_IR_POSTFIX_OPERATOR[ktOperator]
|
||||
|
||||
private val KT_TOKEN_TO_IR_BINARY_OPERATOR = mapOf(
|
||||
private val KT_TOKEN_TO_IR_BINARY_OPERATOR = mapOf<IElementType, IrBinaryOperator>(
|
||||
KtTokens.EQ to IrOperator.EQ,
|
||||
|
||||
KtTokens.PLUSEQ to IrOperator.PLUSEQ,
|
||||
@@ -66,14 +67,14 @@ private val KT_TOKEN_TO_IR_BINARY_OPERATOR = mapOf(
|
||||
KtTokens.ELVIS to IrOperator.ELVIS
|
||||
)
|
||||
|
||||
private val KT_TOKEN_TO_IR_PREFIX_OPERATOR = mapOf(
|
||||
private val KT_TOKEN_TO_IR_PREFIX_OPERATOR = mapOf<IElementType, IrOperator>(
|
||||
KtTokens.PLUSPLUS to IrOperator.PREFIX_INCR,
|
||||
KtTokens.MINUSMINUS to IrOperator.PREFIX_DECR,
|
||||
KtTokens.EXCL to IrOperator.EXCL,
|
||||
KtTokens.MINUS to IrOperator.UMINUS
|
||||
)
|
||||
|
||||
private val KT_TOKEN_TO_IR_POSTFIX_OPERATOR = mapOf(
|
||||
private val KT_TOKEN_TO_IR_POSTFIX_OPERATOR = mapOf<IElementType, IrOperator>(
|
||||
KtTokens.PLUSPLUS to IrOperator.POSTFIX_INCR,
|
||||
KtTokens.MINUSMINUS to IrOperator.POSTFIX_DECR,
|
||||
KtTokens.EXCLEXCL to IrOperator.EXCLEXCL
|
||||
|
||||
+7
-7
@@ -78,7 +78,7 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
|
||||
)
|
||||
}
|
||||
|
||||
private fun generateBinaryBooleanOperator(expression: KtBinaryExpression, irOperator: IrOperator): IrExpression {
|
||||
private fun generateBinaryBooleanOperator(expression: KtBinaryExpression, irOperator: IrBinaryOperator): IrExpression {
|
||||
val irArgument0 = irStatementGenerator.generateExpression(expression.left!!).toExpectedType(context.builtIns.booleanType)
|
||||
val irArgument1 = irStatementGenerator.generateExpression(expression.right!!).toExpectedType(context.builtIns.booleanType)
|
||||
return IrBinaryOperatorExpressionImpl(
|
||||
@@ -99,7 +99,7 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
|
||||
IrOperator.EXCL, null, irOperatorCall)
|
||||
}
|
||||
|
||||
private fun generateIdentityOperator(expression: KtBinaryExpression, irOperator: IrOperator): IrExpression {
|
||||
private fun generateIdentityOperator(expression: KtBinaryExpression, irOperator: IrBinaryOperator): IrExpression {
|
||||
val irArgument0 = irStatementGenerator.generateExpression(expression.left!!)
|
||||
val irArgument1 = irStatementGenerator.generateExpression(expression.right!!)
|
||||
return IrBinaryOperatorExpressionImpl(
|
||||
@@ -108,7 +108,7 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
|
||||
)
|
||||
}
|
||||
|
||||
private fun generateEqualityOperator(expression: KtBinaryExpression, irOperator: IrOperator): IrExpression {
|
||||
private fun generateEqualityOperator(expression: KtBinaryExpression, irOperator: IrBinaryOperator): IrExpression {
|
||||
val relatedCall = getResolvedCall(expression)!!
|
||||
val relatedDescriptor = relatedCall.resultingDescriptor
|
||||
|
||||
@@ -133,7 +133,7 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
|
||||
)
|
||||
}
|
||||
|
||||
private fun generateComparisonOperator(expression: KtBinaryExpression, irOperator: IrOperator): IrExpression {
|
||||
private fun generateComparisonOperator(expression: KtBinaryExpression, irOperator: IrBinaryOperator): IrExpression {
|
||||
val relatedCall = getResolvedCall(expression)!!
|
||||
val relatedDescriptor = relatedCall.resultingDescriptor
|
||||
|
||||
@@ -158,11 +158,11 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
|
||||
val operatorCall = getResolvedCall(expression)!!
|
||||
|
||||
if (irLValue is IrLValueWithAugmentedStore) {
|
||||
return irLValue.prefixAugmentedStore(operatorCall)
|
||||
return irLValue.prefixAugmentedStore(operatorCall, irOperator)
|
||||
}
|
||||
|
||||
val opCallGenerator = IrCallGenerator(irStatementGenerator).apply { putValue(ktBaseExpression, irLValue) }
|
||||
val irBlock = IrBlockExpressionImpl(expression.startOffset, expression.endOffset, irLValue.type, true, true)
|
||||
val irBlock = IrBlockExpressionImpl(expression.startOffset, expression.endOffset, irLValue.type, true, irOperator)
|
||||
val irOpCall = opCallGenerator.generateCall(expression, operatorCall, irOperator)
|
||||
val irTmp = irStatementGenerator.temporaryVariableFactory.createTemporaryVariable(irOpCall)
|
||||
irBlock.addStatement(irTmp)
|
||||
@@ -179,7 +179,7 @@ class IrOperatorExpressionGenerator(val irStatementGenerator: IrStatementGenerat
|
||||
val isSimpleAssignment = get(BindingContext.VARIABLE_REASSIGNMENT, expression) ?: false
|
||||
|
||||
if (isSimpleAssignment && irLValue is IrLValueWithAugmentedStore) {
|
||||
return irLValue.augmentedStore(operatorCall, irStatementGenerator.generateExpression(expression.right!!))
|
||||
return irLValue.augmentedStore(operatorCall, irOperator, irStatementGenerator.generateExpression(expression.right!!))
|
||||
}
|
||||
|
||||
val opCallGenerator = IrCallGenerator(irStatementGenerator).apply { putValue(ktLeft, irLValue) }
|
||||
|
||||
+3
-4
@@ -72,8 +72,7 @@ class IrStatementGenerator(
|
||||
override fun visitDestructuringDeclaration(multiDeclaration: KtDestructuringDeclaration, data: Nothing?): IrStatement {
|
||||
// TODO use some special form that introduces multiple declarations into surrounding scope?
|
||||
|
||||
val irBlock = IrBlockExpressionImpl(multiDeclaration.startOffset, multiDeclaration.endOffset, null,
|
||||
hasResult = false, isDesugared = true)
|
||||
val irBlock = IrBlockExpressionImpl(multiDeclaration.startOffset, multiDeclaration.endOffset, null, false, IrOperator.SYNTHETIC_BLOCK)
|
||||
val ktInitializer = multiDeclaration.initializer!!
|
||||
val irTmpInitializer = temporaryVariableFactory.createTemporaryVariable(ktInitializer.genExpr())
|
||||
irBlock.addStatement(irTmpInitializer)
|
||||
@@ -94,8 +93,8 @@ class IrStatementGenerator(
|
||||
}
|
||||
|
||||
override fun visitBlockExpression(expression: KtBlockExpression, data: Nothing?): IrStatement {
|
||||
val irBlock = IrBlockExpressionImpl(expression.startOffset, expression.endOffset, getReturnType(expression),
|
||||
hasResult = isUsedAsExpression(expression), isDesugared = false)
|
||||
val irBlock = IrBlockExpressionImpl(expression.startOffset, expression.endOffset,
|
||||
getReturnType(expression), isUsedAsExpression(expression))
|
||||
expression.statements.forEach { irBlock.addStatement(it.genStmt()) }
|
||||
return irBlock
|
||||
}
|
||||
|
||||
+29
-18
@@ -51,26 +51,22 @@ class IrIndexedLValue(
|
||||
|
||||
private fun generateGetOrSetCallAsDesugaredBlock(call: ResolvedCall<*>, irArgument: IrExpression? = null): IrExpression {
|
||||
val callGenerator = IrCallGenerator(irStatementGenerator)
|
||||
|
||||
val hasResult = irArgument == null
|
||||
val irBlock = createDesugaredBlock(call, callGenerator, hasResult)
|
||||
setupCallGeneratorContext(callGenerator)
|
||||
|
||||
if (irArgument != null) {
|
||||
callGenerator.putValue(call.resultingDescriptor.valueParameters.last(), IrSingleExpressionValue(irArgument))
|
||||
}
|
||||
|
||||
irBlock.addStatement(callGenerator.generateCall(ktArrayAccessExpression, call, irOperator))
|
||||
|
||||
return irBlock
|
||||
return callGenerator.generateCall(ktArrayAccessExpression, call, irOperator)
|
||||
}
|
||||
|
||||
override fun prefixAugmentedStore(operatorCall: ResolvedCall<*>): IrExpression {
|
||||
override fun prefixAugmentedStore(operatorCall: ResolvedCall<*>, irOperator: IrOperator): IrExpression {
|
||||
if (indexedGetCall == null) throw AssertionError("Indexed LValue has no 'get' call: ${ktArrayAccessExpression.text}")
|
||||
if (indexedSetCall == null) throw AssertionError("Indexed LValue has no 'set' call: ${ktArrayAccessExpression.text}")
|
||||
|
||||
val callGenerator = IrCallGenerator(irStatementGenerator)
|
||||
|
||||
val irBlock = createDesugaredBlock(indexedSetCall, callGenerator, true)
|
||||
val irBlock = createDesugaredBlockWithTemporaries(indexedSetCall, callGenerator, true, irOperator)
|
||||
|
||||
val operatorCallReceiver = operatorCall.extensionReceiver ?: operatorCall.dispatchReceiver
|
||||
callGenerator.putValue(operatorCallReceiver!!,
|
||||
@@ -89,13 +85,13 @@ class IrIndexedLValue(
|
||||
return irBlock
|
||||
}
|
||||
|
||||
override fun augmentedStore(operatorCall: ResolvedCall<*>, irOperatorArgument: IrExpression): IrExpression {
|
||||
override fun augmentedStore(operatorCall: ResolvedCall<*>, irOperator: IrOperator, irOperatorArgument: IrExpression): IrExpression {
|
||||
if (indexedGetCall == null) throw AssertionError("Indexed LValue has no 'get' call: ${ktArrayAccessExpression.text}")
|
||||
if (indexedSetCall == null) throw AssertionError("Indexed LValue has no 'set' call: ${ktArrayAccessExpression.text}")
|
||||
|
||||
val callGenerator = IrCallGenerator(irStatementGenerator)
|
||||
|
||||
val irBlock = createDesugaredBlock(indexedSetCall, callGenerator, false)
|
||||
val irBlock = createDesugaredBlockWithTemporaries(indexedSetCall, callGenerator, false, irOperator)
|
||||
|
||||
callGenerator.putValue(operatorCall.resultingDescriptor.valueParameters[0], IrSingleExpressionValue(irOperatorArgument))
|
||||
|
||||
@@ -111,17 +107,24 @@ class IrIndexedLValue(
|
||||
return irBlock
|
||||
}
|
||||
|
||||
private fun createDesugaredBlock(call: ResolvedCall<*>, callGenerator: IrCallGenerator, hasResult: Boolean): IrBlockExpressionImpl {
|
||||
val irBlock = IrBlockExpressionImpl(ktArrayAccessExpression.startOffset, ktArrayAccessExpression.endOffset,
|
||||
call.resultingDescriptor.returnType,
|
||||
hasResult, true)
|
||||
|
||||
defineContextVariables(irBlock, callGenerator)
|
||||
|
||||
private fun createDesugaredBlockWithTemporaries(
|
||||
call: ResolvedCall<*>,
|
||||
callGenerator: IrCallGenerator,
|
||||
hasResult: Boolean,
|
||||
operator: IrOperator?
|
||||
): IrBlockExpressionImpl {
|
||||
val irBlock = createDesugaredBlock(call, hasResult, operator)
|
||||
defineTemporaryVariables(irBlock, callGenerator)
|
||||
return irBlock
|
||||
}
|
||||
|
||||
private fun defineContextVariables(irBlock: IrBlockExpression, callGenerator: IrCallGenerator) {
|
||||
private fun createDesugaredBlock(call: ResolvedCall<*>, hasResult: Boolean, operator: IrOperator?): IrBlockExpressionImpl {
|
||||
return IrBlockExpressionImpl(ktArrayAccessExpression.startOffset, ktArrayAccessExpression.endOffset,
|
||||
call.resultingDescriptor.returnType,
|
||||
hasResult, operator)
|
||||
}
|
||||
|
||||
private fun defineTemporaryVariables(irBlock: IrBlockExpression, callGenerator: IrCallGenerator) {
|
||||
irBlock.addIfNotNull(callGenerator.introduceTemporary(ktArrayAccessExpression.arrayExpression!!, irArray, "array"))
|
||||
|
||||
var index = 0
|
||||
@@ -129,4 +132,12 @@ class IrIndexedLValue(
|
||||
irBlock.addIfNotNull(callGenerator.introduceTemporary(ktIndexExpression, irIndexValue, "index${index++}"))
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupCallGeneratorContext(callGenerator: IrCallGenerator) {
|
||||
callGenerator.putValue(ktArrayAccessExpression.arrayExpression!!, IrSingleExpressionValue(irArray))
|
||||
|
||||
for ((ktIndexExpression, irIndexValue) in indexValues) {
|
||||
callGenerator.putValue(ktIndexExpression, IrSingleExpressionValue(irIndexValue))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.psi2ir.generators.values
|
||||
|
||||
import org.jetbrains.kotlin.ir.assertDetached
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrOperator
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
|
||||
@@ -49,7 +50,7 @@ interface IrLValue : IrValue {
|
||||
}
|
||||
|
||||
interface IrLValueWithAugmentedStore : IrLValue {
|
||||
fun prefixAugmentedStore(operatorCall: ResolvedCall<*>): IrExpression
|
||||
fun augmentedStore(operatorCall: ResolvedCall<*>, irOperatorArgument: IrExpression): IrExpression
|
||||
fun prefixAugmentedStore(operatorCall: ResolvedCall<*>, irOperator: IrOperator): IrExpression
|
||||
fun augmentedStore(operatorCall: ResolvedCall<*>, irOperator: IrOperator, irOperatorArgument: IrExpression): IrExpression
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -35,11 +35,11 @@ class InlineDesugaredBlocks : IrElementVisitor<Unit, Nothing?> {
|
||||
override fun visitBlockExpression(expression: IrBlockExpression, data: Nothing?) {
|
||||
val transformedBlock = IrBlockExpressionImpl(
|
||||
expression.startOffset, expression.endOffset, expression.type,
|
||||
expression.hasResult, expression.isDesugared
|
||||
expression.hasResult, expression.operator
|
||||
)
|
||||
for (statement in expression.statements) {
|
||||
statement.accept(this, data)
|
||||
if (statement is IrBlockExpression && statement.isDesugared) {
|
||||
if (statement is IrBlockExpression && statement.operator != null) {
|
||||
statement.statements.forEach {
|
||||
transformedBlock.addStatement(it.detach())
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ import java.util.*
|
||||
|
||||
interface IrBlockExpression : IrExpression {
|
||||
val hasResult: Boolean
|
||||
val isDesugared: Boolean
|
||||
val operator: IrOperator?
|
||||
|
||||
val statements: List<IrStatement>
|
||||
fun addStatement(statement: IrStatement)
|
||||
@@ -42,7 +42,7 @@ class IrBlockExpressionImpl(
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
override val hasResult: Boolean,
|
||||
override val isDesugared: Boolean
|
||||
override val operator: IrOperator? = null
|
||||
) : IrExpressionBase(startOffset, endOffset, type), IrBlockExpression {
|
||||
override val statements: MutableList<IrStatement> = ArrayList()
|
||||
|
||||
|
||||
@@ -16,51 +16,54 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.expressions
|
||||
|
||||
abstract class IrOperator(val debugName: String) {
|
||||
override fun toString(): String = debugName
|
||||
interface IrOperator {
|
||||
object UMINUS : IrOperatorImpl("UMINUS"), IrUnaryOperator
|
||||
object EXCL : IrOperatorImpl("EXCL"), IrUnaryOperator
|
||||
object EXCLEXCL : IrOperatorImpl("EXCLEXCL"), IrUnaryOperator
|
||||
|
||||
object INVOKE : IrOperator("INVOKE")
|
||||
object ELVIS : IrOperatorImpl("ELVIS"), IrBinaryOperator
|
||||
|
||||
object PREFIX_INCR : IrOperator("PREFIX_INCR")
|
||||
object PREFIX_DECR : IrOperator("PREFIX_DECR")
|
||||
object POSTFIX_INCR : IrOperator("POSTFIX_INCR")
|
||||
object POSTFIX_DECR : IrOperator("POSTFIX_DECR")
|
||||
object LT : IrOperatorImpl("LT"), IrBinaryOperator
|
||||
object GT : IrOperatorImpl("GT"), IrBinaryOperator
|
||||
object LTEQ : IrOperatorImpl("LTEQ"), IrBinaryOperator
|
||||
object GTEQ : IrOperatorImpl("GTEQ"), IrBinaryOperator
|
||||
|
||||
object UMINUS : IrOperator("UMINUS")
|
||||
object EXCL : IrOperator("EXCL")
|
||||
object EXCLEXCL : IrOperator("EXCLEXCL")
|
||||
object ELVIS : IrOperator("ELVIS")
|
||||
object EQEQ : IrOperatorImpl("EQEQ"), IrBinaryOperator
|
||||
object EQEQEQ : IrOperatorImpl("EQEQEQ"), IrBinaryOperator
|
||||
object EXCLEQ : IrOperatorImpl("EXCLEQ"), IrBinaryOperator
|
||||
object EXCLEQEQ : IrOperatorImpl("EXCLEQEQ"), IrBinaryOperator
|
||||
|
||||
object LT : IrOperator("LT")
|
||||
object GT : IrOperator("GT")
|
||||
object LTEQ : IrOperator("LTEQ")
|
||||
object GTEQ : IrOperator("GTEQ")
|
||||
object IN : IrOperatorImpl("IN"), IrBinaryOperator
|
||||
object NOT_IN : IrOperatorImpl("NOT_IN"), IrBinaryOperator
|
||||
object ANDAND : IrOperatorImpl("ANDAND"), IrBinaryOperator
|
||||
object OROR : IrOperatorImpl("OROR"), IrBinaryOperator
|
||||
|
||||
object EQEQ : IrOperator("EQEQ")
|
||||
object EQEQEQ : IrOperator("EQEQEQ")
|
||||
object EXCLEQ : IrOperator("EXCLEQ")
|
||||
object EXCLEQEQ : IrOperator("EXCLEQEQ")
|
||||
|
||||
object IN : IrOperator("IN")
|
||||
object NOT_IN : IrOperator("NOT_IN")
|
||||
object ANDAND : IrOperator("ANDAND")
|
||||
object OROR : IrOperator("OROR")
|
||||
object RANGE : IrOperator("RANGE")
|
||||
|
||||
object PLUS : IrOperator("PLUS")
|
||||
object MINUS : IrOperator("MINUS")
|
||||
object MUL : IrOperator("MUL")
|
||||
object DIV : IrOperator("DIV")
|
||||
object PERC : IrOperator("PERC")
|
||||
object PLUS : IrOperatorImpl("PLUS"), IrBinaryOperator
|
||||
object MINUS : IrOperatorImpl("MINUS"), IrBinaryOperator
|
||||
object MUL : IrOperatorImpl("MUL"), IrBinaryOperator
|
||||
object DIV : IrOperatorImpl("DIV"), IrBinaryOperator
|
||||
object PERC : IrOperatorImpl("PERC"), IrBinaryOperator
|
||||
object RANGE : IrOperatorImpl("RANGE"), IrBinaryOperator
|
||||
|
||||
object EQ : IrOperator("EQ")
|
||||
object PLUSEQ : IrOperator("PLUSEQ")
|
||||
object MINUSEQ : IrOperator("MINUSEQ")
|
||||
object MULTEQ : IrOperator("MULTEQ")
|
||||
object DIVEQ : IrOperator("DIVEQ")
|
||||
object PERCEQ : IrOperator("PERCEQ")
|
||||
object INVOKE : IrOperatorImpl("INVOKE"), IrUnaryOperator
|
||||
|
||||
data class COMPONENT_N private constructor(val index: Int) : IrOperator("COMPONENT_$index") {
|
||||
object PREFIX_INCR : IrOperatorImpl("PREFIX_INCR"), IrUnaryOperator
|
||||
object PREFIX_DECR : IrOperatorImpl("PREFIX_DECR"), IrUnaryOperator
|
||||
object POSTFIX_INCR : IrOperatorImpl("POSTFIX_INCR"), IrUnaryOperator
|
||||
object POSTFIX_DECR : IrOperatorImpl("POSTFIX_DECR"), IrUnaryOperator
|
||||
|
||||
object EQ : IrOperatorImpl("EQ"), IrBinaryOperator
|
||||
object PLUSEQ : IrOperatorImpl("PLUSEQ"), IrBinaryOperator
|
||||
object MINUSEQ : IrOperatorImpl("MINUSEQ"), IrBinaryOperator
|
||||
object MULTEQ : IrOperatorImpl("MULTEQ"), IrBinaryOperator
|
||||
object DIVEQ : IrOperatorImpl("DIVEQ"), IrBinaryOperator
|
||||
object PERCEQ : IrOperatorImpl("PERCEQ"), IrBinaryOperator
|
||||
|
||||
object SYNTHETIC_BLOCK : IrOperatorImpl("SYNTHETIC_BLOCK")
|
||||
|
||||
data class COMPONENT_N private constructor(val index: Int) : IrOperatorImpl("COMPONENT_$index") {
|
||||
companion object {
|
||||
private val precreatedComponents = Array(32) { i -> COMPONENT_N(i + 1) }
|
||||
|
||||
@@ -71,4 +74,11 @@ abstract class IrOperator(val debugName: String) {
|
||||
COMPONENT_N(index)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface IrUnaryOperator : IrOperator
|
||||
interface IrBinaryOperator : IrOperator
|
||||
|
||||
abstract class IrOperatorImpl(val debugName: String): IrOperator {
|
||||
override fun toString(): String = debugName
|
||||
}
|
||||
@@ -27,10 +27,12 @@ interface IrOperatorExpression : IrExpression {
|
||||
}
|
||||
|
||||
interface IrUnaryOperatorExpression : IrOperatorExpression {
|
||||
override val operator: IrUnaryOperator
|
||||
var argument: IrExpression
|
||||
}
|
||||
|
||||
interface IrBinaryOperatorExpression : IrOperatorExpression {
|
||||
override val operator: IrBinaryOperator
|
||||
var argument0: IrExpression
|
||||
var argument1: IrExpression
|
||||
}
|
||||
@@ -39,14 +41,14 @@ class IrUnaryOperatorExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
override val operator: IrOperator,
|
||||
override val operator: IrUnaryOperator,
|
||||
override val relatedDescriptor: CallableDescriptor?
|
||||
) : IrExpressionBase(startOffset, endOffset, type), IrUnaryOperatorExpression {
|
||||
constructor(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
operator: IrOperator,
|
||||
operator: IrUnaryOperator,
|
||||
relatedDescriptor: CallableDescriptor?,
|
||||
argument: IrExpression
|
||||
) : this(startOffset, endOffset, type, operator, relatedDescriptor) {
|
||||
@@ -89,14 +91,14 @@ class IrBinaryOperatorExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
override val operator: IrOperator,
|
||||
override val operator: IrBinaryOperator,
|
||||
override val relatedDescriptor: CallableDescriptor?
|
||||
) : IrExpressionBase(startOffset, endOffset, type), IrBinaryOperatorExpression {
|
||||
constructor(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
operator: IrOperator,
|
||||
operator: IrBinaryOperator,
|
||||
relatedDescriptor: CallableDescriptor?,
|
||||
argument0: IrExpression,
|
||||
argument1: IrExpression
|
||||
|
||||
@@ -64,7 +64,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
||||
"LITERAL ${expression.kind} type=${expression.renderType()} value='${expression.value}'"
|
||||
|
||||
override fun visitBlockExpression(expression: IrBlockExpression, data: Nothing?): String =
|
||||
"BLOCK type=${expression.renderType()} hasResult=${expression.hasResult} isDesugared=${expression.isDesugared}"
|
||||
"BLOCK type=${expression.renderType()} hasResult=${expression.hasResult} operator=${expression.operator}"
|
||||
|
||||
override fun visitReturnExpression(expression: IrReturnExpression, data: Nothing?): String =
|
||||
"RETURN type=${expression.renderType()}"
|
||||
@@ -77,17 +77,21 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
||||
|
||||
override fun visitCallExpression(expression: IrCallExpression, data: Nothing?): String =
|
||||
"CALL ${if (expression.isSafe) "?." else "."}${expression.descriptor.name} " +
|
||||
"type=${expression.renderType()} operator=${expression.operator ?: ""}"
|
||||
"type=${expression.renderType()} operator=${expression.operator}"
|
||||
|
||||
override fun visitGetProperty(expression: IrGetPropertyExpression, data: Nothing?): String =
|
||||
"GET_PROPERTY ${if (expression.isSafe) "?." else "."}${expression.descriptor.name} " +
|
||||
"type=${expression.renderType()}"
|
||||
"type=${expression.renderType()} operator=${expression.operator}"
|
||||
|
||||
override fun visitSetProperty(expression: IrSetPropertyExpression, data: Nothing?): String =
|
||||
"SET_PROPERTY ${if (expression.isSafe) "?." else "."}${expression.descriptor.name}" +
|
||||
"type=${expression.renderType()} operator=${expression.operator}"
|
||||
|
||||
override fun visitGetVariable(expression: IrGetVariableExpression, data: Nothing?): String =
|
||||
"GET_VAR ${expression.descriptor.name} type=${expression.renderType()}"
|
||||
"GET_VAR ${expression.descriptor.name} type=${expression.renderType()} operator=${expression.operator}"
|
||||
|
||||
override fun visitSetVariable(expression: IrSetVariableExpression, data: Nothing?): String =
|
||||
"SET_VAR ${expression.descriptor.name} type=${expression.renderType()}"
|
||||
"SET_VAR ${expression.descriptor.name} type=${expression.renderType()} operator=${expression.operator}"
|
||||
|
||||
override fun visitGetObjectValue(expression: IrGetObjectValueExpression, data: Nothing?): String =
|
||||
"GET_OBJECT ${expression.descriptor.name} type=${expression.renderType()}"
|
||||
@@ -95,10 +99,6 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
||||
override fun visitGetEnumValue(expression: IrGetEnumValueExpression, data: Nothing?): String =
|
||||
"GET_ENUM_VALUE ${expression.descriptor.name} type=${expression.renderType()}"
|
||||
|
||||
override fun visitSetProperty(expression: IrSetPropertyExpression, data: Nothing?): String =
|
||||
"SET_PROPERTY ${if (expression.isSafe) "?." else "."}${expression.descriptor.name}" +
|
||||
"type=${expression.renderType()}"
|
||||
|
||||
override fun visitUnaryOperator(expression: IrUnaryOperatorExpression, data: Nothing?): String =
|
||||
"UNARY_OP operator=${expression.operator} " +
|
||||
"type=${expression.renderType()} " +
|
||||
|
||||
Reference in New Issue
Block a user