[IR] Refactor JvmSymbols to allow on-demand loading of (subsets of) symbols
This commit is contained in:
committed by
Alexander Udalov
parent
4b4ee78e5d
commit
7e633cf217
+18
-16
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
|||||||
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
|
import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.JvmReflectSymbols
|
||||||
import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface
|
import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.IrInlineScopeResolver
|
import org.jetbrains.kotlin.backend.jvm.ir.IrInlineScopeResolver
|
||||||
import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder
|
import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder
|
||||||
@@ -83,7 +84,7 @@ internal class ReflectiveAccessLowering(
|
|||||||
// reflective access . We record these _before_ transformation, in order to
|
// reflective access . We record these _before_ transformation, in order to
|
||||||
// later predict the compilation strategy for fields. See the uses of
|
// later predict the compilation strategy for fields. See the uses of
|
||||||
// `fieldLocationAndReceiver`.
|
// `fieldLocationAndReceiver`.
|
||||||
val callsOnCompanionObjects: MutableMap<IrCall,IrClassSymbol> = mutableMapOf()
|
val callsOnCompanionObjects: MutableMap<IrCall, IrClassSymbol> = mutableMapOf()
|
||||||
|
|
||||||
private fun recordCompanionObjectAsDispatchReceiver(expression: IrCall) {
|
private fun recordCompanionObjectAsDispatchReceiver(expression: IrCall) {
|
||||||
if ((expression.dispatchReceiver as? IrGetObjectValue)?.symbol?.owner?.isCompanion == true) {
|
if ((expression.dispatchReceiver as? IrGetObjectValue)?.symbol?.owner?.isCompanion == true) {
|
||||||
@@ -169,6 +170,7 @@ internal class ReflectiveAccessLowering(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
private val symbols = context.ir.symbols
|
private val symbols = context.ir.symbols
|
||||||
|
private val reflectSymbols = symbols.javaLangReflectSymbols
|
||||||
|
|
||||||
private fun IrBuilderWithScope.javaClassObject(klass: IrType): IrExpression =
|
private fun IrBuilderWithScope.javaClassObject(klass: IrType): IrExpression =
|
||||||
irCall(symbols.kClassJava.owner.getter!!).apply {
|
irCall(symbols.kClassJava.owner.getter!!).apply {
|
||||||
@@ -182,26 +184,26 @@ internal class ReflectiveAccessLowering(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun IrBuilderWithScope.getDeclaredField(declaringClass: IrExpression, fieldName: String): IrExpression =
|
private fun IrBuilderWithScope.getDeclaredField(declaringClass: IrExpression, fieldName: String): IrExpression =
|
||||||
irCall(symbols.getDeclaredField).apply {
|
irCall(reflectSymbols.getDeclaredField).apply {
|
||||||
dispatchReceiver = declaringClass
|
dispatchReceiver = declaringClass
|
||||||
putValueArgument(0, irString(fieldName))
|
putValueArgument(0, irString(fieldName))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrBuilderWithScope.fieldSetAccessible(field: IrExpression): IrExpression =
|
private fun IrBuilderWithScope.fieldSetAccessible(field: IrExpression): IrExpression =
|
||||||
irCall(symbols.javaLangReflectFieldSetAccessible).apply {
|
irCall(reflectSymbols.javaLangReflectFieldSetAccessible).apply {
|
||||||
dispatchReceiver = field
|
dispatchReceiver = field
|
||||||
putValueArgument(0, irTrue())
|
putValueArgument(0, irTrue())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrBuilderWithScope.fieldSet(fieldObject: IrExpression, receiver: IrExpression, value: IrExpression): IrExpression =
|
private fun IrBuilderWithScope.fieldSet(fieldObject: IrExpression, receiver: IrExpression, value: IrExpression): IrExpression =
|
||||||
irCall(symbols.javaLangReflectFieldSet).apply {
|
irCall(reflectSymbols.javaLangReflectFieldSet).apply {
|
||||||
dispatchReceiver = fieldObject
|
dispatchReceiver = fieldObject
|
||||||
putValueArgument(0, receiver)
|
putValueArgument(0, receiver)
|
||||||
putValueArgument(1, value)
|
putValueArgument(1, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrBuilderWithScope.fieldGet(fieldObject: IrExpression, receiver: IrExpression): IrExpression =
|
private fun IrBuilderWithScope.fieldGet(fieldObject: IrExpression, receiver: IrExpression): IrExpression =
|
||||||
irCall(symbols.javaLangReflectFieldGet).apply {
|
irCall(reflectSymbols.javaLangReflectFieldGet).apply {
|
||||||
dispatchReceiver = fieldObject
|
dispatchReceiver = fieldObject
|
||||||
putValueArgument(0, receiver)
|
putValueArgument(0, receiver)
|
||||||
}
|
}
|
||||||
@@ -211,14 +213,14 @@ internal class ReflectiveAccessLowering(
|
|||||||
methodName: String,
|
methodName: String,
|
||||||
parameterTypes: List<IrType>
|
parameterTypes: List<IrType>
|
||||||
): IrExpression =
|
): IrExpression =
|
||||||
irCall(symbols.getDeclaredMethod).apply {
|
irCall(reflectSymbols.getDeclaredMethod).apply {
|
||||||
dispatchReceiver = declaringClass
|
dispatchReceiver = declaringClass
|
||||||
putValueArgument(0, irString(methodName))
|
putValueArgument(0, irString(methodName))
|
||||||
putValueArgument(1, irVararg(symbols.javaLangClass.defaultType, parameterTypes.map { javaClassObject(it) }))
|
putValueArgument(1, irVararg(symbols.javaLangClass.defaultType, parameterTypes.map { javaClassObject(it) }))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrBuilderWithScope.methodSetAccessible(method: IrExpression): IrExpression =
|
private fun IrBuilderWithScope.methodSetAccessible(method: IrExpression): IrExpression =
|
||||||
irCall(symbols.javaLangReflectMethodSetAccessible).apply {
|
irCall(reflectSymbols.javaLangReflectMethodSetAccessible).apply {
|
||||||
dispatchReceiver = method
|
dispatchReceiver = method
|
||||||
putValueArgument(0, irTrue())
|
putValueArgument(0, irTrue())
|
||||||
}
|
}
|
||||||
@@ -228,7 +230,7 @@ internal class ReflectiveAccessLowering(
|
|||||||
receiver: IrExpression,
|
receiver: IrExpression,
|
||||||
arguments: List<IrExpression>
|
arguments: List<IrExpression>
|
||||||
): IrExpression =
|
): IrExpression =
|
||||||
irCall(symbols.javaLangReflectMethodInvoke).apply {
|
irCall(reflectSymbols.javaLangReflectMethodInvoke).apply {
|
||||||
dispatchReceiver = method
|
dispatchReceiver = method
|
||||||
putValueArgument(0, receiver)
|
putValueArgument(0, receiver)
|
||||||
putValueArgument(1, irVararg(context.irBuiltIns.anyNType, arguments))
|
putValueArgument(1, irVararg(context.irBuiltIns.anyNType, arguments))
|
||||||
@@ -238,20 +240,20 @@ internal class ReflectiveAccessLowering(
|
|||||||
declaringClass: IrExpression,
|
declaringClass: IrExpression,
|
||||||
parameterTypes: List<IrType>
|
parameterTypes: List<IrType>
|
||||||
): IrExpression =
|
): IrExpression =
|
||||||
irCall(symbols.getDeclaredConstructor).apply {
|
irCall(reflectSymbols.getDeclaredConstructor).apply {
|
||||||
dispatchReceiver = declaringClass
|
dispatchReceiver = declaringClass
|
||||||
putValueArgument(0, irVararg(symbols.javaLangClass.defaultType, parameterTypes.map { javaClassObject(it) }))
|
putValueArgument(0, irVararg(symbols.javaLangClass.defaultType, parameterTypes.map { javaClassObject(it) }))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun IrBuilderWithScope.constructorSetAccessible(constructor: IrExpression): IrExpression =
|
private fun IrBuilderWithScope.constructorSetAccessible(constructor: IrExpression): IrExpression =
|
||||||
irCall(symbols.javaLangReflectConstructorSetAccessible).apply {
|
irCall(reflectSymbols.javaLangReflectConstructorSetAccessible).apply {
|
||||||
dispatchReceiver = constructor
|
dispatchReceiver = constructor
|
||||||
putValueArgument(0, irTrue())
|
putValueArgument(0, irTrue())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrBuilderWithScope.constructorNewInstance(constructor: IrExpression, arguments: List<IrExpression>): IrExpression =
|
private fun IrBuilderWithScope.constructorNewInstance(constructor: IrExpression, arguments: List<IrExpression>): IrExpression =
|
||||||
irCall(symbols.javaLangReflectConstructorNewInstance).apply {
|
irCall(reflectSymbols.javaLangReflectConstructorNewInstance).apply {
|
||||||
dispatchReceiver = constructor
|
dispatchReceiver = constructor
|
||||||
putValueArgument(0, irVararg(context.irBuiltIns.anyNType, arguments))
|
putValueArgument(0, irVararg(context.irBuiltIns.anyNType, arguments))
|
||||||
}
|
}
|
||||||
@@ -278,7 +280,7 @@ internal class ReflectiveAccessLowering(
|
|||||||
parameterTypes
|
parameterTypes
|
||||||
),
|
),
|
||||||
nameHint = "method",
|
nameHint = "method",
|
||||||
irType = symbols.javaLangReflectMethod.defaultType
|
irType = reflectSymbols.javaLangReflectMethod.defaultType
|
||||||
)
|
)
|
||||||
+methodSetAccessible(irGet(methodVar))
|
+methodSetAccessible(irGet(methodVar))
|
||||||
+methodInvoke(irGet(methodVar), receiver ?: irNull(), arguments)
|
+methodInvoke(irGet(methodVar), receiver ?: irNull(), arguments)
|
||||||
@@ -330,7 +332,7 @@ internal class ReflectiveAccessLowering(
|
|||||||
call.valueParameterTypes()
|
call.valueParameterTypes()
|
||||||
),
|
),
|
||||||
nameHint = "constructor",
|
nameHint = "constructor",
|
||||||
irType = symbols.javaLangReflectConstructor.defaultType
|
irType = reflectSymbols.javaLangReflectConstructor.defaultType
|
||||||
)
|
)
|
||||||
+constructorSetAccessible(irGet(constructorVar))
|
+constructorSetAccessible(irGet(constructorVar))
|
||||||
+constructorNewInstance(irGet(constructorVar), call.getValueArguments())
|
+constructorNewInstance(irGet(constructorVar), call.getValueArguments())
|
||||||
@@ -353,7 +355,7 @@ internal class ReflectiveAccessLowering(
|
|||||||
val fieldVar = createTmpVariable(
|
val fieldVar = createTmpVariable(
|
||||||
getDeclaredField(irGet(classVar), fieldName),
|
getDeclaredField(irGet(classVar), fieldName),
|
||||||
nameHint = "field",
|
nameHint = "field",
|
||||||
irType = symbols.javaLangReflectField.defaultType
|
irType = reflectSymbols.javaLangReflectField.defaultType
|
||||||
)
|
)
|
||||||
+fieldSetAccessible(irGet(fieldVar))
|
+fieldSetAccessible(irGet(fieldVar))
|
||||||
+fieldGet(irGet(fieldVar), instance ?: irGet(classVar))
|
+fieldGet(irGet(fieldVar), instance ?: irGet(classVar))
|
||||||
@@ -385,7 +387,7 @@ internal class ReflectiveAccessLowering(
|
|||||||
fieldName
|
fieldName
|
||||||
),
|
),
|
||||||
nameHint = "field",
|
nameHint = "field",
|
||||||
irType = symbols.javaLangReflectField.defaultType
|
irType = reflectSymbols.javaLangReflectField.defaultType
|
||||||
)
|
)
|
||||||
+fieldSetAccessible(irGet(fieldVar))
|
+fieldSetAccessible(irGet(fieldVar))
|
||||||
+fieldSet(irGet(fieldVar), instance ?: irNull(), value)
|
+fieldSet(irGet(fieldVar), instance ?: irNull(), value)
|
||||||
@@ -502,7 +504,7 @@ internal class ReflectiveAccessLowering(
|
|||||||
val builder = context.createJvmIrBuilder(expression.symbol)
|
val builder = context.createJvmIrBuilder(expression.symbol)
|
||||||
|
|
||||||
// invokeSpecial(owner: String, name: String, descriptor: String, isInterface: Boolean): T
|
// invokeSpecial(owner: String, name: String, descriptor: String, isInterface: Boolean): T
|
||||||
return builder.irCall(context.irIntrinsics.symbols.jvmDebuggerInvokeSpecialIntrinsic).apply {
|
return builder.irCall(context.ir.symbols.jvmDebuggerInvokeSpecialIntrinsic).apply {
|
||||||
dispatchReceiver = expression.dispatchReceiver
|
dispatchReceiver = expression.dispatchReceiver
|
||||||
this.type = expression.symbol.owner.returnType
|
this.type = expression.symbol.owner.returnType
|
||||||
putValueArgument(0, builder.irString("${owner.packageFqName}/${owner.name}"))
|
putValueArgument(0, builder.irString("${owner.packageFqName}/${owner.name}"))
|
||||||
|
|||||||
@@ -0,0 +1,147 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
package org.jetbrains.kotlin.backend.jvm
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
|
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.addFunction
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
|
||||||
|
import org.jetbrains.kotlin.ir.builders.declarations.buildClass
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.impl.IrExternalPackageFragmentImpl
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
|
import org.jetbrains.kotlin.ir.types.defaultType
|
||||||
|
import org.jetbrains.kotlin.ir.types.makeNullable
|
||||||
|
import org.jetbrains.kotlin.ir.types.typeWith
|
||||||
|
import org.jetbrains.kotlin.ir.util.defaultType
|
||||||
|
import org.jetbrains.kotlin.ir.util.functions
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
|
||||||
|
class JvmReflectSymbols(val context: JvmBackendContext) {
|
||||||
|
private val irBuiltIns: IrBuiltIns = context.irBuiltIns
|
||||||
|
|
||||||
|
private val javaLangReflect: FqName = FqName("java.lang.reflect")
|
||||||
|
|
||||||
|
private val javaLangReflectPackage: IrPackageFragment =
|
||||||
|
IrExternalPackageFragmentImpl.createEmptyExternalPackageFragment(context.state.module, javaLangReflect)
|
||||||
|
|
||||||
|
val javaLangReflectField: IrClassSymbol =
|
||||||
|
createJavaLangReflectClass(FqName("java.lang.reflect.Field")) { klass ->
|
||||||
|
klass.addFunction("setAccessible", irBuiltIns.unitType).apply {
|
||||||
|
addValueParameter("isAccessible", irBuiltIns.booleanType)
|
||||||
|
}
|
||||||
|
klass.addFunction("get", irBuiltIns.anyNType).apply {
|
||||||
|
addValueParameter("receiver", irBuiltIns.anyNType)
|
||||||
|
}
|
||||||
|
klass.addFunction("set", irBuiltIns.unitType).apply {
|
||||||
|
addValueParameter("receiver", irBuiltIns.anyNType)
|
||||||
|
addValueParameter("value", irBuiltIns.anyNType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val javaLangReflectMethod: IrClassSymbol =
|
||||||
|
createJavaLangReflectClass(FqName("java.lang.reflect.Method")) { klass ->
|
||||||
|
klass.addFunction("setAccessible", irBuiltIns.unitType).apply {
|
||||||
|
addValueParameter("isAccessible", irBuiltIns.booleanType)
|
||||||
|
}
|
||||||
|
klass.addFunction("invoke", irBuiltIns.anyNType).apply {
|
||||||
|
addValueParameter("receiver", irBuiltIns.anyNType)
|
||||||
|
addValueParameter {
|
||||||
|
name = Name.identifier("args")
|
||||||
|
type = irBuiltIns.arrayClass.typeWith(irBuiltIns.anyNType)
|
||||||
|
varargElementType = irBuiltIns.anyNType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val javaLangReflectConstructor: IrClassSymbol =
|
||||||
|
createJavaLangReflectClass(FqName("java.lang.reflect.Constructor")) { klass ->
|
||||||
|
klass.addFunction("setAccessible", irBuiltIns.unitType).apply {
|
||||||
|
addValueParameter("isAccessible", irBuiltIns.booleanType)
|
||||||
|
}
|
||||||
|
klass.addFunction("newInstance", irBuiltIns.anyNType).apply {
|
||||||
|
addValueParameter {
|
||||||
|
name = Name.identifier("args")
|
||||||
|
type = irBuiltIns.arrayClass.typeWith(irBuiltIns.anyNType)
|
||||||
|
varargElementType = irBuiltIns.anyNType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
val klass = context.ir.symbols.javaLangClass.owner
|
||||||
|
klass.addFunction("getDeclaredMethod", javaLangReflectMethod.defaultType.makeNullable()).apply {
|
||||||
|
addValueParameter("methodName", irBuiltIns.stringType.makeNullable())
|
||||||
|
addValueParameter {
|
||||||
|
name = Name.identifier("args")
|
||||||
|
type = irBuiltIns.arrayClass.typeWith(klass.defaultType).makeNullable()
|
||||||
|
varargElementType = klass.defaultType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
klass.addFunction("getDeclaredField", javaLangReflectField.defaultType).apply {
|
||||||
|
addValueParameter("fieldName", irBuiltIns.stringType)
|
||||||
|
}
|
||||||
|
klass.addFunction("getDeclaredConstructor", javaLangReflectConstructor.defaultType.makeNullable()).apply {
|
||||||
|
addValueParameter {
|
||||||
|
name = Name.identifier("args")
|
||||||
|
type = irBuiltIns.arrayClass.typeWith(klass.defaultType).makeNullable()
|
||||||
|
varargElementType = klass.defaultType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val javaLangReflectFieldSetAccessible: IrSimpleFunctionSymbol =
|
||||||
|
javaLangReflectField.functionByName("setAccessible")
|
||||||
|
|
||||||
|
val javaLangReflectMethodSetAccessible: IrSimpleFunctionSymbol =
|
||||||
|
javaLangReflectMethod.functionByName("setAccessible")
|
||||||
|
|
||||||
|
val javaLangReflectConstructorSetAccessible: IrSimpleFunctionSymbol =
|
||||||
|
javaLangReflectConstructor.functionByName("setAccessible")
|
||||||
|
|
||||||
|
val getDeclaredField: IrSimpleFunctionSymbol =
|
||||||
|
context.ir.symbols.javaLangClass.functionByName("getDeclaredField")
|
||||||
|
|
||||||
|
val getDeclaredMethod: IrSimpleFunctionSymbol =
|
||||||
|
context.ir.symbols.javaLangClass.functionByName("getDeclaredMethod")
|
||||||
|
|
||||||
|
val getDeclaredConstructor: IrSimpleFunctionSymbol =
|
||||||
|
context.ir.symbols.javaLangClass.functionByName("getDeclaredConstructor")
|
||||||
|
|
||||||
|
val javaLangReflectFieldGet: IrSimpleFunctionSymbol =
|
||||||
|
javaLangReflectField.functionByName("get")
|
||||||
|
|
||||||
|
val javaLangReflectFieldSet: IrSimpleFunctionSymbol =
|
||||||
|
javaLangReflectField.functionByName("set")
|
||||||
|
|
||||||
|
val javaLangReflectMethodInvoke: IrSimpleFunctionSymbol =
|
||||||
|
javaLangReflectMethod.functionByName("invoke")
|
||||||
|
|
||||||
|
val javaLangReflectConstructorNewInstance: IrSimpleFunctionSymbol =
|
||||||
|
javaLangReflectConstructor.functionByName("newInstance")
|
||||||
|
|
||||||
|
private fun createJavaLangReflectClass(
|
||||||
|
fqName: FqName,
|
||||||
|
classKind: ClassKind = ClassKind.CLASS,
|
||||||
|
classModality: Modality = Modality.FINAL,
|
||||||
|
classIsInline: Boolean = false,
|
||||||
|
block: (IrClass) -> Unit = {}
|
||||||
|
): IrClassSymbol =
|
||||||
|
context.irFactory.buildClass {
|
||||||
|
name = fqName.shortName()
|
||||||
|
kind = classKind
|
||||||
|
modality = classModality
|
||||||
|
isInline = classIsInline
|
||||||
|
}.apply {
|
||||||
|
parent = javaLangReflectPackage
|
||||||
|
createImplicitParameterDeclarationWithWrappedDescriptor()
|
||||||
|
block(this)
|
||||||
|
}.symbol
|
||||||
|
}
|
||||||
@@ -60,7 +60,6 @@ class JvmSymbols(
|
|||||||
private val kotlinReflectPackage: IrPackageFragment = createPackage(FqName("kotlin.reflect"))
|
private val kotlinReflectPackage: IrPackageFragment = createPackage(FqName("kotlin.reflect"))
|
||||||
private val javaLangPackage: IrPackageFragment = createPackage(FqName("java.lang"))
|
private val javaLangPackage: IrPackageFragment = createPackage(FqName("java.lang"))
|
||||||
private val javaLangInvokePackage: IrPackageFragment = createPackage(FqName("java.lang.invoke"))
|
private val javaLangInvokePackage: IrPackageFragment = createPackage(FqName("java.lang.invoke"))
|
||||||
private val javaLangReflectPackage: IrPackageFragment = createPackage(FqName("java.lang.reflect"))
|
|
||||||
private val javaUtilPackage: IrPackageFragment = createPackage(FqName("java.util"))
|
private val javaUtilPackage: IrPackageFragment = createPackage(FqName("java.util"))
|
||||||
|
|
||||||
|
|
||||||
@@ -105,7 +104,6 @@ class JvmSymbols(
|
|||||||
"kotlin.reflect" -> kotlinReflectPackage
|
"kotlin.reflect" -> kotlinReflectPackage
|
||||||
"java.lang" -> javaLangPackage
|
"java.lang" -> javaLangPackage
|
||||||
"java.lang.invoke" -> javaLangInvokePackage
|
"java.lang.invoke" -> javaLangInvokePackage
|
||||||
"java.lang.reflect" -> javaLangReflectPackage
|
|
||||||
"java.util" -> javaUtilPackage
|
"java.util" -> javaUtilPackage
|
||||||
"kotlin.internal" -> kotlinInternalPackage
|
"kotlin.internal" -> kotlinInternalPackage
|
||||||
else -> error("Other packages are not supported yet: $fqName")
|
else -> error("Other packages are not supported yet: $fqName")
|
||||||
@@ -232,103 +230,12 @@ class JvmSymbols(
|
|||||||
private val kDeclarationContainer: IrClassSymbol =
|
private val kDeclarationContainer: IrClassSymbol =
|
||||||
createClass(StandardNames.FqNames.kDeclarationContainer.toSafe(), ClassKind.INTERFACE, Modality.ABSTRACT)
|
createClass(StandardNames.FqNames.kDeclarationContainer.toSafe(), ClassKind.INTERFACE, Modality.ABSTRACT)
|
||||||
|
|
||||||
val javaLangReflectField: IrClassSymbol =
|
|
||||||
createClass(FqName("java.lang.reflect.Field")) { klass ->
|
|
||||||
klass.addFunction("setAccessible", irBuiltIns.unitType).apply {
|
|
||||||
addValueParameter("isAccessible", irBuiltIns.booleanType)
|
|
||||||
}
|
|
||||||
klass.addFunction("get", irBuiltIns.anyNType).apply {
|
|
||||||
addValueParameter("receiver", irBuiltIns.anyNType)
|
|
||||||
}
|
|
||||||
klass.addFunction("set", irBuiltIns.unitType).apply {
|
|
||||||
addValueParameter("receiver", irBuiltIns.anyNType)
|
|
||||||
addValueParameter("value", irBuiltIns.anyNType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val javaLangReflectMethod: IrClassSymbol =
|
|
||||||
createClass(FqName("java.lang.reflect.Method")) { klass ->
|
|
||||||
klass.addFunction("setAccessible", irBuiltIns.unitType).apply {
|
|
||||||
addValueParameter("isAccessible", irBuiltIns.booleanType)
|
|
||||||
}
|
|
||||||
klass.addFunction("invoke", irBuiltIns.anyNType).apply {
|
|
||||||
addValueParameter("receiver", irBuiltIns.anyNType)
|
|
||||||
addValueParameter {
|
|
||||||
name = Name.identifier("args")
|
|
||||||
type = irBuiltIns.arrayClass.typeWith(irBuiltIns.anyNType)
|
|
||||||
varargElementType = irBuiltIns.anyNType
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val javaLangReflectConstructor: IrClassSymbol =
|
|
||||||
createClass(FqName("java.lang.reflect.Constructor")) { klass ->
|
|
||||||
klass.addFunction("setAccessible", irBuiltIns.unitType).apply {
|
|
||||||
addValueParameter("isAccessible", irBuiltIns.booleanType)
|
|
||||||
}
|
|
||||||
klass.addFunction("newInstance", irBuiltIns.anyNType).apply {
|
|
||||||
addValueParameter {
|
|
||||||
name = Name.identifier("args")
|
|
||||||
type = irBuiltIns.arrayClass.typeWith(irBuiltIns.anyNType)
|
|
||||||
varargElementType = irBuiltIns.anyNType
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val javaLangReflectFieldSetAccessible: IrSimpleFunctionSymbol =
|
|
||||||
javaLangReflectField.functionByName("setAccessible")
|
|
||||||
|
|
||||||
val javaLangReflectMethodSetAccessible: IrSimpleFunctionSymbol =
|
|
||||||
javaLangReflectMethod.functionByName("setAccessible")
|
|
||||||
|
|
||||||
val javaLangReflectConstructorSetAccessible: IrSimpleFunctionSymbol =
|
|
||||||
javaLangReflectConstructor.functionByName("setAccessible")
|
|
||||||
|
|
||||||
val javaLangClass: IrClassSymbol =
|
val javaLangClass: IrClassSymbol =
|
||||||
createClass(FqName("java.lang.Class")) { klass ->
|
createClass(FqName("java.lang.Class")) { klass ->
|
||||||
klass.addTypeParameter("T", irBuiltIns.anyNType, Variance.INVARIANT)
|
klass.addTypeParameter("T", irBuiltIns.anyNType, Variance.INVARIANT)
|
||||||
klass.addFunction("desiredAssertionStatus", irBuiltIns.booleanType)
|
klass.addFunction("desiredAssertionStatus", irBuiltIns.booleanType)
|
||||||
klass.addFunction("getDeclaredMethod", javaLangReflectMethod.defaultType.makeNullable()).apply {
|
|
||||||
addValueParameter("methodName", irBuiltIns.stringType.makeNullable())
|
|
||||||
addValueParameter {
|
|
||||||
name = Name.identifier("args")
|
|
||||||
type = irBuiltIns.arrayClass.typeWith(klass.defaultType).makeNullable()
|
|
||||||
varargElementType = klass.defaultType
|
|
||||||
}
|
|
||||||
}
|
|
||||||
klass.addFunction("getDeclaredField", javaLangReflectField.defaultType).apply {
|
|
||||||
addValueParameter("fieldName", irBuiltIns.stringType)
|
|
||||||
}
|
|
||||||
klass.addFunction("getDeclaredConstructor", javaLangReflectConstructor.defaultType.makeNullable()).apply {
|
|
||||||
addValueParameter {
|
|
||||||
name = Name.identifier("args")
|
|
||||||
type = irBuiltIns.arrayClass.typeWith(klass.defaultType).makeNullable()
|
|
||||||
varargElementType = klass.defaultType
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val getDeclaredField: IrSimpleFunctionSymbol =
|
|
||||||
javaLangClass.functionByName("getDeclaredField")
|
|
||||||
|
|
||||||
val getDeclaredMethod: IrSimpleFunctionSymbol =
|
|
||||||
javaLangClass.functionByName("getDeclaredMethod")
|
|
||||||
|
|
||||||
val getDeclaredConstructor: IrSimpleFunctionSymbol =
|
|
||||||
javaLangClass.functionByName("getDeclaredConstructor")
|
|
||||||
|
|
||||||
val javaLangReflectFieldGet: IrSimpleFunctionSymbol =
|
|
||||||
javaLangReflectField.functionByName("get")
|
|
||||||
|
|
||||||
val javaLangReflectFieldSet: IrSimpleFunctionSymbol =
|
|
||||||
javaLangReflectField.functionByName("set")
|
|
||||||
|
|
||||||
val javaLangReflectMethodInvoke: IrSimpleFunctionSymbol =
|
|
||||||
javaLangReflectMethod.functionByName("invoke")
|
|
||||||
|
|
||||||
val javaLangReflectConstructorNewInstance: IrSimpleFunctionSymbol =
|
|
||||||
javaLangReflectConstructor.functionByName("newInstance")
|
|
||||||
|
|
||||||
private val javaLangDeprecatedWithDeprecatedFlag: IrClassSymbol =
|
private val javaLangDeprecatedWithDeprecatedFlag: IrClassSymbol =
|
||||||
createClass(FqName("java.lang.Deprecated"), classKind = ClassKind.ANNOTATION_CLASS) { klass ->
|
createClass(FqName("java.lang.Deprecated"), classKind = ClassKind.ANNOTATION_CLASS) { klass ->
|
||||||
klass.addConstructor { isPrimary = true }
|
klass.addConstructor { isPrimary = true }
|
||||||
@@ -630,6 +537,10 @@ class JvmSymbols(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val javaLangReflectSymbols: JvmReflectSymbols by lazy {
|
||||||
|
JvmReflectSymbols(context)
|
||||||
|
}
|
||||||
|
|
||||||
override val functionAdapter: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.FunctionAdapter"), ClassKind.INTERFACE) { klass ->
|
override val functionAdapter: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.FunctionAdapter"), ClassKind.INTERFACE) { klass ->
|
||||||
klass.addFunction("getFunctionDelegate", irBuiltIns.functionClass.starProjectedType, Modality.ABSTRACT)
|
klass.addFunction("getFunctionDelegate", irBuiltIns.functionClass.starProjectedType, Modality.ABSTRACT)
|
||||||
}
|
}
|
||||||
@@ -1198,8 +1109,8 @@ class JvmSymbols(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun IrClassSymbol.functionByName(name: String): IrSimpleFunctionSymbol =
|
fun IrClassSymbol.functionByName(name: String): IrSimpleFunctionSymbol =
|
||||||
functions.single { it.owner.name.asString() == name }
|
functions.single { it.owner.name.asString() == name }
|
||||||
|
|
||||||
private fun IrClassSymbol.fieldByName(name: String): IrFieldSymbol =
|
fun IrClassSymbol.fieldByName(name: String): IrFieldSymbol =
|
||||||
fields.single { it.owner.name.asString() == name }
|
fields.single { it.owner.name.asString() == name }
|
||||||
|
|||||||
Reference in New Issue
Block a user