Psi2Ir: make most declarations internal, remove unused

The main motivation is to avoid pollution in autocompletion in IDE, and
avoid clashes for some common names.

A lot of stuff was declared public seemingly by accident. It is only
used, and can only be meaningfully used, from within the psi2ir module.
This commit is contained in:
Alexander Udalov
2023-03-04 00:43:04 +01:00
committed by Space Team
parent bd3eb81aee
commit f91e1fa7fd
51 changed files with 151 additions and 186 deletions
@@ -33,13 +33,13 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.TypeUtils
fun KotlinType.containsNull() = internal fun KotlinType.containsNull(): Boolean =
TypeUtils.isNullableType(this) TypeUtils.isNullableType(this)
fun KtElement.deparenthesize(): KtElement = fun KtElement.deparenthesize(): KtElement =
if (this is KtExpression) KtPsiUtil.safeDeparenthesize(this) else this if (this is KtExpression) KtPsiUtil.safeDeparenthesize(this) else this
fun ResolvedCall<*>.isValueArgumentReorderingRequired(): Boolean { internal fun ResolvedCall<*>.isValueArgumentReorderingRequired(): Boolean {
var lastValueParameterIndex = -1 var lastValueParameterIndex = -1
for (valueArgument in call.valueArguments) { for (valueArgument in call.valueArguments) {
val argumentMapping = val argumentMapping =
@@ -53,7 +53,7 @@ fun ResolvedCall<*>.isValueArgumentReorderingRequired(): Boolean {
return false return false
} }
fun KtSecondaryConstructor.isConstructorDelegatingToSuper(bindingContext: BindingContext): Boolean { internal fun KtSecondaryConstructor.isConstructorDelegatingToSuper(bindingContext: BindingContext): Boolean {
val constructorDescriptor = bindingContext.get(BindingContext.CONSTRUCTOR, this) ?: return false val constructorDescriptor = bindingContext.get(BindingContext.CONSTRUCTOR, this) ?: return false
val delegatingResolvedCall = getDelegationCall().getResolvedCall(bindingContext) val delegatingResolvedCall = getDelegationCall().getResolvedCall(bindingContext)
return if (delegatingResolvedCall != null) { return if (delegatingResolvedCall != null) {
@@ -68,13 +68,13 @@ fun KtSecondaryConstructor.isConstructorDelegatingToSuper(bindingContext: Bindin
fun MemberScope.findSingleFunction(name: Name): FunctionDescriptor = fun MemberScope.findSingleFunction(name: Name): FunctionDescriptor =
getContributedFunctions(name, NoLookupLocation.FROM_BACKEND).single() getContributedFunctions(name, NoLookupLocation.FROM_BACKEND).single()
val PsiElement?.startOffsetOrUndefined get() = this?.startOffsetSkippingComments ?: UNDEFINED_OFFSET internal val PsiElement?.startOffsetOrUndefined get() = this?.startOffsetSkippingComments ?: UNDEFINED_OFFSET
val PsiElement?.endOffsetOrUndefined get() = this?.endOffset ?: UNDEFINED_OFFSET internal val PsiElement?.endOffsetOrUndefined get() = this?.endOffset ?: UNDEFINED_OFFSET
val PropertyDescriptor.unwrappedGetMethod: FunctionDescriptor? internal val PropertyDescriptor.unwrappedGetMethod: FunctionDescriptor?
get() = if (this is SyntheticPropertyDescriptor) this.getMethod else getter get() = if (this is SyntheticPropertyDescriptor) this.getMethod else getter
val PropertyDescriptor.unwrappedSetMethod: FunctionDescriptor? internal val PropertyDescriptor.unwrappedSetMethod: FunctionDescriptor?
get() = if (this is SyntheticPropertyDescriptor) this.setMethod else setter get() = if (this is SyntheticPropertyDescriptor) this.setMethod else setter
// Only works for descriptors of Java fields. // Only works for descriptors of Java fields.
@@ -90,7 +90,7 @@ internal fun PropertyDescriptor.resolveFakeOverride(): PropertyDescriptor {
return current return current
} }
val KtPureElement?.pureStartOffsetOrUndefined get() = this?.psiOrParent?.startOffsetSkippingComments ?: UNDEFINED_OFFSET internal val KtPureElement?.pureStartOffsetOrUndefined get() = this?.psiOrParent?.startOffsetSkippingComments ?: UNDEFINED_OFFSET
val KtPureElement?.pureEndOffsetOrUndefined get() = this?.psiOrParent?.endOffset ?: UNDEFINED_OFFSET internal val KtPureElement?.pureEndOffsetOrUndefined get() = this?.psiOrParent?.endOffset ?: UNDEFINED_OFFSET
fun KtElement.getChildTokenStartOffsetOrNull(tokenSet: TokenSet) = node.findChildByType(tokenSet)?.startOffset internal fun KtElement.getChildTokenStartOffsetOrNull(tokenSet: TokenSet) = node.findChildByType(tokenSet)?.startOffset
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
class AnnotationGenerator(context: GeneratorContext) : IrElementVisitorVoid { internal class AnnotationGenerator(context: GeneratorContext) : IrElementVisitorVoid {
private val typeTranslator = context.typeTranslator private val typeTranslator = context.typeTranslator
private val constantValueGenerator = context.constantValueGenerator private val constantValueGenerator = context.constantValueGenerator
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.psi.KtBlockExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
class AnonymousInitializerGenerator( internal class AnonymousInitializerGenerator(
declarationGenerator: DeclarationGenerator declarationGenerator: DeclarationGenerator
) : DeclarationGeneratorExtension(declarationGenerator) { ) : DeclarationGeneratorExtension(declarationGenerator) {
@@ -54,10 +54,10 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
fun StatementGenerator.generateReceiverOrNull(ktDefaultElement: KtElement, receiver: ReceiverValue?): IntermediateValue? = internal fun StatementGenerator.generateReceiverOrNull(ktDefaultElement: KtElement, receiver: ReceiverValue?): IntermediateValue? =
receiver?.let { generateReceiver(ktDefaultElement, receiver) } receiver?.let { generateReceiver(ktDefaultElement, receiver) }
fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall( private fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
ktDefaultElement: KtElement, ktDefaultElement: KtElement,
receiver: ContextClassReceiver? receiver: ContextClassReceiver?
): IntermediateValue? = ): IntermediateValue? =
@@ -69,7 +69,7 @@ fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
) )
} }
fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall( private fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
defaultStartOffset: Int, defaultStartOffset: Int,
defaultEndOffset: Int, defaultEndOffset: Int,
receiver: ContextClassReceiver receiver: ContextClassReceiver
@@ -85,10 +85,10 @@ fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
} }
} }
fun StatementGenerator.generateReceiver(ktDefaultElement: KtElement, receiver: ReceiverValue): IntermediateValue = private fun StatementGenerator.generateReceiver(ktDefaultElement: KtElement, receiver: ReceiverValue): IntermediateValue =
generateReceiver(ktDefaultElement.startOffsetSkippingComments, ktDefaultElement.endOffset, receiver) generateReceiver(ktDefaultElement.startOffsetSkippingComments, ktDefaultElement.endOffset, receiver)
fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffset: Int, receiver: ReceiverValue): IntermediateValue { private fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffset: Int, receiver: ReceiverValue): IntermediateValue {
val irReceiverType = val irReceiverType =
when (receiver) { when (receiver) {
is ExtensionReceiver -> is ExtensionReceiver ->
@@ -145,7 +145,7 @@ fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffse
} }
} }
fun StatementGenerator.loadContextReceiver( internal fun StatementGenerator.loadContextReceiver(
receiver: ContextClassReceiver, receiver: ContextClassReceiver,
defaultStartOffset: Int, defaultEndOffset: Int, defaultStartOffset: Int, defaultEndOffset: Int,
): IrGetFieldImpl { ): IrGetFieldImpl {
@@ -165,7 +165,7 @@ fun StatementGenerator.loadContextReceiver(
} }
fun StatementGenerator.generateSingletonReference( internal fun StatementGenerator.generateSingletonReference(
descriptor: ClassDescriptor, descriptor: ClassDescriptor,
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
@@ -216,7 +216,7 @@ fun IrExpression.implicitCastTo(expectedType: IrType?): IrExpression {
return IrTypeOperatorCallImpl(startOffset, endOffset, expectedType, IrTypeOperator.IMPLICIT_CAST, expectedType, this) return IrTypeOperatorCallImpl(startOffset, endOffset, expectedType, IrTypeOperator.IMPLICIT_CAST, expectedType, this)
} }
fun StatementGenerator.generateBackingFieldReceiver( internal fun StatementGenerator.generateBackingFieldReceiver(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
resolvedCall: ResolvedCall<*>?, resolvedCall: ResolvedCall<*>?,
@@ -226,7 +226,7 @@ fun StatementGenerator.generateBackingFieldReceiver(
return this.generateReceiver(startOffset, endOffset, receiver) return this.generateReceiver(startOffset, endOffset, receiver)
} }
fun StatementGenerator.generateCallReceiver( internal fun StatementGenerator.generateCallReceiver(
ktDefaultElement: KtElement, ktDefaultElement: KtElement,
calleeDescriptor: CallableDescriptor, calleeDescriptor: CallableDescriptor,
dispatchReceiver: ReceiverValue?, dispatchReceiver: ReceiverValue?,
@@ -355,11 +355,11 @@ private fun StatementGenerator.generateVarargExpressionUsing(
return irVararg return irVararg
} }
fun StatementGenerator.generateValueArgument( private fun StatementGenerator.generateValueArgument(
valueArgument: ResolvedValueArgument, valueArgument: ResolvedValueArgument,
valueParameter: ValueParameterDescriptor, valueParameter: ValueParameterDescriptor,
resolvedCall: ResolvedCall<*> resolvedCall: ResolvedCall<*>
) = generateValueArgumentUsing(valueArgument, valueParameter, resolvedCall) { generateExpression(it) } ): IrExpression? = generateValueArgumentUsing(valueArgument, valueParameter, resolvedCall) { generateExpression(it) }
private fun StatementGenerator.generateValueArgumentUsing( private fun StatementGenerator.generateValueArgumentUsing(
valueArgument: ResolvedValueArgument, valueArgument: ResolvedValueArgument,
@@ -500,21 +500,21 @@ private fun StatementGenerator.createFunctionForSuspendConversion(
return irAdapterFun return irAdapterFun
} }
fun StatementGenerator.castArgumentToFunctionalInterfaceForSamType(irExpression: IrExpression, samType: KotlinType): IrExpression { internal fun StatementGenerator.castArgumentToFunctionalInterfaceForSamType(irExpression: IrExpression, samType: KotlinType): IrExpression {
val kotlinFunctionType = samType.getSubstitutedFunctionTypeForSamType() val kotlinFunctionType = samType.getSubstitutedFunctionTypeForSamType()
val irFunctionType = context.typeTranslator.translateType(kotlinFunctionType) val irFunctionType = context.typeTranslator.translateType(kotlinFunctionType)
return irExpression.implicitCastTo(irFunctionType) return irExpression.implicitCastTo(irFunctionType)
} }
fun Generator.getSuperQualifier(resolvedCall: ResolvedCall<*>): ClassDescriptor? { internal fun Generator.getSuperQualifier(resolvedCall: ResolvedCall<*>): ClassDescriptor? {
val superCallExpression = getSuperCallExpression(resolvedCall.call) ?: return null val superCallExpression = getSuperCallExpression(resolvedCall.call) ?: return null
return getOrFail(BindingContext.REFERENCE_TARGET, superCallExpression.instanceReference) as ClassDescriptor return getOrFail(BindingContext.REFERENCE_TARGET, superCallExpression.instanceReference) as ClassDescriptor
} }
fun StatementGenerator.pregenerateCall(resolvedCall: ResolvedCall<*>): CallBuilder = internal fun StatementGenerator.pregenerateCall(resolvedCall: ResolvedCall<*>): CallBuilder =
pregenerateCallUsing(resolvedCall) { generateExpression(it) } pregenerateCallUsing(resolvedCall) { generateExpression(it) }
fun StatementGenerator.pregenerateCallUsing( internal fun StatementGenerator.pregenerateCallUsing(
resolvedCall: ResolvedCall<*>, resolvedCall: ResolvedCall<*>,
generateArgumentExpression: (KtExpression) -> IrExpression? generateArgumentExpression: (KtExpression) -> IrExpression?
): CallBuilder { ): CallBuilder {
@@ -527,7 +527,7 @@ fun StatementGenerator.pregenerateCallUsing(
return call return call
} }
fun getTypeArguments(resolvedCall: ResolvedCall<*>?): Map<TypeParameterDescriptor, KotlinType>? { internal fun getTypeArguments(resolvedCall: ResolvedCall<*>?): Map<TypeParameterDescriptor, KotlinType>? {
if (resolvedCall == null) return null if (resolvedCall == null) return null
val descriptor = resolvedCall.resultingDescriptor val descriptor = resolvedCall.resultingDescriptor
@@ -537,7 +537,7 @@ fun getTypeArguments(resolvedCall: ResolvedCall<*>?): Map<TypeParameterDescripto
} }
fun StatementGenerator.pregenerateExtensionInvokeCall(resolvedCall: ResolvedCall<*>): CallBuilder { private fun StatementGenerator.pregenerateExtensionInvokeCall(resolvedCall: ResolvedCall<*>): CallBuilder {
val extensionInvoke = resolvedCall.resultingDescriptor val extensionInvoke = resolvedCall.resultingDescriptor
val functionNClass = extensionInvoke.containingDeclaration as? ClassDescriptor val functionNClass = extensionInvoke.containingDeclaration as? ClassDescriptor
?: throw AssertionError("'invoke' should be a class member: $extensionInvoke") ?: throw AssertionError("'invoke' should be a class member: $extensionInvoke")
@@ -606,7 +606,7 @@ private fun ResolvedCall<*>.isExtensionInvokeCall(): Boolean {
return extensionReceiver != null return extensionReceiver != null
} }
fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: CallBuilder, resolvedCall: ResolvedCall<*>) { internal fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: CallBuilder, resolvedCall: ResolvedCall<*>) {
val samConversion = context.extensions.samConversion val samConversion = context.extensions.samConversion
val originalDescriptor = resolvedCall.resultingDescriptor val originalDescriptor = resolvedCall.resultingDescriptor
@@ -751,7 +751,7 @@ private fun StatementGenerator.getSamTypeForValueParameter(valueParameter: Value
) )
} }
fun StatementGenerator.pregenerateValueArgumentsUsing( internal fun StatementGenerator.pregenerateValueArgumentsUsing(
call: CallBuilder, call: CallBuilder,
resolvedCall: ResolvedCall<*>, resolvedCall: ResolvedCall<*>,
generateArgumentExpression: (KtExpression) -> IrExpression? generateArgumentExpression: (KtExpression) -> IrExpression?
@@ -763,7 +763,7 @@ fun StatementGenerator.pregenerateValueArgumentsUsing(
} }
} }
fun StatementGenerator.pregenerateCallReceivers(resolvedCall: ResolvedCall<*>): CallBuilder { internal fun StatementGenerator.pregenerateCallReceivers(resolvedCall: ResolvedCall<*>): CallBuilder {
val call = unwrapCallableDescriptorAndTypeArguments(resolvedCall) val call = unwrapCallableDescriptorAndTypeArguments(resolvedCall)
call.callReceiver = generateCallReceiver( call.callReceiver = generateCallReceiver(
@@ -790,7 +790,7 @@ private fun unwrapSpecialDescriptor(descriptor: CallableDescriptor): CallableDes
descriptor.getOriginalForFunctionInterfaceAdapter()?.let { unwrapSpecialDescriptor(it) } ?: descriptor descriptor.getOriginalForFunctionInterfaceAdapter()?.let { unwrapSpecialDescriptor(it) } ?: descriptor
} }
fun unwrapCallableDescriptorAndTypeArguments(resolvedCall: ResolvedCall<*>): CallBuilder { internal fun unwrapCallableDescriptorAndTypeArguments(resolvedCall: ResolvedCall<*>): CallBuilder {
val originalDescriptor = resolvedCall.resultingDescriptor val originalDescriptor = resolvedCall.resultingDescriptor
val candidateDescriptor = resolvedCall.candidateDescriptor val candidateDescriptor = resolvedCall.candidateDescriptor
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { internal class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateAssignment(ktExpression: KtBinaryExpression, origin: IrStatementOrigin): IrExpression { fun generateAssignment(ktExpression: KtBinaryExpression, origin: IrStatementOrigin): IrExpression {
return if (getResolvedCall(ktExpression) != null) { return if (getResolvedCall(ktExpression) != null) {
@@ -39,11 +39,11 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.types.typeUtil.isUnit
interface LoopResolver { internal interface LoopResolver {
fun getLoop(expression: KtExpression): IrLoop? fun getLoop(expression: KtExpression): IrLoop?
} }
class BodyGenerator( internal class BodyGenerator(
val scopeOwnerSymbol: IrSymbol, val scopeOwnerSymbol: IrSymbol,
override val context: GeneratorContext, override val context: GeneratorContext,
private val parentLoopResolver: LoopResolver? private val parentLoopResolver: LoopResolver?
@@ -35,7 +35,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression
import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.SmartList
class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { internal class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateIfExpression(expression: KtIfExpression): IrExpression { fun generateIfExpression(expression: KtIfExpression): IrExpression {
var ktLastIf: KtIfExpression = expression var ktLastIf: KtIfExpression = expression
@@ -38,7 +38,7 @@ import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
import org.jetbrains.kotlin.resolve.descriptorUtil.classValueType import org.jetbrains.kotlin.resolve.descriptorUtil.classValueType
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
class CallGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { internal class CallGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateCall(startOffset: Int, endOffset: Int, call: CallBuilder, origin: IrStatementOrigin? = null): IrExpression { fun generateCall(startOffset: Int, endOffset: Int, call: CallBuilder, origin: IrStatementOrigin? = null): IrExpression {
val descriptor = call.descriptor val descriptor = call.descriptor
@@ -454,23 +454,24 @@ class CallGenerator(statementGenerator: StatementGenerator) : StatementGenerator
} }
} }
fun IrExpression.isUnchanging() = fun IrExpression.isUnchanging(): Boolean =
this is IrFunctionExpression || this is IrFunctionExpression ||
(this is IrCallableReference<*> && dispatchReceiver == null && extensionReceiver == null) || (this is IrCallableReference<*> && dispatchReceiver == null && extensionReceiver == null) ||
this is IrClassReference || this is IrClassReference ||
this is IrConst<*> || this is IrConst<*> ||
(this is IrGetValue && !symbol.owner.let { it is IrVariable && it.isVar }) (this is IrGetValue && !symbol.owner.let { it is IrVariable && it.isVar })
fun IrExpression.hasNoSideEffects() = isUnchanging() || this is IrGetValue fun IrExpression.hasNoSideEffects(): Boolean =
isUnchanging() || this is IrGetValue
fun CallGenerator.generateCall( internal fun CallGenerator.generateCall(
ktElement: KtElement, ktElement: KtElement,
call: CallBuilder, call: CallBuilder,
origin: IrStatementOrigin? = null, origin: IrStatementOrigin? = null,
startOffset: Int = ktElement.startOffsetSkippingComments, startOffset: Int = ktElement.startOffsetSkippingComments,
endOffset: Int = ktElement.endOffset, endOffset: Int = ktElement.endOffset,
) = ): IrExpression =
generateCall(startOffset, endOffset, call, origin) generateCall(startOffset, endOffset, call, origin)
fun CallGenerator.generateCall(irExpression: IrExpression, call: CallBuilder, origin: IrStatementOrigin? = null) = internal fun CallGenerator.generateCall(irExpression: IrExpression, call: CallBuilder, origin: IrStatementOrigin? = null): IrExpression =
generateCall(irExpression.startOffset, irExpression.endOffset, call, origin) generateCall(irExpression.startOffset, irExpression.endOffset, call, origin)
@@ -57,7 +57,7 @@ import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.utils.newHashMapWithExpectedSize import org.jetbrains.kotlin.utils.newHashMapWithExpectedSize
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
class ClassGenerator( internal class ClassGenerator(
declarationGenerator: DeclarationGenerator declarationGenerator: DeclarationGenerator
) : DeclarationGeneratorExtension(declarationGenerator) { ) : DeclarationGeneratorExtension(declarationGenerator) {
fun generateClass(ktClassOrObject: KtPureClassOrObject, visibility_: DescriptorVisibility? = null): IrClass { fun generateClass(ktClassOrObject: KtPureClassOrObject, visibility_: DescriptorVisibility? = null): IrClass {
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.lazy.descriptors.getSourceForArgument import org.jetbrains.kotlin.resolve.lazy.descriptors.getSourceForArgument
import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.resolve.source.getPsi
class ConstantValueGeneratorImpl( internal class ConstantValueGeneratorImpl(
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
symbolTable: ReferenceSymbolTable, symbolTable: ReferenceSymbolTable,
typeTranslator: TypeTranslator, typeTranslator: TypeTranslator,
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.types.typeUtil.representativeUpperBound
* This one uses [DataClassMethodGenerator] to determine which members are needed to generate; uses [DataClassMembersGenerator] to generate * This one uses [DataClassMethodGenerator] to determine which members are needed to generate; uses [DataClassMembersGenerator] to generate
* function bodies; and provides ways to declare functions or parameters based on descriptors and binding context. * function bodies; and provides ways to declare functions or parameters based on descriptors and binding context.
*/ */
class DataClassMembersGenerator( internal class DataClassMembersGenerator(
declarationGenerator: DeclarationGenerator, declarationGenerator: DeclarationGenerator,
private val generateBodies: Boolean private val generateBodies: Boolean
) : DeclarationGeneratorExtension(declarationGenerator) { ) : DeclarationGeneratorExtension(declarationGenerator) {
@@ -207,5 +207,5 @@ abstract class DeclarationGeneratorExtension(val declarationGenerator: Declarati
fun KotlinType.toIrType() = with(declarationGenerator) { toIrType() } fun KotlinType.toIrType() = with(declarationGenerator) { toIrType() }
} }
fun Generator.createBodyGenerator(scopeOwnerSymbol: IrSymbol, parentLoopResolver: LoopResolver? = null) = internal fun Generator.createBodyGenerator(scopeOwnerSymbol: IrSymbol, parentLoopResolver: LoopResolver? = null) =
BodyGenerator(scopeOwnerSymbol, context, parentLoopResolver) BodyGenerator(scopeOwnerSymbol, context, parentLoopResolver)
@@ -45,7 +45,9 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections import org.jetbrains.kotlin.types.typeUtil.replaceArgumentsWithStarProjections
class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) { internal class DelegatedPropertyGenerator(
declarationGenerator: DeclarationGenerator
) : DeclarationGeneratorExtension(declarationGenerator) {
constructor(context: GeneratorContext) : this(DeclarationGenerator(context)) constructor(context: GeneratorContext) : this(DeclarationGenerator(context))
fun generateDelegatedProperty( fun generateDelegatedProperty(
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
class DescriptorStorageForContextReceivers { internal class DescriptorStorageForContextReceivers {
private val syntheticFieldStorage: MutableMap<ReceiverValue, IrField> = mutableMapOf() private val syntheticFieldStorage: MutableMap<ReceiverValue, IrField> = mutableMapOf()
fun put(receiverValue: ReceiverValue, irField: IrField) { fun put(receiverValue: ReceiverValue, irField: IrField) {
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.types.error.ErrorTypeKind import org.jetbrains.kotlin.types.error.ErrorTypeKind
import org.jetbrains.kotlin.types.error.ErrorUtils import org.jetbrains.kotlin.types.error.ErrorUtils
class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { internal class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
private val ignoreErrors: Boolean get() = context.configuration.ignoreErrors private val ignoreErrors: Boolean get() = context.configuration.ignoreErrors
private inline fun generateErrorExpression(ktElement: KtElement, e: Throwable? = null, body: () -> IrExpression): IrExpression = private inline fun generateErrorExpression(ktElement: KtElement, e: Throwable? = null, body: () -> IrExpression): IrExpression =
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
class FunctionGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) { internal class FunctionGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
constructor(context: GeneratorContext) : this(DeclarationGenerator(context)) constructor(context: GeneratorContext) : this(DeclarationGenerator(context))
@@ -23,43 +23,40 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi2ir.descriptors.IrBuiltInsOverDescriptors import org.jetbrains.kotlin.psi2ir.descriptors.IrBuiltInsOverDescriptors
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.util.slicedMap.ReadOnlySlice import org.jetbrains.kotlin.util.slicedMap.ReadOnlySlice
internal interface Generator : IrGenerator {
interface Generator : IrGenerator {
override val context: GeneratorContext override val context: GeneratorContext
} }
interface GeneratorWithScope : Generator, IrGeneratorWithScope internal interface GeneratorWithScope : Generator, IrGeneratorWithScope
internal fun <K, V : Any> Generator.get(slice: ReadOnlySlice<K, V>, key: K): V? =
fun <K, V : Any> Generator.get(slice: ReadOnlySlice<K, V>, key: K): V? =
context.bindingContext[slice, key] context.bindingContext[slice, key]
fun <K, V : Any> Generator.getOrFail(slice: ReadOnlySlice<K, V>, key: K): V = internal fun <K, V : Any> Generator.getOrFail(slice: ReadOnlySlice<K, V>, key: K): V =
context.bindingContext[slice, key] ?: throw RuntimeException("No $slice for $key") context.bindingContext[slice, key] ?: throw RuntimeException("No $slice for $key")
inline fun <K, V : Any> Generator.getOrFail(slice: ReadOnlySlice<K, V>, key: K, message: (K) -> String): V = internal inline fun <K, V : Any> Generator.getOrFail(slice: ReadOnlySlice<K, V>, key: K, message: (K) -> String): V =
context.bindingContext[slice, key] ?: throw RuntimeException(message(key)) context.bindingContext[slice, key] ?: throw RuntimeException(message(key))
fun Generator.getTypeInferredByFrontend(key: KtExpression): KotlinType? = internal fun Generator.getTypeInferredByFrontend(key: KtExpression): KotlinType? =
context.bindingContext.getType(key) context.bindingContext.getType(key)
fun Generator.getTypeInferredByFrontendOrFail(key: KtExpression): KotlinType = internal fun Generator.getTypeInferredByFrontendOrFail(key: KtExpression): KotlinType =
getTypeInferredByFrontend(key) ?: throw RuntimeException("No type for expression: ${key.text}") getTypeInferredByFrontend(key) ?: throw RuntimeException("No type for expression: ${key.text}")
fun Generator.getExpressionTypeWithCoercionToUnit(key: KtExpression): KotlinType? = internal fun Generator.getExpressionTypeWithCoercionToUnit(key: KtExpression): KotlinType? =
if (key.isUsedAsExpression(context.bindingContext)) if (key.isUsedAsExpression(context.bindingContext))
getTypeInferredByFrontend(key) getTypeInferredByFrontend(key)
else else
(context.irBuiltIns as IrBuiltInsOverDescriptors).unit (context.irBuiltIns as IrBuiltInsOverDescriptors).unit
fun Generator.getExpressionTypeWithCoercionToUnitOrFail(key: KtExpression): KotlinType = internal fun Generator.getExpressionTypeWithCoercionToUnitOrFail(key: KtExpression): KotlinType =
getExpressionTypeWithCoercionToUnit(key) ?: throw RuntimeException("No type for expression: ${key.text}") getExpressionTypeWithCoercionToUnit(key) ?: throw RuntimeException("No type for expression: ${key.text}")
fun Generator.getResolvedCall(key: KtElement): ResolvedCall<out CallableDescriptor>? = internal fun Generator.getResolvedCall(key: KtElement): ResolvedCall<out CallableDescriptor>? =
key.getResolvedCall(context.bindingContext) key.getResolvedCall(context.bindingContext)
@@ -67,7 +67,7 @@ class GeneratorContext private constructor(
// TODO: inject a correct StorageManager instance, or store NotFoundClasses inside ModuleDescriptor // TODO: inject a correct StorageManager instance, or store NotFoundClasses inside ModuleDescriptor
val reflectionTypes = ReflectionTypes(moduleDescriptor, NotFoundClasses(LockBasedStorageManager.NO_LOCKS, moduleDescriptor)) val reflectionTypes = ReflectionTypes(moduleDescriptor, NotFoundClasses(LockBasedStorageManager.NO_LOCKS, moduleDescriptor))
val additionalDescriptorStorage: DescriptorStorageForContextReceivers = DescriptorStorageForContextReceivers() internal val additionalDescriptorStorage: DescriptorStorageForContextReceivers = DescriptorStorageForContextReceivers()
val samTypeApproximator = SamTypeApproximator(moduleDescriptor.builtIns, languageVersionSettings) val samTypeApproximator = SamTypeApproximator(moduleDescriptor.builtIns, languageVersionSettings)
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
class IrSyntheticDeclarationGenerator(context: GeneratorContext) : IrElementVisitorVoid { internal class IrSyntheticDeclarationGenerator(context: GeneratorContext) : IrElementVisitorVoid {
fun generateSyntheticDeclarations(file: IrFile) { fun generateSyntheticDeclarations(file: IrFile) {
try { try {
file.acceptChildrenVoid(this) file.acceptChildrenVoid(this)
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.psi.KtObjectLiteralExpression
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
class LocalClassGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { internal class LocalClassGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateObjectLiteral(ktObjectLiteral: KtObjectLiteralExpression): IrStatement { fun generateObjectLiteral(ktObjectLiteral: KtObjectLiteralExpression): IrStatement {
val startOffset = ktObjectLiteral.startOffsetSkippingComments val startOffset = ktObjectLiteral.startOffsetSkippingComments
val endOffset = ktObjectLiteral.endOffset val endOffset = ktObjectLiteral.endOffset
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.bindingContextUtil.isInlineableFunctionLiteral import org.jetbrains.kotlin.resolve.bindingContextUtil.isInlineableFunctionLiteral
class LocalFunctionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { internal class LocalFunctionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateLambda(ktLambda: KtLambdaExpression): IrStatement { fun generateLambda(ktLambda: KtLambdaExpression): IrStatement {
val ktFun = ktLambda.functionLiteral val ktFun = ktLambda.functionLiteral
@@ -69,4 +69,4 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
else null, else null,
IrDeclarationOrigin.LOCAL_FUNCTION IrDeclarationOrigin.LOCAL_FUNCTION
) )
} }
@@ -30,7 +30,7 @@ import org.jetbrains.kotlin.psi2ir.intermediate.VariableLValue
import org.jetbrains.kotlin.psi2ir.intermediate.setExplicitReceiverValue import org.jetbrains.kotlin.psi2ir.intermediate.setExplicitReceiverValue
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
class LoopExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { internal class LoopExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateWhileLoop(ktWhile: KtWhileExpression): IrExpression { fun generateWhileLoop(ktWhile: KtWhileExpression): IrExpression {
val irLoop = IrWhileLoopImpl( val irLoop = IrWhileLoopImpl(
ktWhile.startOffsetSkippingComments, ktWhile.endOffset, ktWhile.startOffsetSkippingComments, ktWhile.endOffset,
@@ -222,4 +222,4 @@ class LoopExpressionGenerator(statementGenerator: StatementGenerator) : Statemen
return irForBlock return irForBlock
} }
} }
@@ -21,8 +21,7 @@ import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
internal fun getInfixOperator(ktOperator: IElementType): IrStatementOrigin? =
fun getInfixOperator(ktOperator: IElementType): IrStatementOrigin? =
when (ktOperator) { when (ktOperator) {
KtTokens.EQ -> IrStatementOrigin.EQ KtTokens.EQ -> IrStatementOrigin.EQ
KtTokens.PLUSEQ -> IrStatementOrigin.PLUSEQ KtTokens.PLUSEQ -> IrStatementOrigin.PLUSEQ
@@ -53,7 +52,7 @@ fun getInfixOperator(ktOperator: IElementType): IrStatementOrigin? =
else -> null else -> null
} }
fun getPrefixOperator(ktOperator: IElementType): IrStatementOrigin? = internal fun getPrefixOperator(ktOperator: IElementType): IrStatementOrigin? =
when (ktOperator) { when (ktOperator) {
KtTokens.PLUSPLUS -> IrStatementOrigin.PREFIX_INCR KtTokens.PLUSPLUS -> IrStatementOrigin.PREFIX_INCR
KtTokens.MINUSMINUS -> IrStatementOrigin.PREFIX_DECR KtTokens.MINUSMINUS -> IrStatementOrigin.PREFIX_DECR
@@ -63,7 +62,7 @@ fun getPrefixOperator(ktOperator: IElementType): IrStatementOrigin? =
else -> null else -> null
} }
fun getPostfixOperator(ktOperator: IElementType): IrStatementOrigin? = internal fun getPostfixOperator(ktOperator: IElementType): IrStatementOrigin? =
when (ktOperator) { when (ktOperator) {
KtTokens.PLUSPLUS -> IrStatementOrigin.POSTFIX_INCR KtTokens.PLUSPLUS -> IrStatementOrigin.POSTFIX_INCR
KtTokens.MINUSMINUS -> IrStatementOrigin.POSTFIX_DECR KtTokens.MINUSMINUS -> IrStatementOrigin.POSTFIX_DECR
@@ -71,7 +70,7 @@ fun getPostfixOperator(ktOperator: IElementType): IrStatementOrigin? =
else -> null else -> null
} }
fun getIrTypeOperator(ktOperator: IElementType): IrTypeOperator? = internal fun getIrTypeOperator(ktOperator: IElementType): IrTypeOperator? =
when (ktOperator) { when (ktOperator) {
KtTokens.IS_KEYWORD -> IrTypeOperator.INSTANCEOF KtTokens.IS_KEYWORD -> IrTypeOperator.INSTANCEOF
KtTokens.NOT_IS -> IrTypeOperator.NOT_INSTANCEOF KtTokens.NOT_IS -> IrTypeOperator.NOT_INSTANCEOF
@@ -80,10 +79,10 @@ fun getIrTypeOperator(ktOperator: IElementType): IrTypeOperator? =
else -> null else -> null
} }
val AUGMENTED_ASSIGNMENTS = internal val AUGMENTED_ASSIGNMENTS =
setOf(IrStatementOrigin.PLUSEQ, IrStatementOrigin.MINUSEQ, IrStatementOrigin.MULTEQ, IrStatementOrigin.DIVEQ, IrStatementOrigin.PERCEQ) setOf(IrStatementOrigin.PLUSEQ, IrStatementOrigin.MINUSEQ, IrStatementOrigin.MULTEQ, IrStatementOrigin.DIVEQ, IrStatementOrigin.PERCEQ)
val OPERATORS_DESUGARED_TO_CALLS = internal val OPERATORS_DESUGARED_TO_CALLS =
setOf( setOf(
IrStatementOrigin.PLUS, IrStatementOrigin.PLUS,
IrStatementOrigin.MINUS, IrStatementOrigin.MINUS,
@@ -97,23 +96,20 @@ val OPERATORS_DESUGARED_TO_CALLS =
IrStatementOrigin.UPLUS IrStatementOrigin.UPLUS
) )
val COMPARISON_OPERATORS = internal val COMPARISON_OPERATORS =
setOf(IrStatementOrigin.LT, IrStatementOrigin.LTEQ, IrStatementOrigin.GT, IrStatementOrigin.GTEQ) setOf(IrStatementOrigin.LT, IrStatementOrigin.LTEQ, IrStatementOrigin.GT, IrStatementOrigin.GTEQ)
val EQUALITY_OPERATORS = internal val EQUALITY_OPERATORS =
setOf(IrStatementOrigin.EQEQ, IrStatementOrigin.EXCLEQ) setOf(IrStatementOrigin.EQEQ, IrStatementOrigin.EXCLEQ)
val IDENTITY_OPERATORS = internal val IDENTITY_OPERATORS =
setOf(IrStatementOrigin.EQEQEQ, IrStatementOrigin.EXCLEQEQ) setOf(IrStatementOrigin.EQEQEQ, IrStatementOrigin.EXCLEQEQ)
val IN_OPERATORS = internal val IN_OPERATORS =
setOf(IrStatementOrigin.IN, IrStatementOrigin.NOT_IN) setOf(IrStatementOrigin.IN, IrStatementOrigin.NOT_IN)
val BINARY_BOOLEAN_OPERATORS = internal val BINARY_BOOLEAN_OPERATORS =
setOf(IrStatementOrigin.ANDAND, IrStatementOrigin.OROR) setOf(IrStatementOrigin.ANDAND, IrStatementOrigin.OROR)
val INCREMENT_DECREMENT_OPERATORS = internal val INCREMENT_DECREMENT_OPERATORS =
setOf(IrStatementOrigin.PREFIX_INCR, IrStatementOrigin.PREFIX_DECR, IrStatementOrigin.POSTFIX_INCR, IrStatementOrigin.POSTFIX_DECR) setOf(IrStatementOrigin.PREFIX_INCR, IrStatementOrigin.PREFIX_DECR, IrStatementOrigin.POSTFIX_INCR, IrStatementOrigin.POSTFIX_DECR)
val POSTFIX_INCREMENT_DECREMENT_OPERATORS =
setOf(IrStatementOrigin.POSTFIX_INCR, IrStatementOrigin.POSTFIX_DECR)
@@ -51,8 +51,7 @@ import org.jetbrains.kotlin.types.typeUtil.makeNullable
import kotlin.collections.contains import kotlin.collections.contains
import kotlin.collections.set import kotlin.collections.set
internal class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
private fun createErrorExpression(ktExpression: KtExpression, text: String) = private fun createErrorExpression(ktExpression: KtExpression, text: String) =
IrErrorExpressionImpl( IrErrorExpressionImpl(
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.hasBackingField import org.jetbrains.kotlin.resolve.hasBackingField
class PropertyGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) { internal class PropertyGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
fun generatePropertyDeclaration(ktProperty: KtProperty): IrProperty { fun generatePropertyDeclaration(ktProperty: KtProperty): IrProperty {
val propertyDescriptor = getPropertyDescriptor(ktProperty) val propertyDescriptor = getPropertyDescriptor(ktProperty)
val ktDelegate = ktProperty.delegate val ktDelegate = ktProperty.delegate
@@ -277,5 +277,3 @@ internal fun IrProperty.linkCorrespondingPropertySymbol() {
getter?.correspondingPropertySymbol = symbol getter?.correspondingPropertySymbol = symbol
setter?.correspondingPropertySymbol = symbol setter?.correspondingPropertySymbol = symbol
} }
@@ -48,7 +48,7 @@ import org.jetbrains.kotlin.types.TypeProjectionImpl
import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.expressions.DoubleColonLHS import org.jetbrains.kotlin.types.expressions.DoubleColonLHS
class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { internal class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateClassLiteral(ktClassLiteral: KtClassLiteralExpression): IrExpression { fun generateClassLiteral(ktClassLiteral: KtClassLiteralExpression): IrExpression {
val ktArgument = ktClassLiteral.receiverExpression!! val ktArgument = ktClassLiteral.receiverExpression!!
@@ -669,4 +669,4 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
arguments.last().type, arguments.last().type,
suspendFunction suspendFunction
) )
} }
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) { internal class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
fun generateScriptDeclaration(ktScript: KtScript): IrDeclaration? { fun generateScriptDeclaration(ktScript: KtScript): IrDeclaration? {
val descriptor = getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktScript) as ScriptDescriptor val descriptor = getOrFail(BindingContext.DECLARATION_TO_DESCRIPTOR, ktScript) as ScriptDescriptor
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
class StandaloneDeclarationGenerator(private val context: GeneratorContext) { internal class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
private val typeTranslator = context.typeTranslator private val typeTranslator = context.typeTranslator
private val symbolTable = context.symbolTable private val symbolTable = context.symbolTable
private val irFactory = context.irFactory private val irFactory = context.irFactory
@@ -51,7 +51,7 @@ import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils import org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
class StatementGenerator( internal class StatementGenerator(
val bodyGenerator: BodyGenerator, val bodyGenerator: BodyGenerator,
override val scope: Scope override val scope: Scope
) : KtVisitor<IrStatement, Nothing?>(), ) : KtVisitor<IrStatement, Nothing?>(),
@@ -553,7 +553,7 @@ class StatementGenerator(
ReflectionReferencesGenerator(this).generateCallableReference(expression) ReflectionReferencesGenerator(this).generateCallableReference(expression)
} }
abstract class StatementGeneratorExtension(val statementGenerator: StatementGenerator) : GeneratorWithScope { internal abstract class StatementGeneratorExtension(val statementGenerator: StatementGenerator) : GeneratorWithScope {
override val scope: Scope get() = statementGenerator.scope override val scope: Scope get() = statementGenerator.scope
override val context: GeneratorContext get() = statementGenerator.context override val context: GeneratorContext get() = statementGenerator.context
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
class SyntheticDeclarationsGenerator(context: GeneratorContext) : DeclarationDescriptorVisitor<Unit, IrDeclarationContainer?> { internal class SyntheticDeclarationsGenerator(context: GeneratorContext) : DeclarationDescriptorVisitor<Unit, IrDeclarationContainer?> {
private val generator = StandaloneDeclarationGenerator(context) private val generator = StandaloneDeclarationGenerator(context)
private val symbolTable = context.symbolTable private val symbolTable = context.symbolTable
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) { internal class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateTryCatch(ktTry: KtTryExpression): IrExpression { fun generateTryCatch(ktTry: KtTryExpression): IrExpression {
val resultType = getExpressionTypeWithCoercionToUnitOrFail(ktTry).toIrType() val resultType = getExpressionTypeWithCoercionToUnitOrFail(ktTry).toIrType()
val irTryCatch = IrTryImpl(ktTry.startOffsetSkippingComments, ktTry.endOffset, resultType) val irTryCatch = IrTryImpl(ktTry.startOffsetSkippingComments, ktTry.endOffset, resultType)
@@ -15,15 +15,15 @@ import org.jetbrains.kotlin.resolve.sam.getFunctionTypeForAbstractMethod
import org.jetbrains.kotlin.resolve.sam.getSingleAbstractMethodOrNull import org.jetbrains.kotlin.resolve.sam.getSingleAbstractMethodOrNull
import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.*
fun GeneratorExtensions.SamConversion.isSamType(kotlinType: KotlinType): Boolean { internal fun GeneratorExtensions.SamConversion.isSamType(kotlinType: KotlinType): Boolean {
val descriptor = kotlinType.constructor.declarationDescriptor val descriptor = kotlinType.constructor.declarationDescriptor
return descriptor is ClassDescriptor && descriptor.isFun || return descriptor is ClassDescriptor && descriptor.isFun ||
isPlatformSamType(kotlinType) isPlatformSamType(kotlinType)
} }
fun DeclarationDescriptor.isSamConstructor() = this is FunctionInterfaceConstructorDescriptor internal fun DeclarationDescriptor.isSamConstructor() = this is FunctionInterfaceConstructorDescriptor
fun CallableDescriptor.getOriginalForFunctionInterfaceAdapter() = internal fun CallableDescriptor.getOriginalForFunctionInterfaceAdapter() =
when (this) { when (this) {
is FunctionInterfaceAdapterDescriptor<*> -> is FunctionInterfaceAdapterDescriptor<*> ->
baseDescriptorForSynthetic baseDescriptorForSynthetic
@@ -33,7 +33,7 @@ fun CallableDescriptor.getOriginalForFunctionInterfaceAdapter() =
null null
} }
fun KotlinType.getSubstitutedFunctionTypeForSamType(): KotlinType = internal fun KotlinType.getSubstitutedFunctionTypeForSamType(): KotlinType =
when (val unwrapped = this.unwrap()) { when (val unwrapped = this.unwrap()) {
is SimpleType -> unwrapped.getSubstitutedFunctionTypeForSamType() is SimpleType -> unwrapped.getSubstitutedFunctionTypeForSamType()
is FlexibleType -> KotlinTypeFactory.flexibleType( is FlexibleType -> KotlinTypeFactory.flexibleType(
@@ -39,7 +39,7 @@ import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
class ArrayAccessAssignmentReceiver( internal class ArrayAccessAssignmentReceiver(
private val irArray: IrExpression, private val irArray: IrExpression,
private val ktIndexExpressions: List<KtExpression>, private val ktIndexExpressions: List<KtExpression>,
private val irIndexExpressions: List<IrExpression>, private val irIndexExpressions: List<IrExpression>,
@@ -23,9 +23,8 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.types.KotlinType
class BackingFieldLValue( internal class BackingFieldLValue(
private val context: IrGeneratorContext, private val context: IrGeneratorContext,
private val startOffset: Int, private val startOffset: Int,
private val endOffset: Int, private val endOffset: Int,
@@ -16,14 +16,17 @@
package org.jetbrains.kotlin.psi2ir.intermediate package org.jetbrains.kotlin.psi2ir.intermediate
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.psi2ir.generators.hasNoSideEffects import org.jetbrains.kotlin.psi2ir.generators.hasNoSideEffects
import org.jetbrains.kotlin.psi2ir.isValueArgumentReorderingRequired import org.jetbrains.kotlin.psi2ir.isValueArgumentReorderingRequired
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
class CallBuilder( internal class CallBuilder(
val original: ResolvedCall<*>, // TODO get rid of "original", sometimes we want to generate a call without ResolvedCall val original: ResolvedCall<*>, // TODO get rid of "original", sometimes we want to generate a call without ResolvedCall
val descriptor: CallableDescriptor, val descriptor: CallableDescriptor,
val typeArguments: Map<TypeParameterDescriptor, KotlinType>?, val typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
@@ -41,47 +44,31 @@ class CallBuilder(
irValueArgumentsByIndex[valueParameterDescriptor.index + parametersOffset] irValueArgumentsByIndex[valueParameterDescriptor.index + parametersOffset]
} }
val CallBuilder.argumentsCount: Int internal val CallBuilder.argumentsCount: Int
get() = get() =
irValueArgumentsByIndex.size irValueArgumentsByIndex.size
var CallBuilder.lastArgument: IrExpression? internal var CallBuilder.lastArgument: IrExpression?
get() = irValueArgumentsByIndex.last() get() = irValueArgumentsByIndex.last()
set(value) { set(value) {
irValueArgumentsByIndex[argumentsCount - 1] = value irValueArgumentsByIndex[argumentsCount - 1] = value
} }
fun CallBuilder.getValueArgumentsInParameterOrder(): List<IrExpression?> = internal fun CallBuilder.getValueArgumentsInParameterOrder(): List<IrExpression?> =
descriptor.valueParameters.map { irValueArgumentsByIndex[it.index] } descriptor.valueParameters.map { irValueArgumentsByIndex[it.index] }
fun CallBuilder.isValueArgumentReorderingRequired() = internal fun CallBuilder.isValueArgumentReorderingRequired() =
original.isValueArgumentReorderingRequired() && irValueArgumentsByIndex.any { it != null && !it.hasNoSideEffects() } original.isValueArgumentReorderingRequired() && irValueArgumentsByIndex.any { it != null && !it.hasNoSideEffects() }
val CallBuilder.hasExtensionReceiver: Boolean internal val CallBuilder.hasExtensionReceiver: Boolean
get() = get() =
descriptor.extensionReceiverParameter != null descriptor.extensionReceiverParameter != null
val CallBuilder.hasDispatchReceiver: Boolean internal val CallBuilder.dispatchReceiverType: KotlinType?
get() =
descriptor.dispatchReceiverParameter != null
val CallBuilder.extensionReceiverType: KotlinType?
get() =
descriptor.extensionReceiverParameter?.type
val CallBuilder.dispatchReceiverType: KotlinType?
get() = get() =
descriptor.dispatchReceiverParameter?.type descriptor.dispatchReceiverParameter?.type
val CallBuilder.explicitReceiverParameter: ReceiverParameterDescriptor? internal fun CallBuilder.setExplicitReceiverValue(explicitReceiverValue: IntermediateValue) {
get() =
descriptor.extensionReceiverParameter ?: descriptor.dispatchReceiverParameter
val CallBuilder.explicitReceiverType: KotlinType?
get() =
explicitReceiverParameter?.type
fun CallBuilder.setExplicitReceiverValue(explicitReceiverValue: IntermediateValue) {
val previousCallReceiver = callReceiver val previousCallReceiver = callReceiver
callReceiver = object : CallReceiver { callReceiver = object : CallReceiver {
override fun call(builder: CallExpressionBuilder): IrExpression { override fun call(builder: CallExpressionBuilder): IrExpression {
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
class DelegatedLocalPropertyLValue( internal class DelegatedLocalPropertyLValue(
private val context: IrGeneratorContext, private val context: IrGeneratorContext,
val startOffset: Int, val startOffset: Int,
val endOffset: Int, val endOffset: Int,
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.ir.expressions.left
import org.jetbrains.kotlin.ir.expressions.right import org.jetbrains.kotlin.ir.expressions.right
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
class DynamicMemberLValue( internal class DynamicMemberLValue(
private val context: IrGeneratorContext, private val context: IrGeneratorContext,
private val startOffset: Int, private val startOffset: Int,
private val endOffset: Int, private val endOffset: Int,
@@ -69,4 +69,4 @@ class DynamicMemberLValue(
if (extensionReceiverValue != null) throw AssertionError("Dynamic call $memberName should have no extension receiver") if (extensionReceiverValue != null) throw AssertionError("Dynamic call $memberName should have no extension receiver")
return dispatchReceiverValue.load() return dispatchReceiverValue.load()
} }
} }
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.psi2ir.intermediate
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
class ExtensionInvokeCallReceiver( internal class ExtensionInvokeCallReceiver(
private val callBuilder: CallBuilder, private val callBuilder: CallBuilder,
private val functionReceiver: IntermediateValue, private val functionReceiver: IntermediateValue,
private val extensionInvokeReceiver: IntermediateValue private val extensionInvokeReceiver: IntermediateValue
@@ -35,4 +35,4 @@ class ExtensionInvokeCallReceiver(
callBuilder.irValueArgumentsByIndex[0] = extensionInvokeReceiver.load() callBuilder.irValueArgumentsByIndex[0] = extensionInvokeReceiver.load()
return builder.withReceivers(functionReceiver, null, emptyList()) return builder.withReceivers(functionReceiver, null, emptyList())
} }
} }
@@ -22,10 +22,10 @@ import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
fun IrVariable.loadAt(startOffset: Int, endOffset: Int): IrExpression = internal fun IrVariable.loadAt(startOffset: Int, endOffset: Int): IrExpression =
IrGetValueImpl(startOffset, endOffset, type, symbol) IrGetValueImpl(startOffset, endOffset, type, symbol)
fun CallReceiver.adjustForCallee(callee: CallableMemberDescriptor): CallReceiver = internal fun CallReceiver.adjustForCallee(callee: CallableMemberDescriptor): CallReceiver =
object : CallReceiver { object : CallReceiver {
override fun call(builder: CallExpressionBuilder): IrExpression = override fun call(builder: CallExpressionBuilder): IrExpression =
this@adjustForCallee.call { dispatchReceiverValue, extensionReceiverValue, contextReceiverValues -> this@adjustForCallee.call { dispatchReceiverValue, extensionReceiverValue, contextReceiverValues ->
@@ -51,7 +51,7 @@ fun CallReceiver.adjustForCallee(callee: CallableMemberDescriptor): CallReceiver
} }
fun computeSubstitutedSyntheticAccessor( internal fun computeSubstitutedSyntheticAccessor(
propertyDescriptor: PropertyDescriptor, propertyDescriptor: PropertyDescriptor,
accessorFunctionDescriptor: FunctionDescriptor, accessorFunctionDescriptor: FunctionDescriptor,
substitutedExtensionAccessorDescriptor: PropertyAccessorDescriptor substitutedExtensionAccessorDescriptor: PropertyAccessorDescriptor
@@ -94,4 +94,4 @@ private fun copyTypesFromExtensionAccessor(
accessorFunctionDescriptor.modality, accessorFunctionDescriptor.modality,
accessorFunctionDescriptor.visibility accessorFunctionDescriptor.visibility
) )
} }
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.psi2ir.generators.CallGenerator import org.jetbrains.kotlin.psi2ir.generators.CallGenerator
class LValueWithGetterAndSetterCalls( internal class LValueWithGetterAndSetterCalls(
private val callGenerator: CallGenerator, private val callGenerator: CallGenerator,
private val descriptor: CallableDescriptor, private val descriptor: CallableDescriptor,
private val getterCall: () -> CallBuilder?, private val getterCall: () -> CallBuilder?,
@@ -42,5 +42,4 @@ class LValueWithGetterAndSetterCalls(
val call = setterCall(irExpression) ?: throw AssertionError("No setter call for $descriptor") val call = setterCall(irExpression) ?: throw AssertionError("No setter call for $descriptor")
return callGenerator.generateCall(startOffset, endOffset, call, origin) return callGenerator.generateCall(startOffset, endOffset, call, origin)
} }
} }
@@ -19,16 +19,15 @@ package org.jetbrains.kotlin.psi2ir.intermediate
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.types.KotlinType
abstract class ExpressionValue(override val type: IrType) : IntermediateValue internal abstract class ExpressionValue(override val type: IrType) : IntermediateValue
inline fun generateExpressionValue(type: IrType, crossinline generate: () -> IrExpression) = internal inline fun generateExpressionValue(type: IrType, crossinline generate: () -> IrExpression) =
object : ExpressionValue(type) { object : ExpressionValue(type) {
override fun load(): IrExpression = generate() override fun load(): IrExpression = generate()
} }
class OnceExpressionValue(val irExpression: IrExpression) : LValue, AssignmentReceiver { internal class OnceExpressionValue(val irExpression: IrExpression) : LValue, AssignmentReceiver {
private var instantiated = false private var instantiated = false
override fun load(): IrExpression { override fun load(): IrExpression {
@@ -45,4 +44,4 @@ class OnceExpressionValue(val irExpression: IrExpression) : LValue, AssignmentRe
override fun assign(withLValue: (LValue) -> IrExpression): IrExpression = override fun assign(withLValue: (LValue) -> IrExpression): IrExpression =
withLValue(this) withLValue(this)
} }
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
abstract class PropertyLValueBase( internal abstract class PropertyLValueBase(
protected val context: GeneratorContext, protected val context: GeneratorContext,
val scope: Scope, val scope: Scope,
val startOffset: Int, val startOffset: Int,
@@ -72,7 +72,7 @@ abstract class PropertyLValueBase(
protected abstract fun withReceiver(dispatchReceiver: VariableLValue?, extensionReceiver: VariableLValue?, contextReceivers: List<VariableLValue>): PropertyLValueBase protected abstract fun withReceiver(dispatchReceiver: VariableLValue?, extensionReceiver: VariableLValue?, contextReceivers: List<VariableLValue>): PropertyLValueBase
} }
class FieldPropertyLValue( internal class FieldPropertyLValue(
context: GeneratorContext, context: GeneratorContext,
scope: Scope, scope: Scope,
startOffset: Int, startOffset: Int,
@@ -127,7 +127,7 @@ class FieldPropertyLValue(
) )
} }
class AccessorPropertyLValue( internal class AccessorPropertyLValue(
context: GeneratorContext, context: GeneratorContext,
scope: Scope, scope: Scope,
startOffset: Int, startOffset: Int,
@@ -207,4 +207,4 @@ class AccessorPropertyLValue(
SimpleCallReceiver(dispatchReceiver, extensionReceiver, contextReceivers), SimpleCallReceiver(dispatchReceiver, extensionReceiver, contextReceivers),
superQualifier superQualifier
) )
} }
@@ -21,14 +21,8 @@ import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementContainer import org.jetbrains.kotlin.ir.expressions.IrStatementContainer
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.shallowCopy
class RematerializableValue(override val type: IrType, val irExpression: IrExpression) : IntermediateValue { internal fun Scope.createTemporaryVariableInBlock(
override fun load(): IrExpression = irExpression.shallowCopy()
}
fun Scope.createTemporaryVariableInBlock(
context: IrGeneratorContext, context: IrGeneratorContext,
irExpression: IrExpression, irExpression: IrExpression,
block: IrStatementContainer, block: IrStatementContainer,
@@ -42,7 +36,7 @@ fun Scope.createTemporaryVariableInBlock(
) )
} }
fun Scope.declareTemporaryVariableInBlock( internal fun Scope.declareTemporaryVariableInBlock(
irExpression: IrExpression, irExpression: IrExpression,
block: IrStatementContainer, block: IrStatementContainer,
nameHint: String? = null, nameHint: String? = null,
@@ -53,5 +47,3 @@ fun Scope.declareTemporaryVariableInBlock(
block.statements.add(temporaryVariable) block.statements.add(temporaryVariable)
return temporaryVariable return temporaryVariable
} }
@@ -25,8 +25,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl
import org.jetbrains.kotlin.ir.types.makeNullable import org.jetbrains.kotlin.ir.types.makeNullable
import org.jetbrains.kotlin.psi2ir.generators.GeneratorWithScope import org.jetbrains.kotlin.psi2ir.generators.GeneratorWithScope
internal class SafeCallReceiver(
class SafeCallReceiver(
val generator: GeneratorWithScope, val generator: GeneratorWithScope,
val startOffset: Int, val startOffset: Int,
val endOffset: Int, val endOffset: Int,
@@ -67,8 +66,7 @@ class SafeCallReceiver(
} }
} }
internal fun IrExpression.safeCallOnDispatchReceiver(
fun IrExpression.safeCallOnDispatchReceiver(
generator: GeneratorWithScope, generator: GeneratorWithScope,
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
@@ -83,4 +81,4 @@ fun IrExpression.safeCallOnDispatchReceiver(
).call { dispatchReceiverValue, _, contextReceiverValues -> ).call { dispatchReceiverValue, _, contextReceiverValues ->
assert(contextReceiverValues.isEmpty()) { "Context receivers in numeric promotion" } assert(contextReceiverValues.isEmpty()) { "Context receivers in numeric promotion" }
ifNotNull(dispatchReceiverValue!!.load()) ifNotNull(dispatchReceiverValue!!.load())
} }
@@ -24,13 +24,13 @@ import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.types.makeNullable import org.jetbrains.kotlin.ir.types.makeNullable
import org.jetbrains.kotlin.psi2ir.generators.GeneratorWithScope import org.jetbrains.kotlin.psi2ir.generators.GeneratorWithScope
class SafeExtensionInvokeCallReceiver( internal class SafeExtensionInvokeCallReceiver(
val generator: GeneratorWithScope, val generator: GeneratorWithScope,
val startOffset: Int, val startOffset: Int,
val endOffset: Int, val endOffset: Int,
val callBuilder: CallBuilder, private val callBuilder: CallBuilder,
val functionReceiver: IntermediateValue, private val functionReceiver: IntermediateValue,
val extensionInvokeReceiver: IntermediateValue private val extensionInvokeReceiver: IntermediateValue
) : CallReceiver { ) : CallReceiver {
override fun call(builder: CallExpressionBuilder): IrExpression { override fun call(builder: CallExpressionBuilder): IrExpression {
// extensionInvokeReceiver is actually a first argument: // extensionInvokeReceiver is actually a first argument:
@@ -62,4 +62,3 @@ class SafeExtensionInvokeCallReceiver(
} }
} }
} }
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.psi2ir.intermediate
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
class SimpleCallReceiver( internal class SimpleCallReceiver(
val dispatchReceiverValue: IntermediateValue?, val dispatchReceiverValue: IntermediateValue?,
val extensionReceiverValue: IntermediateValue?, val extensionReceiverValue: IntermediateValue?,
val contextReceiverValues: List<IntermediateValue> val contextReceiverValues: List<IntermediateValue>
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi2ir.generators.StatementGenerator import org.jetbrains.kotlin.psi2ir.generators.StatementGenerator
class SpecialExpressionAssignmentReceiver( internal class SpecialExpressionAssignmentReceiver(
private val statementGenerator: StatementGenerator, private val statementGenerator: StatementGenerator,
private val ktExpression: KtExpression, private val ktExpression: KtExpression,
private val origin: IrStatementOrigin, private val origin: IrStatementOrigin,
@@ -31,4 +31,4 @@ class SpecialExpressionAssignmentReceiver(
override fun assign(withLValue: (LValue) -> IrExpression): IrExpression = override fun assign(withLValue: (LValue) -> IrExpression): IrExpression =
withLValue(this) withLValue(this)
} }
@@ -18,9 +18,8 @@ package org.jetbrains.kotlin.psi2ir.intermediate
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.types.KotlinType
class TransientReceiverValue(override val type: IrType) : IntermediateValue { internal class TransientReceiverValue(override val type: IrType) : IntermediateValue {
override fun load(): IrExpression { override fun load(): IrExpression {
throw AssertionError("Transient receiver should not be instantiated") throw AssertionError("Transient receiver should not be instantiated")
@@ -19,22 +19,22 @@ package org.jetbrains.kotlin.psi2ir.intermediate
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
interface IntermediateValue { internal interface IntermediateValue {
fun load(): IrExpression fun load(): IrExpression
fun loadIfExists(): IrExpression? = load() fun loadIfExists(): IrExpression? = load()
val type: IrType val type: IrType
} }
interface LValue : IntermediateValue { internal interface LValue : IntermediateValue {
fun store(irExpression: IrExpression): IrExpression fun store(irExpression: IrExpression): IrExpression
} }
interface AssignmentReceiver { internal interface AssignmentReceiver {
fun assign(withLValue: (LValue) -> IrExpression): IrExpression fun assign(withLValue: (LValue) -> IrExpression): IrExpression
fun assign(value: IrExpression): IrExpression = assign { it.store(value) } fun assign(value: IrExpression): IrExpression = assign { it.store(value) }
} }
fun interface CallExpressionBuilder { internal fun interface CallExpressionBuilder {
fun withReceivers( fun withReceivers(
dispatchReceiver: IntermediateValue?, dispatchReceiver: IntermediateValue?,
extensionReceiver: IntermediateValue?, extensionReceiver: IntermediateValue?,
@@ -42,6 +42,6 @@ fun interface CallExpressionBuilder {
): IrExpression ): IrExpression
} }
interface CallReceiver { internal interface CallReceiver {
fun call(builder: CallExpressionBuilder): IrExpression fun call(builder: CallExpressionBuilder): IrExpression
} }
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrSetValueImpl
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
class VariableLValue( internal class VariableLValue(
private val context: IrGeneratorContext, private val context: IrGeneratorContext,
val startOffset: Int, val startOffset: Int,
val endOffset: Int, val endOffset: Int,
@@ -58,4 +58,4 @@ class VariableLValue(
override fun assign(withLValue: (LValue) -> IrExpression): IrExpression = override fun assign(withLValue: (LValue) -> IrExpression): IrExpression =
withLValue(this) withLValue(this)
} }
@@ -57,7 +57,7 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.types.typeUtil.* import org.jetbrains.kotlin.types.typeUtil.*
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
fun insertImplicitCasts(file: IrFile, context: GeneratorContext) { internal fun insertImplicitCasts(file: IrFile, context: GeneratorContext) {
InsertImplicitCasts( InsertImplicitCasts(
context.irBuiltIns, context.irBuiltIns,
context.typeTranslator, context.typeTranslator,