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.TypeUtils
fun KotlinType.containsNull() =
internal fun KotlinType.containsNull(): Boolean =
TypeUtils.isNullableType(this)
fun KtElement.deparenthesize(): KtElement =
if (this is KtExpression) KtPsiUtil.safeDeparenthesize(this) else this
fun ResolvedCall<*>.isValueArgumentReorderingRequired(): Boolean {
internal fun ResolvedCall<*>.isValueArgumentReorderingRequired(): Boolean {
var lastValueParameterIndex = -1
for (valueArgument in call.valueArguments) {
val argumentMapping =
@@ -53,7 +53,7 @@ fun ResolvedCall<*>.isValueArgumentReorderingRequired(): Boolean {
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 delegatingResolvedCall = getDelegationCall().getResolvedCall(bindingContext)
return if (delegatingResolvedCall != null) {
@@ -68,13 +68,13 @@ fun KtSecondaryConstructor.isConstructorDelegatingToSuper(bindingContext: Bindin
fun MemberScope.findSingleFunction(name: Name): FunctionDescriptor =
getContributedFunctions(name, NoLookupLocation.FROM_BACKEND).single()
val PsiElement?.startOffsetOrUndefined get() = this?.startOffsetSkippingComments ?: UNDEFINED_OFFSET
val PsiElement?.endOffsetOrUndefined get() = this?.endOffset ?: UNDEFINED_OFFSET
internal val PsiElement?.startOffsetOrUndefined get() = this?.startOffsetSkippingComments ?: 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
val PropertyDescriptor.unwrappedSetMethod: FunctionDescriptor?
internal val PropertyDescriptor.unwrappedSetMethod: FunctionDescriptor?
get() = if (this is SyntheticPropertyDescriptor) this.setMethod else setter
// Only works for descriptors of Java fields.
@@ -90,7 +90,7 @@ internal fun PropertyDescriptor.resolveFakeOverride(): PropertyDescriptor {
return current
}
val KtPureElement?.pureStartOffsetOrUndefined get() = this?.psiOrParent?.startOffsetSkippingComments ?: UNDEFINED_OFFSET
val KtPureElement?.pureEndOffsetOrUndefined get() = this?.psiOrParent?.endOffset ?: UNDEFINED_OFFSET
internal val KtPureElement?.pureStartOffsetOrUndefined get() = this?.psiOrParent?.startOffsetSkippingComments ?: 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.acceptChildrenVoid
class AnnotationGenerator(context: GeneratorContext) : IrElementVisitorVoid {
internal class AnnotationGenerator(context: GeneratorContext) : IrElementVisitorVoid {
private val typeTranslator = context.typeTranslator
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.startOffsetSkippingComments
class AnonymousInitializerGenerator(
internal class AnonymousInitializerGenerator(
declarationGenerator: DeclarationGenerator
) : DeclarationGeneratorExtension(declarationGenerator) {
@@ -54,10 +54,10 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
import kotlin.math.max
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) }
fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
private fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
ktDefaultElement: KtElement,
receiver: ContextClassReceiver?
): IntermediateValue? =
@@ -69,7 +69,7 @@ fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
)
}
fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
private fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall(
defaultStartOffset: Int,
defaultEndOffset: Int,
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)
fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffset: Int, receiver: ReceiverValue): IntermediateValue {
private fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffset: Int, receiver: ReceiverValue): IntermediateValue {
val irReceiverType =
when (receiver) {
is ExtensionReceiver ->
@@ -145,7 +145,7 @@ fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffse
}
}
fun StatementGenerator.loadContextReceiver(
internal fun StatementGenerator.loadContextReceiver(
receiver: ContextClassReceiver,
defaultStartOffset: Int, defaultEndOffset: Int,
): IrGetFieldImpl {
@@ -165,7 +165,7 @@ fun StatementGenerator.loadContextReceiver(
}
fun StatementGenerator.generateSingletonReference(
internal fun StatementGenerator.generateSingletonReference(
descriptor: ClassDescriptor,
startOffset: Int,
endOffset: Int,
@@ -216,7 +216,7 @@ fun IrExpression.implicitCastTo(expectedType: IrType?): IrExpression {
return IrTypeOperatorCallImpl(startOffset, endOffset, expectedType, IrTypeOperator.IMPLICIT_CAST, expectedType, this)
}
fun StatementGenerator.generateBackingFieldReceiver(
internal fun StatementGenerator.generateBackingFieldReceiver(
startOffset: Int,
endOffset: Int,
resolvedCall: ResolvedCall<*>?,
@@ -226,7 +226,7 @@ fun StatementGenerator.generateBackingFieldReceiver(
return this.generateReceiver(startOffset, endOffset, receiver)
}
fun StatementGenerator.generateCallReceiver(
internal fun StatementGenerator.generateCallReceiver(
ktDefaultElement: KtElement,
calleeDescriptor: CallableDescriptor,
dispatchReceiver: ReceiverValue?,
@@ -355,11 +355,11 @@ private fun StatementGenerator.generateVarargExpressionUsing(
return irVararg
}
fun StatementGenerator.generateValueArgument(
private fun StatementGenerator.generateValueArgument(
valueArgument: ResolvedValueArgument,
valueParameter: ValueParameterDescriptor,
resolvedCall: ResolvedCall<*>
) = generateValueArgumentUsing(valueArgument, valueParameter, resolvedCall) { generateExpression(it) }
): IrExpression? = generateValueArgumentUsing(valueArgument, valueParameter, resolvedCall) { generateExpression(it) }
private fun StatementGenerator.generateValueArgumentUsing(
valueArgument: ResolvedValueArgument,
@@ -500,21 +500,21 @@ private fun StatementGenerator.createFunctionForSuspendConversion(
return irAdapterFun
}
fun StatementGenerator.castArgumentToFunctionalInterfaceForSamType(irExpression: IrExpression, samType: KotlinType): IrExpression {
internal fun StatementGenerator.castArgumentToFunctionalInterfaceForSamType(irExpression: IrExpression, samType: KotlinType): IrExpression {
val kotlinFunctionType = samType.getSubstitutedFunctionTypeForSamType()
val irFunctionType = context.typeTranslator.translateType(kotlinFunctionType)
return irExpression.implicitCastTo(irFunctionType)
}
fun Generator.getSuperQualifier(resolvedCall: ResolvedCall<*>): ClassDescriptor? {
internal fun Generator.getSuperQualifier(resolvedCall: ResolvedCall<*>): ClassDescriptor? {
val superCallExpression = getSuperCallExpression(resolvedCall.call) ?: return null
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) }
fun StatementGenerator.pregenerateCallUsing(
internal fun StatementGenerator.pregenerateCallUsing(
resolvedCall: ResolvedCall<*>,
generateArgumentExpression: (KtExpression) -> IrExpression?
): CallBuilder {
@@ -527,7 +527,7 @@ fun StatementGenerator.pregenerateCallUsing(
return call
}
fun getTypeArguments(resolvedCall: ResolvedCall<*>?): Map<TypeParameterDescriptor, KotlinType>? {
internal fun getTypeArguments(resolvedCall: ResolvedCall<*>?): Map<TypeParameterDescriptor, KotlinType>? {
if (resolvedCall == null) return null
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 functionNClass = extensionInvoke.containingDeclaration as? ClassDescriptor
?: throw AssertionError("'invoke' should be a class member: $extensionInvoke")
@@ -606,7 +606,7 @@ private fun ResolvedCall<*>.isExtensionInvokeCall(): Boolean {
return extensionReceiver != null
}
fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: CallBuilder, resolvedCall: ResolvedCall<*>) {
internal fun StatementGenerator.generateSamConversionForValueArgumentsIfRequired(call: CallBuilder, resolvedCall: ResolvedCall<*>) {
val samConversion = context.extensions.samConversion
val originalDescriptor = resolvedCall.resultingDescriptor
@@ -751,7 +751,7 @@ private fun StatementGenerator.getSamTypeForValueParameter(valueParameter: Value
)
}
fun StatementGenerator.pregenerateValueArgumentsUsing(
internal fun StatementGenerator.pregenerateValueArgumentsUsing(
call: CallBuilder,
resolvedCall: ResolvedCall<*>,
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)
call.callReceiver = generateCallReceiver(
@@ -790,7 +790,7 @@ private fun unwrapSpecialDescriptor(descriptor: CallableDescriptor): CallableDes
descriptor.getOriginalForFunctionInterfaceAdapter()?.let { unwrapSpecialDescriptor(it) } ?: descriptor
}
fun unwrapCallableDescriptorAndTypeArguments(resolvedCall: ResolvedCall<*>): CallBuilder {
internal fun unwrapCallableDescriptorAndTypeArguments(resolvedCall: ResolvedCall<*>): CallBuilder {
val originalDescriptor = resolvedCall.resultingDescriptor
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.types.KotlinType
class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
internal class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateAssignment(ktExpression: KtBinaryExpression, origin: IrStatementOrigin): IrExpression {
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.typeUtil.isUnit
interface LoopResolver {
internal interface LoopResolver {
fun getLoop(expression: KtExpression): IrLoop?
}
class BodyGenerator(
internal class BodyGenerator(
val scopeOwnerSymbol: IrSymbol,
override val context: GeneratorContext,
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.utils.SmartList
class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
internal class BranchingExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateIfExpression(expression: KtIfExpression): IrExpression {
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.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 {
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 IrCallableReference<*> && dispatchReceiver == null && extensionReceiver == null) ||
this is IrClassReference ||
this is IrConst<*> ||
(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,
call: CallBuilder,
origin: IrStatementOrigin? = null,
startOffset: Int = ktElement.startOffsetSkippingComments,
endOffset: Int = ktElement.endOffset,
) =
): IrExpression =
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)
@@ -57,7 +57,7 @@ import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.utils.newHashMapWithExpectedSize
@ObsoleteDescriptorBasedAPI
class ClassGenerator(
internal class ClassGenerator(
declarationGenerator: DeclarationGenerator
) : DeclarationGeneratorExtension(declarationGenerator) {
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.source.getPsi
class ConstantValueGeneratorImpl(
internal class ConstantValueGeneratorImpl(
moduleDescriptor: ModuleDescriptor,
symbolTable: ReferenceSymbolTable,
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
* function bodies; and provides ways to declare functions or parameters based on descriptors and binding context.
*/
class DataClassMembersGenerator(
internal class DataClassMembersGenerator(
declarationGenerator: DeclarationGenerator,
private val generateBodies: Boolean
) : DeclarationGeneratorExtension(declarationGenerator) {
@@ -207,5 +207,5 @@ abstract class DeclarationGeneratorExtension(val declarationGenerator: Declarati
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)
@@ -45,7 +45,9 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.types.KotlinType
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))
fun generateDelegatedProperty(
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
class DescriptorStorageForContextReceivers {
internal class DescriptorStorageForContextReceivers {
private val syntheticFieldStorage: MutableMap<ReceiverValue, IrField> = mutableMapOf()
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.ErrorUtils
class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
internal class ErrorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
private val ignoreErrors: Boolean get() = context.configuration.ignoreErrors
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
@ObsoleteDescriptorBasedAPI
class FunctionGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
internal class FunctionGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
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.psi2ir.descriptors.IrBuiltInsOverDescriptors
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.util.getResolvedCall
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.util.slicedMap.ReadOnlySlice
interface Generator : IrGenerator {
internal interface Generator : IrGenerator {
override val context: GeneratorContext
}
interface GeneratorWithScope : Generator, IrGeneratorWithScope
internal interface GeneratorWithScope : Generator, IrGeneratorWithScope
fun <K, V : Any> Generator.get(slice: ReadOnlySlice<K, V>, key: K): V? =
internal fun <K, V : Any> Generator.get(slice: ReadOnlySlice<K, V>, key: K): V? =
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")
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))
fun Generator.getTypeInferredByFrontend(key: KtExpression): KotlinType? =
internal fun Generator.getTypeInferredByFrontend(key: KtExpression): KotlinType? =
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}")
fun Generator.getExpressionTypeWithCoercionToUnit(key: KtExpression): KotlinType? =
internal fun Generator.getExpressionTypeWithCoercionToUnit(key: KtExpression): KotlinType? =
if (key.isUsedAsExpression(context.bindingContext))
getTypeInferredByFrontend(key)
else
(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}")
fun Generator.getResolvedCall(key: KtElement): ResolvedCall<out CallableDescriptor>? =
internal fun Generator.getResolvedCall(key: KtElement): ResolvedCall<out CallableDescriptor>? =
key.getResolvedCall(context.bindingContext)
@@ -67,7 +67,7 @@ class GeneratorContext private constructor(
// TODO: inject a correct StorageManager instance, or store NotFoundClasses inside 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)
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.resolve.DescriptorUtils
class IrSyntheticDeclarationGenerator(context: GeneratorContext) : IrElementVisitorVoid {
internal class IrSyntheticDeclarationGenerator(context: GeneratorContext) : IrElementVisitorVoid {
fun generateSyntheticDeclarations(file: IrFile) {
try {
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.startOffsetSkippingComments
class LocalClassGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
internal class LocalClassGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateObjectLiteral(ktObjectLiteral: KtObjectLiteralExpression): IrStatement {
val startOffset = ktObjectLiteral.startOffsetSkippingComments
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.resolve.bindingContextUtil.isInlineableFunctionLiteral
class LocalFunctionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
internal class LocalFunctionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateLambda(ktLambda: KtLambdaExpression): IrStatement {
val ktFun = ktLambda.functionLiteral
@@ -69,4 +69,4 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
else null,
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.resolve.BindingContext
class LoopExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
internal class LoopExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateWhileLoop(ktWhile: KtWhileExpression): IrExpression {
val irLoop = IrWhileLoopImpl(
ktWhile.startOffsetSkippingComments, ktWhile.endOffset,
@@ -222,4 +222,4 @@ class LoopExpressionGenerator(statementGenerator: StatementGenerator) : Statemen
return irForBlock
}
}
}
@@ -21,8 +21,7 @@ import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
import org.jetbrains.kotlin.lexer.KtTokens
fun getInfixOperator(ktOperator: IElementType): IrStatementOrigin? =
internal fun getInfixOperator(ktOperator: IElementType): IrStatementOrigin? =
when (ktOperator) {
KtTokens.EQ -> IrStatementOrigin.EQ
KtTokens.PLUSEQ -> IrStatementOrigin.PLUSEQ
@@ -53,7 +52,7 @@ fun getInfixOperator(ktOperator: IElementType): IrStatementOrigin? =
else -> null
}
fun getPrefixOperator(ktOperator: IElementType): IrStatementOrigin? =
internal fun getPrefixOperator(ktOperator: IElementType): IrStatementOrigin? =
when (ktOperator) {
KtTokens.PLUSPLUS -> IrStatementOrigin.PREFIX_INCR
KtTokens.MINUSMINUS -> IrStatementOrigin.PREFIX_DECR
@@ -63,7 +62,7 @@ fun getPrefixOperator(ktOperator: IElementType): IrStatementOrigin? =
else -> null
}
fun getPostfixOperator(ktOperator: IElementType): IrStatementOrigin? =
internal fun getPostfixOperator(ktOperator: IElementType): IrStatementOrigin? =
when (ktOperator) {
KtTokens.PLUSPLUS -> IrStatementOrigin.POSTFIX_INCR
KtTokens.MINUSMINUS -> IrStatementOrigin.POSTFIX_DECR
@@ -71,7 +70,7 @@ fun getPostfixOperator(ktOperator: IElementType): IrStatementOrigin? =
else -> null
}
fun getIrTypeOperator(ktOperator: IElementType): IrTypeOperator? =
internal fun getIrTypeOperator(ktOperator: IElementType): IrTypeOperator? =
when (ktOperator) {
KtTokens.IS_KEYWORD -> IrTypeOperator.INSTANCEOF
KtTokens.NOT_IS -> IrTypeOperator.NOT_INSTANCEOF
@@ -80,10 +79,10 @@ fun getIrTypeOperator(ktOperator: IElementType): IrTypeOperator? =
else -> null
}
val AUGMENTED_ASSIGNMENTS =
internal val AUGMENTED_ASSIGNMENTS =
setOf(IrStatementOrigin.PLUSEQ, IrStatementOrigin.MINUSEQ, IrStatementOrigin.MULTEQ, IrStatementOrigin.DIVEQ, IrStatementOrigin.PERCEQ)
val OPERATORS_DESUGARED_TO_CALLS =
internal val OPERATORS_DESUGARED_TO_CALLS =
setOf(
IrStatementOrigin.PLUS,
IrStatementOrigin.MINUS,
@@ -97,23 +96,20 @@ val OPERATORS_DESUGARED_TO_CALLS =
IrStatementOrigin.UPLUS
)
val COMPARISON_OPERATORS =
internal val COMPARISON_OPERATORS =
setOf(IrStatementOrigin.LT, IrStatementOrigin.LTEQ, IrStatementOrigin.GT, IrStatementOrigin.GTEQ)
val EQUALITY_OPERATORS =
internal val EQUALITY_OPERATORS =
setOf(IrStatementOrigin.EQEQ, IrStatementOrigin.EXCLEQ)
val IDENTITY_OPERATORS =
internal val IDENTITY_OPERATORS =
setOf(IrStatementOrigin.EQEQEQ, IrStatementOrigin.EXCLEQEQ)
val IN_OPERATORS =
internal val IN_OPERATORS =
setOf(IrStatementOrigin.IN, IrStatementOrigin.NOT_IN)
val BINARY_BOOLEAN_OPERATORS =
internal val BINARY_BOOLEAN_OPERATORS =
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)
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.set
class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
internal class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
private fun createErrorExpression(ktExpression: KtExpression, text: String) =
IrErrorExpressionImpl(
@@ -36,7 +36,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.hasBackingField
class PropertyGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
internal class PropertyGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
fun generatePropertyDeclaration(ktProperty: KtProperty): IrProperty {
val propertyDescriptor = getPropertyDescriptor(ktProperty)
val ktDelegate = ktProperty.delegate
@@ -277,5 +277,3 @@ internal fun IrProperty.linkCorrespondingPropertySymbol() {
getter?.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.expressions.DoubleColonLHS
class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
internal class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateClassLiteral(ktClassLiteral: KtClassLiteralExpression): IrExpression {
val ktArgument = ktClassLiteral.receiverExpression!!
@@ -669,4 +669,4 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
arguments.last().type,
suspendFunction
)
}
}
@@ -41,7 +41,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore
import org.jetbrains.kotlin.utils.addIfNotNull
class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
internal class ScriptGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGeneratorExtension(declarationGenerator) {
@OptIn(ExperimentalStdlibApi::class)
fun generateScriptDeclaration(ktScript: KtScript): IrDeclaration? {
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.types.KotlinType
class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
internal class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
private val typeTranslator = context.typeTranslator
private val symbolTable = context.symbolTable
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.util.OperatorNameConventions
class StatementGenerator(
internal class StatementGenerator(
val bodyGenerator: BodyGenerator,
override val scope: Scope
) : KtVisitor<IrStatement, Nothing?>(),
@@ -553,7 +553,7 @@ class StatementGenerator(
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 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.resolve.DescriptorUtils
class SyntheticDeclarationsGenerator(context: GeneratorContext) : DeclarationDescriptorVisitor<Unit, IrDeclarationContainer?> {
internal class SyntheticDeclarationsGenerator(context: GeneratorContext) : DeclarationDescriptorVisitor<Unit, IrDeclarationContainer?> {
private val generator = StandaloneDeclarationGenerator(context)
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.resolve.BindingContext
class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
internal class TryCatchExpressionGenerator(statementGenerator: StatementGenerator) : StatementGeneratorExtension(statementGenerator) {
fun generateTryCatch(ktTry: KtTryExpression): IrExpression {
val resultType = getExpressionTypeWithCoercionToUnitOrFail(ktTry).toIrType()
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.types.*
fun GeneratorExtensions.SamConversion.isSamType(kotlinType: KotlinType): Boolean {
internal fun GeneratorExtensions.SamConversion.isSamType(kotlinType: KotlinType): Boolean {
val descriptor = kotlinType.constructor.declarationDescriptor
return descriptor is ClassDescriptor && descriptor.isFun ||
isPlatformSamType(kotlinType)
}
fun DeclarationDescriptor.isSamConstructor() = this is FunctionInterfaceConstructorDescriptor
internal fun DeclarationDescriptor.isSamConstructor() = this is FunctionInterfaceConstructorDescriptor
fun CallableDescriptor.getOriginalForFunctionInterfaceAdapter() =
internal fun CallableDescriptor.getOriginalForFunctionInterfaceAdapter() =
when (this) {
is FunctionInterfaceAdapterDescriptor<*> ->
baseDescriptorForSynthetic
@@ -33,7 +33,7 @@ fun CallableDescriptor.getOriginalForFunctionInterfaceAdapter() =
null
}
fun KotlinType.getSubstitutedFunctionTypeForSamType(): KotlinType =
internal fun KotlinType.getSubstitutedFunctionTypeForSamType(): KotlinType =
when (val unwrapped = this.unwrap()) {
is SimpleType -> unwrapped.getSubstitutedFunctionTypeForSamType()
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.checker.KotlinTypeChecker
class ArrayAccessAssignmentReceiver(
internal class ArrayAccessAssignmentReceiver(
private val irArray: IrExpression,
private val ktIndexExpressions: List<KtExpression>,
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.symbols.IrFieldSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.types.KotlinType
class BackingFieldLValue(
internal class BackingFieldLValue(
private val context: IrGeneratorContext,
private val startOffset: Int,
private val endOffset: Int,
@@ -16,14 +16,17 @@
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.psi2ir.generators.hasNoSideEffects
import org.jetbrains.kotlin.psi2ir.isValueArgumentReorderingRequired
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
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 descriptor: CallableDescriptor,
val typeArguments: Map<TypeParameterDescriptor, KotlinType>?,
@@ -41,47 +44,31 @@ class CallBuilder(
irValueArgumentsByIndex[valueParameterDescriptor.index + parametersOffset]
}
val CallBuilder.argumentsCount: Int
internal val CallBuilder.argumentsCount: Int
get() =
irValueArgumentsByIndex.size
var CallBuilder.lastArgument: IrExpression?
internal var CallBuilder.lastArgument: IrExpression?
get() = irValueArgumentsByIndex.last()
set(value) {
irValueArgumentsByIndex[argumentsCount - 1] = value
}
fun CallBuilder.getValueArgumentsInParameterOrder(): List<IrExpression?> =
internal fun CallBuilder.getValueArgumentsInParameterOrder(): List<IrExpression?> =
descriptor.valueParameters.map { irValueArgumentsByIndex[it.index] }
fun CallBuilder.isValueArgumentReorderingRequired() =
internal fun CallBuilder.isValueArgumentReorderingRequired() =
original.isValueArgumentReorderingRequired() && irValueArgumentsByIndex.any { it != null && !it.hasNoSideEffects() }
val CallBuilder.hasExtensionReceiver: Boolean
internal val CallBuilder.hasExtensionReceiver: Boolean
get() =
descriptor.extensionReceiverParameter != null
val CallBuilder.hasDispatchReceiver: Boolean
get() =
descriptor.dispatchReceiverParameter != null
val CallBuilder.extensionReceiverType: KotlinType?
get() =
descriptor.extensionReceiverParameter?.type
val CallBuilder.dispatchReceiverType: KotlinType?
internal val CallBuilder.dispatchReceiverType: KotlinType?
get() =
descriptor.dispatchReceiverParameter?.type
val CallBuilder.explicitReceiverParameter: ReceiverParameterDescriptor?
get() =
descriptor.extensionReceiverParameter ?: descriptor.dispatchReceiverParameter
val CallBuilder.explicitReceiverType: KotlinType?
get() =
explicitReceiverParameter?.type
fun CallBuilder.setExplicitReceiverValue(explicitReceiverValue: IntermediateValue) {
internal fun CallBuilder.setExplicitReceiverValue(explicitReceiverValue: IntermediateValue) {
val previousCallReceiver = callReceiver
callReceiver = object : CallReceiver {
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.types.IrType
class DelegatedLocalPropertyLValue(
internal class DelegatedLocalPropertyLValue(
private val context: IrGeneratorContext,
val startOffset: 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.types.IrType
class DynamicMemberLValue(
internal class DynamicMemberLValue(
private val context: IrGeneratorContext,
private val startOffset: Int,
private val endOffset: Int,
@@ -69,4 +69,4 @@ class DynamicMemberLValue(
if (extensionReceiverValue != null) throw AssertionError("Dynamic call $memberName should have no extension receiver")
return dispatchReceiverValue.load()
}
}
}
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.psi2ir.intermediate
import org.jetbrains.kotlin.ir.expressions.IrExpression
class ExtensionInvokeCallReceiver(
internal class ExtensionInvokeCallReceiver(
private val callBuilder: CallBuilder,
private val functionReceiver: IntermediateValue,
private val extensionInvokeReceiver: IntermediateValue
@@ -35,4 +35,4 @@ class ExtensionInvokeCallReceiver(
callBuilder.irValueArgumentsByIndex[0] = extensionInvokeReceiver.load()
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.impl.IrGetValueImpl
fun IrVariable.loadAt(startOffset: Int, endOffset: Int): IrExpression =
internal fun IrVariable.loadAt(startOffset: Int, endOffset: Int): IrExpression =
IrGetValueImpl(startOffset, endOffset, type, symbol)
fun CallReceiver.adjustForCallee(callee: CallableMemberDescriptor): CallReceiver =
internal fun CallReceiver.adjustForCallee(callee: CallableMemberDescriptor): CallReceiver =
object : CallReceiver {
override fun call(builder: CallExpressionBuilder): IrExpression =
this@adjustForCallee.call { dispatchReceiverValue, extensionReceiverValue, contextReceiverValues ->
@@ -51,7 +51,7 @@ fun CallReceiver.adjustForCallee(callee: CallableMemberDescriptor): CallReceiver
}
fun computeSubstitutedSyntheticAccessor(
internal fun computeSubstitutedSyntheticAccessor(
propertyDescriptor: PropertyDescriptor,
accessorFunctionDescriptor: FunctionDescriptor,
substitutedExtensionAccessorDescriptor: PropertyAccessorDescriptor
@@ -94,4 +94,4 @@ private fun copyTypesFromExtensionAccessor(
accessorFunctionDescriptor.modality,
accessorFunctionDescriptor.visibility
)
}
}
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.psi2ir.generators.CallGenerator
class LValueWithGetterAndSetterCalls(
internal class LValueWithGetterAndSetterCalls(
private val callGenerator: CallGenerator,
private val descriptor: CallableDescriptor,
private val getterCall: () -> CallBuilder?,
@@ -42,5 +42,4 @@ class LValueWithGetterAndSetterCalls(
val call = setterCall(irExpression) ?: throw AssertionError("No setter call for $descriptor")
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.types.IrType
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) {
override fun load(): IrExpression = generate()
}
class OnceExpressionValue(val irExpression: IrExpression) : LValue, AssignmentReceiver {
internal class OnceExpressionValue(val irExpression: IrExpression) : LValue, AssignmentReceiver {
private var instantiated = false
override fun load(): IrExpression {
@@ -45,4 +44,4 @@ class OnceExpressionValue(val irExpression: IrExpression) : LValue, AssignmentRe
override fun assign(withLValue: (LValue) -> IrExpression): IrExpression =
withLValue(this)
}
}
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
abstract class PropertyLValueBase(
internal abstract class PropertyLValueBase(
protected val context: GeneratorContext,
val scope: Scope,
val startOffset: Int,
@@ -72,7 +72,7 @@ abstract class PropertyLValueBase(
protected abstract fun withReceiver(dispatchReceiver: VariableLValue?, extensionReceiver: VariableLValue?, contextReceivers: List<VariableLValue>): PropertyLValueBase
}
class FieldPropertyLValue(
internal class FieldPropertyLValue(
context: GeneratorContext,
scope: Scope,
startOffset: Int,
@@ -127,7 +127,7 @@ class FieldPropertyLValue(
)
}
class AccessorPropertyLValue(
internal class AccessorPropertyLValue(
context: GeneratorContext,
scope: Scope,
startOffset: Int,
@@ -207,4 +207,4 @@ class AccessorPropertyLValue(
SimpleCallReceiver(dispatchReceiver, extensionReceiver, contextReceivers),
superQualifier
)
}
}
@@ -21,14 +21,8 @@ import org.jetbrains.kotlin.ir.builders.Scope
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.IrExpression
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 {
override fun load(): IrExpression = irExpression.shallowCopy()
}
fun Scope.createTemporaryVariableInBlock(
internal fun Scope.createTemporaryVariableInBlock(
context: IrGeneratorContext,
irExpression: IrExpression,
block: IrStatementContainer,
@@ -42,7 +36,7 @@ fun Scope.createTemporaryVariableInBlock(
)
}
fun Scope.declareTemporaryVariableInBlock(
internal fun Scope.declareTemporaryVariableInBlock(
irExpression: IrExpression,
block: IrStatementContainer,
nameHint: String? = null,
@@ -53,5 +47,3 @@ fun Scope.declareTemporaryVariableInBlock(
block.statements.add(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.psi2ir.generators.GeneratorWithScope
class SafeCallReceiver(
internal class SafeCallReceiver(
val generator: GeneratorWithScope,
val startOffset: Int,
val endOffset: Int,
@@ -67,8 +66,7 @@ class SafeCallReceiver(
}
}
fun IrExpression.safeCallOnDispatchReceiver(
internal fun IrExpression.safeCallOnDispatchReceiver(
generator: GeneratorWithScope,
startOffset: Int,
endOffset: Int,
@@ -83,4 +81,4 @@ fun IrExpression.safeCallOnDispatchReceiver(
).call { dispatchReceiverValue, _, contextReceiverValues ->
assert(contextReceiverValues.isEmpty()) { "Context receivers in numeric promotion" }
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.psi2ir.generators.GeneratorWithScope
class SafeExtensionInvokeCallReceiver(
internal class SafeExtensionInvokeCallReceiver(
val generator: GeneratorWithScope,
val startOffset: Int,
val endOffset: Int,
val callBuilder: CallBuilder,
val functionReceiver: IntermediateValue,
val extensionInvokeReceiver: IntermediateValue
private val callBuilder: CallBuilder,
private val functionReceiver: IntermediateValue,
private val extensionInvokeReceiver: IntermediateValue
) : CallReceiver {
override fun call(builder: CallExpressionBuilder): IrExpression {
// 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
class SimpleCallReceiver(
internal class SimpleCallReceiver(
val dispatchReceiverValue: IntermediateValue?,
val extensionReceiverValue: 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.psi2ir.generators.StatementGenerator
class SpecialExpressionAssignmentReceiver(
internal class SpecialExpressionAssignmentReceiver(
private val statementGenerator: StatementGenerator,
private val ktExpression: KtExpression,
private val origin: IrStatementOrigin,
@@ -31,4 +31,4 @@ class SpecialExpressionAssignmentReceiver(
override fun assign(withLValue: (LValue) -> IrExpression): IrExpression =
withLValue(this)
}
}
@@ -18,9 +18,8 @@ package org.jetbrains.kotlin.psi2ir.intermediate
import org.jetbrains.kotlin.ir.expressions.IrExpression
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 {
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.types.IrType
interface IntermediateValue {
internal interface IntermediateValue {
fun load(): IrExpression
fun loadIfExists(): IrExpression? = load()
val type: IrType
}
interface LValue : IntermediateValue {
internal interface LValue : IntermediateValue {
fun store(irExpression: IrExpression): IrExpression
}
interface AssignmentReceiver {
internal interface AssignmentReceiver {
fun assign(withLValue: (LValue) -> IrExpression): IrExpression
fun assign(value: IrExpression): IrExpression = assign { it.store(value) }
}
fun interface CallExpressionBuilder {
internal fun interface CallExpressionBuilder {
fun withReceivers(
dispatchReceiver: IntermediateValue?,
extensionReceiver: IntermediateValue?,
@@ -42,6 +42,6 @@ fun interface CallExpressionBuilder {
): IrExpression
}
interface CallReceiver {
internal interface CallReceiver {
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.types.IrType
class VariableLValue(
internal class VariableLValue(
private val context: IrGeneratorContext,
val startOffset: Int,
val endOffset: Int,
@@ -58,4 +58,4 @@ class VariableLValue(
override fun assign(withLValue: (LValue) -> IrExpression): IrExpression =
withLValue(this)
}
}
@@ -57,7 +57,7 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.types.typeUtil.*
import org.jetbrains.kotlin.util.OperatorNameConventions
fun insertImplicitCasts(file: IrFile, context: GeneratorContext) {
internal fun insertImplicitCasts(file: IrFile, context: GeneratorContext) {
InsertImplicitCasts(
context.irBuiltIns,
context.typeTranslator,