[FIR] add FirSession parameter to whileAnalysing

It will be needed in the following commits
This commit is contained in:
Ilya Kirillov
2022-12-28 13:33:01 +01:00
committed by Space Team
parent d6d8bf4cbd
commit 90436abb23
8 changed files with 100 additions and 92 deletions
@@ -278,7 +278,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
val existingContext = context val existingContext = context
context = context.addQualifiedAccessOrAnnotationCall(qualifiedAccessOrAnnotationCall) context = context.addQualifiedAccessOrAnnotationCall(qualifiedAccessOrAnnotationCall)
try { try {
return whileAnalysing(qualifiedAccessOrAnnotationCall) { return whileAnalysing(context.session, qualifiedAccessOrAnnotationCall) {
block() block()
} }
} finally { } finally {
@@ -293,7 +293,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
val existingContext = context val existingContext = context
context = context.addGetClassCall(getClassCall) context = context.addGetClassCall(getClassCall)
try { try {
return whileAnalysing(getClassCall) { return whileAnalysing(context.session, getClassCall) {
block() block()
} }
} finally { } finally {
@@ -308,7 +308,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
val existingContext = context val existingContext = context
context = context.addDeclaration(declaration) context = context.addDeclaration(declaration)
try { try {
return whileAnalysing(declaration) { return whileAnalysing(context.session, declaration) {
block() block()
} }
} finally { } finally {
@@ -87,7 +87,7 @@ class FirElementSerializer private constructor(
return builder return builder
} }
fun classProto(klass: FirClass): ProtoBuf.Class.Builder = whileAnalysing(klass) { fun classProto(klass: FirClass): ProtoBuf.Class.Builder = whileAnalysing(session, klass) {
val builder = ProtoBuf.Class.newBuilder() val builder = ProtoBuf.Class.newBuilder()
val regularClass = klass as? FirRegularClass val regularClass = klass as? FirRegularClass
@@ -248,7 +248,7 @@ class FirElementSerializer private constructor(
useSiteTarget == AnnotationUseSiteTarget.SETTER_PARAMETER && isSetter useSiteTarget == AnnotationUseSiteTarget.SETTER_PARAMETER && isSetter
} }
fun propertyProto(property: FirProperty): ProtoBuf.Property.Builder? = whileAnalysing(property) { fun propertyProto(property: FirProperty): ProtoBuf.Property.Builder? = whileAnalysing(session, property) {
if (!extension.shouldSerializeProperty(property)) return null if (!extension.shouldSerializeProperty(property)) return null
val builder = ProtoBuf.Property.newBuilder() val builder = ProtoBuf.Property.newBuilder()
@@ -356,7 +356,7 @@ class FirElementSerializer private constructor(
return builder return builder
} }
fun functionProto(function: FirFunction): ProtoBuf.Function.Builder? = whileAnalysing(function) { fun functionProto(function: FirFunction): ProtoBuf.Function.Builder? = whileAnalysing(session, function) {
if (!extension.shouldSerializeFunction(function)) return null if (!extension.shouldSerializeFunction(function)) return null
val builder = ProtoBuf.Function.newBuilder() val builder = ProtoBuf.Function.newBuilder()
@@ -450,7 +450,7 @@ class FirElementSerializer private constructor(
return builder return builder
} }
private fun typeAliasProto(typeAlias: FirTypeAlias): ProtoBuf.TypeAlias.Builder? = whileAnalysing(typeAlias) { private fun typeAliasProto(typeAlias: FirTypeAlias): ProtoBuf.TypeAlias.Builder? = whileAnalysing(session, typeAlias) {
if (!extension.shouldSerializeTypeAlias(typeAlias)) return null if (!extension.shouldSerializeTypeAlias(typeAlias)) return null
val builder = ProtoBuf.TypeAlias.newBuilder() val builder = ProtoBuf.TypeAlias.newBuilder()
@@ -497,14 +497,14 @@ class FirElementSerializer private constructor(
return builder return builder
} }
private fun enumEntryProto(enumEntry: FirEnumEntry): ProtoBuf.EnumEntry.Builder = whileAnalysing(enumEntry) { private fun enumEntryProto(enumEntry: FirEnumEntry): ProtoBuf.EnumEntry.Builder = whileAnalysing(session, enumEntry) {
val builder = ProtoBuf.EnumEntry.newBuilder() val builder = ProtoBuf.EnumEntry.newBuilder()
builder.name = getSimpleNameIndex(enumEntry.name) builder.name = getSimpleNameIndex(enumEntry.name)
extension.serializeEnumEntry(enumEntry, builder) extension.serializeEnumEntry(enumEntry, builder)
return builder return builder
} }
private fun constructorProto(constructor: FirConstructor): ProtoBuf.Constructor.Builder = whileAnalysing(constructor) { private fun constructorProto(constructor: FirConstructor): ProtoBuf.Constructor.Builder = whileAnalysing(session, constructor) {
val builder = ProtoBuf.Constructor.newBuilder() val builder = ProtoBuf.Constructor.newBuilder()
val local = createChildSerializer(constructor) val local = createChildSerializer(constructor)
@@ -543,7 +543,7 @@ class FirElementSerializer private constructor(
private fun valueParameterProto( private fun valueParameterProto(
parameter: FirValueParameter, parameter: FirValueParameter,
additionalAnnotations: List<FirAnnotation> = emptyList() additionalAnnotations: List<FirAnnotation> = emptyList()
): ProtoBuf.ValueParameter.Builder = whileAnalysing(parameter) { ): ProtoBuf.ValueParameter.Builder = whileAnalysing(session, parameter) {
val builder = ProtoBuf.ValueParameter.newBuilder() val builder = ProtoBuf.ValueParameter.newBuilder()
val declaresDefaultValue = parameter.defaultValue != null // TODO: || parameter.isActualParameterWithAnyExpectedDefault val declaresDefaultValue = parameter.defaultValue != null // TODO: || parameter.isActualParameterWithAnyExpectedDefault
@@ -580,7 +580,7 @@ class FirElementSerializer private constructor(
return builder return builder
} }
private fun typeParameterProto(typeParameter: FirTypeParameter): ProtoBuf.TypeParameter.Builder = whileAnalysing(typeParameter) { private fun typeParameterProto(typeParameter: FirTypeParameter): ProtoBuf.TypeParameter.Builder = whileAnalysing(session, typeParameter) {
val builder = ProtoBuf.TypeParameter.newBuilder() val builder = ProtoBuf.TypeParameter.newBuilder()
builder.id = getTypeParameterId(typeParameter) builder.id = getTypeParameterId(typeParameter)
@@ -76,7 +76,7 @@ class Fir2IrVisitor(
TODO("Should not be here: ${element::class} ${element.render()}") TODO("Should not be here: ${element::class} ${element.render()}")
} }
override fun visitField(field: FirField, data: Any?): IrField = whileAnalysing(field) { override fun visitField(field: FirField, data: Any?): IrField = whileAnalysing(session, field) {
if (field.isSynthetic) { if (field.isSynthetic) {
return declarationStorage.getCachedIrDelegateOrBackingField(field)!!.apply { return declarationStorage.getCachedIrDelegateOrBackingField(field)!!.apply {
// If this is a property backing field, then it has no separate initializer, // If this is a property backing field, then it has no separate initializer,
@@ -105,13 +105,13 @@ class Fir2IrVisitor(
// ================================================================================== // ==================================================================================
override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Any?): IrElement = whileAnalysing(typeAlias) { override fun visitTypeAlias(typeAlias: FirTypeAlias, data: Any?): IrElement = whileAnalysing(session, typeAlias) {
val irTypeAlias = classifierStorage.getCachedTypeAlias(typeAlias)!! val irTypeAlias = classifierStorage.getCachedTypeAlias(typeAlias)!!
annotationGenerator.generate(irTypeAlias, typeAlias) annotationGenerator.generate(irTypeAlias, typeAlias)
return irTypeAlias return irTypeAlias
} }
override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Any?): IrElement = whileAnalysing(enumEntry) { override fun visitEnumEntry(enumEntry: FirEnumEntry, data: Any?): IrElement = whileAnalysing(session, enumEntry) {
val irEnumEntry = classifierStorage.getCachedIrEnumEntry(enumEntry)!! val irEnumEntry = classifierStorage.getCachedIrEnumEntry(enumEntry)!!
annotationGenerator.generate(irEnumEntry, enumEntry) annotationGenerator.generate(irEnumEntry, enumEntry)
val correspondingClass = irEnumEntry.correspondingClass val correspondingClass = irEnumEntry.correspondingClass
@@ -168,7 +168,7 @@ class Fir2IrVisitor(
return irEnumEntry return irEnumEntry
} }
override fun visitRegularClass(regularClass: FirRegularClass, data: Any?): IrElement = whileAnalysing(regularClass) { override fun visitRegularClass(regularClass: FirRegularClass, data: Any?): IrElement = whileAnalysing(session, regularClass) {
if (regularClass.visibility == Visibilities.Local) { if (regularClass.visibility == Visibilities.Local) {
val irParent = conversionScope.parentFromStack() val irParent = conversionScope.parentFromStack()
// NB: for implicit types it is possible that local class is already cached // NB: for implicit types it is possible that local class is already cached
@@ -217,7 +217,7 @@ class Fir2IrVisitor(
return visitAnonymousObject(anonymousObjectExpression.anonymousObject, data) return visitAnonymousObject(anonymousObjectExpression.anonymousObject, data)
} }
override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?): IrElement = whileAnalysing(anonymousObject) { override fun visitAnonymousObject(anonymousObject: FirAnonymousObject, data: Any?): IrElement = whileAnalysing(session, anonymousObject) {
val irParent = conversionScope.parentFromStack() val irParent = conversionScope.parentFromStack()
// NB: for implicit types it is possible that anonymous object is already cached // NB: for implicit types it is possible that anonymous object is already cached
val irAnonymousObject = classifierStorage.getCachedIrClass(anonymousObject)?.apply { this.parent = irParent } val irAnonymousObject = classifierStorage.getCachedIrClass(anonymousObject)?.apply { this.parent = irParent }
@@ -250,7 +250,7 @@ class Fir2IrVisitor(
// ================================================================================== // ==================================================================================
override fun visitConstructor(constructor: FirConstructor, data: Any?): IrElement = whileAnalysing(constructor) { override fun visitConstructor(constructor: FirConstructor, data: Any?): IrElement = whileAnalysing(session, constructor) {
val irConstructor = declarationStorage.getCachedIrConstructor(constructor)!! val irConstructor = declarationStorage.getCachedIrConstructor(constructor)!!
return conversionScope.withFunction(irConstructor) { return conversionScope.withFunction(irConstructor) {
memberGenerator.convertFunctionContent(irConstructor, constructor, containingClass = conversionScope.containerFirClass()) memberGenerator.convertFunctionContent(irConstructor, constructor, containingClass = conversionScope.containerFirClass())
@@ -260,7 +260,7 @@ class Fir2IrVisitor(
override fun visitAnonymousInitializer( override fun visitAnonymousInitializer(
anonymousInitializer: FirAnonymousInitializer, anonymousInitializer: FirAnonymousInitializer,
data: Any? data: Any?
): IrElement = whileAnalysing(anonymousInitializer) { ): IrElement = whileAnalysing(session, anonymousInitializer) {
val irAnonymousInitializer = declarationStorage.getCachedIrAnonymousInitializer(anonymousInitializer)!! val irAnonymousInitializer = declarationStorage.getCachedIrAnonymousInitializer(anonymousInitializer)!!
declarationStorage.enterScope(irAnonymousInitializer) declarationStorage.enterScope(irAnonymousInitializer)
irAnonymousInitializer.body = convertToIrBlockBody(anonymousInitializer.body!!) irAnonymousInitializer.body = convertToIrBlockBody(anonymousInitializer.body!!)
@@ -268,7 +268,7 @@ class Fir2IrVisitor(
return irAnonymousInitializer return irAnonymousInitializer
} }
override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): IrElement = whileAnalysing(simpleFunction) { override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): IrElement = whileAnalysing(session, simpleFunction) {
val irFunction = if (simpleFunction.visibility == Visibilities.Local) { val irFunction = if (simpleFunction.visibility == Visibilities.Local) {
declarationStorage.createIrFunction( declarationStorage.createIrFunction(
simpleFunction, irParent = conversionScope.parent(), predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION, isLocal = true simpleFunction, irParent = conversionScope.parent(), predefinedOrigin = IrDeclarationOrigin.LOCAL_FUNCTION, isLocal = true
@@ -290,7 +290,7 @@ class Fir2IrVisitor(
override fun visitAnonymousFunction( override fun visitAnonymousFunction(
anonymousFunction: FirAnonymousFunction, anonymousFunction: FirAnonymousFunction,
data: Any? data: Any?
): IrElement = whileAnalysing(anonymousFunction) { ): IrElement = whileAnalysing(session, anonymousFunction) {
return anonymousFunction.convertWithOffsets { startOffset, endOffset -> return anonymousFunction.convertWithOffsets { startOffset, endOffset ->
val irFunction = declarationStorage.createIrFunction( val irFunction = declarationStorage.createIrFunction(
anonymousFunction, anonymousFunction,
@@ -312,7 +312,7 @@ class Fir2IrVisitor(
} }
} }
private fun visitLocalVariable(variable: FirProperty): IrElement = whileAnalysing(variable) { private fun visitLocalVariable(variable: FirProperty): IrElement = whileAnalysing(session, variable) {
assert(variable.isLocal) assert(variable.isLocal)
val delegate = variable.delegate val delegate = variable.delegate
if (delegate != null) { if (delegate != null) {
@@ -362,7 +362,7 @@ class Fir2IrVisitor(
this@insertImplicitCast.cast(baseExpression, valueType, expectedType) this@insertImplicitCast.cast(baseExpression, valueType, expectedType)
} }
override fun visitProperty(property: FirProperty, data: Any?): IrElement = whileAnalysing(property) { override fun visitProperty(property: FirProperty, data: Any?): IrElement = whileAnalysing(session, property) {
if (property.isLocal) return visitLocalVariable(property) if (property.isLocal) return visitLocalVariable(property)
val irProperty = declarationStorage.getCachedIrProperty(property) val irProperty = declarationStorage.getCachedIrProperty(property)
?: return IrErrorExpressionImpl( ?: return IrErrorExpressionImpl(
@@ -470,14 +470,14 @@ class Fir2IrVisitor(
return result return result
} }
override fun visitFunctionCall(functionCall: FirFunctionCall, data: Any?): IrExpression = whileAnalysing(functionCall) { override fun visitFunctionCall(functionCall: FirFunctionCall, data: Any?): IrExpression = whileAnalysing(session, functionCall) {
return convertToIrCall(functionCall = functionCall, annotationMode = false) return convertToIrCall(functionCall = functionCall, annotationMode = false)
} }
override fun visitSafeCallExpression( override fun visitSafeCallExpression(
safeCallExpression: FirSafeCallExpression, safeCallExpression: FirSafeCallExpression,
data: Any? data: Any?
): IrElement = whileAnalysing(safeCallExpression) { ): IrElement = whileAnalysing(session, safeCallExpression) {
val explicitReceiverExpression = convertToIrExpression(safeCallExpression.receiver) val explicitReceiverExpression = convertToIrExpression(safeCallExpression.receiver)
val (receiverVariable, variableSymbol) = components.createTemporaryVariableForSafeCallConstruction( val (receiverVariable, variableSymbol) = components.createTemporaryVariableForSafeCallConstruction(
@@ -504,7 +504,7 @@ class Fir2IrVisitor(
return callGenerator.convertToIrConstructorCall(annotation) return callGenerator.convertToIrConstructorCall(annotation)
} }
override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: Any?): IrElement = whileAnalysing(annotationCall) { override fun visitAnnotationCall(annotationCall: FirAnnotationCall, data: Any?): IrElement = whileAnalysing(session, annotationCall) {
return callGenerator.convertToIrConstructorCall(annotationCall) return callGenerator.convertToIrConstructorCall(annotationCall)
} }
@@ -519,7 +519,7 @@ class Fir2IrVisitor(
private fun convertQualifiedAccessExpression( private fun convertQualifiedAccessExpression(
qualifiedAccessExpression: FirQualifiedAccessExpression, qualifiedAccessExpression: FirQualifiedAccessExpression,
annotationMode: Boolean = false annotationMode: Boolean = false
): IrExpression = whileAnalysing(qualifiedAccessExpression) { ): IrExpression = whileAnalysing(session, qualifiedAccessExpression) {
val explicitReceiverExpression = convertToIrReceiverExpression( val explicitReceiverExpression = convertToIrReceiverExpression(
qualifiedAccessExpression.explicitReceiver, qualifiedAccessExpression.calleeReference qualifiedAccessExpression.explicitReceiver, qualifiedAccessExpression.calleeReference
) )
@@ -542,7 +542,7 @@ class Fir2IrVisitor(
override fun visitThisReceiverExpression( override fun visitThisReceiverExpression(
thisReceiverExpression: FirThisReceiverExpression, thisReceiverExpression: FirThisReceiverExpression,
data: Any? data: Any?
): IrElement = whileAnalysing(thisReceiverExpression) { ): IrElement = whileAnalysing(session, thisReceiverExpression) {
val calleeReference = thisReceiverExpression.calleeReference val calleeReference = thisReceiverExpression.calleeReference
val boundSymbol = calleeReference.boundSymbol val boundSymbol = calleeReference.boundSymbol
if (boundSymbol is FirClassSymbol) { if (boundSymbol is FirClassSymbol) {
@@ -625,7 +625,7 @@ class Fir2IrVisitor(
} }
override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: Any?): IrElement { override fun visitCallableReferenceAccess(callableReferenceAccess: FirCallableReferenceAccess, data: Any?): IrElement {
return whileAnalysing(callableReferenceAccess) { return whileAnalysing(session, callableReferenceAccess) {
convertCallableReferenceAccess(callableReferenceAccess, false) convertCallableReferenceAccess(callableReferenceAccess, false)
} }
} }
@@ -644,7 +644,7 @@ class Fir2IrVisitor(
override fun visitVariableAssignment( override fun visitVariableAssignment(
variableAssignment: FirVariableAssignment, variableAssignment: FirVariableAssignment,
data: Any? data: Any?
): IrElement = whileAnalysing(variableAssignment) { ): IrElement = whileAnalysing(session, variableAssignment) {
val explicitReceiverExpression = convertToIrReceiverExpression( val explicitReceiverExpression = convertToIrReceiverExpression(
variableAssignment.explicitReceiver, variableAssignment.calleeReference variableAssignment.explicitReceiver, variableAssignment.calleeReference
) )
@@ -1234,7 +1234,7 @@ class Fir2IrVisitor(
override fun visitStringConcatenationCall( override fun visitStringConcatenationCall(
stringConcatenationCall: FirStringConcatenationCall, stringConcatenationCall: FirStringConcatenationCall,
data: Any? data: Any?
): IrElement = whileAnalysing(stringConcatenationCall) { ): IrElement = whileAnalysing(session, stringConcatenationCall) {
return stringConcatenationCall.convertWithOffsets { startOffset, endOffset -> return stringConcatenationCall.convertWithOffsets { startOffset, endOffset ->
val arguments = mutableListOf<IrExpression>() val arguments = mutableListOf<IrExpression>()
val sb = StringBuilder() val sb = StringBuilder()
@@ -1282,12 +1282,12 @@ class Fir2IrVisitor(
} }
override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall, data: Any?): IrElement { override fun visitEqualityOperatorCall(equalityOperatorCall: FirEqualityOperatorCall, data: Any?): IrElement {
return whileAnalysing(equalityOperatorCall) { return whileAnalysing(session, equalityOperatorCall) {
operatorGenerator.convertEqualityOperatorCall(equalityOperatorCall) operatorGenerator.convertEqualityOperatorCall(equalityOperatorCall)
} }
} }
override fun visitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall, data: Any?): IrElement = whileAnalysing(checkNotNullCall) { override fun visitCheckNotNullCall(checkNotNullCall: FirCheckNotNullCall, data: Any?): IrElement = whileAnalysing(session, checkNotNullCall) {
return checkNotNullCall.convertWithOffsets { startOffset, endOffset -> return checkNotNullCall.convertWithOffsets { startOffset, endOffset ->
IrCallImpl( IrCallImpl(
startOffset, endOffset, startOffset, endOffset,
@@ -1303,7 +1303,7 @@ class Fir2IrVisitor(
} }
} }
override fun visitGetClassCall(getClassCall: FirGetClassCall, data: Any?): IrElement = whileAnalysing(getClassCall) { override fun visitGetClassCall(getClassCall: FirGetClassCall, data: Any?): IrElement = whileAnalysing(session, getClassCall) {
val argument = getClassCall.argument val argument = getClassCall.argument
val irType = getClassCall.typeRef.toIrType() val irType = getClassCall.typeRef.toIrType()
val irClassType = val irClassType =
@@ -1368,14 +1368,14 @@ class Fir2IrVisitor(
} }
} }
override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: Any?): IrElement = whileAnalysing(arrayOfCall) { override fun visitArrayOfCall(arrayOfCall: FirArrayOfCall, data: Any?): IrElement = whileAnalysing(session, arrayOfCall) {
return convertToArrayOfCall(arrayOfCall, annotationMode = false) return convertToArrayOfCall(arrayOfCall, annotationMode = false)
} }
override fun visitAugmentedArraySetCall( override fun visitAugmentedArraySetCall(
augmentedArraySetCall: FirAugmentedArraySetCall, augmentedArraySetCall: FirAugmentedArraySetCall,
data: Any? data: Any?
): IrElement = whileAnalysing(augmentedArraySetCall) { ): IrElement = whileAnalysing(session, augmentedArraySetCall) {
return augmentedArraySetCall.convertWithOffsets { startOffset, endOffset -> return augmentedArraySetCall.convertWithOffsets { startOffset, endOffset ->
IrErrorCallExpressionImpl( IrErrorCallExpressionImpl(
startOffset, endOffset, irBuiltIns.unitType, startOffset, endOffset, irBuiltIns.unitType,
@@ -143,7 +143,7 @@ open class FirDesignatedStatusResolveTransformer(
override fun transformClassContent( override fun transformClassContent(
firClass: FirClass, firClass: FirClass,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(firClass) { ): FirStatement = whileAnalysing(session, firClass) {
if (designation.shouldSkipClass(firClass)) return firClass if (designation.shouldSkipClass(firClass)) return firClass
firClass.symbol.lazyResolveToPhase(FirResolvePhase.TYPES) firClass.symbol.lazyResolveToPhase(FirResolvePhase.TYPES)
val classLocated = designation.classLocated val classLocated = designation.classLocated
@@ -238,7 +238,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformDeclaration( override fun transformDeclaration(
declaration: FirDeclaration, declaration: FirDeclaration,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirDeclaration = whileAnalysing(declaration) { ): FirDeclaration = whileAnalysing(session, declaration) {
return when (declaration) { return when (declaration) {
is FirCallableDeclaration -> { is FirCallableDeclaration -> {
if (declaration is FirFunction) { if (declaration is FirFunction) {
@@ -257,7 +257,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformTypeAlias( override fun transformTypeAlias(
typeAlias: FirTypeAlias, typeAlias: FirTypeAlias,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(typeAlias) { ): FirStatement = whileAnalysing(session, typeAlias) {
typeAlias.typeParameters.forEach { transformDeclaration(it, data) } typeAlias.typeParameters.forEach { transformDeclaration(it, data) }
typeAlias.transformStatus(this, statusResolver.resolveStatus(typeAlias, containingClass, isLocal = false)) typeAlias.transformStatus(this, statusResolver.resolveStatus(typeAlias, containingClass, isLocal = false))
return transformDeclaration(typeAlias, data) as FirTypeAlias return transformDeclaration(typeAlias, data) as FirTypeAlias
@@ -266,7 +266,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformRegularClass( override fun transformRegularClass(
regularClass: FirRegularClass, regularClass: FirRegularClass,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(regularClass) { ): FirStatement = whileAnalysing(session, regularClass) {
transformClassContent(regularClass, data) transformClassContent(regularClass, data)
} }
@@ -278,7 +278,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformAnonymousObject( override fun transformAnonymousObject(
anonymousObject: FirAnonymousObject, anonymousObject: FirAnonymousObject,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(anonymousObject) { ): FirStatement = whileAnalysing(session, anonymousObject) {
transformClassContent(anonymousObject, data) transformClassContent(anonymousObject, data)
} }
@@ -314,7 +314,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformClass( override fun transformClass(
klass: FirClass, klass: FirClass,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(klass) { ): FirStatement = whileAnalysing(session, klass) {
return storeClass(klass) { return storeClass(klass) {
klass.typeParameters.forEach { it.transformSingle(this, data) } klass.typeParameters.forEach { it.transformSingle(this, data) }
transformDeclarationContent(klass, data) transformDeclarationContent(klass, data)
@@ -379,7 +379,7 @@ abstract class AbstractFirStatusResolveTransformer(
propertyAccessor: FirPropertyAccessor, propertyAccessor: FirPropertyAccessor,
containingProperty: FirProperty, containingProperty: FirProperty,
overriddenStatuses: List<FirResolvedDeclarationStatus> = emptyList(), overriddenStatuses: List<FirResolvedDeclarationStatus> = emptyList(),
): Unit = whileAnalysing(propertyAccessor) { ): Unit = whileAnalysing(session, propertyAccessor) {
propertyAccessor.transformStatus( propertyAccessor.transformStatus(
this, this,
statusResolver.resolveStatus( statusResolver.resolveStatus(
@@ -397,7 +397,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformConstructor( override fun transformConstructor(
constructor: FirConstructor, constructor: FirConstructor,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(constructor) { ): FirStatement = whileAnalysing(session, constructor) {
constructor.transformStatus(this, statusResolver.resolveStatus(constructor, containingClass, isLocal = false)) constructor.transformStatus(this, statusResolver.resolveStatus(constructor, containingClass, isLocal = false))
calculateDeprecations(constructor) calculateDeprecations(constructor)
return transformDeclaration(constructor, data) as FirStatement return transformDeclaration(constructor, data) as FirStatement
@@ -406,7 +406,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformSimpleFunction( override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction, simpleFunction: FirSimpleFunction,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(simpleFunction) { ): FirStatement = whileAnalysing(session, simpleFunction) {
val resolvedStatus = statusResolver.resolveStatus(simpleFunction, containingClass, isLocal = false) val resolvedStatus = statusResolver.resolveStatus(simpleFunction, containingClass, isLocal = false)
simpleFunction.transformStatus(this, resolvedStatus) simpleFunction.transformStatus(this, resolvedStatus)
calculateDeprecations(simpleFunction) calculateDeprecations(simpleFunction)
@@ -416,7 +416,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformProperty( override fun transformProperty(
property: FirProperty, property: FirProperty,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(property) { ): FirStatement = whileAnalysing(session, property) {
val overridden = statusResolver.getOverriddenProperties(property, containingClass) val overridden = statusResolver.getOverriddenProperties(property, containingClass)
val overriddenProperties = overridden.map { it.status as FirResolvedDeclarationStatus } val overriddenProperties = overridden.map { it.status as FirResolvedDeclarationStatus }
@@ -448,7 +448,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformField( override fun transformField(
field: FirField, field: FirField,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(field) { ): FirStatement = whileAnalysing(session, field) {
field.transformStatus(this, statusResolver.resolveStatus(field, containingClass, isLocal = false)) field.transformStatus(this, statusResolver.resolveStatus(field, containingClass, isLocal = false))
calculateDeprecations(field) calculateDeprecations(field)
return transformDeclaration(field, data) as FirField return transformDeclaration(field, data) as FirField
@@ -461,7 +461,7 @@ abstract class AbstractFirStatusResolveTransformer(
override fun transformEnumEntry( override fun transformEnumEntry(
enumEntry: FirEnumEntry, enumEntry: FirEnumEntry,
data: FirResolvedDeclarationStatus? data: FirResolvedDeclarationStatus?
): FirStatement = whileAnalysing(enumEntry) { ): FirStatement = whileAnalysing(session, enumEntry) {
enumEntry.transformStatus(this, statusResolver.resolveStatus(enumEntry, containingClass, isLocal = false)) enumEntry.transformStatus(this, statusResolver.resolveStatus(enumEntry, containingClass, isLocal = false))
calculateDeprecations(enumEntry) calculateDeprecations(enumEntry)
return transformDeclaration(enumEntry, data) as FirEnumEntry return transformDeclaration(enumEntry, data) as FirEnumEntry
@@ -78,7 +78,7 @@ open class FirTypeResolveTransformer(
} }
override fun transformRegularClass(regularClass: FirRegularClass, data: Any?): FirStatement { override fun transformRegularClass(regularClass: FirRegularClass, data: Any?): FirStatement {
whileAnalysing(regularClass) { whileAnalysing(session, regularClass) {
withClassDeclarationCleanup(classDeclarationsStack, regularClass) { withClassDeclarationCleanup(classDeclarationsStack, regularClass) {
withScopeCleanup { withScopeCleanup {
regularClass.addTypeParametersScope() regularClass.addTypeParametersScope()
@@ -99,21 +99,21 @@ open class FirTypeResolveTransformer(
} }
} }
override fun transformConstructor(constructor: FirConstructor, data: Any?): FirConstructor = whileAnalysing(constructor) { override fun transformConstructor(constructor: FirConstructor, data: Any?): FirConstructor = whileAnalysing(session, constructor) {
return withScopeCleanup { return withScopeCleanup {
constructor.addTypeParametersScope() constructor.addTypeParametersScope()
transformDeclaration(constructor, data) transformDeclaration(constructor, data)
} as FirConstructor } as FirConstructor
} }
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Any?): FirTypeAlias = whileAnalysing(typeAlias) { override fun transformTypeAlias(typeAlias: FirTypeAlias, data: Any?): FirTypeAlias = whileAnalysing(session, typeAlias) {
return withScopeCleanup { return withScopeCleanup {
typeAlias.addTypeParametersScope() typeAlias.addTypeParametersScope()
transformDeclaration(typeAlias, data) transformDeclaration(typeAlias, data)
} as FirTypeAlias } as FirTypeAlias
} }
override fun transformEnumEntry(enumEntry: FirEnumEntry, data: Any?): FirEnumEntry = whileAnalysing(enumEntry) { override fun transformEnumEntry(enumEntry: FirEnumEntry, data: Any?): FirEnumEntry = whileAnalysing(session, enumEntry) {
enumEntry.transformReturnTypeRef(this, data) enumEntry.transformReturnTypeRef(this, data)
enumEntry.transformTypeParameters(this, data) enumEntry.transformTypeParameters(this, data)
enumEntry.transformAnnotations(this, data) enumEntry.transformAnnotations(this, data)
@@ -124,7 +124,7 @@ open class FirTypeResolveTransformer(
return receiverParameter.transformAnnotations(this, data).transformTypeRef(this, data) return receiverParameter.transformAnnotations(this, data).transformTypeRef(this, data)
} }
override fun transformProperty(property: FirProperty, data: Any?): FirProperty = whileAnalysing(property) { override fun transformProperty(property: FirProperty, data: Any?): FirProperty = whileAnalysing(session, property) {
return withScopeCleanup { return withScopeCleanup {
property.addTypeParametersScope() property.addTypeParametersScope()
property.transformTypeParameters(this, data) property.transformTypeParameters(this, data)
@@ -156,7 +156,7 @@ open class FirTypeResolveTransformer(
property.setter?.valueParameters?.map { it.replaceReturnTypeRef(property.returnTypeRef) } property.setter?.valueParameters?.map { it.replaceReturnTypeRef(property.returnTypeRef) }
} }
override fun transformField(field: FirField, data: Any?): FirField = whileAnalysing(field) { override fun transformField(field: FirField, data: Any?): FirField = whileAnalysing(session, field) {
return withScopeCleanup { return withScopeCleanup {
field.transformReturnTypeRef(this, data).transformAnnotations(this, data) field.transformReturnTypeRef(this, data).transformAnnotations(this, data)
field field
@@ -166,7 +166,7 @@ open class FirTypeResolveTransformer(
override fun transformSimpleFunction( override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction, simpleFunction: FirSimpleFunction,
data: Any? data: Any?
): FirSimpleFunction = whileAnalysing(simpleFunction) { ): FirSimpleFunction = whileAnalysing(session, simpleFunction) {
return withScopeCleanup { return withScopeCleanup {
simpleFunction.addTypeParametersScope() simpleFunction.addTypeParametersScope()
transformDeclaration(simpleFunction, data).also { transformDeclaration(simpleFunction, data).also {
@@ -217,7 +217,7 @@ open class FirTypeResolveTransformer(
} }
} }
override fun transformValueParameter(valueParameter: FirValueParameter, data: Any?): FirStatement = whileAnalysing(valueParameter) { override fun transformValueParameter(valueParameter: FirValueParameter, data: Any?): FirStatement = whileAnalysing(session, valueParameter) {
valueParameter.transformReturnTypeRef(this, data) valueParameter.transformReturnTypeRef(this, data)
valueParameter.transformAnnotations(this, data) valueParameter.transformAnnotations(this, data)
valueParameter.transformVarargTypeToArrayType() valueParameter.transformVarargTypeToArrayType()
@@ -232,7 +232,7 @@ open class FirTypeResolveTransformer(
shouldNotBeCalled() shouldNotBeCalled()
} }
override fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: Any?): FirStatement = whileAnalysing(annotationCall) { override fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: Any?): FirStatement = whileAnalysing(session, annotationCall) {
when (val originalTypeRef = annotationCall.annotationTypeRef) { when (val originalTypeRef = annotationCall.annotationTypeRef) {
is FirResolvedTypeRef -> { is FirResolvedTypeRef -> {
when (annotationCall.annotationResolvePhase) { when (annotationCall.annotationResolvePhase) {
@@ -38,7 +38,10 @@ import org.jetbrains.kotlin.fir.resolve.inference.ResolvedLambdaAtom
import org.jetbrains.kotlin.fir.resolve.inference.extractLambdaInfoFromFunctionalType import org.jetbrains.kotlin.fir.resolve.inference.extractLambdaInfoFromFunctionalType
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.createTypeSubstitutorByTypeConstructor import org.jetbrains.kotlin.fir.resolve.substitution.createTypeSubstitutorByTypeConstructor
import org.jetbrains.kotlin.fir.resolve.transformers.* import org.jetbrains.kotlin.fir.resolve.transformers.FirCallCompletionResultsWriterTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.FirStatusResolver
import org.jetbrains.kotlin.fir.resolve.transformers.toExpectedType
import org.jetbrains.kotlin.fir.resolve.transformers.transformVarargTypeToArrayType
import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope import org.jetbrains.kotlin.fir.scopes.impl.FirMemberTypeParameterScope
import org.jetbrains.kotlin.fir.symbols.constructStarProjectedType import org.jetbrains.kotlin.fir.symbols.constructStarProjectedType
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
@@ -111,7 +114,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
} }
} }
override fun transformProperty(property: FirProperty, data: ResolutionMode): FirProperty = whileAnalysing(property) { override fun transformProperty(property: FirProperty, data: ResolutionMode): FirProperty = whileAnalysing(session, property) {
require(property !is FirSyntheticProperty) { "Synthetic properties should not be processed by body transformers" } require(property !is FirSyntheticProperty) { "Synthetic properties should not be processed by body transformers" }
if (property.isLocal) { if (property.isLocal) {
@@ -207,7 +210,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
} }
} }
override fun transformField(field: FirField, data: ResolutionMode): FirField = whileAnalysing(field) { override fun transformField(field: FirField, data: ResolutionMode): FirField = whileAnalysing(session, field) {
val returnTypeRef = field.returnTypeRef val returnTypeRef = field.returnTypeRef
if (implicitTypeOnly) return field if (implicitTypeOnly) return field
if (field.initializerResolved) return field if (field.initializerResolved) return field
@@ -374,7 +377,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
return delegateExpression return delegateExpression
} }
private fun transformLocalVariable(variable: FirProperty): FirProperty = whileAnalysing(variable) { private fun transformLocalVariable(variable: FirProperty): FirProperty = whileAnalysing(session, variable) {
assert(variable.isLocal) assert(variable.isLocal)
val delegate = variable.delegate val delegate = variable.delegate
@@ -456,7 +459,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
accessor: FirPropertyAccessor, accessor: FirPropertyAccessor,
enhancedTypeRef: FirTypeRef, enhancedTypeRef: FirTypeRef,
owner: FirProperty owner: FirProperty
): Unit = whileAnalysing(accessor) { ): Unit = whileAnalysing(session, accessor) {
context.withPropertyAccessor(owner, accessor, components) { context.withPropertyAccessor(owner, accessor, components) {
if (accessor is FirDefaultPropertyAccessor || accessor.body == null) { if (accessor is FirDefaultPropertyAccessor || accessor.body == null) {
transformFunction(accessor, withExpectedType(enhancedTypeRef)) transformFunction(accessor, withExpectedType(enhancedTypeRef))
@@ -491,7 +494,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
) )
} }
override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement = whileAnalysing(regularClass) { override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement = whileAnalysing(session, regularClass) {
return context.withContainingClass(regularClass) { return context.withContainingClass(regularClass) {
if (regularClass.isLocal && regularClass !in context.targetedLocalClasses) { if (regularClass.isLocal && regularClass !in context.targetedLocalClasses) {
return regularClass.runAllPhasesForLocalClass( return regularClass.runAllPhasesForLocalClass(
@@ -520,7 +523,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
return result return result
} }
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias = whileAnalysing(typeAlias) { override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias = whileAnalysing(session, typeAlias) {
if (typeAlias.isLocal && typeAlias !in context.targetedLocalClasses) { if (typeAlias.isLocal && typeAlias !in context.targetedLocalClasses) {
return typeAlias.runAllPhasesForLocalClass( return typeAlias.runAllPhasesForLocalClass(
transformer, transformer,
@@ -560,7 +563,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
override fun transformAnonymousObject( override fun transformAnonymousObject(
anonymousObject: FirAnonymousObject, anonymousObject: FirAnonymousObject,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(anonymousObject) { ): FirStatement = whileAnalysing(session, anonymousObject) {
if (anonymousObject !in context.targetedLocalClasses) { if (anonymousObject !in context.targetedLocalClasses) {
return anonymousObject.runAllPhasesForLocalClass( return anonymousObject.runAllPhasesForLocalClass(
transformer, transformer,
@@ -618,7 +621,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
override fun transformSimpleFunction( override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction, simpleFunction: FirSimpleFunction,
data: ResolutionMode data: ResolutionMode
): FirSimpleFunction = whileAnalysing(simpleFunction) { ): FirSimpleFunction = whileAnalysing(session, simpleFunction) {
if (simpleFunction.bodyResolved) { if (simpleFunction.bodyResolved) {
return simpleFunction return simpleFunction
} }
@@ -682,7 +685,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
override fun transformFunction( override fun transformFunction(
function: FirFunction, function: FirFunction,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(function) { ): FirStatement = whileAnalysing(session, function) {
val functionIsNotAnalyzed = !function.bodyResolved val functionIsNotAnalyzed = !function.bodyResolved
if (functionIsNotAnalyzed) { if (functionIsNotAnalyzed) {
dataFlowAnalyzer.enterFunction(function) dataFlowAnalyzer.enterFunction(function)
@@ -697,7 +700,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
} as FirStatement } as FirStatement
} }
override fun transformConstructor(constructor: FirConstructor, data: ResolutionMode): FirConstructor = whileAnalysing(constructor) { override fun transformConstructor(constructor: FirConstructor, data: ResolutionMode): FirConstructor = whileAnalysing(session, constructor) {
if (implicitTypeOnly) return constructor if (implicitTypeOnly) return constructor
val container = context.containerIfAny as? FirRegularClass val container = context.containerIfAny as? FirRegularClass
if (constructor.isPrimary && container?.classKind == ClassKind.ANNOTATION_CLASS) { if (constructor.isPrimary && container?.classKind == ClassKind.ANNOTATION_CLASS) {
@@ -738,7 +741,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
override fun transformAnonymousInitializer( override fun transformAnonymousInitializer(
anonymousInitializer: FirAnonymousInitializer, anonymousInitializer: FirAnonymousInitializer,
data: ResolutionMode data: ResolutionMode
): FirAnonymousInitializer = whileAnalysing(anonymousInitializer) { ): FirAnonymousInitializer = whileAnalysing(session, anonymousInitializer) {
if (implicitTypeOnly) return anonymousInitializer if (implicitTypeOnly) return anonymousInitializer
dataFlowAnalyzer.enterInitBlock(anonymousInitializer) dataFlowAnalyzer.enterInitBlock(anonymousInitializer)
return context.withAnonymousInitializer(anonymousInitializer, session) { return context.withAnonymousInitializer(anonymousInitializer, session) {
@@ -753,7 +756,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
override fun transformValueParameter( override fun transformValueParameter(
valueParameter: FirValueParameter, valueParameter: FirValueParameter,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(valueParameter) { ): FirStatement = whileAnalysing(session, valueParameter) {
dataFlowAnalyzer.enterValueParameter(valueParameter) dataFlowAnalyzer.enterValueParameter(valueParameter)
val result = context.withValueParameter(valueParameter, session) { val result = context.withValueParameter(valueParameter, session) {
transformDeclarationContent( transformDeclarationContent(
@@ -772,7 +775,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
override fun transformAnonymousFunction( override fun transformAnonymousFunction(
anonymousFunction: FirAnonymousFunction, anonymousFunction: FirAnonymousFunction,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(anonymousFunction) { ): FirStatement = whileAnalysing(session, anonymousFunction) {
// Either ContextDependent, ContextIndependent or WithExpectedType could be here // Either ContextDependent, ContextIndependent or WithExpectedType could be here
if (data !is ResolutionMode.LambdaResolution) { if (data !is ResolutionMode.LambdaResolution) {
anonymousFunction.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent) anonymousFunction.transformReturnTypeRef(transformer, ResolutionMode.ContextIndependent)
@@ -1023,7 +1026,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
override fun transformBackingField( override fun transformBackingField(
backingField: FirBackingField, backingField: FirBackingField,
data: ResolutionMode, data: ResolutionMode,
): FirStatement = whileAnalysing(backingField) { ): FirStatement = whileAnalysing(session, backingField) {
val propertyType = data.expectedType val propertyType = data.expectedType
val initializerData = if (backingField.returnTypeRef is FirResolvedTypeRef) { val initializerData = if (backingField.returnTypeRef is FirResolvedTypeRef) {
withExpectedType(backingField.returnTypeRef) withExpectedType(backingField.returnTypeRef)
@@ -1127,7 +1130,7 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve
return element return element
} }
override fun transformValueParameter(valueParameter: FirValueParameter, data: Any?): FirStatement = whileAnalysing(valueParameter) { override fun transformValueParameter(valueParameter: FirValueParameter, data: Any?): FirStatement = whileAnalysing(valueParameter.moduleData.session, valueParameter) {
if (valueParameter.returnTypeRef is FirImplicitTypeRef) { if (valueParameter.returnTypeRef is FirImplicitTypeRef) {
valueParameter.replaceReturnTypeRef( valueParameter.replaceReturnTypeRef(
valueParameter.returnTypeRef.resolvedTypeFromPrototype( valueParameter.returnTypeRef.resolvedTypeFromPrototype(
@@ -84,7 +84,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformQualifiedAccessExpression( override fun transformQualifiedAccessExpression(
qualifiedAccessExpression: FirQualifiedAccessExpression, qualifiedAccessExpression: FirQualifiedAccessExpression,
data: ResolutionMode, data: ResolutionMode,
): FirStatement = whileAnalysing(qualifiedAccessExpression) { ): FirStatement = whileAnalysing(session, qualifiedAccessExpression) {
transformQualifiedAccessExpression(qualifiedAccessExpression, data, isUsedAsReceiver = false) transformQualifiedAccessExpression(qualifiedAccessExpression, data, isUsedAsReceiver = false)
} }
@@ -338,7 +338,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
safeCallExpression: FirSafeCallExpression, safeCallExpression: FirSafeCallExpression,
data: ResolutionMode data: ResolutionMode
): FirStatement { ): FirStatement {
whileAnalysing(safeCallExpression) { whileAnalysing(session, safeCallExpression) {
withContainingSafeCallExpression(safeCallExpression) { withContainingSafeCallExpression(safeCallExpression) {
safeCallExpression.transformAnnotations(this, ResolutionMode.ContextIndependent) safeCallExpression.transformAnnotations(this, ResolutionMode.ContextIndependent)
safeCallExpression.transformReceiver(this, ResolutionMode.ContextIndependent) safeCallExpression.transformReceiver(this, ResolutionMode.ContextIndependent)
@@ -377,7 +377,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
return checkedSafeCallSubject return checkedSafeCallSubject
} }
override fun transformFunctionCall(functionCall: FirFunctionCall, data: ResolutionMode): FirStatement = whileAnalysing(functionCall) { override fun transformFunctionCall(functionCall: FirFunctionCall, data: ResolutionMode): FirStatement = whileAnalysing(session, functionCall) {
val calleeReference = functionCall.calleeReference val calleeReference = functionCall.calleeReference
if ( if (
(calleeReference is FirResolvedNamedReference || calleeReference is FirErrorNamedReference) && (calleeReference is FirResolvedNamedReference || calleeReference is FirErrorNamedReference) &&
@@ -542,7 +542,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformComparisonExpression( override fun transformComparisonExpression(
comparisonExpression: FirComparisonExpression, comparisonExpression: FirComparisonExpression,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(comparisonExpression) { ): FirStatement = whileAnalysing(session, comparisonExpression) {
return (comparisonExpression.transformChildren(transformer, ResolutionMode.ContextIndependent) as FirComparisonExpression).also { return (comparisonExpression.transformChildren(transformer, ResolutionMode.ContextIndependent) as FirComparisonExpression).also {
it.resultType = comparisonExpression.typeRef.resolvedTypeFromPrototype(builtinTypes.booleanType.type) it.resultType = comparisonExpression.typeRef.resolvedTypeFromPrototype(builtinTypes.booleanType.type)
dataFlowAnalyzer.exitComparisonExpressionCall(it) dataFlowAnalyzer.exitComparisonExpressionCall(it)
@@ -552,7 +552,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformAssignmentOperatorStatement( override fun transformAssignmentOperatorStatement(
assignmentOperatorStatement: FirAssignmentOperatorStatement, assignmentOperatorStatement: FirAssignmentOperatorStatement,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(assignmentOperatorStatement) { ): FirStatement = whileAnalysing(session, assignmentOperatorStatement) {
val operation = assignmentOperatorStatement.operation val operation = assignmentOperatorStatement.operation
require(operation != FirOperation.ASSIGN) require(operation != FirOperation.ASSIGN)
@@ -679,7 +679,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformEqualityOperatorCall( override fun transformEqualityOperatorCall(
equalityOperatorCall: FirEqualityOperatorCall, equalityOperatorCall: FirEqualityOperatorCall,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(equalityOperatorCall) { ): FirStatement = whileAnalysing(session, equalityOperatorCall) {
// Currently, we use expectedType=Any? for both operands // Currently, we use expectedType=Any? for both operands
// In FE1.0, it's only used for the right // In FE1.0, it's only used for the right
// But it seems a bit inconsistent (see KT-47409) // But it seems a bit inconsistent (see KT-47409)
@@ -852,7 +852,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformBinaryLogicExpression( override fun transformBinaryLogicExpression(
binaryLogicExpression: FirBinaryLogicExpression, binaryLogicExpression: FirBinaryLogicExpression,
data: ResolutionMode, data: ResolutionMode,
): FirStatement = whileAnalysing(binaryLogicExpression) { ): FirStatement = whileAnalysing(session, binaryLogicExpression) {
val booleanType = binaryLogicExpression.typeRef.resolvedTypeFromPrototype(builtinTypes.booleanType.type) val booleanType = binaryLogicExpression.typeRef.resolvedTypeFromPrototype(builtinTypes.booleanType.type)
return binaryLogicExpression.also(dataFlowAnalyzer::enterBinaryLogicExpression) return binaryLogicExpression.also(dataFlowAnalyzer::enterBinaryLogicExpression)
.transformLeftOperand(this, ResolutionMode.WithExpectedType(booleanType)) .transformLeftOperand(this, ResolutionMode.WithExpectedType(booleanType))
@@ -866,7 +866,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformVariableAssignment( override fun transformVariableAssignment(
variableAssignment: FirVariableAssignment, variableAssignment: FirVariableAssignment,
data: ResolutionMode, data: ResolutionMode,
): FirStatement = whileAnalysing(variableAssignment) { ): FirStatement = whileAnalysing(session, variableAssignment) {
// val resolvedAssignment = transformCallee(variableAssignment) // val resolvedAssignment = transformCallee(variableAssignment)
variableAssignment.transformAnnotations(transformer, ResolutionMode.ContextIndependent) variableAssignment.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
val resolvedAssignment = callResolver.resolveVariableAccessAndSelectCandidate(variableAssignment, isUsedAsReceiver = false) val resolvedAssignment = callResolver.resolveVariableAccessAndSelectCandidate(variableAssignment, isUsedAsReceiver = false)
@@ -912,7 +912,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformCallableReferenceAccess( override fun transformCallableReferenceAccess(
callableReferenceAccess: FirCallableReferenceAccess, callableReferenceAccess: FirCallableReferenceAccess,
data: ResolutionMode, data: ResolutionMode,
): FirStatement = whileAnalysing(callableReferenceAccess) { ): FirStatement = whileAnalysing(session, callableReferenceAccess) {
if (callableReferenceAccess.calleeReference is FirResolvedNamedReference) { if (callableReferenceAccess.calleeReference is FirResolvedNamedReference) {
return callableReferenceAccess return callableReferenceAccess
} }
@@ -953,7 +953,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformGetClassCall( override fun transformGetClassCall(
getClassCall: FirGetClassCall, getClassCall: FirGetClassCall,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(getClassCall) { ): FirStatement = whileAnalysing(session, getClassCall) {
getClassCall.transformAnnotations(transformer, ResolutionMode.ContextIndependent) getClassCall.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
val arg = getClassCall.argument val arg = getClassCall.argument
val dataForLhs = if (arg is FirConstExpression<*>) { val dataForLhs = if (arg is FirConstExpression<*>) {
@@ -1096,7 +1096,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformAnnotationCall( override fun transformAnnotationCall(
annotationCall: FirAnnotationCall, annotationCall: FirAnnotationCall,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(annotationCall) { ): FirStatement = whileAnalysing(session, annotationCall) {
if (annotationCall.resolved) return annotationCall if (annotationCall.resolved) return annotationCall
annotationCall.transformAnnotationTypeRef(transformer, ResolutionMode.ContextIndependent) annotationCall.transformAnnotationTypeRef(transformer, ResolutionMode.ContextIndependent)
annotationCall.replaceAnnotationResolvePhase(FirAnnotationResolvePhase.Types) annotationCall.replaceAnnotationResolvePhase(FirAnnotationResolvePhase.Types)
@@ -1129,7 +1129,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformDelegatedConstructorCall( override fun transformDelegatedConstructorCall(
delegatedConstructorCall: FirDelegatedConstructorCall, delegatedConstructorCall: FirDelegatedConstructorCall,
data: ResolutionMode, data: ResolutionMode,
): FirStatement = whileAnalysing(delegatedConstructorCall) { ): FirStatement = whileAnalysing(session, delegatedConstructorCall) {
if (transformer.implicitTypeOnly) return delegatedConstructorCall if (transformer.implicitTypeOnly) return delegatedConstructorCall
when (delegatedConstructorCall.calleeReference) { when (delegatedConstructorCall.calleeReference) {
is FirResolvedNamedReference, is FirErrorNamedReference -> return delegatedConstructorCall is FirResolvedNamedReference, is FirErrorNamedReference -> return delegatedConstructorCall
@@ -1239,7 +1239,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformAugmentedArraySetCall( override fun transformAugmentedArraySetCall(
augmentedArraySetCall: FirAugmentedArraySetCall, augmentedArraySetCall: FirAugmentedArraySetCall,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(augmentedArraySetCall) { ): FirStatement = whileAnalysing(session, augmentedArraySetCall) {
/* /*
* a[b] += c can be desugared to: * a[b] += c can be desugared to:
* *
@@ -1470,7 +1470,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
) )
} }
override fun transformArrayOfCall(arrayOfCall: FirArrayOfCall, data: ResolutionMode): FirStatement = whileAnalysing(arrayOfCall) { override fun transformArrayOfCall(arrayOfCall: FirArrayOfCall, data: ResolutionMode): FirStatement = whileAnalysing(session, arrayOfCall) {
if (data is ResolutionMode.ContextDependent) { if (data is ResolutionMode.ContextDependent) {
arrayOfCall.transformChildren(transformer, data) arrayOfCall.transformChildren(transformer, data)
return arrayOfCall return arrayOfCall
@@ -1484,7 +1484,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
override fun transformStringConcatenationCall( override fun transformStringConcatenationCall(
stringConcatenationCall: FirStringConcatenationCall, stringConcatenationCall: FirStringConcatenationCall,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(stringConcatenationCall) { ): FirStatement = whileAnalysing(session, stringConcatenationCall) {
dataFlowAnalyzer.enterStringConcatenationCall() dataFlowAnalyzer.enterStringConcatenationCall()
stringConcatenationCall.transformChildren(transformer, ResolutionMode.ContextIndependent) stringConcatenationCall.transformChildren(transformer, ResolutionMode.ContextIndependent)
dataFlowAnalyzer.exitStringConcatenationCall(stringConcatenationCall) dataFlowAnalyzer.exitStringConcatenationCall(stringConcatenationCall)
@@ -6,10 +6,16 @@
package org.jetbrains.kotlin.fir package org.jetbrains.kotlin.fir
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.* import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtPsiSourceElement
import org.jetbrains.kotlin.KtRealPsiSourceElement
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.declarations.FirContextReceiver
import org.jetbrains.kotlin.fir.declarations.FirDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvedDeclarationStatus
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.expressions.FirBlock import org.jetbrains.kotlin.fir.expressions.FirBlock
@@ -20,8 +26,6 @@ import org.jetbrains.kotlin.fir.types.builder.*
import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import java.util.*
import kotlin.collections.ArrayList
// TODO: rewrite // TODO: rewrite
fun FirBlock.returnExpressions(): List<FirExpression> = listOfNotNull(statements.lastOrNull() as? FirExpression) fun FirBlock.returnExpressions(): List<FirExpression> = listOfNotNull(statements.lastOrNull() as? FirExpression)
@@ -133,7 +137,8 @@ fun FirDeclarationStatus.copy(
} }
} }
inline fun <R> whileAnalysing(element: FirElement, block: () -> R) = org.jetbrains.kotlin.util.whileAnalysing(element.source, block) inline fun <R> whileAnalysing(@Suppress("UNUSED_PARAMETER") session: FirSession, element: FirElement, block: () -> R) =
org.jetbrains.kotlin.util.whileAnalysing(element.source, block)
inline fun <R> withFileAnalysisExceptionWrapping(file: FirFile, block: () -> R): R { inline fun <R> withFileAnalysisExceptionWrapping(file: FirFile, block: () -> R): R {
return org.jetbrains.kotlin.util.withFileAnalysisExceptionWrapping( return org.jetbrains.kotlin.util.withFileAnalysisExceptionWrapping(