1 // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
3 package org.jetbrains.kotlin.nj2k
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
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 ForConversion(context),
49 LabeledStatementConversion(context),
50 ArrayOperationsConversion(context),
51 EqualsOperatorConversion(context),
52 TypeMappingConversion(context),
53 InternalDeclarationConversion(context),
55 InnerClassConversion(context),
56 StaticsToCompanionExtractConversion(context),
57 InterfaceWithFieldConversion(context),
58 ClassToObjectPromotionConversion(context),
59 RemoveWrongExtraModifiersForSingleFunctionsConversion(context),
60 MethodReferenceToLambdaConversion(context),
61 TypeMappingConversion(context) { typeElement ->
62 typeElement.parent.safeAs<JKParameter>()?.parent is JKLambdaExpression
64 BuiltinMembersConversion(context),
65 ImplicitCastsConversion(context),
66 PrimitiveTypeCastsConversion(context),
67 LiteralConversion(context),
68 StaticMemberAccessConversion(context),
69 RemoveRedundantQualifiersForCallsConversion(context),
70 FunctionalInterfacesConverter(context),
72 FilterImportsConversion(context),
73 AddElementsInfoConversion(context)
78 trees: List<JKTreeRoot>,
79 context: NewJ2kConverterContext,
80 updateProgress: (conversionIndex: Int, conversionCount: Int, fileIndex: Int, String) -> Unit
83 val conversions = createConversions(context)
84 for ((conversionIndex, conversion) in conversions.withIndex()) {
86 val treeSequence = trees.asSequence().onEachIndexed { index, _ ->
87 updateProgress(conversionIndex, conversions.size, index, conversion.description())
90 conversion.runConversion(treeSequence, context)
94 private fun Conversion.description(): String {
95 val conversionName = this::class.simpleName
96 val words = conversionName?.let { wordRegex.findAll(conversionName).map { it.value.decapitalize(Locale.US) }.toList() }
98 conversionName == null -> "Converting..."
99 conversionName.endsWith("Conversion") -> "Converting ${words!!.dropLast(1).joinToString(" ")}"
100 else -> words!!.joinToString(" ")
104 private val wordRegex = "[A-Z][a-z0-9]+".toRegex()