Shrinking IR: GetProperty / SetProperty expressions are now generated as calls.
This commit is contained in:
committed by
Dmitry Petrov
parent
8500f5ddb2
commit
70dfb75f82
@@ -95,25 +95,30 @@ class CallGenerator(val statementGenerator: StatementGenerator) : IrGenerator {
|
||||
superQualifier: ClassDescriptor? = null
|
||||
): IrExpression {
|
||||
val descriptor = resolvedCall.resultingDescriptor
|
||||
val returnType = getReturnType(resolvedCall)
|
||||
|
||||
return when (descriptor) {
|
||||
is PropertyDescriptor ->
|
||||
IrGetPropertyExpressionImpl(
|
||||
ktElement.startOffset, ktElement.endOffset,
|
||||
returnType,
|
||||
resolvedCall.call.isSafeCall(), descriptor
|
||||
).apply {
|
||||
dispatchReceiver = generateReceiver(ktElement, resolvedCall.dispatchReceiver, descriptor.dispatchReceiverParameter)
|
||||
extensionReceiver = generateReceiver(ktElement, resolvedCall.extensionReceiver, descriptor.extensionReceiverParameter)
|
||||
}
|
||||
generatePropertyGetterCall(descriptor, ktElement, resolvedCall)
|
||||
is FunctionDescriptor ->
|
||||
generateFunctionCall(descriptor, ktElement, returnType, operator, resolvedCall, superQualifier)
|
||||
generateFunctionCall(descriptor, ktElement, operator, resolvedCall, superQualifier)
|
||||
else ->
|
||||
TODO("Unexpected callable descriptor: $descriptor ${descriptor.javaClass.simpleName}")
|
||||
}
|
||||
}
|
||||
|
||||
private fun CallGenerator.generatePropertyGetterCall(
|
||||
descriptor: PropertyDescriptor,
|
||||
ktElement: KtElement,
|
||||
resolvedCall: ResolvedCall<*>
|
||||
): IrGetterCallExpressionImpl {
|
||||
val returnType = getReturnType(resolvedCall)
|
||||
val dispatchReceiver = generateReceiver(ktElement, resolvedCall.dispatchReceiver, descriptor.dispatchReceiverParameter)
|
||||
val extensionReceiver = generateReceiver(ktElement, resolvedCall.extensionReceiver, descriptor.extensionReceiverParameter)
|
||||
return IrGetterCallExpressionImpl(ktElement.startOffset, ktElement.endOffset,
|
||||
returnType, descriptor.getter!!, resolvedCall.call.isSafeCall(),
|
||||
dispatchReceiver, extensionReceiver, IrOperator.GET_PROPERTY)
|
||||
}
|
||||
|
||||
private fun ResolvedCall<*>.requiresArgumentReordering(): Boolean {
|
||||
var lastValueParameterIndex = -1
|
||||
for (valueArgument in call.valueArguments) {
|
||||
@@ -131,20 +136,21 @@ class CallGenerator(val statementGenerator: StatementGenerator) : IrGenerator {
|
||||
private fun generateFunctionCall(
|
||||
descriptor: FunctionDescriptor,
|
||||
ktElement: KtElement,
|
||||
resultType: KotlinType?,
|
||||
operator: IrOperator?,
|
||||
resolvedCall: ResolvedCall<out CallableDescriptor>,
|
||||
superQualifier: ClassDescriptor?
|
||||
): IrExpression {
|
||||
val returnType = descriptor.returnType
|
||||
|
||||
val irCall = IrCallExpressionImpl(
|
||||
ktElement.startOffset, ktElement.endOffset, resultType,
|
||||
ktElement.startOffset, ktElement.endOffset, returnType,
|
||||
descriptor, resolvedCall.call.isSafeCall(), operator, superQualifier
|
||||
)
|
||||
irCall.dispatchReceiver = generateReceiver(ktElement, resolvedCall.dispatchReceiver, descriptor.dispatchReceiverParameter)
|
||||
irCall.extensionReceiver = generateReceiver(ktElement, resolvedCall.extensionReceiver, descriptor.extensionReceiverParameter)
|
||||
|
||||
return if (resolvedCall.requiresArgumentReordering()) {
|
||||
generateCallWithArgumentReordering(irCall, ktElement, resolvedCall, resultType)
|
||||
generateCallWithArgumentReordering(irCall, ktElement, resolvedCall, returnType)
|
||||
}
|
||||
else {
|
||||
irCall.apply {
|
||||
|
||||
+1
-2
@@ -17,13 +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.ir.expressions.IrTypeOperator
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
|
||||
|
||||
fun getIrBinaryOperator(ktOperator: IElementType): IrBinaryOperator? =
|
||||
fun getIrBinaryOperator(ktOperator: IElementType): IrOperator? =
|
||||
when (ktOperator) {
|
||||
KtTokens.EQ -> IrOperator.EQ
|
||||
KtTokens.PLUSEQ -> IrOperator.PLUSEQ
|
||||
|
||||
+4
-4
@@ -114,7 +114,7 @@ class OperatorExpressionGenerator(val statementGenerator: StatementGenerator): I
|
||||
)
|
||||
}
|
||||
|
||||
private fun generateBinaryBooleanOperator(expression: KtBinaryExpression, irOperator: IrBinaryOperator): IrExpression {
|
||||
private fun generateBinaryBooleanOperator(expression: KtBinaryExpression, irOperator: IrOperator): IrExpression {
|
||||
val irArgument0 = statementGenerator.generateExpression(expression.left!!).toExpectedType(context.builtIns.booleanType)
|
||||
val irArgument1 = statementGenerator.generateExpression(expression.right!!).toExpectedType(context.builtIns.booleanType)
|
||||
return IrBinaryOperatorExpressionImpl(
|
||||
@@ -135,7 +135,7 @@ class OperatorExpressionGenerator(val statementGenerator: StatementGenerator): I
|
||||
IrOperator.EXCL, null, irOperatorCall)
|
||||
}
|
||||
|
||||
private fun generateIdentityOperator(expression: KtBinaryExpression, irOperator: IrBinaryOperator): IrExpression {
|
||||
private fun generateIdentityOperator(expression: KtBinaryExpression, irOperator: IrOperator): IrExpression {
|
||||
val irArgument0 = statementGenerator.generateExpression(expression.left!!)
|
||||
val irArgument1 = statementGenerator.generateExpression(expression.right!!)
|
||||
return IrBinaryOperatorExpressionImpl(
|
||||
@@ -144,7 +144,7 @@ class OperatorExpressionGenerator(val statementGenerator: StatementGenerator): I
|
||||
)
|
||||
}
|
||||
|
||||
private fun generateEqualityOperator(expression: KtBinaryExpression, irOperator: IrBinaryOperator): IrExpression {
|
||||
private fun generateEqualityOperator(expression: KtBinaryExpression, irOperator: IrOperator): IrExpression {
|
||||
val relatedCall = getResolvedCall(expression)!!
|
||||
val relatedDescriptor = relatedCall.resultingDescriptor
|
||||
|
||||
@@ -169,7 +169,7 @@ class OperatorExpressionGenerator(val statementGenerator: StatementGenerator): I
|
||||
)
|
||||
}
|
||||
|
||||
private fun generateComparisonOperator(expression: KtBinaryExpression, irOperator: IrBinaryOperator): IrExpression {
|
||||
private fun generateComparisonOperator(expression: KtBinaryExpression, irOperator: IrOperator): IrExpression {
|
||||
val compareToCall = getResolvedCall(expression)!!
|
||||
val compareToDescriptor = compareToCall.resultingDescriptor
|
||||
|
||||
|
||||
+16
-16
@@ -35,21 +35,21 @@ class PropertyLValue(
|
||||
override val type: KotlinType?
|
||||
get() = descriptor.type
|
||||
|
||||
private fun IrPropertyAccessExpression.setReceivers() =
|
||||
apply {
|
||||
dispatchReceiver = this@PropertyLValue.dispatchReceiver
|
||||
extensionReceiver = this@PropertyLValue.extensionReceiver
|
||||
}
|
||||
override fun load(): IrExpression {
|
||||
val getter = descriptor.getter!!
|
||||
return IrGetterCallExpressionImpl(
|
||||
ktElement.startOffset, ktElement.endOffset,
|
||||
getter.returnType, getter, isSafe,
|
||||
dispatchReceiver, extensionReceiver, IrOperator.GET_PROPERTY
|
||||
)
|
||||
}
|
||||
|
||||
override fun load(): IrExpression =
|
||||
IrGetPropertyExpressionImpl(
|
||||
ktElement.startOffset, ktElement.endOffset,
|
||||
descriptor.type, isSafe, descriptor, irOperator
|
||||
).setReceivers()
|
||||
|
||||
override fun store(irExpression: IrExpression): IrExpression =
|
||||
IrSetPropertyExpressionImpl(
|
||||
ktElement.startOffset, ktElement.endOffset,
|
||||
isSafe, descriptor, irExpression.toExpectedType(descriptor.type), irOperator
|
||||
).setReceivers()
|
||||
override fun store(irExpression: IrExpression): IrExpression {
|
||||
val setter = descriptor.setter!!
|
||||
val irArgument = irExpression.toExpectedType(descriptor.type)
|
||||
val irCall = IrSetterCallExpressionImpl(ktElement.startOffset, ktElement.endOffset,
|
||||
setter.returnType, setter, isSafe,
|
||||
dispatchReceiver, extensionReceiver, irArgument, irOperator)
|
||||
return irCall
|
||||
}
|
||||
}
|
||||
@@ -29,4 +29,5 @@ const val WHEN_SUBJECT_VARIABLE_SLOT = -1
|
||||
const val WHEN_ELSE_EXPRESSION_SLOT = -2
|
||||
const val BRANCH_RESULT_SLOT = -1
|
||||
const val LOOP_BODY_SLOT = -1
|
||||
const val LOOP_CONDITION_SLOT = -2
|
||||
const val LOOP_CONDITION_SLOT = -2
|
||||
const val SETTER_ARGUMENT_INDEX = 0
|
||||
@@ -38,7 +38,7 @@ class IrCallExpressionImpl(
|
||||
type: KotlinType?,
|
||||
override val descriptor: CallableDescriptor,
|
||||
isSafe: Boolean,
|
||||
override val operator: IrOperator?,
|
||||
override val operator: IrOperator? = null,
|
||||
override val superQualifier: ClassDescriptor? = null
|
||||
) : IrMemberAccessExpressionBase(startOffset, endOffset, type, isSafe), IrCallExpression {
|
||||
private val argumentsByParameterIndex =
|
||||
@@ -83,3 +83,98 @@ class IrCallExpressionImpl(
|
||||
argumentsByParameterIndex.forEach { it?.accept(visitor, data) }
|
||||
}
|
||||
}
|
||||
|
||||
abstract class IrPropertyAccessorCallExpressionBase(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
override val descriptor: CallableDescriptor,
|
||||
isSafe: Boolean,
|
||||
override val operator: IrOperator? = null,
|
||||
override val superQualifier: ClassDescriptor? = null
|
||||
) : IrMemberAccessExpressionBase(startOffset, endOffset, type, isSafe), IrCallExpression {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||
return visitor.visitCallExpression(this, data)
|
||||
}
|
||||
}
|
||||
|
||||
class IrGetterCallExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
descriptor: CallableDescriptor,
|
||||
isSafe: Boolean,
|
||||
operator: IrOperator? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : IrPropertyAccessorCallExpressionBase(startOffset, endOffset, type, descriptor, isSafe, operator, superQualifier), IrCallExpression {
|
||||
constructor(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
descriptor: CallableDescriptor,
|
||||
isSafe: Boolean,
|
||||
dispatchReceiver: IrExpression?,
|
||||
extensionReceiver: IrExpression?,
|
||||
operator: IrOperator? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : this(startOffset, endOffset, type, descriptor, isSafe, operator, superQualifier) {
|
||||
this.dispatchReceiver = dispatchReceiver
|
||||
this.extensionReceiver = extensionReceiver
|
||||
}
|
||||
|
||||
override fun getArgument(index: Int): IrExpression? = null
|
||||
|
||||
override fun putArgument(index: Int, valueArgument: IrExpression?) {
|
||||
throw UnsupportedOperationException("Property setter call has no arguments")
|
||||
}
|
||||
|
||||
override fun removeArgument(index: Int) {
|
||||
throw UnsupportedOperationException("Property getter call has no arguments")
|
||||
}
|
||||
}
|
||||
|
||||
class IrSetterCallExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
descriptor: CallableDescriptor,
|
||||
isSafe: Boolean,
|
||||
operator: IrOperator? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : IrPropertyAccessorCallExpressionBase(startOffset, endOffset, type, descriptor, isSafe, operator, superQualifier), IrCallExpression {
|
||||
constructor(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
descriptor: CallableDescriptor,
|
||||
isSafe: Boolean,
|
||||
dispatchReceiver: IrExpression?,
|
||||
extensionReceiver: IrExpression?,
|
||||
argument: IrExpression,
|
||||
operator: IrOperator? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : this(startOffset, endOffset, type, descriptor, isSafe, operator, superQualifier) {
|
||||
this.dispatchReceiver = dispatchReceiver
|
||||
this.extensionReceiver = extensionReceiver
|
||||
putArgument(SETTER_ARGUMENT_INDEX, argument)
|
||||
}
|
||||
|
||||
private var argumentImpl: IrExpression? = null
|
||||
|
||||
override fun getArgument(index: Int): IrExpression? =
|
||||
if (index == SETTER_ARGUMENT_INDEX) argumentImpl!! else null
|
||||
|
||||
override fun putArgument(index: Int, valueArgument: IrExpression?) {
|
||||
if (index != SETTER_ARGUMENT_INDEX) return
|
||||
argumentImpl?.detach()
|
||||
valueArgument?.assertDetached()
|
||||
argumentImpl = valueArgument
|
||||
valueArgument?.setTreeLocation(this, SETTER_ARGUMENT_INDEX)
|
||||
}
|
||||
|
||||
override fun removeArgument(index: Int) {
|
||||
if (index != SETTER_ARGUMENT_INDEX) return
|
||||
argumentImpl?.detach()
|
||||
argumentImpl = null
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -16,20 +16,20 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
|
||||
interface IrGetExtensionReceiverExpression : IrDeclarationReference {
|
||||
override val descriptor: CallableDescriptor
|
||||
override val descriptor: ReceiverParameterDescriptor
|
||||
}
|
||||
|
||||
class IrGetExtensionReceiverExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
descriptor: CallableDescriptor
|
||||
) : IrTerminalDeclarationReferenceBase<CallableDescriptor>(startOffset, endOffset, type, descriptor), IrGetExtensionReceiverExpression {
|
||||
descriptor: ReceiverParameterDescriptor
|
||||
) : IrTerminalDeclarationReferenceBase<ReceiverParameterDescriptor>(startOffset, endOffset, type, descriptor), IrGetExtensionReceiverExpression {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||
visitor.visitGetExtensionReceiver(this, data)
|
||||
}
|
||||
|
||||
@@ -17,51 +17,58 @@
|
||||
package org.jetbrains.kotlin.ir.expressions
|
||||
|
||||
interface IrOperator {
|
||||
object UMINUS : IrOperatorImpl("UMINUS"), IrUnaryOperator
|
||||
object EXCL : IrOperatorImpl("EXCL"), IrUnaryOperator
|
||||
object EXCLEXCL : IrOperatorImpl("EXCLEXCL"), IrUnaryOperator
|
||||
abstract class IrOperatorImpl(val debugName: String): IrOperator {
|
||||
override fun toString(): String = debugName
|
||||
}
|
||||
|
||||
object UMINUS : IrOperatorImpl("UMINUS")
|
||||
object EXCL : IrOperatorImpl("EXCL")
|
||||
object EXCLEXCL : IrOperatorImpl("EXCLEXCL")
|
||||
|
||||
object IMPLICIT_NOTNULL : IrOperatorImpl("IMPLICIT_NOTNULL"), IrUnaryOperator
|
||||
object IMPLICIT_NOTNULL : IrOperatorImpl("IMPLICIT_NOTNULL")
|
||||
|
||||
object ELVIS : IrOperatorImpl("ELVIS"), IrBinaryOperator
|
||||
object ELVIS : IrOperatorImpl("ELVIS")
|
||||
|
||||
object LT : IrOperatorImpl("LT"), IrBinaryOperator
|
||||
object GT : IrOperatorImpl("GT"), IrBinaryOperator
|
||||
object LTEQ : IrOperatorImpl("LTEQ"), IrBinaryOperator
|
||||
object GTEQ : IrOperatorImpl("GTEQ"), IrBinaryOperator
|
||||
object LT : IrOperatorImpl("LT")
|
||||
object GT : IrOperatorImpl("GT")
|
||||
object LTEQ : IrOperatorImpl("LTEQ")
|
||||
object GTEQ : IrOperatorImpl("GTEQ")
|
||||
|
||||
object EQEQ : IrOperatorImpl("EQEQ"), IrBinaryOperator
|
||||
object EQEQEQ : IrOperatorImpl("EQEQEQ"), IrBinaryOperator
|
||||
object EXCLEQ : IrOperatorImpl("EXCLEQ"), IrBinaryOperator
|
||||
object EXCLEQEQ : IrOperatorImpl("EXCLEQEQ"), IrBinaryOperator
|
||||
object EQEQ : IrOperatorImpl("EQEQ")
|
||||
object EQEQEQ : IrOperatorImpl("EQEQEQ")
|
||||
object EXCLEQ : IrOperatorImpl("EXCLEQ")
|
||||
object EXCLEQEQ : IrOperatorImpl("EXCLEQEQ")
|
||||
|
||||
object IN : IrOperatorImpl("IN"), IrBinaryOperator
|
||||
object NOT_IN : IrOperatorImpl("NOT_IN"), IrBinaryOperator
|
||||
object ANDAND : IrOperatorImpl("ANDAND"), IrBinaryOperator
|
||||
object OROR : IrOperatorImpl("OROR"), IrBinaryOperator
|
||||
object IN : IrOperatorImpl("IN")
|
||||
object NOT_IN : IrOperatorImpl("NOT_IN")
|
||||
object ANDAND : IrOperatorImpl("ANDAND")
|
||||
object OROR : IrOperatorImpl("OROR")
|
||||
|
||||
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 PLUS : IrOperatorImpl("PLUS")
|
||||
object MINUS : IrOperatorImpl("MINUS")
|
||||
object MUL : IrOperatorImpl("MUL")
|
||||
object DIV : IrOperatorImpl("DIV")
|
||||
object PERC : IrOperatorImpl("PERC")
|
||||
object RANGE : IrOperatorImpl("RANGE")
|
||||
|
||||
object INVOKE : IrOperatorImpl("INVOKE"), IrUnaryOperator
|
||||
object INVOKE : IrOperatorImpl("INVOKE")
|
||||
|
||||
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 PREFIX_INCR : IrOperatorImpl("PREFIX_INCR")
|
||||
object PREFIX_DECR : IrOperatorImpl("PREFIX_DECR")
|
||||
object POSTFIX_INCR : IrOperatorImpl("POSTFIX_INCR")
|
||||
object POSTFIX_DECR : IrOperatorImpl("POSTFIX_DECR")
|
||||
|
||||
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 EQ : IrOperatorImpl("EQ")
|
||||
object PLUSEQ : IrOperatorImpl("PLUSEQ")
|
||||
object MINUSEQ : IrOperatorImpl("MINUSEQ")
|
||||
object MULTEQ : IrOperatorImpl("MULTEQ")
|
||||
object DIVEQ : IrOperatorImpl("DIVEQ")
|
||||
object PERCEQ : IrOperatorImpl("PERCEQ")
|
||||
|
||||
object SYNTHETIC_BLOCK : IrOperatorImpl("SYNTHETIC_BLOCK")
|
||||
|
||||
object GET_PROPERTY : IrOperatorImpl("GET_PROPERTY")
|
||||
object SET_PROPERTY : IrOperatorImpl("SET_PROPERTY")
|
||||
|
||||
data class COMPONENT_N private constructor(val index: Int) : IrOperatorImpl("COMPONENT_$index") {
|
||||
companion object {
|
||||
@@ -75,10 +82,3 @@ interface IrOperator {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
interface IrUnaryOperator : IrOperator
|
||||
interface IrBinaryOperator : IrOperator
|
||||
|
||||
abstract class IrOperatorImpl(val debugName: String): IrOperator {
|
||||
override fun toString(): String = debugName
|
||||
}
|
||||
@@ -27,12 +27,12 @@ interface IrOperatorExpression : IrExpression {
|
||||
}
|
||||
|
||||
interface IrUnaryOperatorExpression : IrOperatorExpression {
|
||||
override val operator: IrUnaryOperator
|
||||
override val operator: IrOperator
|
||||
var argument: IrExpression
|
||||
}
|
||||
|
||||
interface IrBinaryOperatorExpression : IrOperatorExpression {
|
||||
override val operator: IrBinaryOperator
|
||||
override val operator: IrOperator
|
||||
var argument0: IrExpression
|
||||
var argument1: IrExpression
|
||||
}
|
||||
@@ -41,14 +41,14 @@ class IrUnaryOperatorExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
override val operator: IrUnaryOperator,
|
||||
override val operator: IrOperator,
|
||||
override val relatedDescriptor: CallableDescriptor?
|
||||
) : IrExpressionBase(startOffset, endOffset, type), IrUnaryOperatorExpression {
|
||||
constructor(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
operator: IrUnaryOperator,
|
||||
operator: IrOperator,
|
||||
relatedDescriptor: CallableDescriptor?,
|
||||
argument: IrExpression
|
||||
) : this(startOffset, endOffset, type, operator, relatedDescriptor) {
|
||||
@@ -91,14 +91,14 @@ class IrBinaryOperatorExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
override val operator: IrBinaryOperator,
|
||||
override val operator: IrOperator,
|
||||
override val relatedDescriptor: CallableDescriptor?
|
||||
) : IrExpressionBase(startOffset, endOffset, type), IrBinaryOperatorExpression {
|
||||
constructor(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
operator: IrBinaryOperator,
|
||||
operator: IrOperator,
|
||||
relatedDescriptor: CallableDescriptor?,
|
||||
argument0: IrExpression,
|
||||
argument1: IrExpression
|
||||
|
||||
-96
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2016 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.ir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.ir.*
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
|
||||
interface IrPropertyAccessExpression : IrMemberAccessExpression {
|
||||
override val descriptor: PropertyDescriptor
|
||||
val operator: IrOperator?
|
||||
}
|
||||
|
||||
interface IrGetPropertyExpression : IrPropertyAccessExpression
|
||||
|
||||
interface IrSetPropertyExpression : IrPropertyAccessExpression {
|
||||
var value: IrExpression
|
||||
}
|
||||
|
||||
class IrGetPropertyExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType?,
|
||||
isSafe: Boolean,
|
||||
override val descriptor: PropertyDescriptor,
|
||||
override val operator: IrOperator? = null
|
||||
) : IrMemberAccessExpressionBase(startOffset, endOffset, type, isSafe), IrGetPropertyExpression {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||
visitor.visitGetProperty(this, data)
|
||||
}
|
||||
|
||||
class IrSetPropertyExpressionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
isSafe: Boolean,
|
||||
override val descriptor: PropertyDescriptor,
|
||||
override val operator: IrOperator? = null
|
||||
) : IrMemberAccessExpressionBase(startOffset, endOffset, null, isSafe), IrSetPropertyExpression {
|
||||
constructor(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
isSafe: Boolean,
|
||||
descriptor: PropertyDescriptor,
|
||||
value: IrExpression,
|
||||
operator: IrOperator? = null
|
||||
) : this(startOffset, endOffset, isSafe, descriptor, operator) {
|
||||
this.value = value
|
||||
}
|
||||
|
||||
private var valueImpl: IrExpression? = null
|
||||
override var value: IrExpression
|
||||
get() = valueImpl!!
|
||||
set(value) {
|
||||
value.assertDetached()
|
||||
valueImpl?.detach()
|
||||
valueImpl = value
|
||||
value.setTreeLocation(this, ARGUMENT0_SLOT)
|
||||
}
|
||||
|
||||
override fun getChild(slot: Int): IrElement? =
|
||||
when (slot) {
|
||||
ARGUMENT0_SLOT -> value
|
||||
else -> super.getChild(slot)
|
||||
}
|
||||
|
||||
override fun replaceChild(slot: Int, newChild: IrElement) {
|
||||
when (slot) {
|
||||
ARGUMENT0_SLOT -> value = newChild.assertCast()
|
||||
else -> super.replaceChild(slot, newChild)
|
||||
}
|
||||
}
|
||||
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||
return visitor.visitSetProperty(this, data)
|
||||
}
|
||||
|
||||
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||
super.acceptChildren(visitor, data)
|
||||
value.accept(visitor, data)
|
||||
}
|
||||
}
|
||||
@@ -20,8 +20,6 @@ import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.SourceLocationManager
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCallExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrGetPropertyExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrSetPropertyExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrWhenExpression
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.utils.Printer
|
||||
@@ -56,21 +54,6 @@ class DumpIrTreeVisitor(out: Appendable): IrElementVisitor<Unit, String> {
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitGetProperty(expression: IrGetPropertyExpression, data: String) {
|
||||
expression.dumpLabeledElementWith(data) {
|
||||
expression.dispatchReceiver?.accept(this, "\$this")
|
||||
expression.extensionReceiver?.accept(this, "\$receiver")
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitSetProperty(expression: IrSetPropertyExpression, data: String) {
|
||||
expression.dumpLabeledElementWith(data) {
|
||||
expression.dispatchReceiver?.accept(this, "\$this")
|
||||
expression.extensionReceiver?.accept(this, "\$receiver")
|
||||
expression.value.accept(this, "\$value")
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitWhenExpression(expression: IrWhenExpression, data: String) {
|
||||
expression.dumpLabeledElementWith(data) {
|
||||
expression.subject?.let { subject ->
|
||||
|
||||
@@ -79,14 +79,6 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
|
||||
"CALL ${if (expression.isSafe) "?." else "."}${expression.descriptor.name} " +
|
||||
"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()} 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()} operator=${expression.operator}"
|
||||
|
||||
|
||||
@@ -47,16 +47,13 @@ interface IrElementVisitor<out R, in D> {
|
||||
fun visitThisExpression(expression: IrThisExpression, data: D) = visitExpression(expression, data)
|
||||
|
||||
fun visitDeclarationReference(expression: IrDeclarationReference, data: D) = visitExpression(expression, data)
|
||||
fun visitGetObjectValue(expression: IrGetObjectValueExpression, data: D) = visitDeclarationReference(expression, data)
|
||||
fun visitGetEnumValue(expression: IrGetEnumValueExpression, data: D) = visitDeclarationReference(expression, data)
|
||||
fun visitSingletonReference(expression: IrGetSingletonValueExpression, data: D) = visitDeclarationReference(expression, data)
|
||||
fun visitGetObjectValue(expression: IrGetObjectValueExpression, data: D) = visitSingletonReference(expression, data)
|
||||
fun visitGetEnumValue(expression: IrGetEnumValueExpression, data: D) = visitSingletonReference(expression, data)
|
||||
fun visitGetVariable(expression: IrGetVariableExpression, data: D) = visitDeclarationReference(expression, data)
|
||||
fun visitSetVariable(expression: IrSetVariableExpression, data: D) = visitDeclarationReference(expression, data)
|
||||
fun visitGetExtensionReceiver(expression: IrGetExtensionReceiverExpression, data: D) = visitDeclarationReference(expression, data)
|
||||
fun visitMemberAccess(expression: IrMemberAccessExpression, data: D) = visitDeclarationReference(expression, data)
|
||||
fun visitCallExpression(expression: IrCallExpression, data: D) = visitMemberAccess(expression, data)
|
||||
fun visitPropertyAccess(expression: IrPropertyAccessExpression, data: D) = visitMemberAccess(expression, data)
|
||||
fun visitGetProperty(expression: IrGetPropertyExpression, data: D) = visitPropertyAccess(expression, data)
|
||||
fun visitSetProperty(expression: IrSetPropertyExpression, data: D) = visitPropertyAccess(expression, data)
|
||||
fun visitCallExpression(expression: IrCallExpression, data: D) = visitDeclarationReference(expression, data)
|
||||
|
||||
fun visitOperatorExpression(expression: IrOperatorExpression, data: D) = visitExpression(expression, data)
|
||||
fun visitUnaryOperator(expression: IrUnaryOperatorExpression, data: D) = visitOperatorExpression(expression, data)
|
||||
|
||||
Reference in New Issue
Block a user