[IR] Simplify access to IrProperty from IrCall and IrField in interpreter
This commit is contained in:
@@ -378,11 +378,11 @@ class IrInterpreter(internal val environment: IrInterpreterEnvironment, internal
|
||||
else -> callInterceptor.interceptJavaStaticField(expression)
|
||||
}
|
||||
}
|
||||
field.origin == IrDeclarationOrigin.PROPERTY_BACKING_FIELD && field.correspondingPropertySymbol?.owner?.isConst == true -> {
|
||||
field.origin == IrDeclarationOrigin.PROPERTY_BACKING_FIELD && field.property?.isConst == true -> {
|
||||
callStack.pushCompoundInstruction(field.initializer?.expression)
|
||||
}
|
||||
expression.accessesTopLevelOrObjectField() -> {
|
||||
val propertyOwner = field.correspondingPropertySymbol?.owner
|
||||
val propertyOwner = field.property
|
||||
val isConst = propertyOwner?.isConst == true ||
|
||||
propertyOwner?.backingField?.initializer?.expression is IrConst<*> ||
|
||||
propertyOwner?.parentClassOrNull?.hasAnnotation(compileTimeAnnotation) == true // check if object is marked as compile time
|
||||
|
||||
@@ -17,7 +17,10 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
|
||||
import org.jetbrains.kotlin.ir.interpreter.exceptions.handleUserException
|
||||
import org.jetbrains.kotlin.ir.interpreter.proxy.wrap
|
||||
import org.jetbrains.kotlin.ir.interpreter.stack.CallStack
|
||||
import org.jetbrains.kotlin.ir.interpreter.state.*
|
||||
import org.jetbrains.kotlin.ir.interpreter.state.Common
|
||||
import org.jetbrains.kotlin.ir.interpreter.state.Primitive
|
||||
import org.jetbrains.kotlin.ir.interpreter.state.State
|
||||
import org.jetbrains.kotlin.ir.interpreter.state.isSubtypeOf
|
||||
import org.jetbrains.kotlin.ir.interpreter.state.reflection.KTypeState
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.ir.types.*
|
||||
@@ -318,7 +321,7 @@ internal fun IrExpression?.isAccessToNotNullableObject(): Boolean {
|
||||
}
|
||||
|
||||
internal fun IrFunction.isAccessorOfPropertyWithBackingField(): Boolean {
|
||||
return this is IrSimpleFunction && this.correspondingPropertySymbol?.owner?.backingField?.initializer != null
|
||||
return property?.backingField?.initializer != null
|
||||
}
|
||||
|
||||
internal fun State.unsignedToString(): String {
|
||||
@@ -359,3 +362,8 @@ internal fun IrEnumEntry.toState(irBuiltIns: IrBuiltIns): Common {
|
||||
internal val IrFunction.property: IrProperty?
|
||||
get() = (this as? IrSimpleFunction)?.correspondingPropertySymbol?.owner
|
||||
|
||||
internal val IrField.property: IrProperty?
|
||||
get() = this.correspondingPropertySymbol?.owner
|
||||
|
||||
internal val IrCall.correspondingProperty: IrProperty?
|
||||
get() = this.symbol.owner.correspondingPropertySymbol?.owner
|
||||
|
||||
+5
-3
@@ -9,7 +9,9 @@ import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.interpreter.*
|
||||
import org.jetbrains.kotlin.ir.interpreter.accessesTopLevelOrObjectField
|
||||
import org.jetbrains.kotlin.ir.interpreter.correspondingProperty
|
||||
import org.jetbrains.kotlin.ir.interpreter.fqName
|
||||
import org.jetbrains.kotlin.ir.interpreter.isAccessToNotNullableObject
|
||||
import org.jetbrains.kotlin.ir.interpreter.preprocessor.IrInterpreterKCallableNamePreprocessor.Companion.isEnumName
|
||||
@@ -57,7 +59,7 @@ class IrInterpreterCommonChecker : IrInterpreterChecker {
|
||||
}
|
||||
|
||||
private fun IrCall.isGetterToConstVal(): Boolean {
|
||||
return symbol.owner.correspondingPropertySymbol?.owner?.isConst == true
|
||||
return correspondingProperty?.isConst == true
|
||||
}
|
||||
|
||||
override fun visitCall(expression: IrCall, data: IrInterpreterCheckerData): Boolean {
|
||||
@@ -171,7 +173,7 @@ class IrInterpreterCommonChecker : IrInterpreterChecker {
|
||||
|
||||
override fun visitGetField(expression: IrGetField, data: IrInterpreterCheckerData): Boolean {
|
||||
val owner = expression.symbol.owner
|
||||
val property = owner.correspondingPropertySymbol?.owner
|
||||
val property = owner.property
|
||||
val fqName = owner.fqName
|
||||
fun isJavaStaticWithPrimitiveOrString(): Boolean {
|
||||
return owner.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && owner.isStatic && owner.isFinal &&
|
||||
@@ -206,7 +208,7 @@ class IrInterpreterCommonChecker : IrInterpreterChecker {
|
||||
override fun visitSetField(expression: IrSetField, data: IrInterpreterCheckerData): Boolean {
|
||||
if (expression.accessesTopLevelOrObjectField()) return false
|
||||
//todo check receiver?
|
||||
val property = expression.symbol.owner.correspondingPropertySymbol?.owner
|
||||
val property = expression.symbol.owner.property
|
||||
val declarations = expression.symbol.owner.parent.getInnerDeclarations()
|
||||
val setter = declarations.filterIsInstance<IrProperty>().single { it == property }.setter ?: return false
|
||||
return visitedStack.contains(setter) && expression.value.accept(this, data)
|
||||
|
||||
+4
-2
@@ -14,6 +14,8 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetObjectValueImpl
|
||||
import org.jetbrains.kotlin.ir.interpreter.correspondingProperty
|
||||
import org.jetbrains.kotlin.ir.interpreter.property
|
||||
import org.jetbrains.kotlin.ir.types.classOrFail
|
||||
|
||||
class IrInterpreterConstGetterPreprocessor : IrInterpreterPreprocessor {
|
||||
@@ -24,7 +26,7 @@ class IrInterpreterConstGetterPreprocessor : IrInterpreterPreprocessor {
|
||||
}
|
||||
|
||||
override fun visitCall(expression: IrCall, data: IrInterpreterPreprocessorData): IrElement {
|
||||
val field = expression.symbol.owner.correspondingPropertySymbol?.owner?.backingField ?: return super.visitCall(expression, data)
|
||||
val field = expression.correspondingProperty?.backingField ?: return super.visitCall(expression, data)
|
||||
return expression.lowerConstRead(field, data) ?: super.visitCall(expression, data)
|
||||
}
|
||||
|
||||
@@ -62,6 +64,6 @@ class IrInterpreterConstGetterPreprocessor : IrInterpreterPreprocessor {
|
||||
|
||||
fun IrField.hasConstantValue(): Boolean {
|
||||
val implicitConst = isFinal && isStatic && origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && initializer != null
|
||||
return implicitConst || correspondingPropertySymbol?.owner?.isConst == true
|
||||
return implicitConst || property?.isConst == true
|
||||
}
|
||||
}
|
||||
@@ -139,7 +139,7 @@ internal class Wrapper(val value: Any, override val irClass: IrClass, environmen
|
||||
val methodType = irFunction.getMethodType()
|
||||
val methodName = when (irFunction) {
|
||||
is IrSimpleFunction -> {
|
||||
val property = irFunction.correspondingPropertySymbol?.owner
|
||||
val property = irFunction.property
|
||||
when {
|
||||
property?.getter == irFunction -> "get${property.name.asString().capitalizeAsciiOnly()}"
|
||||
property?.setter == irFunction -> "set${property.name.asString().capitalizeAsciiOnly()}"
|
||||
|
||||
+2
-1
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.interpreter.state.reflection
|
||||
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.interpreter.CallInterceptor
|
||||
import org.jetbrains.kotlin.ir.interpreter.property
|
||||
import org.jetbrains.kotlin.ir.interpreter.proxy.reflection.KTypeProxy
|
||||
import kotlin.reflect.KParameter
|
||||
import kotlin.reflect.KType
|
||||
@@ -48,7 +49,7 @@ internal class KParameterState(
|
||||
|
||||
append(" of ")
|
||||
when (val parent = irParameter.parent) {
|
||||
is IrSimpleFunction -> parent.correspondingPropertySymbol?.owner?.let { append(renderProperty(it)) }
|
||||
is IrSimpleFunction -> parent.property?.let { append(renderProperty(it)) }
|
||||
?: append(renderFunction(parent))
|
||||
is IrFunction -> append(renderFunction(parent))
|
||||
is IrProperty -> append(renderProperty(parent))
|
||||
|
||||
+4
-3
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.interpreter.IrInterpreter
|
||||
import org.jetbrains.kotlin.ir.interpreter.checker.EvaluationMode
|
||||
import org.jetbrains.kotlin.ir.interpreter.checker.IrInterpreterChecker
|
||||
import org.jetbrains.kotlin.ir.interpreter.property
|
||||
|
||||
/**
|
||||
* This transformer will visit all expressions and will evaluate only those that are necessary. By "necessary" we mean expressions
|
||||
@@ -34,7 +35,7 @@ internal class IrConstOnlyNecessaryTransformer(
|
||||
interpreter, irFile, mode, checker, evaluatedConstTracker, inlineConstTracker, onWarning, onError, suppressExceptions
|
||||
) {
|
||||
override fun visitCall(expression: IrCall, data: Data): IrElement {
|
||||
val isConstGetter = expression.symbol.owner.correspondingPropertySymbol?.owner?.isConst == true
|
||||
val isConstGetter = expression.symbol.owner.property?.isConst == true
|
||||
if (!data.inAnnotation && !isConstGetter) {
|
||||
expression.transformChildren(this, data)
|
||||
return expression
|
||||
@@ -43,7 +44,7 @@ internal class IrConstOnlyNecessaryTransformer(
|
||||
}
|
||||
|
||||
override fun visitGetField(expression: IrGetField, data: Data): IrExpression {
|
||||
val isConst = expression.symbol.owner.correspondingPropertySymbol?.owner?.isConst == true
|
||||
val isConst = expression.symbol.owner.property?.isConst == true
|
||||
if (!data.inAnnotation && !isConst) return expression
|
||||
return super.visitGetField(expression, data)
|
||||
}
|
||||
@@ -57,7 +58,7 @@ internal class IrConstOnlyNecessaryTransformer(
|
||||
}
|
||||
|
||||
override fun visitField(declaration: IrField, data: Data): IrStatement {
|
||||
val isConst = declaration.correspondingPropertySymbol?.owner?.isConst == true
|
||||
val isConst = declaration.property?.isConst == true
|
||||
if (!isConst) {
|
||||
declaration.transformChildren(this, data)
|
||||
return declaration
|
||||
|
||||
Reference in New Issue
Block a user