[kotlin j2k] Fix conversion of escaped dollar sign in string literals
[idea/community.git] / plugins / kotlin / j2k / new / src / org / jetbrains / kotlin / nj2k / ConversionsRunner.kt
1 // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
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         ForConversion(context),
49         LabeledStatementConversion(context),
50         ArrayOperationsConversion(context),
51         EqualsOperatorConversion(context),
52         TypeMappingConversion(context),
53         InternalDeclarationConversion(context),
54
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
63         },
64         BuiltinMembersConversion(context),
65         ImplicitCastsConversion(context),
66         PrimitiveTypeCastsConversion(context),
67         LiteralConversion(context),
68         StaticMemberAccessConversion(context),
69         RemoveRedundantQualifiersForCallsConversion(context),
70         FunctionalInterfacesConverter(context),
71
72         FilterImportsConversion(context),
73         AddElementsInfoConversion(context)
74     )
75
76
77     fun doApply(
78         trees: List<JKTreeRoot>,
79         context: NewJ2kConverterContext,
80         updateProgress: (conversionIndex: Int, conversionCount: Int, fileIndex: Int, String) -> Unit
81     ) {
82
83         val conversions = createConversions(context)
84         for ((conversionIndex, conversion) in conversions.withIndex()) {
85
86             val treeSequence = trees.asSequence().onEachIndexed { index, _ ->
87                 updateProgress(conversionIndex, conversions.size, index, conversion.description())
88             }
89
90             conversion.runConversion(treeSequence, context)
91         }
92     }
93
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() }
97         return when {
98             conversionName == null -> "Converting..."
99             conversionName.endsWith("Conversion") -> "Converting ${words!!.dropLast(1).joinToString(" ")}"
100             else -> words!!.joinToString(" ")
101         }
102     }
103
104     private val wordRegex = "[A-Z][a-z0-9]+".toRegex()
105 }