[FIR] FirAbstractBodyResolveTransformerDispatcher: refactor code

Extract transformation logic into expressionTransformation,
declarationTransformation and controlFlowStatementsTransformation.
This simplifies logic (we do not need to write ?: each time) and
adds an one-place enter-point for transformations which can be used
by LL FIR later.

^KT-56551
This commit is contained in:
Dmitrii Gridin
2023-09-12 16:51:58 +02:00
committed by Space Team
parent 9d2d75313b
commit 274d7ba47d
5 changed files with 481 additions and 246 deletions
@@ -45,17 +45,32 @@ abstract class FirAbstractBodyResolveTransformerDispatcher(
private val controlFlowStatementsTransformer = FirControlFlowStatementsResolveTransformer(this) private val controlFlowStatementsTransformer = FirControlFlowStatementsResolveTransformer(this)
override fun transformFile(file: FirFile, data: ResolutionMode): FirFile { override fun transformFile(
return declarationsTransformer?.transformFile(file, data) ?: file file: FirFile,
} data: ResolutionMode,
): FirFile = declarationTransformation(
file,
data,
FirDeclarationsResolveTransformer::transformFile,
)
override fun transformScript(script: FirScript, data: ResolutionMode): FirScript { override fun transformScript(
return declarationsTransformer?.transformScript(script, data) ?: script script: FirScript,
} data: ResolutionMode,
): FirScript = declarationTransformation(
script,
data,
FirDeclarationsResolveTransformer::transformScript,
)
override fun transformCodeFragment(codeFragment: FirCodeFragment, data: ResolutionMode): FirCodeFragment { override fun transformCodeFragment(
return declarationsTransformer?.transformCodeFragment(codeFragment, data) ?: codeFragment codeFragment: FirCodeFragment,
} data: ResolutionMode,
): FirCodeFragment = declarationTransformation(
codeFragment,
data,
FirDeclarationsResolveTransformer::transformCodeFragment,
)
override fun <E : FirElement> transformElement(element: E, data: ResolutionMode): E { override fun <E : FirElement> transformElement(element: E, data: ResolutionMode): E {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@@ -95,360 +110,572 @@ abstract class FirAbstractBodyResolveTransformerDispatcher(
// ------------------------------------- Expressions ------------------------------------- // ------------------------------------- Expressions -------------------------------------
private inline fun <T : R, R> expressionTransformation(
expression: T,
data: ResolutionMode,
transformation: FirExpressionsResolveTransformer.(T, ResolutionMode) -> R,
): R {
return expressionsTransformer?.transformation(expression, data) ?: expression
}
override fun transformExpression(expression: FirExpression, data: ResolutionMode): FirStatement { override fun transformExpression(expression: FirExpression, data: ResolutionMode): FirStatement {
return expressionsTransformer?.transformExpression(expression, data) ?: expression return expressionTransformation(expression, data, FirExpressionsResolveTransformer::transformExpression)
} }
override fun transformWrappedArgumentExpression( override fun transformWrappedArgumentExpression(
wrappedArgumentExpression: FirWrappedArgumentExpression, wrappedArgumentExpression: FirWrappedArgumentExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement {
return transformElement(wrappedArgumentExpression, data) return transformElement(wrappedArgumentExpression, data)
} }
override fun transformQualifiedAccessExpression( override fun transformQualifiedAccessExpression(
qualifiedAccessExpression: FirQualifiedAccessExpression, qualifiedAccessExpression: FirQualifiedAccessExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformQualifiedAccessExpression(qualifiedAccessExpression, data) ?: qualifiedAccessExpression qualifiedAccessExpression,
} data,
FirExpressionsResolveTransformer::transformQualifiedAccessExpression,
)
override fun transformPropertyAccessExpression( override fun transformPropertyAccessExpression(
propertyAccessExpression: FirPropertyAccessExpression, propertyAccessExpression: FirPropertyAccessExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformQualifiedAccessExpression(propertyAccessExpression, data) ?: propertyAccessExpression propertyAccessExpression,
} data,
FirExpressionsResolveTransformer::transformQualifiedAccessExpression,
)
override fun transformFunctionCall(functionCall: FirFunctionCall, data: ResolutionMode): FirStatement { override fun transformFunctionCall(
return expressionsTransformer?.transformFunctionCall(functionCall, data) ?: functionCall functionCall: FirFunctionCall,
} data: ResolutionMode,
): FirStatement = expressionTransformation(
functionCall,
data,
FirExpressionsResolveTransformer::transformFunctionCall,
)
override fun transformStringConcatenationCall(stringConcatenationCall: FirStringConcatenationCall, data: ResolutionMode): FirStatement { override fun transformStringConcatenationCall(
return expressionsTransformer?.transformStringConcatenationCall(stringConcatenationCall, data) ?: stringConcatenationCall stringConcatenationCall: FirStringConcatenationCall,
} data: ResolutionMode,
): FirStatement = expressionTransformation(
stringConcatenationCall,
data,
FirExpressionsResolveTransformer::transformStringConcatenationCall,
)
override fun transformCallableReferenceAccess( override fun transformCallableReferenceAccess(
callableReferenceAccess: FirCallableReferenceAccess, callableReferenceAccess: FirCallableReferenceAccess,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformCallableReferenceAccess(callableReferenceAccess, data) ?: callableReferenceAccess callableReferenceAccess,
} data,
FirExpressionsResolveTransformer::transformCallableReferenceAccess,
)
override fun transformBlock(block: FirBlock, data: ResolutionMode): FirStatement { override fun transformBlock(
return expressionsTransformer?.transformBlock(block, data) ?: block block: FirBlock,
} data: ResolutionMode,
): FirStatement = expressionTransformation(
block,
data,
FirExpressionsResolveTransformer::transformBlock,
)
override fun transformThisReceiverExpression( override fun transformThisReceiverExpression(
thisReceiverExpression: FirThisReceiverExpression, thisReceiverExpression: FirThisReceiverExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformThisReceiverExpression(thisReceiverExpression, data) ?: thisReceiverExpression thisReceiverExpression,
} data,
FirExpressionsResolveTransformer::transformThisReceiverExpression,
)
override fun transformComparisonExpression( override fun transformComparisonExpression(
comparisonExpression: FirComparisonExpression, comparisonExpression: FirComparisonExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformComparisonExpression(comparisonExpression, data) ?: comparisonExpression comparisonExpression,
} data,
FirExpressionsResolveTransformer::transformComparisonExpression,
)
override fun transformTypeOperatorCall( override fun transformTypeOperatorCall(
typeOperatorCall: FirTypeOperatorCall, typeOperatorCall: FirTypeOperatorCall,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformTypeOperatorCall(typeOperatorCall, data) ?: typeOperatorCall typeOperatorCall,
} data,
FirExpressionsResolveTransformer::transformTypeOperatorCall,
)
override fun transformAssignmentOperatorStatement( override fun transformAssignmentOperatorStatement(
assignmentOperatorStatement: FirAssignmentOperatorStatement, assignmentOperatorStatement: FirAssignmentOperatorStatement,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformAssignmentOperatorStatement(assignmentOperatorStatement, data) assignmentOperatorStatement,
?: assignmentOperatorStatement data,
} FirExpressionsResolveTransformer::transformAssignmentOperatorStatement,
)
override fun transformIncrementDecrementExpression( override fun transformIncrementDecrementExpression(
incrementDecrementExpression: FirIncrementDecrementExpression, incrementDecrementExpression: FirIncrementDecrementExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformIncrementDecrementExpression(incrementDecrementExpression, data) incrementDecrementExpression,
?: incrementDecrementExpression data,
} FirExpressionsResolveTransformer::transformIncrementDecrementExpression,
)
override fun transformEqualityOperatorCall( override fun transformEqualityOperatorCall(
equalityOperatorCall: FirEqualityOperatorCall, equalityOperatorCall: FirEqualityOperatorCall,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformEqualityOperatorCall(equalityOperatorCall, data) ?: equalityOperatorCall equalityOperatorCall,
} data,
FirExpressionsResolveTransformer::transformEqualityOperatorCall,
)
override fun transformCheckNotNullCall( override fun transformCheckNotNullCall(
checkNotNullCall: FirCheckNotNullCall, checkNotNullCall: FirCheckNotNullCall,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformCheckNotNullCall(checkNotNullCall, data) ?: checkNotNullCall checkNotNullCall,
} data,
FirExpressionsResolveTransformer::transformCheckNotNullCall,
)
override fun transformBinaryLogicExpression( override fun transformBinaryLogicExpression(
binaryLogicExpression: FirBinaryLogicExpression, binaryLogicExpression: FirBinaryLogicExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformBinaryLogicExpression(binaryLogicExpression, data) ?: binaryLogicExpression binaryLogicExpression,
} data,
FirExpressionsResolveTransformer::transformBinaryLogicExpression,
)
override fun transformDesugaredAssignmentValueReferenceExpression( override fun transformDesugaredAssignmentValueReferenceExpression(
desugaredAssignmentValueReferenceExpression: FirDesugaredAssignmentValueReferenceExpression, desugaredAssignmentValueReferenceExpression: FirDesugaredAssignmentValueReferenceExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformDesugaredAssignmentValueReferenceExpression( desugaredAssignmentValueReferenceExpression,
desugaredAssignmentValueReferenceExpression, data,
data, FirExpressionsResolveTransformer::transformDesugaredAssignmentValueReferenceExpression,
) ?: desugaredAssignmentValueReferenceExpression )
}
override fun transformVariableAssignment( override fun transformVariableAssignment(
variableAssignment: FirVariableAssignment, variableAssignment: FirVariableAssignment,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformVariableAssignment(variableAssignment, data) ?: variableAssignment variableAssignment,
} data,
FirExpressionsResolveTransformer::transformVariableAssignment,
)
override fun transformGetClassCall(getClassCall: FirGetClassCall, data: ResolutionMode): FirStatement { override fun transformGetClassCall(
return expressionsTransformer?.transformGetClassCall(getClassCall, data) ?: getClassCall getClassCall: FirGetClassCall,
} data: ResolutionMode,
): FirStatement = expressionTransformation(
getClassCall,
data,
FirExpressionsResolveTransformer::transformGetClassCall,
)
override fun transformWrappedDelegateExpression( override fun transformWrappedDelegateExpression(
wrappedDelegateExpression: FirWrappedDelegateExpression, wrappedDelegateExpression: FirWrappedDelegateExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = declarationTransformation(
return declarationsTransformer?.transformWrappedDelegateExpression(wrappedDelegateExpression, data) ?: wrappedDelegateExpression wrappedDelegateExpression,
} data,
FirDeclarationsResolveTransformer::transformWrappedDelegateExpression,
)
override fun <T> transformConstExpression( override fun <T> transformConstExpression(
constExpression: FirConstExpression<T>, constExpression: FirConstExpression<T>,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformConstExpression(constExpression, data) ?: constExpression constExpression,
} data,
FirExpressionsResolveTransformer::transformConstExpression,
)
override fun transformAnnotation(annotation: FirAnnotation, data: ResolutionMode): FirStatement { override fun transformAnnotation(
return expressionsTransformer?.transformAnnotation(annotation, data) ?: annotation annotation: FirAnnotation,
} data: ResolutionMode,
): FirStatement = expressionTransformation(
annotation,
data,
FirExpressionsResolveTransformer::transformAnnotation,
)
override fun transformAnnotationCall(annotationCall: FirAnnotationCall, data: ResolutionMode): FirStatement { override fun transformAnnotationCall(
return expressionsTransformer?.transformAnnotationCall(annotationCall, data) ?: annotationCall annotationCall: FirAnnotationCall,
} data: ResolutionMode,
): FirStatement = expressionTransformation(
annotationCall,
data,
FirExpressionsResolveTransformer::transformAnnotationCall,
)
override fun transformErrorAnnotationCall(errorAnnotationCall: FirErrorAnnotationCall, data: ResolutionMode): FirStatement { override fun transformErrorAnnotationCall(
return expressionsTransformer?.transformErrorAnnotationCall(errorAnnotationCall, data) ?: errorAnnotationCall errorAnnotationCall: FirErrorAnnotationCall,
} data: ResolutionMode,
): FirStatement = expressionTransformation(
errorAnnotationCall,
data,
FirExpressionsResolveTransformer::transformErrorAnnotationCall,
)
override fun transformDelegatedConstructorCall( override fun transformDelegatedConstructorCall(
delegatedConstructorCall: FirDelegatedConstructorCall, delegatedConstructorCall: FirDelegatedConstructorCall,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformDelegatedConstructorCall(delegatedConstructorCall, data) ?: delegatedConstructorCall delegatedConstructorCall,
} data,
FirExpressionsResolveTransformer::transformDelegatedConstructorCall,
)
override fun transformAugmentedArraySetCall( override fun transformAugmentedArraySetCall(
augmentedArraySetCall: FirAugmentedArraySetCall, augmentedArraySetCall: FirAugmentedArraySetCall,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformAugmentedArraySetCall(augmentedArraySetCall, data) ?: augmentedArraySetCall augmentedArraySetCall,
} data,
FirExpressionsResolveTransformer::transformAugmentedArraySetCall,
)
override fun transformSafeCallExpression( override fun transformSafeCallExpression(
safeCallExpression: FirSafeCallExpression, safeCallExpression: FirSafeCallExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformSafeCallExpression(safeCallExpression, data) ?: safeCallExpression safeCallExpression,
} data,
FirExpressionsResolveTransformer::transformSafeCallExpression,
)
override fun transformCheckedSafeCallSubject( override fun transformCheckedSafeCallSubject(
checkedSafeCallSubject: FirCheckedSafeCallSubject, checkedSafeCallSubject: FirCheckedSafeCallSubject,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformCheckedSafeCallSubject(checkedSafeCallSubject, data) ?: checkedSafeCallSubject checkedSafeCallSubject,
} data,
FirExpressionsResolveTransformer::transformCheckedSafeCallSubject,
)
override fun transformArrayLiteral(arrayLiteral: FirArrayLiteral, data: ResolutionMode): FirStatement { override fun transformArrayLiteral(
return expressionsTransformer?.transformArrayLiteral(arrayLiteral, data) ?: arrayLiteral arrayLiteral: FirArrayLiteral,
} data: ResolutionMode,
): FirStatement = expressionTransformation(
arrayLiteral,
data,
FirExpressionsResolveTransformer::transformArrayLiteral,
)
override fun transformSmartCastExpression(smartCastExpression: FirSmartCastExpression, data: ResolutionMode): FirStatement { override fun transformSmartCastExpression(
return expressionsTransformer?.transformSmartCastExpression(smartCastExpression, data) ?: smartCastExpression smartCastExpression: FirSmartCastExpression,
} data: ResolutionMode,
): FirStatement = expressionTransformation(
smartCastExpression,
data,
FirExpressionsResolveTransformer::transformSmartCastExpression,
)
// ------------------------------------- Declarations ------------------------------------- // ------------------------------------- Declarations -------------------------------------
override fun transformDeclaration(declaration: FirDeclaration, data: ResolutionMode): FirDeclaration { private inline fun <T : R, R : FirElement> declarationTransformation(
return declarationsTransformer?.transformDeclaration(declaration, data) ?: declaration declaration: T,
data: ResolutionMode,
transformation: FirDeclarationsResolveTransformer.(T, ResolutionMode) -> R,
): R {
return declarationsTransformer?.transformation(declaration, data) ?: declaration
} }
override fun transformDeclaration(
declaration: FirDeclaration,
data: ResolutionMode,
): FirDeclaration = declarationTransformation(
declaration,
data,
FirDeclarationsResolveTransformer::transformDeclaration,
)
open fun transformDeclarationContent( open fun transformDeclarationContent(
declaration: FirDeclaration, data: ResolutionMode declaration: FirDeclaration, data: ResolutionMode,
): FirDeclaration { ): FirDeclaration {
return transformElement(declaration, data) return transformElement(declaration, data)
} }
override fun transformDeclarationStatus( override fun transformDeclarationStatus(
declarationStatus: FirDeclarationStatus, declarationStatus: FirDeclarationStatus,
data: ResolutionMode data: ResolutionMode,
): FirDeclarationStatus { ): FirDeclarationStatus = declarationTransformation(
return declarationsTransformer?.transformDeclarationStatus(declarationStatus, data) ?: declarationStatus declarationStatus,
} data,
FirDeclarationsResolveTransformer::transformDeclarationStatus,
)
override fun transformEnumEntry(enumEntry: FirEnumEntry, data: ResolutionMode): FirEnumEntry { override fun transformEnumEntry(
return declarationsTransformer?.transformEnumEntry(enumEntry, data) ?: enumEntry enumEntry: FirEnumEntry,
} data: ResolutionMode,
): FirEnumEntry = declarationTransformation(
enumEntry,
data,
FirDeclarationsResolveTransformer::transformEnumEntry,
)
override fun transformProperty(property: FirProperty, data: ResolutionMode): FirProperty { override fun transformProperty(
return declarationsTransformer?.transformProperty(property, data) ?: property property: FirProperty,
} data: ResolutionMode,
): FirProperty = declarationTransformation(
property,
data,
FirDeclarationsResolveTransformer::transformProperty,
)
override fun transformPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: ResolutionMode): FirStatement { override fun transformPropertyAccessor(
return declarationsTransformer?.transformPropertyAccessor(propertyAccessor, data) ?: propertyAccessor propertyAccessor: FirPropertyAccessor,
} data: ResolutionMode,
): FirPropertyAccessor = declarationTransformation(
propertyAccessor,
data,
FirDeclarationsResolveTransformer::transformPropertyAccessor,
)
override fun transformBackingField( override fun transformBackingField(
backingField: FirBackingField, backingField: FirBackingField,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirBackingField = declarationTransformation(
return declarationsTransformer?.transformBackingField(backingField, data) ?: backingField backingField,
} data,
FirDeclarationsResolveTransformer::transformBackingField,
)
override fun transformField(field: FirField, data: ResolutionMode): FirField { override fun transformField(
return declarationsTransformer?.transformField(field, data) ?: field field: FirField,
} data: ResolutionMode,
): FirField = declarationTransformation(
field,
data,
FirDeclarationsResolveTransformer::transformField,
)
override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement { override fun transformRegularClass(
return declarationsTransformer?.transformRegularClass(regularClass, data) ?: regularClass regularClass: FirRegularClass,
} data: ResolutionMode,
): FirRegularClass = declarationTransformation(
regularClass,
data,
FirDeclarationsResolveTransformer::transformRegularClass,
)
override fun transformAnonymousObject( override fun transformAnonymousObject(
anonymousObject: FirAnonymousObject, anonymousObject: FirAnonymousObject,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = declarationTransformation(
return declarationsTransformer?.transformAnonymousObject(anonymousObject, data) ?: anonymousObject anonymousObject,
} data,
FirDeclarationsResolveTransformer::transformAnonymousObject,
)
override fun transformAnonymousObjectExpression( override fun transformAnonymousObjectExpression(
anonymousObjectExpression: FirAnonymousObjectExpression, anonymousObjectExpression: FirAnonymousObjectExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformAnonymousObjectExpression(anonymousObjectExpression, data) ?: anonymousObjectExpression anonymousObjectExpression,
} data,
FirExpressionsResolveTransformer::transformAnonymousObjectExpression,
)
override fun transformSimpleFunction( override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction, simpleFunction: FirSimpleFunction,
data: ResolutionMode data: ResolutionMode,
): FirSimpleFunction { ): FirSimpleFunction = declarationTransformation(
return declarationsTransformer?.transformSimpleFunction(simpleFunction, data) ?: simpleFunction simpleFunction,
} data,
FirDeclarationsResolveTransformer::transformSimpleFunction,
)
override fun transformFunction( override fun transformFunction(
function: FirFunction, function: FirFunction,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirFunction = declarationTransformation(
return declarationsTransformer?.transformFunction(function, data) ?: function function,
} data,
FirDeclarationsResolveTransformer::transformFunction,
)
override fun transformConstructor(constructor: FirConstructor, data: ResolutionMode): FirConstructor { override fun transformConstructor(
return declarationsTransformer?.transformConstructor(constructor, data) ?: constructor constructor: FirConstructor,
} data: ResolutionMode,
): FirConstructor = declarationTransformation(
constructor,
data,
FirDeclarationsResolveTransformer::transformConstructor,
)
override fun transformErrorPrimaryConstructor(errorPrimaryConstructor: FirErrorPrimaryConstructor, data: ResolutionMode): FirStatement { override fun transformErrorPrimaryConstructor(
return declarationsTransformer?.transformErrorPrimaryConstructor(errorPrimaryConstructor, data) ?: errorPrimaryConstructor errorPrimaryConstructor: FirErrorPrimaryConstructor,
} data: ResolutionMode,
): FirErrorPrimaryConstructor = declarationTransformation(
errorPrimaryConstructor,
data,
FirDeclarationsResolveTransformer::transformErrorPrimaryConstructor,
)
override fun transformAnonymousInitializer( override fun transformAnonymousInitializer(
anonymousInitializer: FirAnonymousInitializer, anonymousInitializer: FirAnonymousInitializer,
data: ResolutionMode data: ResolutionMode,
): FirAnonymousInitializer { ): FirAnonymousInitializer = declarationTransformation(
return declarationsTransformer?.transformAnonymousInitializer(anonymousInitializer, data) ?: anonymousInitializer anonymousInitializer,
} data,
FirDeclarationsResolveTransformer::transformAnonymousInitializer,
)
override fun transformAnonymousFunction( override fun transformAnonymousFunction(
anonymousFunction: FirAnonymousFunction, anonymousFunction: FirAnonymousFunction,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirAnonymousFunction = declarationTransformation(
return declarationsTransformer?.transformAnonymousFunction(anonymousFunction, data) ?: anonymousFunction anonymousFunction,
} data,
FirDeclarationsResolveTransformer::transformAnonymousFunction,
)
override fun transformAnonymousFunctionExpression( override fun transformAnonymousFunctionExpression(
anonymousFunctionExpression: FirAnonymousFunctionExpression, anonymousFunctionExpression: FirAnonymousFunctionExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = expressionTransformation(
return expressionsTransformer?.transformAnonymousFunctionExpression(anonymousFunctionExpression, data) anonymousFunctionExpression,
?: anonymousFunctionExpression data,
} FirExpressionsResolveTransformer::transformAnonymousFunctionExpression,
)
override fun transformValueParameter(valueParameter: FirValueParameter, data: ResolutionMode): FirStatement { override fun transformValueParameter(
return declarationsTransformer?.transformValueParameter(valueParameter, data) ?: valueParameter valueParameter: FirValueParameter,
} data: ResolutionMode,
): FirValueParameter = declarationTransformation(
valueParameter,
data,
FirDeclarationsResolveTransformer::transformValueParameter,
)
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias { override fun transformTypeAlias(
return declarationsTransformer?.transformTypeAlias(typeAlias, data) ?: typeAlias typeAlias: FirTypeAlias,
} data: ResolutionMode,
): FirTypeAlias = declarationTransformation(
typeAlias,
data,
FirDeclarationsResolveTransformer::transformTypeAlias,
)
// ------------------------------------- Control flow statements ------------------------------------- // ------------------------------------- Control flow statements -------------------------------------
override fun transformWhileLoop(whileLoop: FirWhileLoop, data: ResolutionMode): FirStatement { private inline fun <T, R> controlFlowStatementsTransformation(
return controlFlowStatementsTransformer.transformWhileLoop(whileLoop, data) declaration: T,
data: ResolutionMode,
transformation: FirControlFlowStatementsResolveTransformer.(T, ResolutionMode) -> R,
): R {
return controlFlowStatementsTransformer.transformation(declaration, data)
} }
override fun transformDoWhileLoop(doWhileLoop: FirDoWhileLoop, data: ResolutionMode): FirStatement { override fun transformWhileLoop(
return controlFlowStatementsTransformer.transformDoWhileLoop(doWhileLoop, data) whileLoop: FirWhileLoop,
} data: ResolutionMode,
): FirStatement = controlFlowStatementsTransformation(
whileLoop,
data,
FirControlFlowStatementsResolveTransformer::transformWhileLoop,
)
override fun transformWhenExpression(whenExpression: FirWhenExpression, data: ResolutionMode): FirStatement { override fun transformDoWhileLoop(
return controlFlowStatementsTransformer.transformWhenExpression(whenExpression, data) doWhileLoop: FirDoWhileLoop,
} data: ResolutionMode,
): FirStatement = controlFlowStatementsTransformation(
doWhileLoop,
data,
FirControlFlowStatementsResolveTransformer::transformDoWhileLoop,
)
override fun transformWhenBranch(whenBranch: FirWhenBranch, data: ResolutionMode): FirWhenBranch { override fun transformWhenExpression(
return controlFlowStatementsTransformer.transformWhenBranch(whenBranch, data) whenExpression: FirWhenExpression,
} data: ResolutionMode,
): FirStatement = controlFlowStatementsTransformation(
whenExpression,
data,
FirControlFlowStatementsResolveTransformer::transformWhenExpression,
)
override fun transformWhenBranch(
whenBranch: FirWhenBranch,
data: ResolutionMode,
): FirWhenBranch = controlFlowStatementsTransformation(
whenBranch,
data,
FirControlFlowStatementsResolveTransformer::transformWhenBranch,
)
override fun transformWhenSubjectExpression( override fun transformWhenSubjectExpression(
whenSubjectExpression: FirWhenSubjectExpression, whenSubjectExpression: FirWhenSubjectExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = controlFlowStatementsTransformation(
return controlFlowStatementsTransformer.transformWhenSubjectExpression(whenSubjectExpression, data) whenSubjectExpression,
} data,
FirControlFlowStatementsResolveTransformer::transformWhenSubjectExpression,
)
override fun transformTryExpression(tryExpression: FirTryExpression, data: ResolutionMode): FirStatement { override fun transformTryExpression(
return controlFlowStatementsTransformer.transformTryExpression(tryExpression, data) tryExpression: FirTryExpression,
} data: ResolutionMode,
): FirStatement = controlFlowStatementsTransformation(
tryExpression,
data,
FirControlFlowStatementsResolveTransformer::transformTryExpression,
)
override fun transformCatch(catch: FirCatch, data: ResolutionMode): FirCatch { override fun transformCatch(
return controlFlowStatementsTransformer.transformCatch(catch, data) catch: FirCatch,
} data: ResolutionMode,
): FirCatch = controlFlowStatementsTransformation(
catch,
data,
FirControlFlowStatementsResolveTransformer::transformCatch,
)
override fun <E : FirTargetElement> transformJump(jump: FirJump<E>, data: ResolutionMode): FirStatement { override fun <E : FirTargetElement> transformJump(
return controlFlowStatementsTransformer.transformJump(jump, data) jump: FirJump<E>,
} data: ResolutionMode,
): FirStatement = controlFlowStatementsTransformation(
jump,
data,
FirControlFlowStatementsResolveTransformer::transformJump,
)
override fun transformReturnExpression( override fun transformReturnExpression(
returnExpression: FirReturnExpression, returnExpression: FirReturnExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = controlFlowStatementsTransformation(
return controlFlowStatementsTransformer.transformReturnExpression(returnExpression, data) returnExpression,
} data,
FirControlFlowStatementsResolveTransformer::transformReturnExpression,
)
override fun transformThrowExpression( override fun transformThrowExpression(
throwExpression: FirThrowExpression, throwExpression: FirThrowExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = controlFlowStatementsTransformation(
return controlFlowStatementsTransformer.transformThrowExpression(throwExpression, data) throwExpression,
} data,
FirControlFlowStatementsResolveTransformer::transformThrowExpression,
)
override fun transformElvisExpression( override fun transformElvisExpression(
elvisExpression: FirElvisExpression, elvisExpression: FirElvisExpression,
data: ResolutionMode data: ResolutionMode,
): FirStatement { ): FirStatement = controlFlowStatementsTransformation(
return controlFlowStatementsTransformer.transformElvisExpression(elvisExpression, data) elvisExpression,
} data,
FirControlFlowStatementsResolveTransformer::transformElvisExpression,
)
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -325,7 +325,7 @@ open class FirDeclarationsResolveTransformer(
dataFlowAnalyzer.exitDelegateExpression(delegate) dataFlowAnalyzer.exitDelegateExpression(delegate)
} }
override fun transformPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: ResolutionMode): FirStatement { override fun transformPropertyAccessor(propertyAccessor: FirPropertyAccessor, data: ResolutionMode): FirPropertyAccessor {
return propertyAccessor.also { return propertyAccessor.also {
transformProperty(it.propertySymbol.fir, data) transformProperty(it.propertySymbol.fir, data)
} }
@@ -604,7 +604,7 @@ open class FirDeclarationsResolveTransformer(
override fun transformRegularClass( override fun transformRegularClass(
regularClass: FirRegularClass, regularClass: FirRegularClass,
data: ResolutionMode data: ResolutionMode
): FirStatement = ): FirRegularClass =
whileAnalysing(session, regularClass) { 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) {
@@ -705,7 +705,7 @@ open class FirDeclarationsResolveTransformer(
override fun transformAnonymousObject( override fun transformAnonymousObject(
anonymousObject: FirAnonymousObject, anonymousObject: FirAnonymousObject,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(session, anonymousObject) { ): FirAnonymousObject = whileAnalysing(session, anonymousObject) {
if (anonymousObject !in context.targetedLocalClasses) { if (anonymousObject !in context.targetedLocalClasses) {
return anonymousObject.runAllPhasesForLocalClass(transformer, components, data, transformer.firResolveContextCollector) return anonymousObject.runAllPhasesForLocalClass(transformer, components, data, transformer.firResolveContextCollector)
} }
@@ -785,14 +785,14 @@ open class FirDeclarationsResolveTransformer(
override fun transformFunction( override fun transformFunction(
function: FirFunction, function: FirFunction,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(session, function) { ): FirFunction = whileAnalysing(session, function) {
if (function.bodyResolved) return function if (function.bodyResolved) return function
dataFlowAnalyzer.enterFunction(function) dataFlowAnalyzer.enterFunction(function)
return transformDeclarationContent(function, data).also { return transformDeclarationContent(function, data).also {
val result = it as FirFunction val result = it as FirFunction
val controlFlowGraphReference = dataFlowAnalyzer.exitFunction(result) val controlFlowGraphReference = dataFlowAnalyzer.exitFunction(result)
result.replaceControlFlowGraphReference(controlFlowGraphReference) result.replaceControlFlowGraphReference(controlFlowGraphReference)
} as FirStatement } as FirFunction
} }
override fun transformConstructor(constructor: FirConstructor, data: ResolutionMode): FirConstructor = override fun transformConstructor(constructor: FirConstructor, data: ResolutionMode): FirConstructor =
@@ -809,8 +809,10 @@ open class FirDeclarationsResolveTransformer(
return doTransformConstructor(constructor, data) return doTransformConstructor(constructor, data)
} }
override fun transformErrorPrimaryConstructor(errorPrimaryConstructor: FirErrorPrimaryConstructor, data: ResolutionMode) = override fun transformErrorPrimaryConstructor(
transformConstructor(errorPrimaryConstructor, data) errorPrimaryConstructor: FirErrorPrimaryConstructor,
data: ResolutionMode,
): FirErrorPrimaryConstructor = transformConstructor(errorPrimaryConstructor, data) as FirErrorPrimaryConstructor
private fun doTransformConstructor(constructor: FirConstructor, data: ResolutionMode): FirConstructor { private fun doTransformConstructor(constructor: FirConstructor, data: ResolutionMode): FirConstructor {
val owningClass = context.containerIfAny as? FirRegularClass val owningClass = context.containerIfAny as? FirRegularClass
@@ -863,7 +865,7 @@ open class FirDeclarationsResolveTransformer(
override fun transformValueParameter( override fun transformValueParameter(
valueParameter: FirValueParameter, valueParameter: FirValueParameter,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(session, valueParameter) { ): FirValueParameter = whileAnalysing(session, valueParameter) {
dataFlowAnalyzer.enterValueParameter(valueParameter) dataFlowAnalyzer.enterValueParameter(valueParameter)
val result = context.withValueParameter(valueParameter, session) { val result = context.withValueParameter(valueParameter, session) {
transformDeclarationContent( transformDeclarationContent(
@@ -882,7 +884,7 @@ open class FirDeclarationsResolveTransformer(
override fun transformAnonymousFunction( override fun transformAnonymousFunction(
anonymousFunction: FirAnonymousFunction, anonymousFunction: FirAnonymousFunction,
data: ResolutionMode data: ResolutionMode
): FirStatement = whileAnalysing(session, anonymousFunction) { ): FirAnonymousFunction = whileAnalysing(session, anonymousFunction) {
// Either ContextDependent, ContextIndependent or WithExpectedType could be here // Either ContextDependent, ContextIndependent or WithExpectedType could be here
anonymousFunction.transformAnnotations(transformer, ResolutionMode.ContextIndependent) anonymousFunction.transformAnnotations(transformer, ResolutionMode.ContextIndependent)
if (data !is ResolutionMode.LambdaResolution) { if (data !is ResolutionMode.LambdaResolution) {
@@ -1079,7 +1081,7 @@ open class FirDeclarationsResolveTransformer(
override fun transformBackingField( override fun transformBackingField(
backingField: FirBackingField, backingField: FirBackingField,
data: ResolutionMode, data: ResolutionMode,
): FirStatement = whileAnalysing(session, backingField) { ): FirBackingField = whileAnalysing(session, backingField) {
val propertyType = data.expectedType val propertyType = data.expectedType
val initializerData = when { val initializerData = when {
backingField.returnTypeRef is FirResolvedTypeRef -> withExpectedType(backingField.returnTypeRef) backingField.returnTypeRef is FirResolvedTypeRef -> withExpectedType(backingField.returnTypeRef)
@@ -265,7 +265,7 @@ abstract class FirAbstractContractResolveTransformerDispatcher(
} }
} }
override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement { override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirRegularClass {
return withRegularClass(regularClass) { return withRegularClass(regularClass) {
transformDeclarationContent(regularClass, data) transformDeclarationContent(regularClass, data)
regularClass regularClass
@@ -281,7 +281,7 @@ abstract class FirAbstractContractResolveTransformerDispatcher(
override fun transformAnonymousObject( override fun transformAnonymousObject(
anonymousObject: FirAnonymousObject, anonymousObject: FirAnonymousObject,
data: ResolutionMode data: ResolutionMode
): FirStatement { ): FirAnonymousObject {
context.withAnonymousObject(anonymousObject, components) { context.withAnonymousObject(anonymousObject, components) {
transformDeclarationContent(anonymousObject, data) transformDeclarationContent(anonymousObject, data)
} }
@@ -306,8 +306,10 @@ abstract class FirAbstractContractResolveTransformerDispatcher(
} }
} }
override fun transformErrorPrimaryConstructor(errorPrimaryConstructor: FirErrorPrimaryConstructor, data: ResolutionMode) = override fun transformErrorPrimaryConstructor(
transformConstructor(errorPrimaryConstructor, data) errorPrimaryConstructor: FirErrorPrimaryConstructor,
data: ResolutionMode,
): FirErrorPrimaryConstructor = transformConstructor(errorPrimaryConstructor, data) as FirErrorPrimaryConstructor
override fun transformEnumEntry(enumEntry: FirEnumEntry, data: ResolutionMode): FirEnumEntry { override fun transformEnumEntry(enumEntry: FirEnumEntry, data: ResolutionMode): FirEnumEntry {
return enumEntry return enumEntry
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.resolve.transformers.plugin package org.jetbrains.kotlin.fir.resolve.transformers.plugin
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.util.PrivateForInline
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirErrorAnnotationCall
@@ -17,6 +16,7 @@ import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.* import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.*
import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.fir.visitors.transformSingle
import org.jetbrains.kotlin.util.PrivateForInline
open class FirAnnotationArgumentsMappingTransformer( open class FirAnnotationArgumentsMappingTransformer(
session: FirSession, session: FirSession,
@@ -91,7 +91,7 @@ private class FirDeclarationsResolveTransformerForAnnotationArgumentsMapping(
} }
} }
override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement { override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirRegularClass {
regularClass.transformAnnotations(this, data) regularClass.transformAnnotations(this, data)
doTransformTypeParameters(regularClass) doTransformTypeParameters(regularClass)
regularClass.transformSuperTypeRefs(this, data) regularClass.transformSuperTypeRefs(this, data)
@@ -154,10 +154,12 @@ private class FirDeclarationsResolveTransformerForAnnotationArgumentsMapping(
return constructor return constructor
} }
override fun transformErrorPrimaryConstructor(errorPrimaryConstructor: FirErrorPrimaryConstructor, data: ResolutionMode) = override fun transformErrorPrimaryConstructor(
transformConstructor(errorPrimaryConstructor, data) errorPrimaryConstructor: FirErrorPrimaryConstructor,
data: ResolutionMode,
): FirErrorPrimaryConstructor = transformConstructor(errorPrimaryConstructor, data) as FirErrorPrimaryConstructor
override fun transformValueParameter(valueParameter: FirValueParameter, data: ResolutionMode): FirStatement { override fun transformValueParameter(valueParameter: FirValueParameter, data: ResolutionMode): FirValueParameter {
context.withValueParameter(valueParameter, session) { context.withValueParameter(valueParameter, session) {
valueParameter valueParameter
.transformAnnotations(transformer, data) .transformAnnotations(transformer, data)
@@ -220,7 +222,7 @@ private class FirDeclarationsResolveTransformerForAnnotationArgumentsMapping(
return field return field
} }
override fun transformBackingField(backingField: FirBackingField, data: ResolutionMode): FirStatement { override fun transformBackingField(backingField: FirBackingField, data: ResolutionMode): FirBackingField {
backingField.transformAnnotations(transformer, data) backingField.transformAnnotations(transformer, data)
return backingField return backingField
} }
@@ -61,7 +61,7 @@ private class FirDeclarationsResolveTransformerForArgumentAnnotations(
} }
} }
override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement { override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirRegularClass {
regularClass.transformAnnotations(this, data) regularClass.transformAnnotations(this, data)
withRegularClass(regularClass) { withRegularClass(regularClass) {
regularClass regularClass
@@ -109,10 +109,12 @@ private class FirDeclarationsResolveTransformerForArgumentAnnotations(
return constructor return constructor
} }
override fun transformErrorPrimaryConstructor(errorPrimaryConstructor: FirErrorPrimaryConstructor, data: ResolutionMode) = override fun transformErrorPrimaryConstructor(
transformConstructor(errorPrimaryConstructor, data) errorPrimaryConstructor: FirErrorPrimaryConstructor,
data: ResolutionMode,
): FirErrorPrimaryConstructor = transformConstructor(errorPrimaryConstructor, data) as FirErrorPrimaryConstructor
override fun transformValueParameter(valueParameter: FirValueParameter, data: ResolutionMode): FirStatement { override fun transformValueParameter(valueParameter: FirValueParameter, data: ResolutionMode): FirValueParameter {
valueParameter valueParameter
.transformAnnotations(transformer, data) .transformAnnotations(transformer, data)
.transformReturnTypeRef(transformer, data) .transformReturnTypeRef(transformer, data)