4247b9253f8fe6a3a37bf449ec8240389205256d
[idea/community.git] / plugins / kotlin / j2k / new / src / org / jetbrains / kotlin / nj2k / ConversionsRunner.kt
1 // Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2
3 package org.jetbrains.kotlin.nj2k
4
5 import org.jetbrains.kotlin.nj2k.conversions.*
6 import org.jetbrains.kotlin.nj2k.tree.JKLambdaExpression
7 import org.jetbrains.kotlin.nj2k.tree.JKParameter
8 import org.jetbrains.kotlin.nj2k.tree.JKTreeRoot
9 import org.jetbrains.kotlin.utils.addToStdlib.safeAs
10 import java.util.*
11
12 object ConversionsRunner {
13     private fun createConversions(context: NewJ2kConverterContext) = listOf(
14         ParenthesizeBitwiseOperationConversion(context),
15         NonCodeElementsConversion(context),
16         JavaModifiersConversion(context),
17         JavaAnnotationsConversion(context),
18         AnnotationClassConversion(context),
19         AnnotationConversion(context),
20         ModalityConversion(context),
21         FunctionAsAnonymousObjectToLambdaConversion(context),
22         ReturnStatementInLambdaExpressionConversion(context),
23         BoxedTypeOperationsConversion(context),
24         AnyWithStringConcatenationConversion(context),
25         AssignmentExpressionUnfoldingConversion(context),
26         AddParenthesisForLineBreaksInBinaryExpression(context),
27         ThrowStatementConversion(context),
28         ArrayInitializerConversion(context),
29         TryStatementConversion(context),
30         EnumFieldAccessConversion(context),
31         SynchronizedStatementConversion(context),
32         JetbrainsNullableAnnotationsConverter(context),
33         DefaultArgumentsConversion(context),
34         ConstructorConversion(context),
35         MoveConstructorsAfterFieldsConversion(context),
36         ImplicitInitializerConversion(context),
37         ParameterModificationInMethodCallsConversion(context),
38         BlockToRunConversion(context),
39         PrimaryConstructorDetectConversion(context),
40         InsertDefaultPrimaryConstructorConversion(context),
41         FieldToPropertyConversion(context),
42         JavaStandardMethodsConversion(context),
43         JavaMethodToKotlinFunctionConversion(context),
44         MainFunctionConversion(context),
45         AssertStatementConversion(context),
46         SwitchToWhenConversion(context),
47         YieldStatementConversion(context),
48         LiteralConversion(context),
49         ForConversion(context),
50         LabeledStatementConversion(context),
51         ArrayOperationsConversion(context),
52         EqualsOperatorConversion(context),
53         TypeMappingConversion(context),
54         InternalDeclarationConversion(context),
55
56         InnerClassConversion(context),
57         StaticsToCompanionExtractConversion(context),
58         InterfaceWithFieldConversion(context),
59         ClassToObjectPromotionConversion(context),
60         RemoveWrongExtraModifiersForSingleFunctionsConversion(context),
61         MethodReferenceToLambdaConversion(context),
62         TypeMappingConversion(context) { typeElement ->
63             typeElement.parent.safeAs<JKParameter>()?.parent is JKLambdaExpression
64         },
65         BuiltinMembersConversion(context),
66         ImplicitCastsConversion(context),
67         PrimitiveTypeCastsConversion(context),
68         LiteralConversion(context),
69         StaticMemberAccessConversion(context),
70         RemoveRedundantQualifiersForCallsConversion(context),
71         FunctionalInterfacesConverter(context),
72
73         FilterImportsConversion(context),
74         AddElementsInfoConversion(context)
75     )
76
77
78     fun doApply(
79         trees: List<JKTreeRoot>,
80         context: NewJ2kConverterContext,
81         updateProgress: (conversionIndex: Int, conversionCount: Int, fileIndex: Int, String) -> Unit
82     ) {
83
84         val conversions = createConversions(context)
85         for ((conversionIndex, conversion) in conversions.withIndex()) {
86
87             val treeSequence = trees.asSequence().onEachIndexed { index, _ ->
88                 updateProgress(conversionIndex, conversions.size, index, conversion.description())
89             }
90
91             conversion.runConversion(treeSequence, context)
92         }
93     }
94
95     private fun Conversion.description(): String {
96         val conversionName = this::class.simpleName
97         val words = conversionName?.let { wordRegex.findAll(conversionName).map { it.value.decapitalize(Locale.US) }.toList() }
98         return when {
99             conversionName == null -> "Converting..."
100             conversionName.endsWith("Conversion") -> "Converting ${words!!.dropLast(1).joinToString(" ")}"
101             else -> words!!.joinToString(" ")
102         }
103     }
104
105     private val wordRegex = "[A-Z][a-z0-9]+".toRegex()
106 }