Extract property references with only backing field

This commit is contained in:
Tamas Vajk
2022-03-11 12:57:42 +01:00
committed by Ian Lynagh
parent 90ca47a46b
commit a6f036d94e
7 changed files with 964 additions and 819 deletions

View File

@@ -16,10 +16,7 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.FqName
@@ -2551,10 +2548,10 @@ open class KotlinFileExtractor(
extractTypeAccessRecursive(e.classType, locId, id, 0, callable, exprParent.enclosingStmt)
}
is IrPropertyReference -> {
extractPropertyReference("property reference", e, e.getter, e.setter, parent, callable)
extractPropertyReference("property reference", e, e.getter, e.setter, e.field, parent, callable)
}
is IrLocalDelegatedPropertyReference -> {
extractPropertyReference("local delegated property reference", e, e.getter, e.setter, parent, callable)
extractPropertyReference("local delegated property reference", e, e.getter, e.setter, null, parent, callable)
}
else -> {
logger.errorElement("Unrecognised IrExpression: " + e.javaClass, e)
@@ -2644,6 +2641,50 @@ open class KotlinFileExtractor(
}
}
private fun writeVariableAccessInFunctionBody(pType: TypeResults, idx: Int, variable: Label<out DbVariable>,
parent: Label<out DbExprparent>, callable: Label<out DbCallable>, stmt: Label<out DbStmt>
): Label<DbVaraccess> {
val pId = tw.getFreshIdLabel<DbVaraccess>()
tw.writeExprs_varaccess(pId, pType.javaResult.id, parent, idx)
tw.writeExprsKotlinType(pId, pType.kotlinResult.id)
tw.writeVariableBinding(pId, variable)
writeExpressionMetadataToTrapFile(pId, callable, stmt)
return pId
}
private fun writeFieldAccessInFunctionBody(pType: IrType, idx: Int, variable: Label<out DbField>,
parent: Label<out DbExprparent>, callable: Label<out DbCallable>, stmt: Label<out DbStmt>) {
val accessId = writeVariableAccessInFunctionBody(useType(pType), idx, variable, parent, callable, stmt)
val thisId = tw.getFreshIdLabel<DbThisaccess>()
tw.writeExprs_thisaccess(thisId, ids.type.javaResult.id, accessId, -1)
tw.writeExprsKotlinType(thisId, ids.type.kotlinResult.id)
writeExpressionMetadataToTrapFile(thisId, callable, stmt)
}
fun extractFieldAccessToReflectionTarget(
labels: FunctionLabels, // labels of the containing function
target: IrFieldSymbol, // the target field being accessed
) {
val retId = tw.getFreshIdLabel<DbReturnstmt>()
tw.writeStmts_returnstmt(retId, labels.blockId, 0, labels.methodId)
tw.writeHasLocation(retId, locId)
val fieldType = useType(target.owner.type)
var accessId = tw.getFreshIdLabel<DbVaraccess>()
tw.writeExprs_varaccess(accessId, fieldType.javaResult.id, retId, 0)
tw.writeExprsKotlinType(accessId, fieldType.kotlinResult.id)
writeExpressionMetadataToTrapFile(accessId, labels.methodId, retId)
val fieldId = useField(target.owner)
tw.writeVariableBinding(accessId, fieldId)
if (dispatchReceiver != null) {
writeFieldAccessInFunctionBody(receiverType!!, -1, dispatchFieldId!!, accessId, labels.methodId, retId)
}
}
/**
* Extracts a call to `target` inside the function identified by `labels`. Special parameters (`dispatch` and `extension`) are also handled.
*
@@ -2700,30 +2741,9 @@ open class KotlinFileExtractor(
@Suppress("UNCHECKED_CAST")
tw.writeCallableBinding(callId as Label<out DbCaller>, callableId)
fun writeVariableAccessInFunctionBody(
pType: TypeResults,
idx: Int,
variable: Label<out DbVariable>
): Label<DbVaraccess> {
val pId = tw.getFreshIdLabel<DbVaraccess>()
tw.writeExprs_varaccess(pId, pType.javaResult.id, callId, idx)
tw.writeExprsKotlinType(pId, pType.kotlinResult.id)
tw.writeVariableBinding(pId, variable)
writeExpressionMetadataToTrapFile(pId, labels.methodId, retId)
return pId
}
fun writeFieldAccessInFunctionBody(pType: IrType, idx: Int, variable: Label<out DbField>) {
val accessId = writeVariableAccessInFunctionBody(useType(pType), idx, variable)
val thisId = tw.getFreshIdLabel<DbThisaccess>()
tw.writeExprs_thisaccess(thisId, ids.type.javaResult.id, accessId, -1)
tw.writeExprsKotlinType(thisId, ids.type.kotlinResult.id)
writeExpressionMetadataToTrapFile(thisId, labels.methodId, retId)
}
val useFirstArgAsDispatch: Boolean
if (dispatchReceiver != null) {
writeFieldAccessInFunctionBody(receiverType!!, dispatchReceiverIdx, dispatchFieldId!!)
writeFieldAccessInFunctionBody(receiverType!!, dispatchReceiverIdx, dispatchFieldId!!, callId, labels.methodId, retId)
useFirstArgAsDispatch = false
} else {
@@ -2732,7 +2752,7 @@ open class KotlinFileExtractor(
val extensionIdxOffset: Int
if (extensionReceiver != null) {
writeFieldAccessInFunctionBody(receiverType!!, 0, extensionFieldId!!)
writeFieldAccessInFunctionBody(receiverType!!, 0, extensionFieldId!!, callId, labels.methodId, retId)
extensionIdxOffset = 1
} else {
extensionIdxOffset = 0
@@ -2752,7 +2772,7 @@ open class KotlinFileExtractor(
} else {
pIdx + extensionIdxOffset - dispatchIdxOffset
}
writeVariableAccessInFunctionBody(p.second, childIdx, p.first)
writeVariableAccessInFunctionBody(p.second, childIdx, p.first, callId, labels.methodId, retId)
}
}
}
@@ -2777,6 +2797,7 @@ open class KotlinFileExtractor(
propertyReferenceExpr: IrCallableReference<out IrSymbol>,
getter: IrSimpleFunctionSymbol?,
setter: IrSimpleFunctionSymbol?,
backingField: IrFieldSymbol?,
parent: StmtExprParent,
callable: Label<out DbCallable>
) {
@@ -2803,11 +2824,6 @@ open class KotlinFileExtractor(
* - no receiver vs dispatchReceiver vs extensionReceiver
**/
if (getter == null && setter == null) {
logger.errorElement("Expected to find getter or setter for property reference.", propertyReferenceExpr)
return
}
val kPropertyType = propertyReferenceExpr.type
if (kPropertyType !is IrSimpleType) {
logger.errorElement("Unexpected: property reference with non simple type. ${kPropertyType.classFqName?.asString()}", propertyReferenceExpr)
@@ -2858,6 +2874,22 @@ open class KotlinFileExtractor(
)
tw.writePropertyRefGetBinding(idPropertyRef, getterCallableId)
} else {
// Property without a getter.
if (backingField == null) {
logger.errorElement("Expected to find getter or backing field for property reference.", propertyReferenceExpr)
return
}
val getterParameterTypes = parameterTypes.dropLast(1)
val getLabels = addFunctionManual(tw.getFreshIdLabel(), "get", getterParameterTypes, parameterTypes.last(), classId, locId)
val fieldId = useField(backingField.owner)
helper.extractFieldAccessToReflectionTarget(
getLabels,
backingField)
tw.writePropertyRefFieldBinding(idPropertyRef, fieldId)
}
if (setter != null) {

View File

@@ -845,6 +845,11 @@ propertyRefGetBinding(
int getter: @callable ref
);
propertyRefFieldBinding(
unique int id: @expr ref,
int field: @field ref
);
propertyRefSetBinding(
unique int id: @expr ref,
int setter: @callable ref

View File

@@ -1474,6 +1474,11 @@ class PropertyRefExpr extends ClassInstanceExpr, @propertyref {
*/
Callable getGetterCallable() { propertyRefGetBinding(this, result) }
/**
* Gets the field referenced by this property reference expression, if any.
*/
Field getField() { propertyRefFieldBinding(this, result) }
/**
* Gets the property setter referenced by this property reference expression, if any.
*/

File diff suppressed because it is too large Load Diff

View File

@@ -1,90 +1,110 @@
variableInitializerType
| reflection.kt:5:9:5:54 | KFunction<Double> ref | file://<external>/KFunction.class:0:0:0:0 | KFunction<Double> | reflection.kt:5:49:5:54 | new Function2<Ccc,Integer,Double>(...) { ... } | file://<external>/Function2.class:0:0:0:0 | Function2<Ccc,Integer,Double> | true |
| reflection.kt:5:9:5:54 | KFunction<Double> ref | file://<external>/KFunction.class:0:0:0:0 | KFunction<Double> | reflection.kt:5:49:5:54 | new Function2<Ccc,Integer,Double>(...) { ... } | file://<external>/FunctionReference.class:0:0:0:0 | FunctionReference | true |
| reflection.kt:8:9:8:42 | KProperty1<C,Integer> x0 | file://<external>/KProperty1.class:0:0:0:0 | KProperty1<C,Integer> | reflection.kt:8:38:8:42 | new KProperty1<C,Integer>(...) { ... } | file://<external>/KProperty1.class:0:0:0:0 | KProperty1<C,Integer> | true |
| reflection.kt:8:9:8:42 | KProperty1<C,Integer> x0 | file://<external>/KProperty1.class:0:0:0:0 | KProperty1<C,Integer> | reflection.kt:8:38:8:42 | new KProperty1<C,Integer>(...) { ... } | file://<external>/PropertyReference.class:0:0:0:0 | PropertyReference | true |
| reflection.kt:11:9:11:53 | Getter<C,Integer> x3 | file://<external>/KProperty1$Getter.class:0:0:0:0 | Getter<C,Integer> | file://<external>/KProperty1$Getter.class:0:0:0:0 | Getter<C,Integer> | file://<external>/Function1.class:0:0:0:0 | Function1<C,Integer> | true |
| reflection.kt:11:9:11:53 | Getter<C,Integer> x3 | file://<external>/KProperty1$Getter.class:0:0:0:0 | Getter<C,Integer> | file://<external>/KProperty1$Getter.class:0:0:0:0 | Getter<C,Integer> | file://<external>/KProperty$Getter.class:0:0:0:0 | Getter<Integer> | true |
| reflection.kt:12:9:12:44 | KFunction<Integer> x4 | file://<external>/KFunction.class:0:0:0:0 | KFunction<Integer> | reflection.kt:12:38:12:44 | new Function1<C,Integer>(...) { ... } | file://<external>/Function1.class:0:0:0:0 | Function1<C,Integer> | true |
| reflection.kt:12:9:12:44 | KFunction<Integer> x4 | file://<external>/KFunction.class:0:0:0:0 | KFunction<Integer> | reflection.kt:12:38:12:44 | new Function1<C,Integer>(...) { ... } | file://<external>/FunctionReference.class:0:0:0:0 | FunctionReference | true |
| reflection.kt:13:9:13:41 | KProperty0<Integer> x5 | file://<external>/KProperty0.class:0:0:0:0 | KProperty0<Integer> | reflection.kt:13:35:13:41 | new KProperty0<Integer>(...) { ... } | file://<external>/KProperty0.class:0:0:0:0 | KProperty0<Integer> | true |
| reflection.kt:13:9:13:41 | KProperty0<Integer> x5 | file://<external>/KProperty0.class:0:0:0:0 | KProperty0<Integer> | reflection.kt:13:35:13:41 | new KProperty0<Integer>(...) { ... } | file://<external>/PropertyReference.class:0:0:0:0 | PropertyReference | true |
| reflection.kt:15:9:15:49 | KMutableProperty1<C,Integer> y0 | file://<external>/KMutableProperty1.class:0:0:0:0 | KMutableProperty1<C,Integer> | reflection.kt:15:45:15:49 | new KMutableProperty1<C,Integer>(...) { ... } | file://<external>/KMutableProperty1.class:0:0:0:0 | KMutableProperty1<C,Integer> | true |
| reflection.kt:15:9:15:49 | KMutableProperty1<C,Integer> y0 | file://<external>/KMutableProperty1.class:0:0:0:0 | KMutableProperty1<C,Integer> | reflection.kt:15:45:15:49 | new KMutableProperty1<C,Integer>(...) { ... } | file://<external>/PropertyReference.class:0:0:0:0 | PropertyReference | true |
| reflection.kt:18:9:18:60 | Setter<C,Integer> y3 | file://<external>/KMutableProperty1$Setter.class:0:0:0:0 | Setter<C,Integer> | file://<external>/KMutableProperty1$Setter.class:0:0:0:0 | Setter<C,Integer> | file://<external>/Function2.class:0:0:0:0 | Function2<C,Integer,Unit> | true |
| reflection.kt:18:9:18:60 | Setter<C,Integer> y3 | file://<external>/KMutableProperty1$Setter.class:0:0:0:0 | Setter<C,Integer> | file://<external>/KMutableProperty1$Setter.class:0:0:0:0 | Setter<C,Integer> | file://<external>/KMutableProperty$Setter.class:0:0:0:0 | Setter<Integer> | true |
| reflection.kt:19:9:19:50 | KFunction<Unit> y4 | file://<external>/KFunction.class:0:0:0:0 | KFunction<Unit> | reflection.kt:19:44:19:50 | new Function2<C,Integer,Unit>(...) { ... } | file://<external>/Function2.class:0:0:0:0 | Function2<C,Integer,Unit> | true |
| reflection.kt:19:9:19:50 | KFunction<Unit> y4 | file://<external>/KFunction.class:0:0:0:0 | KFunction<Unit> | reflection.kt:19:44:19:50 | new Function2<C,Integer,Unit>(...) { ... } | file://<external>/FunctionReference.class:0:0:0:0 | FunctionReference | true |
| reflection.kt:20:9:20:48 | KMutableProperty0<Integer> y5 | file://<external>/KMutableProperty0.class:0:0:0:0 | KMutableProperty0<Integer> | reflection.kt:20:42:20:48 | new KMutableProperty0<Integer>(...) { ... } | file://<external>/KMutableProperty0.class:0:0:0:0 | KMutableProperty0<Integer> | true |
| reflection.kt:20:9:20:48 | KMutableProperty0<Integer> y5 | file://<external>/KMutableProperty0.class:0:0:0:0 | KMutableProperty0<Integer> | reflection.kt:20:42:20:48 | new KMutableProperty0<Integer>(...) { ... } | file://<external>/PropertyReference.class:0:0:0:0 | PropertyReference | true |
| reflection.kt:22:9:22:91 | KProperty2<C,Integer,Integer> prop | file://<external>/KProperty2.class:0:0:0:0 | KProperty2<C,Integer,Integer> | file://<external>/KProperty2.class:0:0:0:0 | KProperty2<C,Integer,Integer> | file://<external>/Function2.class:0:0:0:0 | Function2<C,Integer,Integer> | true |
| reflection.kt:22:9:22:91 | KProperty2<C,Integer,Integer> prop | file://<external>/KProperty2.class:0:0:0:0 | KProperty2<C,Integer,Integer> | file://<external>/KProperty2.class:0:0:0:0 | KProperty2<C,Integer,Integer> | file://<external>/KProperty.class:0:0:0:0 | KProperty<Integer> | true |
| reflection.kt:7:9:7:54 | KFunction<Double> ref | file://<external>/KFunction.class:0:0:0:0 | KFunction<Double> | reflection.kt:7:49:7:54 | new Function2<Ccc,Integer,Double>(...) { ... } | file://<external>/Function2.class:0:0:0:0 | Function2<Ccc,Integer,Double> | true |
| reflection.kt:7:9:7:54 | KFunction<Double> ref | file://<external>/KFunction.class:0:0:0:0 | KFunction<Double> | reflection.kt:7:49:7:54 | new Function2<Ccc,Integer,Double>(...) { ... } | file://<external>/FunctionReference.class:0:0:0:0 | FunctionReference | true |
| reflection.kt:10:9:10:42 | KProperty1<C,Integer> x0 | file://<external>/KProperty1.class:0:0:0:0 | KProperty1<C,Integer> | reflection.kt:10:38:10:42 | new KProperty1<C,Integer>(...) { ... } | file://<external>/KProperty1.class:0:0:0:0 | KProperty1<C,Integer> | true |
| reflection.kt:10:9:10:42 | KProperty1<C,Integer> x0 | file://<external>/KProperty1.class:0:0:0:0 | KProperty1<C,Integer> | reflection.kt:10:38:10:42 | new KProperty1<C,Integer>(...) { ... } | file://<external>/PropertyReference.class:0:0:0:0 | PropertyReference | true |
| reflection.kt:13:9:13:53 | Getter<C,Integer> x3 | file://<external>/KProperty1$Getter.class:0:0:0:0 | Getter<C,Integer> | file://<external>/KProperty1$Getter.class:0:0:0:0 | Getter<C,Integer> | file://<external>/Function1.class:0:0:0:0 | Function1<C,Integer> | true |
| reflection.kt:13:9:13:53 | Getter<C,Integer> x3 | file://<external>/KProperty1$Getter.class:0:0:0:0 | Getter<C,Integer> | file://<external>/KProperty1$Getter.class:0:0:0:0 | Getter<C,Integer> | file://<external>/KProperty$Getter.class:0:0:0:0 | Getter<Integer> | true |
| reflection.kt:14:9:14:44 | KFunction<Integer> x4 | file://<external>/KFunction.class:0:0:0:0 | KFunction<Integer> | reflection.kt:14:38:14:44 | new Function1<C,Integer>(...) { ... } | file://<external>/Function1.class:0:0:0:0 | Function1<C,Integer> | true |
| reflection.kt:14:9:14:44 | KFunction<Integer> x4 | file://<external>/KFunction.class:0:0:0:0 | KFunction<Integer> | reflection.kt:14:38:14:44 | new Function1<C,Integer>(...) { ... } | file://<external>/FunctionReference.class:0:0:0:0 | FunctionReference | true |
| reflection.kt:15:9:15:41 | KProperty0<Integer> x5 | file://<external>/KProperty0.class:0:0:0:0 | KProperty0<Integer> | reflection.kt:15:35:15:41 | new KProperty0<Integer>(...) { ... } | file://<external>/KProperty0.class:0:0:0:0 | KProperty0<Integer> | true |
| reflection.kt:15:9:15:41 | KProperty0<Integer> x5 | file://<external>/KProperty0.class:0:0:0:0 | KProperty0<Integer> | reflection.kt:15:35:15:41 | new KProperty0<Integer>(...) { ... } | file://<external>/PropertyReference.class:0:0:0:0 | PropertyReference | true |
| reflection.kt:17:9:17:49 | KMutableProperty1<C,Integer> y0 | file://<external>/KMutableProperty1.class:0:0:0:0 | KMutableProperty1<C,Integer> | reflection.kt:17:45:17:49 | new KMutableProperty1<C,Integer>(...) { ... } | file://<external>/KMutableProperty1.class:0:0:0:0 | KMutableProperty1<C,Integer> | true |
| reflection.kt:17:9:17:49 | KMutableProperty1<C,Integer> y0 | file://<external>/KMutableProperty1.class:0:0:0:0 | KMutableProperty1<C,Integer> | reflection.kt:17:45:17:49 | new KMutableProperty1<C,Integer>(...) { ... } | file://<external>/PropertyReference.class:0:0:0:0 | PropertyReference | true |
| reflection.kt:20:9:20:60 | Setter<C,Integer> y3 | file://<external>/KMutableProperty1$Setter.class:0:0:0:0 | Setter<C,Integer> | file://<external>/KMutableProperty1$Setter.class:0:0:0:0 | Setter<C,Integer> | file://<external>/Function2.class:0:0:0:0 | Function2<C,Integer,Unit> | true |
| reflection.kt:20:9:20:60 | Setter<C,Integer> y3 | file://<external>/KMutableProperty1$Setter.class:0:0:0:0 | Setter<C,Integer> | file://<external>/KMutableProperty1$Setter.class:0:0:0:0 | Setter<C,Integer> | file://<external>/KMutableProperty$Setter.class:0:0:0:0 | Setter<Integer> | true |
| reflection.kt:21:9:21:50 | KFunction<Unit> y4 | file://<external>/KFunction.class:0:0:0:0 | KFunction<Unit> | reflection.kt:21:44:21:50 | new Function2<C,Integer,Unit>(...) { ... } | file://<external>/Function2.class:0:0:0:0 | Function2<C,Integer,Unit> | true |
| reflection.kt:21:9:21:50 | KFunction<Unit> y4 | file://<external>/KFunction.class:0:0:0:0 | KFunction<Unit> | reflection.kt:21:44:21:50 | new Function2<C,Integer,Unit>(...) { ... } | file://<external>/FunctionReference.class:0:0:0:0 | FunctionReference | true |
| reflection.kt:22:9:22:48 | KMutableProperty0<Integer> y5 | file://<external>/KMutableProperty0.class:0:0:0:0 | KMutableProperty0<Integer> | reflection.kt:22:42:22:48 | new KMutableProperty0<Integer>(...) { ... } | file://<external>/KMutableProperty0.class:0:0:0:0 | KMutableProperty0<Integer> | true |
| reflection.kt:22:9:22:48 | KMutableProperty0<Integer> y5 | file://<external>/KMutableProperty0.class:0:0:0:0 | KMutableProperty0<Integer> | reflection.kt:22:42:22:48 | new KMutableProperty0<Integer>(...) { ... } | file://<external>/PropertyReference.class:0:0:0:0 | PropertyReference | true |
| reflection.kt:24:9:24:91 | KProperty2<C,Integer,Integer> prop | file://<external>/KProperty2.class:0:0:0:0 | KProperty2<C,Integer,Integer> | file://<external>/KProperty2.class:0:0:0:0 | KProperty2<C,Integer,Integer> | file://<external>/Function2.class:0:0:0:0 | Function2<C,Integer,Integer> | true |
| reflection.kt:24:9:24:91 | KProperty2<C,Integer,Integer> prop | file://<external>/KProperty2.class:0:0:0:0 | KProperty2<C,Integer,Integer> | file://<external>/KProperty2.class:0:0:0:0 | KProperty2<C,Integer,Integer> | file://<external>/KProperty.class:0:0:0:0 | KProperty<Integer> | true |
invocation
| reflection.kt:6:21:6:24 | getName(...) | file://<external>/KCallable.class:0:0:0:0 | getName |
| reflection.kt:9:26:9:33 | get(...) | file://<external>/KProperty1.class:0:0:0:0 | get |
| reflection.kt:10:29:10:32 | getName(...) | file://<external>/KCallable.class:0:0:0:0 | getName |
| reflection.kt:11:48:11:53 | getGetter(...) | file://<external>/KProperty1.class:0:0:0:0 | getGetter |
| reflection.kt:12:38:12:44 | get(...) | file://<external>/KProperty1.class:0:0:0:0 | get |
| reflection.kt:16:27:16:37 | set(...) | file://<external>/KMutableProperty1.class:0:0:0:0 | set |
| reflection.kt:17:29:17:32 | getName(...) | file://<external>/KCallable.class:0:0:0:0 | getName |
| reflection.kt:18:55:18:60 | getSetter(...) | file://<external>/KMutableProperty1.class:0:0:0:0 | getSetter |
| reflection.kt:19:44:19:50 | set(...) | file://<external>/KMutableProperty1.class:0:0:0:0 | set |
| reflection.kt:22:31:22:37 | getMembers(...) | file://<external>/KClass.class:0:0:0:0 | getMembers |
| reflection.kt:22:51:22:54 | getName(...) | file://<external>/KCallable.class:0:0:0:0 | getName |
| reflection.kt:23:23:23:33 | get(...) | file://<external>/KProperty2.class:0:0:0:0 | get |
| reflection.kt:48:30:48:39 | get(...) | file://<external>/KProperty1.class:0:0:0:0 | get |
| reflection.kt:49:30:49:34 | get(...) | file://<external>/KProperty0.class:0:0:0:0 | get |
| reflection.kt:8:21:8:24 | getName(...) | file://<external>/KCallable.class:0:0:0:0 | getName |
| reflection.kt:11:26:11:33 | get(...) | file://<external>/KProperty1.class:0:0:0:0 | get |
| reflection.kt:12:29:12:32 | getName(...) | file://<external>/KCallable.class:0:0:0:0 | getName |
| reflection.kt:13:48:13:53 | getGetter(...) | file://<external>/KProperty1.class:0:0:0:0 | getGetter |
| reflection.kt:14:38:14:44 | get(...) | file://<external>/KProperty1.class:0:0:0:0 | get |
| reflection.kt:18:27:18:37 | set(...) | file://<external>/KMutableProperty1.class:0:0:0:0 | set |
| reflection.kt:19:29:19:32 | getName(...) | file://<external>/KCallable.class:0:0:0:0 | getName |
| reflection.kt:20:55:20:60 | getSetter(...) | file://<external>/KMutableProperty1.class:0:0:0:0 | getSetter |
| reflection.kt:21:44:21:50 | set(...) | file://<external>/KMutableProperty1.class:0:0:0:0 | set |
| reflection.kt:24:31:24:37 | getMembers(...) | file://<external>/KClass.class:0:0:0:0 | getMembers |
| reflection.kt:24:51:24:54 | getName(...) | file://<external>/KCallable.class:0:0:0:0 | getName |
| reflection.kt:25:23:25:33 | get(...) | file://<external>/KProperty2.class:0:0:0:0 | get |
| reflection.kt:50:30:50:39 | get(...) | file://<external>/KProperty1.class:0:0:0:0 | get |
| reflection.kt:51:30:51:34 | get(...) | file://<external>/KProperty0.class:0:0:0:0 | get |
functionReferences
| reflection.kt:5:49:5:54 | ...::... | reflection.kt:5:49:5:54 | invoke | reflection.kt:27:9:27:33 | m |
| reflection.kt:12:38:12:44 | ...::... | reflection.kt:12:38:12:44 | invoke | file://<external>/KProperty1.class:0:0:0:0 | get |
| reflection.kt:19:44:19:50 | ...::... | reflection.kt:19:44:19:50 | invoke | file://<external>/KMutableProperty1.class:0:0:0:0 | set |
| reflection.kt:58:17:58:32 | ...::... | reflection.kt:58:17:58:32 | invoke | reflection.kt:70:9:70:38 | m1 |
| reflection.kt:59:17:59:34 | ...::... | reflection.kt:59:17:59:34 | invoke | reflection.kt:70:9:70:38 | m1 |
| reflection.kt:60:17:60:34 | ...::... | reflection.kt:60:17:60:34 | invoke | reflection.kt:52:1:52:52 | ext1 |
| reflection.kt:61:17:61:36 | ...::... | reflection.kt:61:17:61:36 | invoke | reflection.kt:52:1:52:52 | ext1 |
| reflection.kt:62:17:62:34 | ...::... | reflection.kt:62:17:62:34 | invoke | reflection.kt:54:1:54:48 | ext2 |
| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | invoke | reflection.kt:54:1:54:48 | ext2 |
| reflection.kt:84:18:84:24 | ...::... | reflection.kt:84:18:84:24 | invoke | reflection.kt:80:9:80:30 | Inner<String> |
| reflection.kt:91:14:91:21 | ...::... | reflection.kt:91:14:91:21 | invoke | reflection.kt:77:1:86:1 | Class2<String> |
| reflection.kt:92:14:92:17 | ...::... | reflection.kt:92:14:92:17 | invoke | reflection.kt:88:1:88:24 | fn |
| reflection.kt:93:14:93:29 | ...::... | reflection.kt:93:14:93:29 | invoke | reflection.kt:80:9:80:30 | Inner<String> |
| reflection.kt:7:49:7:54 | ...::... | reflection.kt:7:49:7:54 | invoke | reflection.kt:29:9:29:33 | m |
| reflection.kt:14:38:14:44 | ...::... | reflection.kt:14:38:14:44 | invoke | file://<external>/KProperty1.class:0:0:0:0 | get |
| reflection.kt:21:44:21:50 | ...::... | reflection.kt:21:44:21:50 | invoke | file://<external>/KMutableProperty1.class:0:0:0:0 | set |
| reflection.kt:60:17:60:32 | ...::... | reflection.kt:60:17:60:32 | invoke | reflection.kt:76:9:76:38 | m1 |
| reflection.kt:61:17:61:34 | ...::... | reflection.kt:61:17:61:34 | invoke | reflection.kt:76:9:76:38 | m1 |
| reflection.kt:62:17:62:34 | ...::... | reflection.kt:62:17:62:34 | invoke | reflection.kt:54:1:54:52 | ext1 |
| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | invoke | reflection.kt:54:1:54:52 | ext1 |
| reflection.kt:64:17:64:34 | ...::... | reflection.kt:64:17:64:34 | invoke | reflection.kt:56:1:56:48 | ext2 |
| reflection.kt:65:17:65:36 | ...::... | reflection.kt:65:17:65:36 | invoke | reflection.kt:56:1:56:48 | ext2 |
| reflection.kt:90:18:90:24 | ...::... | reflection.kt:90:18:90:24 | invoke | reflection.kt:86:9:86:30 | Inner<String> |
| reflection.kt:97:14:97:21 | ...::... | reflection.kt:97:14:97:21 | invoke | reflection.kt:83:1:92:1 | Class2<String> |
| reflection.kt:98:14:98:17 | ...::... | reflection.kt:98:14:98:17 | invoke | reflection.kt:94:1:94:24 | fn |
| reflection.kt:99:14:99:29 | ...::... | reflection.kt:99:14:99:29 | invoke | reflection.kt:86:9:86:30 | Inner<String> |
propertyGetReferences
| reflection.kt:8:38:8:42 | ...::... | reflection.kt:8:38:8:42 | get | reflection.kt:31:9:31:23 | getP0 |
| reflection.kt:13:35:13:41 | ...::... | reflection.kt:13:35:13:41 | get | reflection.kt:31:9:31:23 | getP0 |
| reflection.kt:15:45:15:49 | ...::... | reflection.kt:15:45:15:49 | get | reflection.kt:32:9:32:23 | getP1 |
| reflection.kt:20:42:20:48 | ...::... | reflection.kt:20:42:20:48 | get | reflection.kt:32:9:32:23 | getP1 |
| reflection.kt:48:13:48:28 | ...::... | reflection.kt:48:13:48:28 | get | reflection.kt:45:5:45:28 | getLastChar |
| reflection.kt:49:13:49:28 | ...::... | reflection.kt:49:13:49:28 | get | reflection.kt:45:5:45:28 | getLastChar |
| reflection.kt:65:17:65:32 | ...::... | reflection.kt:65:17:65:32 | get | reflection.kt:72:13:72:24 | getP2 |
| reflection.kt:66:17:66:34 | ...::... | reflection.kt:66:17:66:34 | get | reflection.kt:72:13:72:24 | getP2 |
| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | get | reflection.kt:33:9:33:23 | getP0 |
| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | get | reflection.kt:33:9:33:23 | getP0 |
| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | get | reflection.kt:34:9:34:23 | getP1 |
| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | get | reflection.kt:34:9:34:23 | getP1 |
| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | get | reflection.kt:47:5:47:28 | getLastChar |
| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | get | reflection.kt:47:5:47:28 | getLastChar |
| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | get | reflection.kt:78:13:78:24 | getP2 |
| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | get | reflection.kt:78:13:78:24 | getP2 |
| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | get | file://<external>/IntCompanionObject.class:0:0:0:0 | getMAX_VALUE |
propertySetReferences
| reflection.kt:15:45:15:49 | ...::... | reflection.kt:15:45:15:49 | set | reflection.kt:32:9:32:23 | setP1 |
| reflection.kt:20:42:20:48 | ...::... | reflection.kt:20:42:20:48 | set | reflection.kt:32:9:32:23 | setP1 |
| reflection.kt:65:17:65:32 | ...::... | reflection.kt:65:17:65:32 | set | reflection.kt:73:13:73:29 | setP2 |
| reflection.kt:66:17:66:34 | ...::... | reflection.kt:66:17:66:34 | set | reflection.kt:73:13:73:29 | setP2 |
| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | set | reflection.kt:34:9:34:23 | setP1 |
| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | set | reflection.kt:34:9:34:23 | setP1 |
| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | set | reflection.kt:79:13:79:29 | setP2 |
| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | set | reflection.kt:79:13:79:29 | setP2 |
callsInsideInvocationMethods
| reflection.kt:5:49:5:54 | ...::... | reflection.kt:5:49:5:54 | new Function2<Ccc,Integer,Double>(...) { ... } | reflection.kt:5:49:5:54 | invoke | reflection.kt:5:49:5:54 | m(...) | Ccc.m |
| reflection.kt:8:38:8:42 | ...::... | reflection.kt:8:38:8:42 | new KProperty1<C,Integer>(...) { ... } | reflection.kt:8:38:8:42 | get | reflection.kt:8:38:8:42 | getP0(...) | C.getP0 |
| reflection.kt:12:38:12:44 | ...::... | reflection.kt:12:38:12:44 | new Function1<C,Integer>(...) { ... } | reflection.kt:12:38:12:44 | invoke | reflection.kt:12:38:12:44 | get(...) | KProperty1<C,Integer>.get |
| reflection.kt:13:35:13:41 | ...::... | reflection.kt:13:35:13:41 | new KProperty0<Integer>(...) { ... } | reflection.kt:13:35:13:41 | get | reflection.kt:13:35:13:41 | getP0(...) | C.getP0 |
| reflection.kt:15:45:15:49 | ...::... | reflection.kt:15:45:15:49 | new KMutableProperty1<C,Integer>(...) { ... } | reflection.kt:15:45:15:49 | get | reflection.kt:15:45:15:49 | getP1(...) | C.getP1 |
| reflection.kt:15:45:15:49 | ...::... | reflection.kt:15:45:15:49 | new KMutableProperty1<C,Integer>(...) { ... } | reflection.kt:15:45:15:49 | set | reflection.kt:15:45:15:49 | setP1(...) | C.setP1 |
| reflection.kt:19:44:19:50 | ...::... | reflection.kt:19:44:19:50 | new Function2<C,Integer,Unit>(...) { ... } | reflection.kt:19:44:19:50 | invoke | reflection.kt:19:44:19:50 | set(...) | KMutableProperty1<C,Integer>.set |
| reflection.kt:20:42:20:48 | ...::... | reflection.kt:20:42:20:48 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:20:42:20:48 | get | reflection.kt:20:42:20:48 | getP1(...) | C.getP1 |
| reflection.kt:20:42:20:48 | ...::... | reflection.kt:20:42:20:48 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:20:42:20:48 | set | reflection.kt:20:42:20:48 | setP1(...) | C.setP1 |
| reflection.kt:48:13:48:28 | ...::... | reflection.kt:48:13:48:28 | new KProperty1<String,Character>(...) { ... } | reflection.kt:48:13:48:28 | get | reflection.kt:48:13:48:28 | getLastChar(...) | ReflectionKt.getLastChar |
| reflection.kt:49:13:49:28 | ...::... | reflection.kt:49:13:49:28 | new KProperty0<Character>(...) { ... } | reflection.kt:49:13:49:28 | get | reflection.kt:49:13:49:28 | getLastChar(...) | ReflectionKt.getLastChar |
| reflection.kt:58:17:58:32 | ...::... | reflection.kt:58:17:58:32 | new Function2<Generic<Integer>,Integer,String>(...) { ... } | reflection.kt:58:17:58:32 | invoke | reflection.kt:58:17:58:32 | m1(...) | Generic<Integer>.m1 |
| reflection.kt:59:17:59:34 | ...::... | reflection.kt:59:17:59:34 | new Function1<Integer,String>(...) { ... } | reflection.kt:59:17:59:34 | invoke | reflection.kt:59:17:59:34 | m1(...) | Generic<Integer>.m1 |
| reflection.kt:60:17:60:34 | ...::... | reflection.kt:60:17:60:34 | new Function1<Generic<Integer>,String>(...) { ... } | reflection.kt:60:17:60:34 | invoke | reflection.kt:60:17:60:34 | ext1(...) | ReflectionKt.ext1 |
| reflection.kt:61:17:61:36 | ...::... | reflection.kt:61:17:61:36 | new Function0<String>(...) { ... } | reflection.kt:61:17:61:36 | invoke | reflection.kt:61:17:61:36 | ext1(...) | ReflectionKt.ext1 |
| reflection.kt:62:17:62:34 | ...::... | reflection.kt:62:17:62:34 | new Function1<Generic<Integer>,String>(...) { ... } | reflection.kt:62:17:62:34 | invoke | reflection.kt:62:17:62:34 | ext2(...) | ReflectionKt.ext2 |
| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | new Function0<String>(...) { ... } | reflection.kt:63:17:63:36 | invoke | reflection.kt:63:17:63:36 | ext2(...) | ReflectionKt.ext2 |
| reflection.kt:65:17:65:32 | ...::... | reflection.kt:65:17:65:32 | new KMutableProperty1<Generic<Integer>,Integer>(...) { ... } | reflection.kt:65:17:65:32 | get | reflection.kt:65:17:65:32 | getP2(...) | Generic<Integer>.getP2 |
| reflection.kt:65:17:65:32 | ...::... | reflection.kt:65:17:65:32 | new KMutableProperty1<Generic<Integer>,Integer>(...) { ... } | reflection.kt:65:17:65:32 | set | reflection.kt:65:17:65:32 | setP2(...) | Generic<Integer>.setP2 |
| reflection.kt:66:17:66:34 | ...::... | reflection.kt:66:17:66:34 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:66:17:66:34 | get | reflection.kt:66:17:66:34 | getP2(...) | Generic<Integer>.getP2 |
| reflection.kt:66:17:66:34 | ...::... | reflection.kt:66:17:66:34 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:66:17:66:34 | set | reflection.kt:66:17:66:34 | setP2(...) | Generic<Integer>.setP2 |
| reflection.kt:84:18:84:24 | ...::... | reflection.kt:84:18:84:24 | new Function1<String,Inner<String>>(...) { ... } | reflection.kt:84:18:84:24 | invoke | reflection.kt:84:18:84:24 | new Inner<String>(...) | Inner<String>.Inner<String> |
| reflection.kt:91:14:91:21 | ...::... | reflection.kt:91:14:91:21 | new Function1<String,Class2<String>>(...) { ... } | reflection.kt:91:14:91:21 | invoke | reflection.kt:91:14:91:21 | new Class2<String>(...) | Class2<String>.Class2<String> |
| reflection.kt:92:14:92:17 | ...::... | reflection.kt:92:14:92:17 | new Function1<String,Unit>(...) { ... } | reflection.kt:92:14:92:17 | invoke | reflection.kt:92:14:92:17 | fn(...) | ReflectionKt.fn |
| reflection.kt:93:14:93:29 | ...::... | reflection.kt:93:14:93:29 | new Function1<String,Inner<String>>(...) { ... } | reflection.kt:93:14:93:29 | invoke | reflection.kt:93:14:93:29 | new Inner<String>(...) | Inner<String>.Inner<String> |
| reflection.kt:7:49:7:54 | ...::... | reflection.kt:7:49:7:54 | new Function2<Ccc,Integer,Double>(...) { ... } | reflection.kt:7:49:7:54 | invoke | reflection.kt:7:49:7:54 | m(...) | Ccc.m |
| reflection.kt:10:38:10:42 | ...::... | reflection.kt:10:38:10:42 | new KProperty1<C,Integer>(...) { ... } | reflection.kt:10:38:10:42 | get | reflection.kt:10:38:10:42 | getP0(...) | C.getP0 |
| reflection.kt:14:38:14:44 | ...::... | reflection.kt:14:38:14:44 | new Function1<C,Integer>(...) { ... } | reflection.kt:14:38:14:44 | invoke | reflection.kt:14:38:14:44 | get(...) | KProperty1<C,Integer>.get |
| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | new KProperty0<Integer>(...) { ... } | reflection.kt:15:35:15:41 | get | reflection.kt:15:35:15:41 | getP0(...) | C.getP0 |
| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | new KMutableProperty1<C,Integer>(...) { ... } | reflection.kt:17:45:17:49 | get | reflection.kt:17:45:17:49 | getP1(...) | C.getP1 |
| reflection.kt:17:45:17:49 | ...::... | reflection.kt:17:45:17:49 | new KMutableProperty1<C,Integer>(...) { ... } | reflection.kt:17:45:17:49 | set | reflection.kt:17:45:17:49 | setP1(...) | C.setP1 |
| reflection.kt:21:44:21:50 | ...::... | reflection.kt:21:44:21:50 | new Function2<C,Integer,Unit>(...) { ... } | reflection.kt:21:44:21:50 | invoke | reflection.kt:21:44:21:50 | set(...) | KMutableProperty1<C,Integer>.set |
| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:22:42:22:48 | get | reflection.kt:22:42:22:48 | getP1(...) | C.getP1 |
| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:22:42:22:48 | set | reflection.kt:22:42:22:48 | setP1(...) | C.setP1 |
| reflection.kt:50:13:50:28 | ...::... | reflection.kt:50:13:50:28 | new KProperty1<String,Character>(...) { ... } | reflection.kt:50:13:50:28 | get | reflection.kt:50:13:50:28 | getLastChar(...) | ReflectionKt.getLastChar |
| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | new KProperty0<Character>(...) { ... } | reflection.kt:51:13:51:28 | get | reflection.kt:51:13:51:28 | getLastChar(...) | ReflectionKt.getLastChar |
| reflection.kt:60:17:60:32 | ...::... | reflection.kt:60:17:60:32 | new Function2<Generic<Integer>,Integer,String>(...) { ... } | reflection.kt:60:17:60:32 | invoke | reflection.kt:60:17:60:32 | m1(...) | Generic<Integer>.m1 |
| reflection.kt:61:17:61:34 | ...::... | reflection.kt:61:17:61:34 | new Function1<Integer,String>(...) { ... } | reflection.kt:61:17:61:34 | invoke | reflection.kt:61:17:61:34 | m1(...) | Generic<Integer>.m1 |
| reflection.kt:62:17:62:34 | ...::... | reflection.kt:62:17:62:34 | new Function1<Generic<Integer>,String>(...) { ... } | reflection.kt:62:17:62:34 | invoke | reflection.kt:62:17:62:34 | ext1(...) | ReflectionKt.ext1 |
| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | new Function0<String>(...) { ... } | reflection.kt:63:17:63:36 | invoke | reflection.kt:63:17:63:36 | ext1(...) | ReflectionKt.ext1 |
| reflection.kt:64:17:64:34 | ...::... | reflection.kt:64:17:64:34 | new Function1<Generic<Integer>,String>(...) { ... } | reflection.kt:64:17:64:34 | invoke | reflection.kt:64:17:64:34 | ext2(...) | ReflectionKt.ext2 |
| reflection.kt:65:17:65:36 | ...::... | reflection.kt:65:17:65:36 | new Function0<String>(...) { ... } | reflection.kt:65:17:65:36 | invoke | reflection.kt:65:17:65:36 | ext2(...) | ReflectionKt.ext2 |
| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | new KMutableProperty1<Generic<Integer>,Integer>(...) { ... } | reflection.kt:67:17:67:32 | get | reflection.kt:67:17:67:32 | getP2(...) | Generic<Integer>.getP2 |
| reflection.kt:67:17:67:32 | ...::... | reflection.kt:67:17:67:32 | new KMutableProperty1<Generic<Integer>,Integer>(...) { ... } | reflection.kt:67:17:67:32 | set | reflection.kt:67:17:67:32 | setP2(...) | Generic<Integer>.setP2 |
| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:68:17:68:34 | get | reflection.kt:68:17:68:34 | getP2(...) | Generic<Integer>.getP2 |
| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:68:17:68:34 | set | reflection.kt:68:17:68:34 | setP2(...) | Generic<Integer>.setP2 |
| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | new KProperty0<Integer>(...) { ... } | reflection.kt:70:17:70:30 | get | reflection.kt:70:17:70:30 | getMAX_VALUE(...) | IntCompanionObject.getMAX_VALUE |
| reflection.kt:90:18:90:24 | ...::... | reflection.kt:90:18:90:24 | new Function1<String,Inner<String>>(...) { ... } | reflection.kt:90:18:90:24 | invoke | reflection.kt:90:18:90:24 | new Inner<String>(...) | Inner<String>.Inner<String> |
| reflection.kt:97:14:97:21 | ...::... | reflection.kt:97:14:97:21 | new Function1<String,Class2<String>>(...) { ... } | reflection.kt:97:14:97:21 | invoke | reflection.kt:97:14:97:21 | new Class2<String>(...) | Class2<String>.Class2<String> |
| reflection.kt:98:14:98:17 | ...::... | reflection.kt:98:14:98:17 | new Function1<String,Unit>(...) { ... } | reflection.kt:98:14:98:17 | invoke | reflection.kt:98:14:98:17 | fn(...) | ReflectionKt.fn |
| reflection.kt:99:14:99:29 | ...::... | reflection.kt:99:14:99:29 | new Function1<String,Inner<String>>(...) { ... } | reflection.kt:99:14:99:29 | invoke | reflection.kt:99:14:99:29 | new Inner<String>(...) | Inner<String>.Inner<String> |
fieldAccessInsideInvocationMethods
| reflection.kt:14:38:14:44 | ...::... | reflection.kt:14:38:14:44 | new Function1<C,Integer>(...) { ... } | reflection.kt:14:38:14:44 | invoke | reflection.kt:14:38:14:44 | this.<dispatchReceiver> |
| reflection.kt:15:35:15:41 | ...::... | reflection.kt:15:35:15:41 | new KProperty0<Integer>(...) { ... } | reflection.kt:15:35:15:41 | get | reflection.kt:15:35:15:41 | this.<dispatchReceiver> |
| reflection.kt:21:44:21:50 | ...::... | reflection.kt:21:44:21:50 | new Function2<C,Integer,Unit>(...) { ... } | reflection.kt:21:44:21:50 | invoke | reflection.kt:21:44:21:50 | this.<dispatchReceiver> |
| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:22:42:22:48 | get | reflection.kt:22:42:22:48 | this.<dispatchReceiver> |
| reflection.kt:22:42:22:48 | ...::... | reflection.kt:22:42:22:48 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:22:42:22:48 | set | reflection.kt:22:42:22:48 | this.<dispatchReceiver> |
| reflection.kt:51:13:51:28 | ...::... | reflection.kt:51:13:51:28 | new KProperty0<Character>(...) { ... } | reflection.kt:51:13:51:28 | get | reflection.kt:51:13:51:28 | this.<extensionReceiver> |
| reflection.kt:61:17:61:34 | ...::... | reflection.kt:61:17:61:34 | new Function1<Integer,String>(...) { ... } | reflection.kt:61:17:61:34 | invoke | reflection.kt:61:17:61:34 | this.<dispatchReceiver> |
| reflection.kt:63:17:63:36 | ...::... | reflection.kt:63:17:63:36 | new Function0<String>(...) { ... } | reflection.kt:63:17:63:36 | invoke | reflection.kt:63:17:63:36 | this.<extensionReceiver> |
| reflection.kt:65:17:65:36 | ...::... | reflection.kt:65:17:65:36 | new Function0<String>(...) { ... } | reflection.kt:65:17:65:36 | invoke | reflection.kt:65:17:65:36 | this.<extensionReceiver> |
| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:68:17:68:34 | get | reflection.kt:68:17:68:34 | this.<dispatchReceiver> |
| reflection.kt:68:17:68:34 | ...::... | reflection.kt:68:17:68:34 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:68:17:68:34 | set | reflection.kt:68:17:68:34 | this.<dispatchReceiver> |
| reflection.kt:70:17:70:30 | ...::... | reflection.kt:70:17:70:30 | new KProperty0<Integer>(...) { ... } | reflection.kt:70:17:70:30 | get | reflection.kt:70:17:70:30 | this.<dispatchReceiver> |
| reflection.kt:71:17:71:34 | ...::... | reflection.kt:71:17:71:34 | new KProperty0<Integer>(...) { ... } | reflection.kt:71:17:71:34 | get | reflection.kt:71:17:71:34 | MAX_VALUE |
| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:72:17:72:35 | get | reflection.kt:72:17:72:35 | this.<dispatchReceiver> |
| reflection.kt:72:17:72:35 | ...::... | reflection.kt:72:17:72:35 | new KMutableProperty0<Integer>(...) { ... } | reflection.kt:72:17:72:35 | get | reflection.kt:72:17:72:35 | this.<dispatchReceiver>.height |
| reflection.kt:90:18:90:24 | ...::... | reflection.kt:90:18:90:24 | new Function1<String,Inner<String>>(...) { ... } | reflection.kt:90:18:90:24 | invoke | reflection.kt:90:18:90:24 | this.<dispatchReceiver> |
| reflection.kt:99:14:99:29 | ...::... | reflection.kt:99:14:99:29 | new Function1<String,Inner<String>>(...) { ... } | reflection.kt:99:14:99:29 | invoke | reflection.kt:99:14:99:29 | this.<dispatchReceiver> |

View File

@@ -1,3 +1,5 @@
import java.awt.Rectangle
import kotlin.reflect.*
class Reflection {
@@ -64,6 +66,10 @@ class Class1 {
println(Generic<Int>::p2)
println(Generic<Int>()::p2)
println(Int::MAX_VALUE) // Companion object and property getter
println(Integer::MAX_VALUE) // Static field access, no getter
println(Rectangle()::height) // Field access, no getter, with dispatch receiver
}
class Generic<T1> {

View File

@@ -65,3 +65,13 @@ query predicate callsInsideInvocationMethods(
call.getEnclosingCallable() = m and
callee = call.getCallee().getQualifiedName()
}
query predicate fieldAccessInsideInvocationMethods(
ClassInstanceExpr e, AnonymousClass c, Method m, FieldAccess access
) {
(e instanceof MemberRefExpr or e instanceof PropertyRefExpr) and
e.getAnonymousClass() = c and
c.getAMethod() = m and
m.getName() = ["invoke", "get", "set"] and
access.getEnclosingCallable() = m
}