IrMemberAccessExpression::getTypeArgument
This commit is contained in:
committed by
Dmitry Petrov
parent
89de2a2ebe
commit
7ae6c55ddb
@@ -102,15 +102,15 @@ fun IrBuilderWithScope.irNotEquals(arg1: IrExpression, arg2: IrExpression) =
|
||||
arg1, arg2))
|
||||
|
||||
fun IrBuilderWithScope.irGet(receiver: IrExpression, property: PropertyDescriptor): IrExpression =
|
||||
IrGetterCallImpl(startOffset, endOffset, property.getter!!, receiver, null, IrStatementOrigin.GET_PROPERTY)
|
||||
IrGetterCallImpl(startOffset, endOffset, property.getter!!, null, receiver, null, IrStatementOrigin.GET_PROPERTY)
|
||||
|
||||
fun IrBuilderWithScope.irCall(callee: CallableDescriptor) =
|
||||
IrCallImpl(startOffset, endOffset, callee.returnType!!, callee)
|
||||
IrCallImpl(startOffset, endOffset, callee.returnType!!, callee, null)
|
||||
|
||||
fun IrBuilderWithScope.irCallOp(callee: CallableDescriptor, dispatchReceiver: IrExpression, argument: IrExpression) =
|
||||
IrCallImpl(startOffset, endOffset, callee.returnType!!, callee).apply {
|
||||
IrCallImpl(startOffset, endOffset, callee.returnType!!, callee, null).apply {
|
||||
this.dispatchReceiver = dispatchReceiver
|
||||
putArgument(0, argument)
|
||||
putValueArgument(0, argument)
|
||||
}
|
||||
|
||||
fun IrBuilderWithScope.irNotIs(argument: IrExpression, type: KotlinType) =
|
||||
|
||||
+11
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.kotlin.psi2ir.generators
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.resolve.calls.callResolverUtil.getSuperCallExpressio
|
||||
import org.jetbrains.kotlin.resolve.calls.callUtil.isSafeCall
|
||||
import org.jetbrains.kotlin.resolve.calls.model.*
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.*
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import java.lang.AssertionError
|
||||
|
||||
fun StatementGenerator.generateReceiverOrNull(ktDefaultElement: KtElement, receiver: ReceiverValue?): IntermediateValue? =
|
||||
@@ -150,6 +152,15 @@ fun StatementGenerator.pregenerateCall(resolvedCall: ResolvedCall<*>): CallBuild
|
||||
return call
|
||||
}
|
||||
|
||||
fun getTypeArguments(resolvedCall: ResolvedCall<*>?): Map<TypeParameterDescriptor, KotlinType>? {
|
||||
if (resolvedCall == null) return null
|
||||
|
||||
val descriptor = resolvedCall.resultingDescriptor
|
||||
if (descriptor.typeParameters.isEmpty()) return null
|
||||
|
||||
return resolvedCall.typeArguments
|
||||
}
|
||||
|
||||
private fun StatementGenerator.pregenerateValueArguments(call: CallBuilder, resolvedCall: ResolvedCall<*>) {
|
||||
resolvedCall.valueArgumentsByIndex!!.forEachIndexed { index, valueArgument ->
|
||||
val valueParameter = call.descriptor.valueParameters[index]
|
||||
|
||||
+1
-1
@@ -150,7 +150,7 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen
|
||||
val superQualifier = getSuperQualifier(resolvedCall)
|
||||
|
||||
return SimplePropertyLValue(context, scope, ktLeft.startOffset, ktLeft.endOffset, origin, descriptor,
|
||||
propertyReceiver, superQualifier)
|
||||
getTypeArguments(resolvedCall), propertyReceiver, superQualifier)
|
||||
}
|
||||
|
||||
private fun isValInitializationInConstructor(descriptor: PropertyDescriptor, resolvedCall: ResolvedCall<*>): Boolean =
|
||||
|
||||
@@ -224,7 +224,7 @@ class BodyGenerator(val scopeOwner: DeclarationDescriptor, override val context:
|
||||
|
||||
private fun generateAnySuperConstructorCAll(irBlockBody: IrBlockBodyImpl, ktElement: KtElement) {
|
||||
val anyConstructor = context.builtIns.any.constructors.single()
|
||||
irBlockBody.statements.add(IrDelegatingConstructorCallImpl(ktElement.startOffset, ktElement.endOffset, anyConstructor))
|
||||
irBlockBody.statements.add(IrDelegatingConstructorCallImpl(ktElement.startOffset, ktElement.endOffset, anyConstructor, null))
|
||||
}
|
||||
|
||||
private fun generateEnumSuperConstructorCall(irBlockBody: IrBlockBodyImpl, ktElement: KtElement) {
|
||||
|
||||
@@ -37,7 +37,7 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE
|
||||
generatePropertyGetterCall(descriptor, startOffset, endOffset, call)
|
||||
is VariableDescriptor ->
|
||||
call.callReceiver.call { dispatchReceiverValue, extensionReceiverValue ->
|
||||
generateGetVariable(startOffset, endOffset, descriptor, origin)
|
||||
generateGetVariable(startOffset, endOffset, descriptor, getTypeArguments(call.original), origin)
|
||||
}
|
||||
is FunctionDescriptor ->
|
||||
generateFunctionCall(descriptor, startOffset, endOffset, origin, call)
|
||||
@@ -46,9 +46,12 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE
|
||||
}
|
||||
}
|
||||
|
||||
fun generateGetVariable(startOffset: Int, endOffset: Int, descriptor: VariableDescriptor, origin: IrStatementOrigin? = null) =
|
||||
fun generateGetVariable(startOffset: Int, endOffset: Int,
|
||||
descriptor: VariableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
origin: IrStatementOrigin? = null) =
|
||||
if (descriptor is LocalVariableDescriptor && descriptor.isDelegated)
|
||||
IrCallImpl(startOffset, endOffset, descriptor.type, descriptor.getter!!, origin ?: IrStatementOrigin.GET_LOCAL_PROPERTY)
|
||||
IrCallImpl(startOffset, endOffset, descriptor.type, descriptor.getter!!, typeArguments, origin ?: IrStatementOrigin.GET_LOCAL_PROPERTY)
|
||||
else
|
||||
IrGetVariableImpl(startOffset, endOffset, descriptor, origin)
|
||||
|
||||
@@ -57,7 +60,7 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE
|
||||
if (descriptor !is ConstructorDescriptor) throw AssertionError("Constructor expected: $descriptor")
|
||||
|
||||
return call.callReceiver.call { dispatchReceiver, extensionReceiver ->
|
||||
val irCall = IrDelegatingConstructorCallImpl(startOffset, endOffset, descriptor)
|
||||
val irCall = IrDelegatingConstructorCallImpl(startOffset, endOffset, descriptor, getTypeArguments(call.original))
|
||||
irCall.dispatchReceiver = dispatchReceiver?.load()
|
||||
irCall.extensionReceiver = extensionReceiver?.load()
|
||||
addParametersToCall(startOffset, endOffset, call, irCall, descriptor.returnType)
|
||||
@@ -88,6 +91,7 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE
|
||||
return call.callReceiver.call { dispatchReceiverValue, extensionReceiverValue ->
|
||||
descriptor.getter?.let { getter ->
|
||||
IrGetterCallImpl(startOffset, endOffset, getter,
|
||||
getTypeArguments(call.original),
|
||||
dispatchReceiverValue?.load(),
|
||||
extensionReceiverValue?.load(),
|
||||
IrStatementOrigin.GET_PROPERTY,
|
||||
@@ -108,7 +112,7 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE
|
||||
val returnType = descriptor.returnType!!
|
||||
|
||||
return call.callReceiver.call { dispatchReceiverValue, extensionReceiverValue ->
|
||||
val irCall = IrCallImpl(startOffset, endOffset, returnType, descriptor, origin, call.superQualifier)
|
||||
val irCall = IrCallImpl(startOffset, endOffset, returnType, descriptor, getTypeArguments(call.original), origin, call.superQualifier)
|
||||
irCall.dispatchReceiver = dispatchReceiverValue?.load()
|
||||
irCall.extensionReceiver = extensionReceiverValue?.load()
|
||||
|
||||
@@ -123,7 +127,7 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE
|
||||
else {
|
||||
val valueArguments = call.getValueArgumentsInParameterOrder()
|
||||
for ((index, valueArgument) in valueArguments.withIndex()) {
|
||||
irCall.putArgument(index, valueArgument)
|
||||
irCall.putValueArgument(index, valueArgument)
|
||||
}
|
||||
irCall
|
||||
}
|
||||
@@ -159,7 +163,7 @@ class CallGenerator(statementGenerator: StatementGenerator): StatementGeneratorE
|
||||
|
||||
resolvedCall.valueArgumentsByIndex!!.forEachIndexed { index, valueArgument ->
|
||||
val valueParameter = valueParameters[index]
|
||||
irCall.putArgument(index, irArgumentValues[valueParameter]?.load())
|
||||
irCall.putValueArgument(index, irArgumentValues[valueParameter]?.load())
|
||||
}
|
||||
|
||||
irBlock.statements.add(irCall)
|
||||
|
||||
@@ -163,7 +163,7 @@ class ClassGenerator(val declarationGenerator: DeclarationGenerator) : Generator
|
||||
private fun generateDelegateFunctionBody(irDelegate: IrFieldImpl, delegated: FunctionDescriptor, overridden: FunctionDescriptor): IrBlockBodyImpl {
|
||||
val irBlockBody = IrBlockBodyImpl(irDelegate.startOffset, irDelegate.endOffset)
|
||||
val returnType = overridden.returnType!!
|
||||
val irCall = IrCallImpl(irDelegate.startOffset, irDelegate.endOffset, returnType, overridden)
|
||||
val irCall = IrCallImpl(irDelegate.startOffset, irDelegate.endOffset, returnType, overridden, null)
|
||||
irCall.dispatchReceiver = IrGetVariableImpl(irDelegate.startOffset, irDelegate.endOffset, irDelegate.descriptor)
|
||||
irCall.extensionReceiver = delegated.extensionReceiverParameter?.let { extensionReceiver ->
|
||||
IrGetExtensionReceiverImpl(irDelegate.startOffset, irDelegate.endOffset, extensionReceiver)
|
||||
|
||||
+1
-1
@@ -89,7 +89,7 @@ class DelegatedPropertyGenerator(override val context: GeneratorContext) : Gener
|
||||
|
||||
private fun createCallableReference(ktElement: KtElement, type: KotlinType, referencedDescriptor: CallableDescriptor): IrCallableReference =
|
||||
IrCallableReferenceImpl(ktElement.startOffset, ktElement.endOffset, type,
|
||||
referencedDescriptor, IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE)
|
||||
referencedDescriptor, null, IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE)
|
||||
|
||||
fun generateLocalDelegatedProperty(
|
||||
ktProperty: KtProperty,
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ class LocalClassGenerator(statementGenerator: StatementGenerator): StatementGene
|
||||
}
|
||||
|
||||
irBlock.statements.add(IrCallImpl(ktObjectLiteral.startOffset, ktObjectLiteral.endOffset, objectLiteralType,
|
||||
objectConstructor, IrStatementOrigin.OBJECT_LITERAL))
|
||||
objectConstructor, null, IrStatementOrigin.OBJECT_LITERAL))
|
||||
|
||||
return irBlock
|
||||
}
|
||||
|
||||
+2
-2
@@ -41,7 +41,7 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
|
||||
irBlock.statements.add(irFun)
|
||||
|
||||
irBlock.statements.add(IrCallableReferenceImpl(ktLambda.startOffset, ktLambda.endOffset, lambdaExpressionType,
|
||||
lambdaDescriptor, IrStatementOrigin.LAMBDA))
|
||||
lambdaDescriptor, null, IrStatementOrigin.LAMBDA))
|
||||
|
||||
return irBlock
|
||||
}
|
||||
@@ -59,7 +59,7 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
|
||||
irBlock.statements.add(irFun)
|
||||
|
||||
irBlock.statements.add(IrCallableReferenceImpl(ktFun.startOffset, ktFun.endOffset, funExpressionType,
|
||||
irFun.descriptor, IrStatementOrigin.ANONYMOUS_FUNCTION))
|
||||
irFun.descriptor, null, IrStatementOrigin.ANONYMOUS_FUNCTION))
|
||||
|
||||
irBlock
|
||||
}
|
||||
|
||||
+2
-2
@@ -50,8 +50,8 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
|
||||
fun generateCallableReference(ktCallableReference: KtCallableReferenceExpression): IrExpression {
|
||||
val resolvedCall = getResolvedCall(ktCallableReference.callableReference)!!
|
||||
val irCallableRef = IrCallableReferenceImpl(ktCallableReference.startOffset, ktCallableReference.endOffset,
|
||||
getInferredTypeWithImplicitCastsOrFail(ktCallableReference),
|
||||
resolvedCall.resultingDescriptor)
|
||||
getInferredTypeWithImplicitCastsOrFail(ktCallableReference),
|
||||
resolvedCall.resultingDescriptor, null)
|
||||
resolvedCall.dispatchReceiver?.let { dispatchReceiver ->
|
||||
if (dispatchReceiver !is TransientReceiver) {
|
||||
irCallableRef.dispatchReceiver = statementGenerator.generateReceiver(ktCallableReference, dispatchReceiver).load()
|
||||
|
||||
+2
-1
@@ -275,7 +275,8 @@ class StatementGenerator(
|
||||
CallGenerator(this).generateCall(expression.startOffset, expression.endOffset, pregenerateCall(resolvedCall!!))
|
||||
}
|
||||
is VariableDescriptor ->
|
||||
CallGenerator(this).generateGetVariable(expression.startOffset, expression.endOffset, descriptor)
|
||||
CallGenerator(this).generateGetVariable(expression.startOffset, expression.endOffset, descriptor,
|
||||
getTypeArguments(resolvedCall))
|
||||
else ->
|
||||
IrErrorExpressionImpl(
|
||||
expression.startOffset, expression.endOffset, getInferredTypeWithImplicitCastsOrFail(expression),
|
||||
|
||||
+3
-3
@@ -31,11 +31,11 @@ class DelegatedLocalPropertyLValue(
|
||||
override val type: KotlinType get() = descriptor.type
|
||||
|
||||
override fun load(): IrExpression =
|
||||
IrCallImpl(startOffset, endOffset, descriptor.type, descriptor.getter!!, origin)
|
||||
IrCallImpl(startOffset, endOffset, descriptor.type, descriptor.getter!!, null, origin)
|
||||
|
||||
override fun store(irExpression: IrExpression): IrExpression =
|
||||
IrCallImpl(startOffset, endOffset, descriptor.type, descriptor.setter!!, origin).apply {
|
||||
putArgument(0, irExpression)
|
||||
IrCallImpl(startOffset, endOffset, descriptor.type, descriptor.setter!!, null, origin).apply {
|
||||
putValueArgument(0, irExpression)
|
||||
}
|
||||
|
||||
override fun assign(withLValue: (LValue) -> IrExpression): IrExpression =
|
||||
|
||||
+5
-3
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.psi2ir.intermediate
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.*
|
||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
||||
@@ -31,6 +32,7 @@ class SimplePropertyLValue(
|
||||
val endOffset: Int,
|
||||
val origin: IrStatementOrigin?,
|
||||
val descriptor: PropertyDescriptor,
|
||||
val typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
val callReceiver: CallReceiver,
|
||||
val superQualifier: ClassDescriptor?
|
||||
) : LValue, AssignmentReceiver {
|
||||
@@ -39,7 +41,7 @@ class SimplePropertyLValue(
|
||||
override fun load(): IrExpression =
|
||||
callReceiver.call { dispatchReceiverValue, extensionReceiverValue ->
|
||||
descriptor.getter?.let { getter ->
|
||||
IrGetterCallImpl(startOffset, endOffset, getter,
|
||||
IrGetterCallImpl(startOffset, endOffset, getter, typeArguments,
|
||||
dispatchReceiverValue?.load(),
|
||||
extensionReceiverValue?.load(),
|
||||
origin,
|
||||
@@ -51,7 +53,7 @@ class SimplePropertyLValue(
|
||||
override fun store(irExpression: IrExpression) =
|
||||
callReceiver.call { dispatchReceiverValue, extensionReceiverValue ->
|
||||
descriptor.setter?.let { setter ->
|
||||
IrSetterCallImpl(startOffset, endOffset, setter,
|
||||
IrSetterCallImpl(startOffset, endOffset, setter, typeArguments,
|
||||
dispatchReceiverValue?.load(),
|
||||
extensionReceiverValue?.load(),
|
||||
irExpression,
|
||||
@@ -74,7 +76,7 @@ class SimplePropertyLValue(
|
||||
val extensionReceiverValue2 = extensionReceiverTmp?.let { VariableLValue(it) }
|
||||
|
||||
val irResultExpression = withLValue(
|
||||
SimplePropertyLValue(context, scope, startOffset, endOffset, origin, descriptor,
|
||||
SimplePropertyLValue(context, scope, startOffset, endOffset, origin, descriptor, typeArguments,
|
||||
SimpleCallReceiver(dispatchReceiverValue2, extensionReceiverValue2),
|
||||
superQualifier)
|
||||
)
|
||||
|
||||
+2
-2
@@ -47,9 +47,9 @@ class InsertImplicitCasts(val builtIns: KotlinBuiltIns): IrElementTransformerVoi
|
||||
dispatchReceiver = dispatchReceiver?.cast(descriptor.dispatchReceiverParameter?.type)
|
||||
extensionReceiver = extensionReceiver?.cast(descriptor.extensionReceiverParameter?.type)
|
||||
for (index in descriptor.valueParameters.indices) {
|
||||
val argument = getArgument(index) ?: continue
|
||||
val argument = getValueArgument(index) ?: continue
|
||||
val parameterType = descriptor.valueParameters[index].type
|
||||
putArgument(index, argument.cast(parameterType))
|
||||
putValueArgument(index, argument.cast(parameterType))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+18
-4
@@ -17,7 +17,9 @@
|
||||
package org.jetbrains.kotlin.ir.expressions
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
|
||||
interface IrMemberAccessExpression : IrDeclarationReference {
|
||||
var dispatchReceiver: IrExpression?
|
||||
@@ -26,15 +28,27 @@ interface IrMemberAccessExpression : IrDeclarationReference {
|
||||
val origin: IrStatementOrigin?
|
||||
override val descriptor: CallableDescriptor
|
||||
|
||||
fun getArgument(index: Int): IrExpression?
|
||||
fun putArgument(index: Int, valueArgument: IrExpression?)
|
||||
fun removeArgument(index: Int)
|
||||
fun getTypeArgument(typeParameterDescriptor: TypeParameterDescriptor): KotlinType?
|
||||
|
||||
fun getValueArgument(index: Int): IrExpression?
|
||||
fun putValueArgument(index: Int, valueArgument: IrExpression?)
|
||||
fun removeValueArgument(index: Int)
|
||||
}
|
||||
|
||||
fun IrMemberAccessExpression.getValueArgument(valueParameterDescriptor: ValueParameterDescriptor) =
|
||||
getValueArgument(valueParameterDescriptor.index)
|
||||
|
||||
fun IrMemberAccessExpression.putValueArgument(valueParameterDescriptor: ValueParameterDescriptor, valueArgument: IrExpression?) {
|
||||
putValueArgument(valueParameterDescriptor.index, valueArgument)
|
||||
}
|
||||
|
||||
fun IrMemberAccessExpression.removeValueArgument(valueParameterDescriptor: ValueParameterDescriptor) {
|
||||
removeValueArgument(valueParameterDescriptor.index)
|
||||
}
|
||||
|
||||
inline fun <T : IrMemberAccessExpression> T.mapValueParameters(transform: (ValueParameterDescriptor) -> IrExpression): T {
|
||||
descriptor.valueParameters.forEach {
|
||||
putArgument(it.index, transform(it))
|
||||
putValueArgument(it.index, transform(it))
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.ir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
@@ -28,9 +29,10 @@ class IrCallImpl(
|
||||
endOffset: Int,
|
||||
type: KotlinType,
|
||||
override val descriptor: CallableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
override val origin: IrStatementOrigin? = null,
|
||||
override val superQualifier: ClassDescriptor? = null
|
||||
) : IrCallWithIndexedArgumentsBase(startOffset, endOffset, type, descriptor.valueParameters.size), IrCall {
|
||||
) : IrCallWithIndexedArgumentsBase(startOffset, endOffset, type, descriptor.valueParameters.size, typeArguments), IrCall {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
|
||||
visitor.visitCall(this, data)
|
||||
}
|
||||
+6
-4
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
@@ -26,22 +27,23 @@ import java.lang.AssertionError
|
||||
abstract class IrCallWithIndexedArgumentsBase(
|
||||
startOffset: Int, endOffset: Int, type: KotlinType,
|
||||
numArguments: Int,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
override val origin: IrStatementOrigin? = null
|
||||
) : IrMemberAccessExpressionBase(startOffset, endOffset, type) {
|
||||
) : IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArguments) {
|
||||
protected val argumentsByParameterIndex =
|
||||
arrayOfNulls<IrExpression>(numArguments)
|
||||
|
||||
override fun getArgument(index: Int): IrExpression? =
|
||||
override fun getValueArgument(index: Int): IrExpression? =
|
||||
argumentsByParameterIndex[index]
|
||||
|
||||
override fun putArgument(index: Int, valueArgument: IrExpression?) {
|
||||
override fun putValueArgument(index: Int, valueArgument: IrExpression?) {
|
||||
if (index >= argumentsByParameterIndex.size) {
|
||||
throw AssertionError("$this: No such argument slot: $index")
|
||||
}
|
||||
argumentsByParameterIndex[index] = valueArgument
|
||||
}
|
||||
|
||||
override fun removeArgument(index: Int) {
|
||||
override fun removeValueArgument(index: Int) {
|
||||
argumentsByParameterIndex[index] = null
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -17,6 +17,7 @@
|
||||
package org.jetbrains.kotlin.ir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCallableReference
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
@@ -27,8 +28,10 @@ class IrCallableReferenceImpl(
|
||||
endOffset: Int,
|
||||
type: KotlinType,
|
||||
override val descriptor: CallableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
override val origin: IrStatementOrigin? = null
|
||||
) : IrCallWithIndexedArgumentsBase(startOffset, endOffset, type, descriptor.valueParameters.size, origin), IrCallableReference {
|
||||
) : IrCallWithIndexedArgumentsBase(startOffset, endOffset, type, descriptor.valueParameters.size, typeArguments, origin),
|
||||
IrCallableReference {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||
return visitor.visitCallableReference(this, data)
|
||||
}
|
||||
|
||||
+6
-2
@@ -17,14 +17,18 @@
|
||||
package org.jetbrains.kotlin.ir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.IrDelegatingConstructorCall
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
|
||||
class IrDelegatingConstructorCallImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
override val descriptor: ConstructorDescriptor
|
||||
) : IrCallWithIndexedArgumentsBase(startOffset, endOffset, descriptor.returnType, descriptor.valueParameters.size), IrDelegatingConstructorCall {
|
||||
override val descriptor: ConstructorDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?
|
||||
) : IrCallWithIndexedArgumentsBase(startOffset, endOffset, descriptor.returnType, descriptor.valueParameters.size, typeArguments),
|
||||
IrDelegatingConstructorCall {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||
return visitor.visitDelegatingConstructorCall(this, data)
|
||||
}
|
||||
|
||||
+2
-1
@@ -26,7 +26,8 @@ class IrEnumConstructorCallImpl(
|
||||
endOffset: Int,
|
||||
override val descriptor: ConstructorDescriptor,
|
||||
override val enumEntryDescriptor: ClassDescriptor? = null
|
||||
) : IrCallWithIndexedArgumentsBase(startOffset, endOffset, descriptor.returnType, descriptor.valueParameters.size), IrEnumConstructorCall {
|
||||
) : IrCallWithIndexedArgumentsBase(startOffset, endOffset, descriptor.returnType, descriptor.valueParameters.size, null),
|
||||
IrEnumConstructorCall {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||
return visitor.visitEnumConstructorCall(this, data)
|
||||
}
|
||||
|
||||
+6
-1
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.ir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
@@ -25,11 +26,15 @@ import org.jetbrains.kotlin.types.KotlinType
|
||||
abstract class IrMemberAccessExpressionBase(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
type: KotlinType
|
||||
type: KotlinType,
|
||||
private val typeArguments: Map<TypeParameterDescriptor, KotlinType>?
|
||||
) : IrExpressionBase(startOffset, endOffset, type), IrMemberAccessExpression {
|
||||
override var dispatchReceiver: IrExpression? = null
|
||||
override var extensionReceiver: IrExpression? = null
|
||||
|
||||
override fun getTypeArgument(typeParameterDescriptor: TypeParameterDescriptor): KotlinType? =
|
||||
typeArguments?.get(typeParameterDescriptor)
|
||||
|
||||
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||
dispatchReceiver?.accept(visitor, data)
|
||||
extensionReceiver?.accept(visitor, data)
|
||||
|
||||
+12
-7
@@ -18,12 +18,14 @@ package org.jetbrains.kotlin.ir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import java.lang.UnsupportedOperationException
|
||||
|
||||
abstract class IrPrimitiveCallBase(
|
||||
@@ -47,7 +49,10 @@ abstract class IrPrimitiveCallBase(
|
||||
throw UnsupportedOperationException("Operator call expression can't have a receiver")
|
||||
}
|
||||
|
||||
override fun removeArgument(index: Int) {
|
||||
override fun getTypeArgument(typeParameterDescriptor: TypeParameterDescriptor): KotlinType? =
|
||||
null // IR primitives have no type parameters
|
||||
|
||||
override fun removeValueArgument(index: Int) {
|
||||
throw AssertionError("Operator call expression can't have a default argument")
|
||||
}
|
||||
|
||||
@@ -63,9 +68,9 @@ abstract class IrPrimitiveCallBase(
|
||||
|
||||
class IrNullaryPrimitiveImpl constructor(startOffset: Int, endOffset: Int, origin: IrStatementOrigin, descriptor: CallableDescriptor) :
|
||||
IrPrimitiveCallBase(startOffset, endOffset, origin, descriptor) {
|
||||
override fun getArgument(index: Int): IrExpression? = null
|
||||
override fun getValueArgument(index: Int): IrExpression? = null
|
||||
|
||||
override fun putArgument(index: Int, valueArgument: IrExpression?) {
|
||||
override fun putValueArgument(index: Int, valueArgument: IrExpression?) {
|
||||
throw UnsupportedOperationException("Nullary operator $descriptor doesn't have arguments")
|
||||
}
|
||||
|
||||
@@ -88,14 +93,14 @@ class IrUnaryPrimitiveImpl private constructor(startOffset: Int, endOffset: Int,
|
||||
|
||||
lateinit var argument: IrExpression
|
||||
|
||||
override fun getArgument(index: Int): IrExpression? {
|
||||
override fun getValueArgument(index: Int): IrExpression? {
|
||||
return when (index) {
|
||||
ARGUMENT0 -> argument
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
override fun putArgument(index: Int, valueArgument: IrExpression?) {
|
||||
override fun putValueArgument(index: Int, valueArgument: IrExpression?) {
|
||||
when (index) {
|
||||
ARGUMENT0 -> argument = valueArgument ?: throw AssertionError("Primitive call $descriptor argument is null")
|
||||
else -> throw AssertionError("Primitive call $descriptor: no such argument index $index")
|
||||
@@ -124,7 +129,7 @@ class IrBinaryPrimitiveImpl(startOffset: Int, endOffset: Int, origin: IrStatemen
|
||||
lateinit var argument0: IrExpression
|
||||
lateinit var argument1: IrExpression
|
||||
|
||||
override fun getArgument(index: Int): IrExpression? {
|
||||
override fun getValueArgument(index: Int): IrExpression? {
|
||||
return when (index) {
|
||||
ARGUMENT0 -> argument0
|
||||
ARGUMENT1 -> argument1
|
||||
@@ -132,7 +137,7 @@ class IrBinaryPrimitiveImpl(startOffset: Int, endOffset: Int, origin: IrStatemen
|
||||
}
|
||||
}
|
||||
|
||||
override fun putArgument(index: Int, valueArgument: IrExpression?) {
|
||||
override fun putValueArgument(index: Int, valueArgument: IrExpression?) {
|
||||
val argument = valueArgument ?: throw AssertionError("Primitive call $descriptor argument is null")
|
||||
when (index) {
|
||||
ARGUMENT0 -> argument0 = argument
|
||||
|
||||
+33
-20
@@ -18,19 +18,22 @@ package org.jetbrains.kotlin.ir.expressions.impl
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||
import org.jetbrains.kotlin.ir.expressions.IrCall
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import java.lang.AssertionError
|
||||
import java.lang.UnsupportedOperationException
|
||||
|
||||
abstract class IrPropertyAccessorCallBase(
|
||||
startOffset: Int, endOffset: Int,
|
||||
override val descriptor: CallableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
override val origin: IrStatementOrigin? = null,
|
||||
override val superQualifier: ClassDescriptor? = null
|
||||
) : IrMemberAccessExpressionBase(startOffset, endOffset, descriptor.returnType!!), IrCall {
|
||||
) : IrMemberAccessExpressionBase(startOffset, endOffset, descriptor.returnType!!, typeArguments), IrCall {
|
||||
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
|
||||
return visitor.visitCall(this, data)
|
||||
}
|
||||
@@ -40,58 +43,68 @@ abstract class IrPropertyAccessorCallBase(
|
||||
}
|
||||
}
|
||||
|
||||
class IrGetterCallImpl(startOffset: Int, endOffset: Int, descriptor: CallableDescriptor,
|
||||
origin: IrStatementOrigin? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : IrPropertyAccessorCallBase(startOffset, endOffset, descriptor, origin, superQualifier), IrCall {
|
||||
constructor(startOffset: Int, endOffset: Int, descriptor: CallableDescriptor,
|
||||
class IrGetterCallImpl(
|
||||
startOffset: Int, endOffset: Int,
|
||||
descriptor: CallableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
origin: IrStatementOrigin? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : IrPropertyAccessorCallBase(startOffset, endOffset, descriptor, typeArguments, origin, superQualifier), IrCall {
|
||||
constructor(startOffset: Int, endOffset: Int,
|
||||
descriptor: CallableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
dispatchReceiver: IrExpression?,
|
||||
extensionReceiver: IrExpression?,
|
||||
origin: IrStatementOrigin? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : this(startOffset, endOffset, descriptor, origin, superQualifier) {
|
||||
) : this(startOffset, endOffset, descriptor, typeArguments, origin, superQualifier) {
|
||||
this.dispatchReceiver = dispatchReceiver
|
||||
this.extensionReceiver = extensionReceiver
|
||||
}
|
||||
|
||||
override fun getArgument(index: Int): IrExpression? = null
|
||||
override fun getValueArgument(index: Int): IrExpression? = null
|
||||
|
||||
override fun putArgument(index: Int, valueArgument: IrExpression?) {
|
||||
override fun putValueArgument(index: Int, valueArgument: IrExpression?) {
|
||||
throw UnsupportedOperationException("Property setter call has no arguments")
|
||||
}
|
||||
|
||||
override fun removeArgument(index: Int) {
|
||||
override fun removeValueArgument(index: Int) {
|
||||
throw UnsupportedOperationException("Property getter call has no arguments")
|
||||
}
|
||||
}
|
||||
|
||||
class IrSetterCallImpl(startOffset: Int, endOffset: Int, descriptor: CallableDescriptor,
|
||||
origin: IrStatementOrigin? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : IrPropertyAccessorCallBase(startOffset, endOffset, descriptor, origin, superQualifier), IrCall {
|
||||
constructor(startOffset: Int, endOffset: Int, descriptor: CallableDescriptor,
|
||||
class IrSetterCallImpl(
|
||||
startOffset: Int, endOffset: Int,
|
||||
descriptor: CallableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
origin: IrStatementOrigin? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : IrPropertyAccessorCallBase(startOffset, endOffset, descriptor, typeArguments, origin, superQualifier), IrCall {
|
||||
constructor(startOffset: Int, endOffset: Int,
|
||||
descriptor: CallableDescriptor,
|
||||
typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
|
||||
dispatchReceiver: IrExpression?,
|
||||
extensionReceiver: IrExpression?,
|
||||
argument: IrExpression,
|
||||
origin: IrStatementOrigin? = null,
|
||||
superQualifier: ClassDescriptor? = null
|
||||
) : this(startOffset, endOffset, descriptor, origin, superQualifier) {
|
||||
) : this(startOffset, endOffset, descriptor, typeArguments, origin, superQualifier) {
|
||||
this.dispatchReceiver = dispatchReceiver
|
||||
this.extensionReceiver = extensionReceiver
|
||||
putArgument(SETTER_ARGUMENT_INDEX, argument)
|
||||
putValueArgument(SETTER_ARGUMENT_INDEX, argument)
|
||||
}
|
||||
|
||||
private var argumentImpl: IrExpression? = null
|
||||
|
||||
override fun getArgument(index: Int): IrExpression? =
|
||||
override fun getValueArgument(index: Int): IrExpression? =
|
||||
if (index == SETTER_ARGUMENT_INDEX) argumentImpl!! else null
|
||||
|
||||
override fun putArgument(index: Int, valueArgument: IrExpression?) {
|
||||
override fun putValueArgument(index: Int, valueArgument: IrExpression?) {
|
||||
if (index != SETTER_ARGUMENT_INDEX) throw AssertionError("Property setter call $descriptor has no argument $index")
|
||||
argumentImpl = valueArgument
|
||||
}
|
||||
|
||||
override fun removeArgument(index: Int) {
|
||||
override fun removeValueArgument(index: Int) {
|
||||
if (index != SETTER_ARGUMENT_INDEX) throw AssertionError("Property setter call $descriptor has no argument $index")
|
||||
argumentImpl = null
|
||||
}
|
||||
|
||||
@@ -97,14 +97,25 @@ class DumpIrTreeVisitor(out: Appendable): IrElementVisitor<Unit, String> {
|
||||
|
||||
override fun visitMemberAccess(expression: IrMemberAccessExpression, data: String) {
|
||||
expression.dumpLabeledElementWith(data) {
|
||||
dumpTypeArguments(expression)
|
||||
|
||||
expression.dispatchReceiver?.accept(this, "\$this")
|
||||
expression.extensionReceiver?.accept(this, "\$receiver")
|
||||
for (valueParameter in expression.descriptor.valueParameters) {
|
||||
expression.getArgument(valueParameter.index)?.accept(this, valueParameter.name.asString())
|
||||
expression.getValueArgument(valueParameter.index)?.accept(this, valueParameter.name.asString())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun dumpTypeArguments(expression: IrMemberAccessExpression) {
|
||||
for (typeParameter in expression.descriptor.original.typeParameters) {
|
||||
val typeArgument = expression.getTypeArgument(typeParameter) ?: continue
|
||||
val renderedParameter = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(typeParameter)
|
||||
val renderedType = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.renderType(typeArgument)
|
||||
printer.println("$renderedParameter: $renderedType")
|
||||
}
|
||||
}
|
||||
|
||||
override fun visitGetField(expression: IrGetField, data: String) {
|
||||
expression.dumpLabeledElementWith(data) {
|
||||
expression.receiver?.accept(this, "receiver")
|
||||
|
||||
@@ -72,6 +72,7 @@ FILE /classLevelProperties.kt
|
||||
FIELD DELEGATE val `test7$delegate`: kotlin.Lazy<kotlin.Int>
|
||||
EXPRESSION_BODY
|
||||
CALL 'lazy(() -> Int): Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
<T>: Int
|
||||
initializer: BLOCK type=() -> kotlin.Int origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
@@ -82,6 +83,7 @@ FILE /classLevelProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-test7>(): Int'
|
||||
CALL 'getValue(Any?, KProperty<*>) on Lazy<Int>: Int' type=kotlin.Int origin=null
|
||||
<T>: Int
|
||||
$receiver: GET_FIELD '`test7$delegate`: Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
receiver: THIS of 'C' type=C
|
||||
thisRef: THIS of 'C' type=C
|
||||
@@ -90,10 +92,13 @@ FILE /classLevelProperties.kt
|
||||
FIELD DELEGATE val `test8$delegate`: java.util.HashMap<kotlin.String, kotlin.Int>
|
||||
EXPRESSION_BODY
|
||||
CALL 'hashMapOf(vararg Pair<String, Int>): HashMap<String, Int>' type=java.util.HashMap<kotlin.String, kotlin.Int> origin=null
|
||||
<K>: String
|
||||
<V>: Int
|
||||
FUN DELEGATED_PROPERTY_ACCESSOR public final fun <get-test8>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-test8>(): Int'
|
||||
CALL 'getValue(Any?, KProperty<*>) on MutableMap<in String, in Int>: Int' type=kotlin.Int origin=null
|
||||
<V>: Int
|
||||
$receiver: GET_FIELD '`test8$delegate`: HashMap<String, Int>' type=java.util.HashMap<kotlin.String, kotlin.Int> origin=null
|
||||
receiver: THIS of 'C' type=C
|
||||
thisRef: THIS of 'C' type=C
|
||||
@@ -102,6 +107,7 @@ FILE /classLevelProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<set-test8>(Int): Unit'
|
||||
CALL 'setValue(Any?, KProperty<*>, Int) on MutableMap<in String, in Int>: Unit' type=kotlin.Unit origin=null
|
||||
<V>: Int
|
||||
$receiver: GET_FIELD '`test8$delegate`: HashMap<String, Int>' type=java.util.HashMap<kotlin.String, kotlin.Int> origin=null
|
||||
receiver: THIS of 'C' type=C
|
||||
thisRef: THIS of 'C' type=C
|
||||
|
||||
@@ -3,6 +3,7 @@ FILE /delegatedProperties.kt
|
||||
FIELD DELEGATE val `test1$delegate`: kotlin.Lazy<kotlin.Int>
|
||||
EXPRESSION_BODY
|
||||
CALL 'lazy(() -> Int): Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
<T>: Int
|
||||
initializer: BLOCK type=() -> kotlin.Int origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
@@ -13,6 +14,7 @@ FILE /delegatedProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-test1>(): Int'
|
||||
CALL 'getValue(Any?, KProperty<*>) on Lazy<Int>: Int' type=kotlin.Int origin=null
|
||||
<T>: Int
|
||||
$receiver: GET_FIELD '`test1$delegate`: Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
thisRef: CONST Null type=kotlin.Nothing? value='null'
|
||||
property: CALLABLE_REFERENCE 'test1: Int' type=kotlin.reflect.KProperty0<kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
@@ -34,6 +36,7 @@ FILE /delegatedProperties.kt
|
||||
FIELD DELEGATE val `test2$delegate`: kotlin.Lazy<kotlin.Int>
|
||||
EXPRESSION_BODY
|
||||
CALL 'lazy(() -> Int): Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
<T>: Int
|
||||
initializer: BLOCK type=() -> kotlin.Int origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
@@ -44,6 +47,7 @@ FILE /delegatedProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-test2>(): Int'
|
||||
CALL 'getValue(Any?, KProperty<*>) on Lazy<Int>: Int' type=kotlin.Int origin=null
|
||||
<T>: Int
|
||||
$receiver: GET_FIELD '`test2$delegate`: Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
receiver: THIS of 'C' type=C
|
||||
thisRef: THIS of 'C' type=C
|
||||
@@ -57,6 +61,7 @@ FILE /delegatedProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-test3>(): Any'
|
||||
CALL 'getValue(Any?, KProperty<*>) on MutableMap<in String, in Any>: Any' type=kotlin.Any origin=null
|
||||
<V>: Any
|
||||
$receiver: GET_FIELD '`test3$delegate`: MutableMap<String, Any>' type=kotlin.collections.MutableMap<kotlin.String, kotlin.Any> origin=null
|
||||
receiver: THIS of 'C' type=C
|
||||
thisRef: THIS of 'C' type=C
|
||||
@@ -65,6 +70,7 @@ FILE /delegatedProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<set-test3>(Any): Unit'
|
||||
CALL 'setValue(Any?, KProperty<*>, Any) on MutableMap<in String, in Any>: Unit' type=kotlin.Unit origin=null
|
||||
<V>: Any
|
||||
$receiver: GET_FIELD '`test3$delegate`: MutableMap<String, Any>' type=kotlin.collections.MutableMap<kotlin.String, kotlin.Any> origin=null
|
||||
receiver: THIS of 'C' type=C
|
||||
thisRef: THIS of 'C' type=C
|
||||
@@ -74,10 +80,13 @@ FILE /delegatedProperties.kt
|
||||
FIELD DELEGATE val `test4$delegate`: java.util.HashMap<kotlin.String, kotlin.Any>
|
||||
EXPRESSION_BODY
|
||||
CALL 'hashMapOf(vararg Pair<String, Any>): HashMap<String, Any>' type=java.util.HashMap<kotlin.String, kotlin.Any> origin=null
|
||||
<K>: String
|
||||
<V>: Any
|
||||
FUN DELEGATED_PROPERTY_ACCESSOR public fun <get-test4>(): kotlin.Any
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-test4>(): Any'
|
||||
CALL 'getValue(Any?, KProperty<*>) on MutableMap<in String, in Any>: Any' type=kotlin.Any origin=null
|
||||
<V>: Any
|
||||
$receiver: GET_FIELD '`test4$delegate`: HashMap<String, Any>' type=java.util.HashMap<kotlin.String, kotlin.Any> origin=null
|
||||
thisRef: CONST Null type=kotlin.Nothing? value='null'
|
||||
property: CALLABLE_REFERENCE 'test4: Any' type=kotlin.reflect.KMutableProperty0<kotlin.Any> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
@@ -85,6 +94,7 @@ FILE /delegatedProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<set-test4>(Any): Unit'
|
||||
CALL 'setValue(Any?, KProperty<*>, Any) on MutableMap<in String, in Any>: Unit' type=kotlin.Unit origin=null
|
||||
<V>: Any
|
||||
$receiver: GET_FIELD '`test4$delegate`: HashMap<String, Any>' type=java.util.HashMap<kotlin.String, kotlin.Any> origin=null
|
||||
thisRef: CONST Null type=kotlin.Nothing? value='null'
|
||||
property: CALLABLE_REFERENCE 'test4: Any' type=kotlin.reflect.KMutableProperty0<kotlin.Any> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
|
||||
@@ -4,6 +4,7 @@ FILE /localDelegatedProperties.kt
|
||||
LOCAL_DELEGATED_PROPERTY val x: kotlin.Int
|
||||
VAR DELEGATE val `x$delegate`: kotlin.Lazy<kotlin.Int>
|
||||
CALL 'lazy(() -> Int): Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
<T>: Int
|
||||
initializer: BLOCK type=() -> kotlin.Int origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
@@ -14,6 +15,7 @@ FILE /localDelegatedProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-x>(): Int'
|
||||
CALL 'getValue(Any?, KProperty<*>) on Lazy<Int>: Int' type=kotlin.Int origin=null
|
||||
<T>: Int
|
||||
$receiver: GET_VAR '`x$delegate`: Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
thisRef: CONST Null type=kotlin.Nothing? value='null'
|
||||
property: CALLABLE_REFERENCE 'x: Int' type=kotlin.reflect.KProperty0<kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
@@ -24,10 +26,13 @@ FILE /localDelegatedProperties.kt
|
||||
LOCAL_DELEGATED_PROPERTY var x: kotlin.Int
|
||||
VAR DELEGATE val `x$delegate`: java.util.HashMap<kotlin.String, kotlin.Int>
|
||||
CALL 'hashMapOf(vararg Pair<String, Int>): HashMap<String, Int>' type=java.util.HashMap<kotlin.String, kotlin.Int> origin=null
|
||||
<K>: String
|
||||
<V>: Int
|
||||
FUN DELEGATED_PROPERTY_ACCESSOR local final fun <get-x>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-x>(): Int'
|
||||
CALL 'getValue(Any?, KProperty<*>) on MutableMap<in String, in Int>: Int' type=kotlin.Int origin=null
|
||||
<V>: Int
|
||||
$receiver: GET_VAR '`x$delegate`: HashMap<String, Int>' type=java.util.HashMap<kotlin.String, kotlin.Int> origin=null
|
||||
thisRef: CONST Null type=kotlin.Nothing? value='null'
|
||||
property: CALLABLE_REFERENCE 'x: Int' type=kotlin.reflect.KMutableProperty0<kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
@@ -36,6 +41,7 @@ FILE /localDelegatedProperties.kt
|
||||
RETURN type=kotlin.Nothing from='<set-x>(Int): Int'
|
||||
TYPE_OP origin=IMPLICIT_CAST typeOperand=kotlin.Int
|
||||
CALL 'setValue(Any?, KProperty<*>, Int) on MutableMap<in String, in Int>: Unit' type=kotlin.Unit origin=null
|
||||
<V>: Int
|
||||
$receiver: GET_VAR '`x$delegate`: HashMap<String, Int>' type=java.util.HashMap<kotlin.String, kotlin.Int> origin=null
|
||||
thisRef: CONST Null type=kotlin.Nothing? value='null'
|
||||
property: CALLABLE_REFERENCE 'x: Int' type=kotlin.reflect.KMutableProperty0<kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
|
||||
@@ -60,6 +60,7 @@ FILE /packageLevelProperties.kt
|
||||
FIELD DELEGATE val `test7$delegate`: kotlin.Lazy<kotlin.Int>
|
||||
EXPRESSION_BODY
|
||||
CALL 'lazy(() -> Int): Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
<T>: Int
|
||||
initializer: BLOCK type=() -> kotlin.Int origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
@@ -70,6 +71,7 @@ FILE /packageLevelProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-test7>(): Int'
|
||||
CALL 'getValue(Any?, KProperty<*>) on Lazy<Int>: Int' type=kotlin.Int origin=null
|
||||
<T>: Int
|
||||
$receiver: GET_FIELD '`test7$delegate`: Lazy<Int>' type=kotlin.Lazy<kotlin.Int> origin=null
|
||||
thisRef: CONST Null type=kotlin.Nothing? value='null'
|
||||
property: CALLABLE_REFERENCE 'test7: Int' type=kotlin.reflect.KProperty0<kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
@@ -77,10 +79,13 @@ FILE /packageLevelProperties.kt
|
||||
FIELD DELEGATE val `test8$delegate`: java.util.HashMap<kotlin.String, kotlin.Int>
|
||||
EXPRESSION_BODY
|
||||
CALL 'hashMapOf(vararg Pair<String, Int>): HashMap<String, Int>' type=java.util.HashMap<kotlin.String, kotlin.Int> origin=null
|
||||
<K>: String
|
||||
<V>: Int
|
||||
FUN DELEGATED_PROPERTY_ACCESSOR public fun <get-test8>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-test8>(): Int'
|
||||
CALL 'getValue(Any?, KProperty<*>) on MutableMap<in String, in Int>: Int' type=kotlin.Int origin=null
|
||||
<V>: Int
|
||||
$receiver: GET_FIELD '`test8$delegate`: HashMap<String, Int>' type=java.util.HashMap<kotlin.String, kotlin.Int> origin=null
|
||||
thisRef: CONST Null type=kotlin.Nothing? value='null'
|
||||
property: CALLABLE_REFERENCE 'test8: Int' type=kotlin.reflect.KMutableProperty0<kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
@@ -88,6 +93,7 @@ FILE /packageLevelProperties.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<set-test8>(Int): Unit'
|
||||
CALL 'setValue(Any?, KProperty<*>, Int) on MutableMap<in String, in Int>: Unit' type=kotlin.Unit origin=null
|
||||
<V>: Int
|
||||
$receiver: GET_FIELD '`test8$delegate`: HashMap<String, Int>' type=java.util.HashMap<kotlin.String, kotlin.Int> origin=null
|
||||
thisRef: CONST Null type=kotlin.Nothing? value='null'
|
||||
property: CALLABLE_REFERENCE 'test8: Int' type=kotlin.reflect.KMutableProperty0<kotlin.Int> origin=PROPERTY_REFERENCE_FOR_DELEGATE
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
// WITH_RUNTIME
|
||||
|
||||
fun test1(x: Any) =
|
||||
x is Array<*> && x.isArrayOf<String>()
|
||||
@@ -0,0 +1,12 @@
|
||||
FILE /typeArguments.kt
|
||||
FUN public fun test1(x: kotlin.Any): kotlin.Boolean
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='test1(Any): Boolean'
|
||||
WHEN type=kotlin.Boolean origin=ANDAND
|
||||
if: TYPE_OP origin=INSTANCEOF typeOperand=kotlin.Array<*>
|
||||
GET_VAR 'value-parameter x: Any' type=kotlin.Any origin=null
|
||||
then: CALL 'isArrayOf() on Array<*>: Boolean' type=kotlin.Boolean origin=null
|
||||
<reified T : Any>: String
|
||||
$receiver: TYPE_OP origin=IMPLICIT_CAST typeOperand=kotlin.Array<*>
|
||||
GET_VAR 'value-parameter x: Any' type=kotlin.Any origin=null
|
||||
else: CONST Boolean type=kotlin.Boolean value='false'
|
||||
@@ -3,6 +3,7 @@ FILE /vararg.kt
|
||||
FIELD PROPERTY_BACKING_FIELD public val test1: kotlin.Array<kotlin.String>
|
||||
EXPRESSION_BODY
|
||||
CALL 'arrayOf(vararg String): Array<String>' type=kotlin.Array<kotlin.String> origin=null
|
||||
<reified T>: String
|
||||
FUN DEFAULT_PROPERTY_ACCESSOR public fun <get-test1>(): kotlin.Array<kotlin.String>
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<get-test1>(): Array<String>'
|
||||
@@ -11,6 +12,7 @@ FILE /vararg.kt
|
||||
FIELD PROPERTY_BACKING_FIELD public val test2: kotlin.Array<kotlin.String>
|
||||
EXPRESSION_BODY
|
||||
CALL 'arrayOf(vararg String): Array<String>' type=kotlin.Array<kotlin.String> origin=null
|
||||
<reified T>: String
|
||||
elements: VARARG type=Array<out String> varargElementType=String
|
||||
CONST String type=kotlin.String value='1'
|
||||
CONST String type=kotlin.String value='2'
|
||||
@@ -23,6 +25,7 @@ FILE /vararg.kt
|
||||
FIELD PROPERTY_BACKING_FIELD public val test3: kotlin.Array<kotlin.String>
|
||||
EXPRESSION_BODY
|
||||
CALL 'arrayOf(vararg String): Array<String>' type=kotlin.Array<kotlin.String> origin=null
|
||||
<reified T>: String
|
||||
elements: VARARG type=Array<out String> varargElementType=String
|
||||
CONST String type=kotlin.String value='0'
|
||||
SPREAD_ELEMENT
|
||||
|
||||
@@ -23,7 +23,9 @@ FILE /when.kt
|
||||
GET_VAR 'tmp0_subject: Any?' type=kotlin.Any? origin=null
|
||||
then: CONST String type=kotlin.String value='String'
|
||||
if: CALL 'contains(Any) on Iterable<Any>: Boolean' type=kotlin.Boolean origin=IN
|
||||
<T>: Any
|
||||
$receiver: CALL 'setOf(): Set<Nothing>' type=kotlin.collections.Set<kotlin.Nothing> origin=null
|
||||
<T>: Nothing
|
||||
element: GET_VAR 'tmp0_subject: Any?' type=kotlin.Any? origin=null
|
||||
then: CONST String type=kotlin.String value='nothingness?'
|
||||
else: CONST String type=kotlin.String value='something'
|
||||
@@ -43,7 +45,9 @@ FILE /when.kt
|
||||
GET_VAR 'value-parameter x: Any?' type=kotlin.Any? origin=null
|
||||
then: CONST String type=kotlin.String value='String'
|
||||
if: CALL 'contains(Any) on Iterable<Any>: Boolean' type=kotlin.Boolean origin=IN
|
||||
<T>: Any
|
||||
$receiver: CALL 'setOf(): Set<Nothing>' type=kotlin.collections.Set<kotlin.Nothing> origin=null
|
||||
<T>: Nothing
|
||||
element: GET_VAR 'value-parameter x: Any?' type=kotlin.Any? origin=null
|
||||
then: CONST String type=kotlin.String value='nothingness?'
|
||||
else: CONST String type=kotlin.String value='something'
|
||||
|
||||
@@ -3,6 +3,8 @@ FILE /extensionLambda.kt
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='test1(): Int'
|
||||
CALL 'run(String.() -> Int) on String: Int' type=kotlin.Int origin=null
|
||||
<T>: String
|
||||
<R>: Int
|
||||
$receiver: CONST String type=kotlin.String value='42'
|
||||
block: BLOCK type=kotlin.String.() -> kotlin.Int origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun kotlin.String.<anonymous>(): kotlin.Int
|
||||
|
||||
@@ -23,18 +23,24 @@ FILE /multipleImplicitReceivers.kt
|
||||
FUN public fun test(fooImpl: IFoo, invokeImpl: IInvoke): kotlin.Unit
|
||||
BLOCK_BODY
|
||||
CALL 'with(A, A.() -> Int): Int' type=kotlin.Int origin=null
|
||||
<T>: A
|
||||
<R>: Int
|
||||
receiver: GET_OBJECT 'A' type=A
|
||||
block: BLOCK type=A.() -> kotlin.Int origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun A.<anonymous>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<anonymous>() on A: Int'
|
||||
CALL 'with(IFoo, IFoo.() -> Int): Int' type=kotlin.Int origin=null
|
||||
<T>: IFoo
|
||||
<R>: Int
|
||||
receiver: GET_VAR 'value-parameter fooImpl: IFoo' type=IFoo origin=null
|
||||
block: BLOCK type=IFoo.() -> kotlin.Int origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun IFoo.<anonymous>(): kotlin.Int
|
||||
BLOCK_BODY
|
||||
RETURN type=kotlin.Nothing from='<anonymous>() on IFoo: Int'
|
||||
CALL 'with(IInvoke, IInvoke.() -> Int): Int' type=kotlin.Int origin=null
|
||||
<T>: IInvoke
|
||||
<R>: Int
|
||||
receiver: GET_VAR 'value-parameter invokeImpl: IInvoke' type=IInvoke origin=null
|
||||
block: BLOCK type=IInvoke.() -> kotlin.Int origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun IInvoke.<anonymous>(): kotlin.Int
|
||||
|
||||
@@ -2,6 +2,7 @@ FILE /nonLocalReturn.kt
|
||||
FUN public fun test0(): kotlin.Unit
|
||||
BLOCK_BODY
|
||||
CALL 'run(() -> Nothing): Nothing' type=kotlin.Nothing origin=null
|
||||
<R>: Nothing
|
||||
block: BLOCK type=() -> kotlin.Nothing origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(): kotlin.Nothing
|
||||
BLOCK_BODY
|
||||
@@ -10,6 +11,7 @@ FILE /nonLocalReturn.kt
|
||||
FUN public fun test1(): kotlin.Unit
|
||||
BLOCK_BODY
|
||||
CALL 'run(() -> Unit): Unit' type=kotlin.Unit origin=null
|
||||
<R>: Unit
|
||||
block: BLOCK type=() -> kotlin.Unit origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(): kotlin.Unit
|
||||
BLOCK_BODY
|
||||
@@ -18,6 +20,7 @@ FILE /nonLocalReturn.kt
|
||||
FUN public fun test2(): kotlin.Unit
|
||||
BLOCK_BODY
|
||||
CALL 'run(() -> Unit): Unit' type=kotlin.Unit origin=null
|
||||
<R>: Unit
|
||||
block: BLOCK type=() -> kotlin.Unit origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(): kotlin.Unit
|
||||
BLOCK_BODY
|
||||
@@ -26,6 +29,7 @@ FILE /nonLocalReturn.kt
|
||||
FUN public fun testLrmFoo1(ints: kotlin.collections.List<kotlin.Int>): kotlin.Unit
|
||||
BLOCK_BODY
|
||||
CALL 'forEach((Int) -> Unit) on Iterable<Int>: Unit' type=kotlin.Unit origin=null
|
||||
<T>: Int
|
||||
$receiver: GET_VAR 'value-parameter ints: List<Int>' type=kotlin.collections.List<kotlin.Int> origin=null
|
||||
action: BLOCK type=(kotlin.Int) -> kotlin.Unit origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(it: kotlin.Int): kotlin.Unit
|
||||
@@ -42,6 +46,7 @@ FILE /nonLocalReturn.kt
|
||||
FUN public fun testLrmFoo2(ints: kotlin.collections.List<kotlin.Int>): kotlin.Unit
|
||||
BLOCK_BODY
|
||||
CALL 'forEach((Int) -> Unit) on Iterable<Int>: Unit' type=kotlin.Unit origin=null
|
||||
<T>: Int
|
||||
$receiver: GET_VAR 'value-parameter ints: List<Int>' type=kotlin.collections.List<kotlin.Int> origin=null
|
||||
action: BLOCK type=(kotlin.Int) -> kotlin.Unit origin=LAMBDA
|
||||
FUN LOCAL_FUNCTION_FOR_LAMBDA local final fun <anonymous>(it: kotlin.Int): kotlin.Unit
|
||||
|
||||
@@ -598,6 +598,12 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("typeArguments.kt")
|
||||
public void testTypeArguments() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/typeArguments.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("typeOperators.kt")
|
||||
public void testTypeOperators() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/ir/irText/expressions/typeOperators.kt");
|
||||
|
||||
Reference in New Issue
Block a user