New J2K: store reference to conversionContext & symbolProvider in conversion

This commit is contained in:
Ilya Kirillov
2019-09-03 14:17:06 +03:00
parent eb690f451e
commit 047bb07727
62 changed files with 218 additions and 201 deletions
@@ -7,11 +7,15 @@ package org.jetbrains.kotlin.nj2k
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
interface BatchBaseConversion { interface Conversion {
val context: NewJ2kConverterContext
val symbolProvider
get() = context.symbolProvider
fun runConversion(treeRoots: List<JKTreeElement>, context: NewJ2kConverterContext): Boolean fun runConversion(treeRoots: List<JKTreeElement>, context: NewJ2kConverterContext): Boolean
} }
interface SequentialBaseConversion : BatchBaseConversion { interface SequentialBaseConversion : Conversion {
fun runConversion(treeRoot: JKTreeElement, context: NewJ2kConverterContext): Boolean fun runConversion(treeRoot: JKTreeElement, context: NewJ2kConverterContext): Boolean
override fun runConversion(treeRoots: List<JKTreeElement>, context: NewJ2kConverterContext): Boolean { override fun runConversion(treeRoots: List<JKTreeElement>, context: NewJ2kConverterContext): Boolean {
@@ -22,25 +22,25 @@ import org.jetbrains.kotlin.nj2k.tree.JKTreeRoot
object ConversionsRunner { object ConversionsRunner {
private fun createConversions(context: NewJ2kConverterContext) = listOf( private fun createConversions(context: NewJ2kConverterContext) = listOf(
NonCodeElementsConversion(), NonCodeElementsConversion(context),
JavaModifiersConversion(context), JavaModifiersConversion(context),
JavaAnnotationsConversion(context), JavaAnnotationsConversion(context),
AnnotationClassConversion(context), AnnotationClassConversion(context),
AnnotationConversion(context), AnnotationConversion(context),
ModalityConversion(context), ModalityConversion(context),
FunctionAsAnonymousObjectToLambdaConversion(), FunctionAsAnonymousObjectToLambdaConversion(context),
ReturnStatementInLambdaExpressionConversion(), ReturnStatementInLambdaExpressionConversion(context),
BoxedTypeOperationsConversion(context), BoxedTypeOperationsConversion(context),
AssignmentAsExpressionToAlsoConversion(context), AssignmentAsExpressionToAlsoConversion(context),
AssignmentStatementValCreationConversion(context), AssignmentStatementValCreationConversion(context),
AssignmentStatementOperatorConversion(), AssignmentStatementOperatorConversion(context),
AssignmentStatementSimplifyValConversion(), AssignmentStatementSimplifyValConversion(context),
AssignmentStatementSimplifyAlsoConversion(), AssignmentStatementSimplifyAlsoConversion(context),
AssignmentStatementSplitAlsoConversion(), AssignmentStatementSplitAlsoConversion(context),
PolyadicExpressionConversion(), PolyadicExpressionConversion(context),
OperatorExpressionConversion(context), OperatorExpressionConversion(context),
AddParenthesisForLineBreaksInBinaryExpression(), AddParenthesisForLineBreaksInBinaryExpression(context),
ThrowStatementConversion(), ThrowStatementConversion(context),
ArrayInitializerConversion(context), ArrayInitializerConversion(context),
TryStatementConversion(context), TryStatementConversion(context),
EnumFieldAccessConversion(context), EnumFieldAccessConversion(context),
@@ -49,38 +49,38 @@ object ConversionsRunner {
JetbrainsNullableAnnotationsConverter(context), JetbrainsNullableAnnotationsConverter(context),
DefaultArgumentsConversion(context), DefaultArgumentsConversion(context),
ConstructorConversion(context), ConstructorConversion(context),
StaticInitDeclarationConversion(), StaticInitDeclarationConversion(context),
ImplicitInitializerConversion(context), ImplicitInitializerConversion(context),
ParameterModificationInMethodCallsConversion(context), ParameterModificationInMethodCallsConversion(context),
BlockToRunConversion(context), BlockToRunConversion(context),
PrimaryConstructorDetectConversion(context), PrimaryConstructorDetectConversion(context),
InsertDefaultPrimaryConstructorConversion(context), InsertDefaultPrimaryConstructorConversion(context),
FieldToPropertyConversion(), FieldToPropertyConversion(context),
JavaStandardMethodsConversion(context), JavaStandardMethodsConversion(context),
JavaMethodToKotlinFunctionConversion(context), JavaMethodToKotlinFunctionConversion(context),
MainFunctionConversion(context), MainFunctionConversion(context),
AssertStatementConversion(context), AssertStatementConversion(context),
SwitchStatementConversion(context), SwitchStatementConversion(context),
LiteralConversion(), LiteralConversion(context),
ForConversion(context), ForConversion(context),
LabeledStatementConversion(), LabeledStatementConversion(context),
ArrayOperationsConversion(context), ArrayOperationsConversion(context),
EqualsOperatorConversion(context), EqualsOperatorConversion(context),
TypeMappingConversion(context), TypeMappingConversion(context),
InternalDeclarationConversion(context), InternalDeclarationConversion(context),
InnerClassConversion(), InnerClassConversion(context),
StaticsToCompanionExtractConversion(), StaticsToCompanionExtractConversion(context),
InterfaceWithFieldConversion(), InterfaceWithFieldConversion(context),
ClassToObjectPromotionConversion(context), ClassToObjectPromotionConversion(context),
RemoveWrongExtraModifiersForSingleFunctionsConversion(), RemoveWrongExtraModifiersForSingleFunctionsConversion(context),
MethodReferenceToLambdaConversion(context), MethodReferenceToLambdaConversion(context),
BuiltinMembersConversion(context), BuiltinMembersConversion(context),
ImplicitCastsConversion(context), ImplicitCastsConversion(context),
LiteralConversion(), LiteralConversion(context),
CollectImportsConversion(context), CollectImportsConversion(context),
FilterImportsConversion(), FilterImportsConversion(context),
MoveInitBlocksToTheEndConversion(), MoveInitBlocksToTheEndConversion(context),
AddElementsInfoConversion(context) AddElementsInfoConversion(context)
) )
@@ -17,8 +17,6 @@ import org.jetbrains.kotlin.nj2k.symbols.JKUniverseMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKCapturedType import org.jetbrains.kotlin.nj2k.tree.impl.JKCapturedType
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
import org.jetbrains.kotlin.nj2k.types.JKParametrizedType
import org.jetbrains.kotlin.nj2k.types.JKStarProjectionType
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class AddElementsInfoConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) { class AddElementsInfoConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
@@ -55,8 +53,8 @@ class AddElementsInfoConversion(context: NewJ2kConverterContext) : RecursiveAppl
private fun JKMethod.superMethods(): Collection<FunctionDescriptor>? { private fun JKMethod.superMethods(): Collection<FunctionDescriptor>? {
val psiMethod = psi<PsiMethod>() ?: return null val psiMethod = psi<PsiMethod>() ?: return null
psiMethod.getJavaMethodDescriptor()?.let { psiMethod.getJavaMethodDescriptor()?.let { descriptor ->
return it.overriddenDescriptors return descriptor.overriddenDescriptors
} }
return psiMethod.findSuperMethods().mapNotNull { superMethod -> return psiMethod.findSuperMethods().mapNotNull { superMethod ->
when (superMethod) { when (superMethod) {
@@ -5,12 +5,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKBinaryExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKBinaryExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl
class AddParenthesisForLineBreaksInBinaryExpression : RecursiveApplicableConversionBase() { class AddParenthesisForLineBreaksInBinaryExpression(override val context: NewJ2kConverterContext) :
RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKBinaryExpression) return recurse(element) if (element !is JKBinaryExpression) return recurse(element)
if (element.parent is JKBinaryExpression) return recurse(element) if (element.parent is JKBinaryExpression) return recurse(element)
@@ -27,5 +29,4 @@ class AddParenthesisForLineBreaksInBinaryExpression : RecursiveApplicableConvers
} }
return recurse(element) return recurse(element)
} }
} }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.nj2k.toExpression
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class AnnotationClassConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class AnnotationClassConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
if (element.classKind != JKClass.ClassKind.ANNOTATION) return recurse(element) if (element.classKind != JKClass.ClassKind.ANNOTATION) return recurse(element)
@@ -36,8 +36,8 @@ class AnnotationClassConversion(private val context: NewJ2kConverterContext) : R
private fun JKJavaAnnotationMethod.asKotlinAnnotationParameter(): JKParameterImpl { private fun JKJavaAnnotationMethod.asKotlinAnnotationParameter(): JKParameterImpl {
val type = returnType.type val type = returnType.type
.updateNullabilityRecursively(Nullability.NotNull) .updateNullabilityRecursively(Nullability.NotNull)
.replaceJavaClassWithKotlinClassType(context.symbolProvider) .replaceJavaClassWithKotlinClassType(symbolProvider)
val initializer = this::defaultValue.detached().toExpression(context.symbolProvider) val initializer = this::defaultValue.detached().toExpression(symbolProvider)
val isVarArgs = type is JKJavaArrayType && name.value == "value" val isVarArgs = type is JKJavaArrayType && name.value == "value"
return JKParameterImpl( return JKParameterImpl(
JKTypeElementImpl( JKTypeElementImpl(
@@ -17,12 +17,12 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKAnnotationParameterImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtAnnotationArrayInitializerExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtAnnotationArrayInitializerExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKNameIdentifierImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKNameIdentifierImpl
class AnnotationConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class AnnotationConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKAnnotation) return recurse(element) if (element !is JKAnnotation) return recurse(element)
fixVarargsInvocation(element) fixVarargsInvocation(element)
for (parameter in element.arguments) { for (parameter in element.arguments) {
parameter.value = parameter.value.toExpression(context.symbolProvider) parameter.value = parameter.value.toExpression(symbolProvider)
} }
return recurse(element) return recurse(element)
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.resolve.CollectionLiteralResolver import org.jetbrains.kotlin.resolve.CollectionLiteralResolver
class ArrayInitializerConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class ArrayInitializerConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
var newElement = element var newElement = element
if (element is JKJavaNewArray) { if (element is JKJavaNewArray) {
@@ -29,7 +29,7 @@ class ArrayInitializerConversion(private val context: NewJ2kConverterContext) :
if (primitiveArrayType == null) JKTypeArgumentListImpl(listOf(element::type.detached())) if (primitiveArrayType == null) JKTypeArgumentListImpl(listOf(element::type.detached()))
else JKTypeArgumentListImpl() else JKTypeArgumentListImpl()
newElement = JKJavaMethodCallExpressionImpl( newElement = JKJavaMethodCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.$arrayConstructorName"), symbolProvider.provideMethodSymbol("kotlin.$arrayConstructorName"),
element.initializer.also { element.initializer = emptyList() }.toArgumentList(), element.initializer.also { element.initializer = emptyList() }.toArgumentList(),
typeArguments typeArguments
) )
@@ -46,13 +46,13 @@ class ArrayInitializerConversion(private val context: NewJ2kConverterContext) :
if (dimensions.size == 1) { if (dimensions.size == 1) {
return if (type !is JKJavaPrimitiveType) { return if (type !is JKJavaPrimitiveType) {
JKJavaMethodCallExpressionImpl( JKJavaMethodCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.arrayOfNulls"), symbolProvider.provideMethodSymbol("kotlin.arrayOfNulls"),
JKArgumentListImpl(dimensions[0]), JKArgumentListImpl(dimensions[0]),
JKTypeArgumentListImpl(listOf(JKTypeElementImpl(type))) JKTypeArgumentListImpl(listOf(JKTypeElementImpl(type)))
) )
} else { } else {
JKJavaNewExpressionImpl( JKJavaNewExpressionImpl(
context.symbolProvider.provideClassSymbol(type.arrayFqName()), symbolProvider.provideClassSymbol(type.arrayFqName()),
JKArgumentListImpl(dimensions[0]), JKArgumentListImpl(dimensions[0]),
JKTypeArgumentListImpl(emptyList()) JKTypeArgumentListImpl(emptyList())
) )
@@ -63,7 +63,7 @@ class ArrayInitializerConversion(private val context: NewJ2kConverterContext) :
JKJavaArrayTypeImpl(currentType) JKJavaArrayTypeImpl(currentType)
} }
return JKJavaNewExpressionImpl( return JKJavaNewExpressionImpl(
context.symbolProvider.provideClassSymbol("kotlin.Array"), symbolProvider.provideClassSymbol("kotlin.Array"),
JKArgumentListImpl( JKArgumentListImpl(
dimensions[0], dimensions[0],
JKLambdaExpressionImpl( JKLambdaExpressionImpl(
@@ -75,19 +75,19 @@ class ArrayInitializerConversion(private val context: NewJ2kConverterContext) :
) )
} }
var resultType = JKClassTypeImpl( var resultType = JKClassTypeImpl(
context.symbolProvider.provideClassSymbol(type.arrayFqName()), symbolProvider.provideClassSymbol(type.arrayFqName()),
if (type is JKJavaPrimitiveType) emptyList() else listOf(type), if (type is JKJavaPrimitiveType) emptyList() else listOf(type),
Nullability.Default Nullability.Default
) )
for (i in 0 until dimensions.size - 2) { for (i in 0 until dimensions.size - 2) {
resultType = JKClassTypeImpl( resultType = JKClassTypeImpl(
context.symbolProvider.provideClassSymbol(KotlinBuiltIns.FQ_NAMES.array.toSafe()), symbolProvider.provideClassSymbol(KotlinBuiltIns.FQ_NAMES.array.toSafe()),
listOf(resultType), listOf(resultType),
Nullability.Default Nullability.Default
) )
} }
return JKJavaMethodCallExpressionImpl( return JKJavaMethodCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.arrayOfNulls"), symbolProvider.provideMethodSymbol("kotlin.arrayOfNulls"),
JKArgumentListImpl(dimensions[0]), JKArgumentListImpl(dimensions[0]),
JKTypeArgumentListImpl(listOf(JKTypeElementImpl(resultType))) JKTypeArgumentListImpl(listOf(JKTypeElementImpl(resultType)))
) )
@@ -17,14 +17,14 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class ArrayOperationsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class ArrayOperationsConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKQualifiedExpression) return recurse(element) if (element !is JKQualifiedExpression) return recurse(element)
val selector = element.selector as? JKFieldAccessExpression ?: return recurse(element) val selector = element.selector as? JKFieldAccessExpression ?: return recurse(element)
if (element.receiver.isArrayOrVarargTypeParameter() && selector.identifier.name == "length") { if (element.receiver.isArrayOrVarargTypeParameter() && selector.identifier.name == "length") {
val sizeCall = val sizeCall =
JKFieldAccessExpressionImpl( JKFieldAccessExpressionImpl(
context.symbolProvider.provideFieldSymbol("kotlin.Array.size") symbolProvider.provideFieldSymbol("kotlin.Array.size")
) )
element.selector = sizeCall element.selector = sizeCall
} }
@@ -32,7 +32,7 @@ class ArrayOperationsConversion(private val context: NewJ2kConverterContext) : R
} }
private fun JKExpression.isArrayOrVarargTypeParameter(): Boolean { private fun JKExpression.isArrayOrVarargTypeParameter(): Boolean {
if (type(context.symbolProvider) is JKJavaArrayType) return true if (type(symbolProvider) is JKJavaArrayType) return true
val parameter = val parameter =
safeAs<JKFieldAccessExpression>() safeAs<JKFieldAccessExpression>()
?.identifier ?.identifier
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKExpressionStatementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKLambdaExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKLambdaExpressionImpl
class AssertStatementConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class AssertStatementConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaAssertStatement) return recurse(element) if (element !is JKJavaAssertStatement) return recurse(element)
val messageExpression = val messageExpression =
@@ -29,7 +29,7 @@ class AssertStatementConversion(private val context: NewJ2kConverterContext) : R
kotlinAssert( kotlinAssert(
element::condition.detached(), element::condition.detached(),
messageExpression, messageExpression,
context.symbolProvider symbolProvider
) )
) )
) )
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.cast
class AssignmentAsExpressionToAlsoConversion(val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class AssignmentAsExpressionToAlsoConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaAssignmentExpression) return recurse(element) if (element !is JKJavaAssignmentExpression) return recurse(element)
element.invalidate() element.invalidate()
@@ -21,11 +21,11 @@ class AssignmentAsExpressionToAlsoConversion(val context: NewJ2kConverterContext
val alsoExpression = JKKtAlsoCallExpressionImpl( val alsoExpression = JKKtAlsoCallExpressionImpl(
JKBlockStatementImpl( JKBlockStatementImpl(
JKBlockImpl(listOf(JKKtAssignmentStatementImpl(element.field, JKStubExpressionImpl(), element.operator))) JKBlockImpl(listOf(JKKtAssignmentStatementImpl(element.field, JKStubExpressionImpl(), element.operator)))
), context.symbolProvider.provideMethodSymbol("kotlin.also") ), symbolProvider.provideMethodSymbol("kotlin.also")
).also { ).also {
it.statement.cast<JKBlockStatement>().block.statements.first().cast<JKKtAssignmentStatement>().expression = it.statement.cast<JKBlockStatement>().block.statements.first().cast<JKKtAssignmentStatement>().expression =
JKFieldAccessExpressionImpl( JKFieldAccessExpressionImpl(
context.symbolProvider.provideUniverseSymbol( symbolProvider.provideUniverseSymbol(
JKParameterImpl(JKTypeElementImpl(JKContextType), JKNameIdentifierImpl("it")) JKParameterImpl(JKTypeElementImpl(JKContextType), JKNameIdentifierImpl("it"))
) )
)//TODO introduce symbol )//TODO introduce symbol
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import com.intellij.psi.JavaTokenType import com.intellij.psi.JavaTokenType
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.tree.JKKtAssignmentStatement import org.jetbrains.kotlin.nj2k.tree.JKKtAssignmentStatement
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
@@ -13,7 +14,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKBinaryExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaOperatorImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaOperatorImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaOperatorToken import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaOperatorToken
class AssignmentStatementOperatorConversion : RecursiveApplicableConversionBase() { class AssignmentStatementOperatorConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKKtAssignmentStatement) return recurse(element) if (element !is JKKtAssignmentStatement) return recurse(element)
val operator = element.operator as? JKJavaOperatorImpl ?: return recurse(element) val operator = element.operator as? JKJavaOperatorImpl ?: return recurse(element)
@@ -5,11 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKExpressionStatementImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKExpressionStatementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKStubExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKStubExpressionImpl
class AssignmentStatementSimplifyAlsoConversion : RecursiveApplicableConversionBase() { class AssignmentStatementSimplifyAlsoConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKExpressionStatement) return recurse(element) if (element !is JKExpressionStatement) return recurse(element)
val qualifiedExpression = element.expression as? JKQualifiedExpression ?: return recurse(element) val qualifiedExpression = element.expression as? JKQualifiedExpression ?: return recurse(element)
@@ -5,10 +5,11 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKStubExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKStubExpressionImpl
class AssignmentStatementSimplifyValConversion : RecursiveApplicableConversionBase() { class AssignmentStatementSimplifyValConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKKtAlsoCallExpression) return recurse(element) if (element !is JKKtAlsoCallExpression) return recurse(element)
val codeBlock = (element.statement as? JKBlockStatement)?.block ?: return recurse(element) val codeBlock = (element.statement as? JKBlockStatement)?.block ?: return recurse(element)
@@ -5,11 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class AssignmentStatementSplitAlsoConversion : RecursiveApplicableConversionBase() { class AssignmentStatementSplitAlsoConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
return recurse( return recurse(
when (element) { when (element) {
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class AssignmentStatementValCreationConversion(val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class AssignmentStatementValCreationConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKKtAlsoCallExpression) return recurse(element) if (element !is JKKtAlsoCallExpression) return recurse(element)
val codeBlock = (element.statement as? JKBlockStatement)?.block ?: return recurse(element) val codeBlock = (element.statement as? JKBlockStatement)?.block ?: return recurse(element)
@@ -29,7 +29,7 @@ class AssignmentStatementValCreationConversion(val context: NewJ2kConverterConte
ex1, ex1,
JKMutabilityModifierElementImpl(Mutability.IMMUTABLE) JKMutabilityModifierElementImpl(Mutability.IMMUTABLE)
).also { ).also {
assignableExpr.expression = JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it)) assignableExpr.expression = JKFieldAccessExpressionImpl(symbolProvider.provideUniverseSymbol(it))
}, JKLocalVariableImpl( }, JKLocalVariableImpl(
JKTypeElementImpl(JKJavaVoidType/*TODO*/), JKTypeElementImpl(JKJavaVoidType/*TODO*/),
JKNameIdentifierImpl("i"), JKNameIdentifierImpl("i"),
@@ -37,7 +37,7 @@ class AssignmentStatementValCreationConversion(val context: NewJ2kConverterConte
JKMutabilityModifierElementImpl(Mutability.UNKNOWN) JKMutabilityModifierElementImpl(Mutability.UNKNOWN)
).also { ).also {
assignableExpr.indexExpression = assignableExpr.indexExpression =
JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it)) JKFieldAccessExpressionImpl(symbolProvider.provideUniverseSymbol(it))
} }
) )
) )
@@ -55,7 +55,7 @@ class AssignmentStatementValCreationConversion(val context: NewJ2kConverterConte
ex, ex,
JKMutabilityModifierElementImpl(Mutability.UNKNOWN) JKMutabilityModifierElementImpl(Mutability.UNKNOWN)
).also { ).also {
assignableExpr.receiver = JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(it)) assignableExpr.receiver = JKFieldAccessExpressionImpl(symbolProvider.provideUniverseSymbol(it))
} }
) )
) )
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class BlockToRunConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class BlockToRunConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKBlockStatement) return recurse(element) if (element !is JKBlockStatement) return recurse(element)
@@ -24,7 +24,7 @@ class BlockToRunConversion(private val context: NewJ2kConverterContext) : Recurs
emptyList() emptyList()
) )
val call = JKKtCallExpressionImpl( val call = JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.run"), symbolProvider.provideMethodSymbol("kotlin.run"),
JKArgumentListImpl(lambda) JKArgumentListImpl(lambda)
) )
return recurse(JKExpressionStatementImpl(call).withNonCodeElementsFrom(element)) return recurse(JKExpressionStatementImpl(call).withNonCodeElementsFrom(element))
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKArgumentListImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKArgumentListImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtCallExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtCallExpressionImpl
class BoxedTypeOperationsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class BoxedTypeOperationsConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
return recurse( return recurse(
when (element) { when (element) {
@@ -39,7 +39,7 @@ class BoxedTypeOperationsConversion(private val context: NewJ2kConverterContext)
val primitiveTypeName = boxedTypeToPrimitiveType[boxedJavaType] ?: return null val primitiveTypeName = boxedTypeToPrimitiveType[boxedJavaType] ?: return null
if (operationType !in primitiveTypeNames) return null if (operationType !in primitiveTypeNames) return null
return JKKtCallExpressionImpl( return JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol( symbolProvider.provideMethodSymbol(
"kotlin.${primitiveTypeName.capitalize()}.to${operationType.capitalize()}" "kotlin.${primitiveTypeName.capitalize()}.to${operationType.capitalize()}"
), ),
JKArgumentListImpl() JKArgumentListImpl()
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.utils.addToStdlib.cast import org.jetbrains.kotlin.utils.addToStdlib.cast
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class BuiltinMembersConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKExpression) return recurse(element) if (element !is JKExpression) return recurse(element)
return recurse(element.convert() ?: element) return recurse(element.convert() ?: element)
@@ -89,19 +89,19 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
when (from) { when (from) {
is JKMethodCallExpression -> is JKMethodCallExpression ->
JKKtCallExpressionImpl( JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol(fqName), symbolProvider.provideMethodSymbol(fqName),
argumentsProvider(from::arguments.detached()), argumentsProvider(from::arguments.detached()),
from::typeArgumentList.detached() from::typeArgumentList.detached()
).withNonCodeElementsFrom(from) ).withNonCodeElementsFrom(from)
is JKFieldAccessExpression -> is JKFieldAccessExpression ->
JKKtCallExpressionImpl( JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol(fqName), symbolProvider.provideMethodSymbol(fqName),
JKArgumentListImpl(), JKArgumentListImpl(),
JKTypeArgumentListImpl() JKTypeArgumentListImpl()
).withNonCodeElementsFrom(from) ).withNonCodeElementsFrom(from)
is JKJavaNewExpression -> is JKJavaNewExpression ->
JKKtCallExpressionImpl( JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol(fqName), symbolProvider.provideMethodSymbol(fqName),
argumentsProvider(from::arguments.detached()), argumentsProvider(from::arguments.detached()),
JKTypeArgumentListImpl() JKTypeArgumentListImpl()
).withNonCodeElementsFrom(from) ).withNonCodeElementsFrom(from)
@@ -116,11 +116,11 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
when (from) { when (from) {
is JKMethodCallExpression -> is JKMethodCallExpression ->
JKFieldAccessExpressionImpl( JKFieldAccessExpressionImpl(
context.symbolProvider.provideFieldSymbol(fqName) symbolProvider.provideFieldSymbol(fqName)
).withNonCodeElementsFrom(from) ).withNonCodeElementsFrom(from)
is JKFieldAccessExpression -> is JKFieldAccessExpression ->
JKFieldAccessExpressionImpl( JKFieldAccessExpressionImpl(
context.symbolProvider.provideFieldSymbol(fqName) symbolProvider.provideFieldSymbol(fqName)
).withNonCodeElementsFrom(from) ).withNonCodeElementsFrom(from)
else -> error("Bad conversion") else -> error("Bad conversion")
} }
@@ -137,7 +137,7 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
arguments.first()::value.detached().parenthesizeIfBinaryExpression(), arguments.first()::value.detached().parenthesizeIfBinaryExpression(),
JKKtQualifierImpl.DOT, JKKtQualifierImpl.DOT,
JKKtCallExpressionImpl( JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol(fqName), symbolProvider.provideMethodSymbol(fqName),
JKArgumentListImpl(arguments.drop(1)), JKArgumentListImpl(arguments.drop(1)),
from::typeArgumentList.detached() from::typeArgumentList.detached()
) )
@@ -267,11 +267,11 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
Method("java.lang.String.indexOf") convertTo Method("kotlin.text.indexOf"), Method("java.lang.String.indexOf") convertTo Method("kotlin.text.indexOf"),
Method("java.lang.String.lastIndexOf") convertTo Method("kotlin.text.lastIndexOf"), Method("java.lang.String.lastIndexOf") convertTo Method("kotlin.text.lastIndexOf"),
Method("java.lang.String.getBytes") convertTo Method("kotlin.text.toByteArray") Method("java.lang.String.getBytes") convertTo Method("kotlin.text.toByteArray")
withByArgumentsFilter { it.singleOrNull()?.type(context.symbolProvider)?.isStringType() == true } withByArgumentsFilter { it.singleOrNull()?.type(symbolProvider)?.isStringType() == true }
withArgumentsProvider { arguments -> withArgumentsProvider { arguments ->
val argument = arguments.arguments.single()::value.detached() val argument = arguments.arguments.single()::value.detached()
val call = JKKtCallExpressionImpl( val call = JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.text.charset"), symbolProvider.provideMethodSymbol("kotlin.text.charset"),
JKArgumentListImpl(argument) JKArgumentListImpl(argument)
) )
JKArgumentListImpl(call) JKArgumentListImpl(call)
@@ -280,7 +280,7 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
Method("java.lang.String.valueOf") Method("java.lang.String.valueOf")
convertTo ExtensionMethod("kotlin.Any.toString") convertTo ExtensionMethod("kotlin.Any.toString")
withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER
withByArgumentsFilter { it.isNotEmpty() && it.first().type(context.symbolProvider)?.isArrayType() == false }, withByArgumentsFilter { it.isNotEmpty() && it.first().type(symbolProvider)?.isArrayType() == false },
Method("java.lang.String.getChars") Method("java.lang.String.getChars")
convertTo Method("kotlin.text.toCharArray") convertTo Method("kotlin.text.toCharArray")
@@ -296,12 +296,12 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
Method("java.lang.String.valueOf") Method("java.lang.String.valueOf")
convertTo Method("kotlin.String") convertTo Method("kotlin.String")
withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER
withByArgumentsFilter { it.isNotEmpty() && it.first().type(context.symbolProvider)?.isArrayType() == true }, withByArgumentsFilter { it.isNotEmpty() && it.first().type(symbolProvider)?.isArrayType() == true },
Method("java.lang.String.copyValueOf") Method("java.lang.String.copyValueOf")
convertTo Method("kotlin.String") convertTo Method("kotlin.String")
withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER
withByArgumentsFilter { it.isNotEmpty() && it.first().type(context.symbolProvider)?.isArrayType() == true }, withByArgumentsFilter { it.isNotEmpty() && it.first().type(symbolProvider)?.isArrayType() == true },
Method("java.lang.String.replaceAll") Method("java.lang.String.replaceAll")
convertTo Method("kotlin.text.replace") convertTo Method("kotlin.text.replace")
@@ -309,7 +309,7 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
val detachedArguments = arguments::arguments.detached() val detachedArguments = arguments::arguments.detached()
val first = val first =
detachedArguments.first()::value.detached().callOn( detachedArguments.first()::value.detached().callOn(
context.symbolProvider.provideMethodSymbol("kotlin.text.toRegex") symbolProvider.provideMethodSymbol("kotlin.text.toRegex")
) )
JKArgumentListImpl(listOf(JKArgumentImpl(first)) + detachedArguments.drop(1)) JKArgumentListImpl(listOf(JKArgumentImpl(first)) + detachedArguments.drop(1))
}, },
@@ -319,7 +319,7 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
val detachedArguments = arguments::arguments.detached() val detachedArguments = arguments::arguments.detached()
val first = val first =
detachedArguments.first()::value.detached().callOn( detachedArguments.first()::value.detached().callOn(
context.symbolProvider.provideMethodSymbol("kotlin.text.toRegex") symbolProvider.provideMethodSymbol("kotlin.text.toRegex")
) )
JKArgumentListImpl(listOf(JKArgumentImpl(first)) + detachedArguments.drop(1)) JKArgumentListImpl(listOf(JKArgumentImpl(first)) + detachedArguments.drop(1))
@@ -370,7 +370,7 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
firstArgument, firstArgument,
secondArgument, secondArgument,
KtTokens.PLUS, KtTokens.PLUS,
context.symbolProvider symbolProvider
) )
} withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER, } withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER,
@@ -392,14 +392,14 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
arguments.arguments = arguments.arguments.dropLast(1) arguments.arguments = arguments.arguments.dropLast(1)
}.let { }.let {
it.callOn( it.callOn(
context.symbolProvider.provideMethodSymbol("kotlin.collections.dropLastWhile"), symbolProvider.provideMethodSymbol("kotlin.collections.dropLastWhile"),
JKLambdaExpressionImpl( JKLambdaExpressionImpl(
JKFieldAccessExpressionImpl( JKFieldAccessExpressionImpl(
JKUnresolvedField(//TODO replace with `it` parameter JKUnresolvedField(//TODO replace with `it` parameter
"it", "it",
context.symbolProvider symbolProvider
) )
).callOn(context.symbolProvider.provideMethodSymbol("kotlin.text.isEmpty")) ).callOn(symbolProvider.provideMethodSymbol("kotlin.text.isEmpty"))
.asStatement(), .asStatement(),
emptyList() emptyList()
) )
@@ -409,7 +409,7 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
else -> expression.also { else -> expression.also {
val lastArgument = arguments.arguments.last().value.copyTreeAndDetach() val lastArgument = arguments.arguments.last().value.copyTreeAndDetach()
.callOn( .callOn(
context.symbolProvider.provideMethodSymbol("kotlin.ranges.coerceAtLeast"), symbolProvider.provideMethodSymbol("kotlin.ranges.coerceAtLeast"),
JKKtLiteralExpressionImpl("0", JKLiteralExpression.LiteralType.INT) JKKtLiteralExpressionImpl("0", JKLiteralExpression.LiteralType.INT)
) )
arguments.arguments = arguments.arguments.dropLast(1) + JKArgumentImpl(lastArgument) arguments.arguments = arguments.arguments.dropLast(1) + JKArgumentImpl(lastArgument)
@@ -432,12 +432,12 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
JKFieldAccessExpressionImpl( JKFieldAccessExpressionImpl(
JKUnresolvedField(//TODO replace with `it` parameter JKUnresolvedField(//TODO replace with `it` parameter
"it", "it",
context.symbolProvider symbolProvider
) )
), ),
JKKtLiteralExpressionImpl("' '", JKLiteralExpression.LiteralType.CHAR), JKKtLiteralExpressionImpl("' '", JKLiteralExpression.LiteralType.CHAR),
KtTokens.LTEQ, KtTokens.LTEQ,
context.symbolProvider symbolProvider
) )
), ),
emptyList() emptyList()
@@ -446,9 +446,9 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
}, },
Method("java.lang.String.format") convertTo CustomExpression { expression -> Method("java.lang.String.format") convertTo CustomExpression { expression ->
JKClassAccessExpressionImpl( JKClassAccessExpressionImpl(
context.symbolProvider.provideClassSymbol(KotlinBuiltIns.FQ_NAMES.string) symbolProvider.provideClassSymbol(KotlinBuiltIns.FQ_NAMES.string)
).callOn( ).callOn(
context.symbolProvider.provideMethodSymbol("kotlin.text.String.format"), symbolProvider.provideMethodSymbol("kotlin.text.String.format"),
(expression as JKMethodCallExpression).arguments::arguments.detached() (expression as JKMethodCallExpression).arguments::arguments.detached()
) )
} withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER, } withReplaceType ReplaceType.REPLACE_WITH_QUALIFIER,
@@ -501,5 +501,5 @@ class BuiltinMembersConversion(private val context: NewJ2kConverterContext) : Re
private fun JKExpression.castToTypedArray() = private fun JKExpression.castToTypedArray() =
callOn(context.symbolProvider.provideMethodSymbol("kotlin.collections.toTypedArray")) callOn(symbolProvider.provideMethodSymbol("kotlin.collections.toTypedArray"))
} }
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKClassImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKModalityModifierElementImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKModalityModifierElementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
class ClassToObjectPromotionConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class ClassToObjectPromotionConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKClass && element.classKind == JKClass.ClassKind.CLASS) { if (element is JKClass && element.classKind == JKClass.ClassKind.CLASS) {
val companion = element.getCompanion() ?: return recurse(element) val companion = element.getCompanion() ?: return recurse(element)
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class CollectImportsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class CollectImportsConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
when (element) { when (element) {
is JKClassAccessExpression -> addSymbol(element.identifier) is JKClassAccessExpression -> addSymbol(element.identifier)
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtConstructorImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtConstructorImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKStubExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKStubExpressionImpl
class ConstructorConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class ConstructorConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaMethod) return recurse(element) if (element !is JKJavaMethod) return recurse(element)
val outerClass = element.parentOfType<JKClass>() ?: return recurse(element) val outerClass = element.parentOfType<JKClass>() ?: return recurse(element)
@@ -29,7 +29,7 @@ class ConstructorConversion(private val context: NewJ2kConverterContext) : Recur
element.visibilityElement, element.visibilityElement,
element.modalityElement element.modalityElement
).also { ).also {
context.symbolProvider.transferSymbol(it, element) symbolProvider.transferSymbol(it, element)
}.withNonCodeElementsFrom(element) }.withNonCodeElementsFrom(element)
} }
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class DefaultArgumentsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class DefaultArgumentsConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
private fun JKMethod.canBeGetterOrSetter() = private fun JKMethod.canBeGetterOrSetter() =
name.value.asGetterName() != null name.value.asGetterName() != null
|| name.value.asSetterName() != null || name.value.asSetterName() != null
@@ -97,7 +97,7 @@ class DefaultArgumentsConversion(private val context: NewJ2kConverterContext) :
val target = on.identifier.target val target = on.identifier.target
if (target is JKParameter) { if (target is JKParameter) {
val newSymbol = val newSymbol =
context.symbolProvider.provideUniverseSymbol(calledMethod.parameters[method.parameters.indexOf(target)]) symbolProvider.provideUniverseSymbol(calledMethod.parameters[method.parameters.indexOf(target)])
return JKFieldAccessExpressionImpl(newSymbol) return JKFieldAccessExpressionImpl(newSymbol)
} }
} }
@@ -115,7 +115,7 @@ class DefaultArgumentsConversion(private val context: NewJ2kConverterContext) :
if (method.hasParametersWithDefaultValues() if (method.hasParametersWithDefaultValues()
&& (method.visibility == Visibility.PUBLIC || method.visibility == Visibility.INTERNAL) && (method.visibility == Visibility.PUBLIC || method.visibility == Visibility.INTERNAL)
) { ) {
method.annotationList.annotations += jvmAnnotation("JvmOverloads", context.symbolProvider) method.annotationList.annotations += jvmAnnotation("JvmOverloads", symbolProvider)
} }
} }
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKQualifiedExpressionImpl
import org.jetbrains.kotlin.psi.psiUtil.containingClass import org.jetbrains.kotlin.psi.psiUtil.containingClass
class EnumFieldAccessConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class EnumFieldAccessConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKFieldAccessExpression) return recurse(element) if (element !is JKFieldAccessExpression) return recurse(element)
if ((element.parent as? JKQualifiedExpression)?.selector == element) return recurse(element) if ((element.parent as? JKQualifiedExpression)?.selector == element) return recurse(element)
@@ -34,11 +34,11 @@ class EnumFieldAccessConversion(private val context: NewJ2kConverterContext) : R
private fun JKFieldSymbol.enumClassSymbol(): JKClassSymbol? = private fun JKFieldSymbol.enumClassSymbol(): JKClassSymbol? =
when { when {
this is JKMultiverseFieldSymbol && target is PsiEnumConstant -> this is JKMultiverseFieldSymbol && target is PsiEnumConstant ->
context.symbolProvider.provideDirectSymbol(target.containingClass!!) as JKClassSymbol symbolProvider.provideDirectSymbol(target.containingClass!!) as JKClassSymbol
this is JKMultiverseKtEnumEntrySymbol -> this is JKMultiverseKtEnumEntrySymbol ->
context.symbolProvider.provideDirectSymbol(target.containingClass()!!) as JKClassSymbol symbolProvider.provideDirectSymbol(target.containingClass()!!) as JKClassSymbol
this is JKUniverseFieldSymbol && target is JKEnumConstant -> this is JKUniverseFieldSymbol && target is JKEnumConstant ->
context.symbolProvider.provideUniverseSymbol(target.parentOfType<JKClass>()!!) symbolProvider.provideUniverseSymbol(target.parentOfType<JKClass>()!!)
else -> null else -> null
} }
} }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.nj2k.symbols.deepestFqName
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl
class EqualsOperatorConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class EqualsOperatorConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKQualifiedExpression) return recurse(element) if (element !is JKQualifiedExpression) return recurse(element)
if (element.receiver is JKSuperExpression) return recurse(element) if (element.receiver is JKSuperExpression) return recurse(element)
@@ -23,7 +23,7 @@ class EqualsOperatorConversion(private val context: NewJ2kConverterContext) : Re
equalsExpression( equalsExpression(
element::receiver.detached(), element::receiver.detached(),
argument::value.detached(), argument::value.detached(),
context.symbolProvider symbolProvider
) )
) )
) )
@@ -5,10 +5,11 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class FieldToPropertyConversion : RecursiveApplicableConversionBase() { class FieldToPropertyConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaField) return recurse(element) if (element !is JKJavaField) return recurse(element)
element.invalidate() element.invalidate()
@@ -6,11 +6,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.ImportStorage import org.jetbrains.kotlin.nj2k.ImportStorage
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKImportList import org.jetbrains.kotlin.nj2k.tree.JKImportList
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
class FilterImportsConversion : RecursiveApplicableConversionBase() { class FilterImportsConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKImportList) return recurse(element) if (element !is JKImportList) return recurse(element)
element.imports = element.imports.filter { import -> element.imports = element.imports.filter { import ->
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.*
import kotlin.math.abs import kotlin.math.abs
class ForConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class ForConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
private val referenceSearcher: ReferenceSearcher private val referenceSearcher: ReferenceSearcher
get() = context.converter.converterServices.oldServices.referenceSearcher get() = context.converter.converterServices.oldServices.referenceSearcher
@@ -53,7 +53,7 @@ class ForConversion(private val context: NewJ2kConverterContext) : RecursiveAppl
JKExpressionStatementImpl( JKExpressionStatementImpl(
runExpression( runExpression(
convertedFromForLoopSyntheticWhileStatement, convertedFromForLoopSyntheticWhileStatement,
context.symbolProvider symbolProvider
) )
) )
!notNeedParentBlock -> blockStatement(convertedFromForLoopSyntheticWhileStatement) !notNeedParentBlock -> blockStatement(convertedFromForLoopSyntheticWhileStatement)
@@ -63,7 +63,7 @@ class ForConversion(private val context: NewJ2kConverterContext) : RecursiveAppl
private fun createWhileBody(loopStatement: JKJavaForLoopStatement): JKStatement { private fun createWhileBody(loopStatement: JKJavaForLoopStatement): JKStatement {
if (loopStatement.updaters.singleOrNull() is JKEmptyStatement) return loopStatement::body.detached() if (loopStatement.updaters.singleOrNull() is JKEmptyStatement) return loopStatement::body.detached()
val continueStatementConverter = object : RecursiveApplicableConversionBase() { val continueStatementConverter = object : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKContinueStatement) return recurse(element) if (element !is JKContinueStatement) return recurse(element)
val elementPsi = element.psi<PsiContinueStatement>()!! val elementPsi = element.psi<PsiContinueStatement>()!!
@@ -90,7 +90,7 @@ class ForConversion(private val context: NewJ2kConverterContext) : RecursiveAppl
val statements = val statements =
if (hasNameConflict) { if (hasNameConflict) {
listOf(JKExpressionStatementImpl(runExpression(body, context.symbolProvider))) + loopStatement::updaters.detached() listOf(JKExpressionStatementImpl(runExpression(body, symbolProvider))) + loopStatement::updaters.detached()
} else { } else {
body.block::statements.detached() + loopStatement::updaters.detached() body.block::statements.detached() + loopStatement::updaters.detached()
} }
@@ -185,7 +185,7 @@ class ForConversion(private val context: NewJ2kConverterContext) : RecursiveAppl
start, start,
convertBound(bound, if (inclusiveComparison) 0 else -1), convertBound(bound, if (inclusiveComparison) 0 else -1),
JKKtSingleValueOperatorToken(KtTokens.RANGE), JKKtSingleValueOperatorToken(KtTokens.RANGE),
context.symbolProvider symbolProvider
) )
} }
} }
@@ -203,7 +203,7 @@ class ForConversion(private val context: NewJ2kConverterContext) : RecursiveAppl
bound, bound,
JKKtLiteralExpressionImpl(abs(correction).toString(), JKLiteralExpression.LiteralType.INT), JKKtLiteralExpressionImpl(abs(correction).toString(), JKLiteralExpression.LiteralType.INT),
JKKtSingleValueOperatorToken(sign), JKKtSingleValueOperatorToken(sign),
context.symbolProvider symbolProvider
) )
} }
@@ -238,7 +238,7 @@ class ForConversion(private val context: NewJ2kConverterContext) : RecursiveAppl
indices, indices,
JKKtQualifierImpl.DOT, JKKtQualifierImpl.DOT,
JKJavaMethodCallExpressionImpl( JKJavaMethodCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.collections.reversed"), symbolProvider.provideMethodSymbol("kotlin.collections.reversed"),
JKArgumentListImpl() JKArgumentListImpl()
) )
) )
@@ -255,7 +255,7 @@ class ForConversion(private val context: NewJ2kConverterContext) : RecursiveAppl
private fun indicesByArrayLength(javaSizeCall: JKQualifiedExpression): JKQualifiedExpression? { private fun indicesByArrayLength(javaSizeCall: JKQualifiedExpression): JKQualifiedExpression? {
val methodCall = javaSizeCall.selector as? JKFieldAccessExpression ?: return null val methodCall = javaSizeCall.selector as? JKFieldAccessExpression ?: return null
val receiverType = javaSizeCall.receiver.type(context.symbolProvider) val receiverType = javaSizeCall.receiver.type(symbolProvider)
if (methodCall.identifier.name == "length" && receiverType is JKJavaArrayType) { if (methodCall.identifier.name == "length" && receiverType is JKJavaArrayType) {
return toIndicesCall(javaSizeCall) return toIndicesCall(javaSizeCall)
} }
@@ -265,7 +265,7 @@ class ForConversion(private val context: NewJ2kConverterContext) : RecursiveAppl
private fun toIndicesCall(javaSizeCall: JKQualifiedExpression): JKQualifiedExpression? { private fun toIndicesCall(javaSizeCall: JKQualifiedExpression): JKQualifiedExpression? {
if (javaSizeCall.psi == null) return null if (javaSizeCall.psi == null) return null
val selector = JKFieldAccessExpressionImpl( val selector = JKFieldAccessExpressionImpl(
context.symbolProvider.provideFieldSymbol("kotlin.collections.indices") symbolProvider.provideFieldSymbol("kotlin.collections.indices")
) )
return JKQualifiedExpressionImpl(javaSizeCall::receiver.detached(), javaSizeCall.operator, selector) return JKQualifiedExpressionImpl(javaSizeCall::receiver.detached(), javaSizeCall.operator, selector)
} }
@@ -5,13 +5,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol import org.jetbrains.kotlin.nj2k.symbols.JKClassSymbol
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKBlockStatementImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKBlockStatementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKLambdaExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKLambdaExpressionImpl
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class FunctionAsAnonymousObjectToLambdaConversion : RecursiveApplicableConversionBase() { class FunctionAsAnonymousObjectToLambdaConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaNewExpression) return recurse(element) if (element !is JKJavaNewExpression) return recurse(element)
if (element.isAnonymousClass() if (element.isAnonymousClass()
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class ImplicitCastsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class ImplicitCastsConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
when (element) { when (element) {
is JKVariable -> convertVariable(element) is JKVariable -> convertVariable(element)
@@ -30,8 +30,8 @@ class ImplicitCastsConversion(private val context: NewJ2kConverterContext) : Rec
private fun convertBinaryExpression(binaryExpression: JKBinaryExpression): JKExpression { private fun convertBinaryExpression(binaryExpression: JKBinaryExpression): JKExpression {
fun JKBinaryExpression.convertBinaryOperationWithChar(): JKBinaryExpression { fun JKBinaryExpression.convertBinaryOperationWithChar(): JKBinaryExpression {
val leftType = left.type(context.symbolProvider)?.asPrimitiveType() ?: return this val leftType = left.type(symbolProvider)?.asPrimitiveType() ?: return this
val rightType = right.type(context.symbolProvider)?.asPrimitiveType() ?: return this val rightType = right.type(symbolProvider)?.asPrimitiveType() ?: return this
val leftOperandCastedCasted by lazy { val leftOperandCastedCasted by lazy {
JKBinaryExpressionImpl( JKBinaryExpressionImpl(
@@ -72,7 +72,7 @@ class ImplicitCastsConversion(private val context: NewJ2kConverterContext) : Rec
} }
private fun convertAssignmentStatement(statement: JKKtAssignmentStatement) { private fun convertAssignmentStatement(statement: JKKtAssignmentStatement) {
val expressionType = statement.field.type(context.symbolProvider) ?: return val expressionType = statement.field.type(symbolProvider) ?: return
statement.expression.castTo(expressionType)?.also { statement.expression.castTo(expressionType)?.also {
statement.expression = it statement.expression = it
} }
@@ -99,13 +99,13 @@ class ImplicitCastsConversion(private val context: NewJ2kConverterContext) : Rec
private fun JKExpression.castStringToRegex(toType: JKType): JKExpression? { private fun JKExpression.castStringToRegex(toType: JKType): JKExpression? {
if (toType.safeAs<JKClassType>()?.classReference?.fqName != "java.util.regex.Pattern") return null if (toType.safeAs<JKClassType>()?.classReference?.fqName != "java.util.regex.Pattern") return null
val expressionType = type(context.symbolProvider) ?: return null val expressionType = type(symbolProvider) ?: return null
if (!expressionType.isStringType()) return null if (!expressionType.isStringType()) return null
return JKQualifiedExpressionImpl( return JKQualifiedExpressionImpl(
copyTreeAndDetach().parenthesizeIfBinaryExpression(), copyTreeAndDetach().parenthesizeIfBinaryExpression(),
JKKtQualifierImpl.DOT, JKKtQualifierImpl.DOT,
JKKtCallExpressionImpl( JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.text.toRegex"), symbolProvider.provideMethodSymbol("kotlin.text.toRegex"),
JKArgumentListImpl(), JKArgumentListImpl(),
JKTypeArgumentListImpl() JKTypeArgumentListImpl()
) )
@@ -120,7 +120,7 @@ class ImplicitCastsConversion(private val context: NewJ2kConverterContext) : Rec
val casted = expression.castToAsPrimitiveTypes(toType, strict) ?: return null val casted = expression.castToAsPrimitiveTypes(toType, strict) ?: return null
return JKPrefixExpressionImpl(casted, operator) return JKPrefixExpressionImpl(casted, operator)
} }
val expressionTypeAsPrimitive = type(context.symbolProvider)?.asPrimitiveType() ?: return null val expressionTypeAsPrimitive = type(symbolProvider)?.asPrimitiveType() ?: return null
val toTypeAsPrimitive = toType.asPrimitiveType() ?: return null val toTypeAsPrimitive = toType.asPrimitiveType() ?: return null
if (toTypeAsPrimitive == expressionTypeAsPrimitive) return null if (toTypeAsPrimitive == expressionTypeAsPrimitive) return null
@@ -147,7 +147,7 @@ class ImplicitCastsConversion(private val context: NewJ2kConverterContext) : Rec
this.copyTreeAndDetach(), this.copyTreeAndDetach(),
JKKtQualifierImpl.DOT, JKKtQualifierImpl.DOT,
JKJavaMethodCallExpressionImpl( JKJavaMethodCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.$initialTypeName.$conversionFunctionName"), symbolProvider.provideMethodSymbol("kotlin.$initialTypeName.$conversionFunctionName"),
JKArgumentListImpl() JKArgumentListImpl()
) )
) )
@@ -155,7 +155,7 @@ class ImplicitCastsConversion(private val context: NewJ2kConverterContext) : Rec
private fun JKExpression.castTo(toType: JKType, strict: Boolean = false): JKExpression? { private fun JKExpression.castTo(toType: JKType, strict: Boolean = false): JKExpression? {
val expressionType = type(context.symbolProvider) val expressionType = type(symbolProvider)
if (expressionType == toType) return null if (expressionType == toType) return null
castToAsPrimitiveTypes(toType, strict)?.also { return it } castToAsPrimitiveTypes(toType, strict)?.also { return it }
castStringToRegex(toType)?.also { return it } castStringToRegex(toType)?.also { return it }
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaLiteralExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaPrimitiveTypeImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKJavaPrimitiveTypeImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKNullLiteral import org.jetbrains.kotlin.nj2k.tree.impl.JKNullLiteral
class ImplicitInitializerConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class ImplicitInitializerConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
enum class InitializationState { enum class InitializationState {
INITIALIZED_IN_ALL_CONSTRUCTORS, INITIALIZED_IN_ALL_CONSTRUCTORS,
@@ -48,11 +48,11 @@ class ImplicitInitializerConversion(private val context: NewJ2kConverterContext)
} }
private fun JKJavaField.initializationState(): InitializationState { private fun JKJavaField.initializationState(): InitializationState {
val fieldSymbol = context.symbolProvider.provideUniverseSymbol(this) val fieldSymbol = symbolProvider.provideUniverseSymbol(this)
val containingClass = parentOfType<JKClass>() ?: return InitializationState.NON_INITIALIZED val containingClass = parentOfType<JKClass>() ?: return InitializationState.NON_INITIALIZED
val symbolToConstructor = containingClass.declarationList val symbolToConstructor = containingClass.declarationList
.filterIsInstance<JKKtConstructor>() .filterIsInstance<JKKtConstructor>()
.map { context.symbolProvider.provideUniverseSymbol(it) to it } .map { symbolProvider.provideUniverseSymbol(it) to it }
.toMap() .toMap()
fun JKMethodSymbol.parentConstructor(): JKMethodSymbol? = fun JKMethodSymbol.parentConstructor(): JKMethodSymbol? =
@@ -61,7 +61,7 @@ class ImplicitInitializerConversion(private val context: NewJ2kConverterContext)
val constructors = containingClass.declarationList val constructors = containingClass.declarationList
.filterIsInstance<JKKtConstructor>() .filterIsInstance<JKKtConstructor>()
.map { context.symbolProvider.provideUniverseSymbol(it) to false } .map { symbolProvider.provideUniverseSymbol(it) to false }
.toMap() .toMap()
.toMutableMap() .toMutableMap()
@@ -87,7 +87,7 @@ class ImplicitInitializerConversion(private val context: NewJ2kConverterContext)
} }
for (constructor in constructorsWithInitializers) { for (constructor in constructorsWithInitializers) {
constructors[context.symbolProvider.provideUniverseSymbol(constructor)] = true constructors[symbolProvider.provideUniverseSymbol(constructor)] = true
} }
val constructorsToInitialize = mutableListOf<JKMethodSymbol>() val constructorsToInitialize = mutableListOf<JKMethodSymbol>()
@@ -5,13 +5,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.OtherModifier import org.jetbrains.kotlin.nj2k.tree.OtherModifier
import org.jetbrains.kotlin.nj2k.tree.JKClass import org.jetbrains.kotlin.nj2k.tree.JKClass
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
import org.jetbrains.kotlin.nj2k.tree.impl.JKOtherModifierElementImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKOtherModifierElementImpl
import org.jetbrains.kotlin.nj2k.tree.isLocalClass import org.jetbrains.kotlin.nj2k.tree.isLocalClass
class InnerClassConversion : RecursiveApplicableConversionBase() { class InnerClassConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
return recurseArmed(element, element) return recurseArmed(element, element)
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class InsertDefaultPrimaryConstructorConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class InsertDefaultPrimaryConstructorConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
if (element.classKind != JKClass.ClassKind.CLASS) return recurse(element) if (element.classKind != JKClass.ClassKind.CLASS) return recurse(element)
@@ -35,7 +35,7 @@ class InsertDefaultPrimaryConstructorConversion(private val context: NewJ2kConve
if (superClassSymbol is JKUniverseClassSymbol) { if (superClassSymbol is JKUniverseClassSymbol) {
val superClass = recurse(superClassSymbol.target) val superClass = recurse(superClassSymbol.target)
val superConstructor = context.symbolProvider.provideUniverseSymbol( val superConstructor = symbolProvider.provideUniverseSymbol(
superClass.declarationList.singleOrNull { it is JKKtConstructor && it.parameters.isEmpty() } as? JKMethod ?: return recurse( superClass.declarationList.singleOrNull { it is JKKtConstructor && it.parameters.isEmpty() } as? JKMethod ?: return recurse(
element element
) )
@@ -5,11 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.getOrCreateCompanionObject import org.jetbrains.kotlin.nj2k.getOrCreateCompanionObject
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
class InterfaceWithFieldConversion : RecursiveApplicableConversionBase() { class InterfaceWithFieldConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
if (element.classKind != JKClass.ClassKind.INTERFACE if (element.classKind != JKClass.ClassKind.INTERFACE
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
import org.jetbrains.kotlin.nj2k.visibility import org.jetbrains.kotlin.nj2k.visibility
class InternalDeclarationConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class InternalDeclarationConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKVisibilityOwner || element !is JKModalityOwner) return recurse(element) if (element !is JKVisibilityOwner || element !is JKModalityOwner) return recurse(element)
val containingClass = element.parentOfType<JKClass>() val containingClass = element.parentOfType<JKClass>()
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKFieldAccessExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtLiteralExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtLiteralExpressionImpl
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class JavaAnnotationsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class JavaAnnotationsConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKAnnotationList) { if (element is JKAnnotationList) {
for (annotation in element.annotations) { for (annotation in element.annotations) {
@@ -29,14 +29,14 @@ class JavaAnnotationsConversion(private val context: NewJ2kConverterContext) : R
private fun processAnnotation(annotation: JKAnnotation) { private fun processAnnotation(annotation: JKAnnotation) {
if (annotation.classSymbol.fqName == "java.lang.Deprecated") { if (annotation.classSymbol.fqName == "java.lang.Deprecated") {
annotation.classSymbol = context.symbolProvider.provideClassSymbol("kotlin.Deprecated") annotation.classSymbol = symbolProvider.provideClassSymbol("kotlin.Deprecated")
if (annotation.arguments.isEmpty()) { if (annotation.arguments.isEmpty()) {
annotation.arguments += annotation.arguments +=
JKAnnotationParameterImpl(JKKtLiteralExpressionImpl("\"\"", JKLiteralExpression.LiteralType.STRING)) JKAnnotationParameterImpl(JKKtLiteralExpressionImpl("\"\"", JKLiteralExpression.LiteralType.STRING))
} }
} }
if (annotation.classSymbol.fqName == "java.lang.annotation.Target") { if (annotation.classSymbol.fqName == "java.lang.annotation.Target") {
annotation.classSymbol = context.symbolProvider.provideClassSymbol("kotlin.annotation.Target") annotation.classSymbol = symbolProvider.provideClassSymbol("kotlin.annotation.Target")
val arguments = annotation.arguments.singleOrNull()?.let { parameter -> val arguments = annotation.arguments.singleOrNull()?.let { parameter ->
val value = parameter.value val value = parameter.value
@@ -51,7 +51,7 @@ class JavaAnnotationsConversion(private val context: NewJ2kConverterContext) : R
value.fieldAccessFqName() value.fieldAccessFqName()
?.let { targetMappings[it] } ?.let { targetMappings[it] }
?.map { fqName -> ?.map { fqName ->
JKFieldAccessExpressionImpl(context.symbolProvider.provideFieldSymbol(fqName)) JKFieldAccessExpressionImpl(symbolProvider.provideFieldSymbol(fqName))
} ?: listOf(value.copyTreeAndDetach()) } ?: listOf(value.copyTreeAndDetach())
} }
annotation.arguments = newArguments.map { JKAnnotationParameterImpl(it) } annotation.arguments = newArguments.map { JKAnnotationParameterImpl(it) }
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtFunctionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtFunctionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
class JavaMethodToKotlinFunctionConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class JavaMethodToKotlinFunctionConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaMethod) return recurse(element) if (element !is JKJavaMethod) return recurse(element)
@@ -39,7 +39,7 @@ class JavaMethodToKotlinFunctionConversion(private val context: NewJ2kConverterC
it.annotations += it.annotations +=
throwAnnotation( throwAnnotation(
element.throwsList.map { it.type.updateNullabilityRecursively(Nullability.NotNull) }, element.throwsList.map { it.type.updateNullabilityRecursively(Nullability.NotNull) },
context.symbolProvider symbolProvider
) )
} }
}, },
@@ -48,7 +48,7 @@ class JavaMethodToKotlinFunctionConversion(private val context: NewJ2kConverterC
element.modalityElement element.modalityElement
).also { ).also {
it.psi = element.psi it.psi = element.psi
context.symbolProvider.transferSymbol(it, element) symbolProvider.transferSymbol(it, element)
it.leftParen.takeNonCodeElementsFrom(element.leftParen) it.leftParen.takeNonCodeElementsFrom(element.leftParen)
it.rightParen.takeNonCodeElementsFrom(element.rightParen) it.rightParen.takeNonCodeElementsFrom(element.rightParen)
}.withNonCodeElementsFrom(element) }.withNonCodeElementsFrom(element)
@@ -10,38 +10,37 @@ import org.jetbrains.kotlin.nj2k.annotationByFqName
import org.jetbrains.kotlin.nj2k.jvmAnnotation import org.jetbrains.kotlin.nj2k.jvmAnnotation
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
class JavaModifiersConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class JavaModifiersConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKModalityOwner && element is JKAnnotationListOwner) { if (element is JKModalityOwner && element is JKAnnotationListOwner) {
val overrideAnnotation = element.annotationList.annotationByFqName("java.lang.Override") val overrideAnnotation = element.annotationList.annotationByFqName("java.lang.Override")
if (overrideAnnotation != null) { if (overrideAnnotation != null) {
element.annotationList.annotations -= overrideAnnotation element.annotationList.annotations -= overrideAnnotation
//TODO change modality to OVERRIDE???
} }
} }
if (element is JKOtherModifiersOwner && element is JKAnnotationListOwner) { if (element is JKOtherModifiersOwner && element is JKAnnotationListOwner) {
element.elementByModifier(OtherModifier.VOLATILE)?.also { modifierElement -> element.elementByModifier(OtherModifier.VOLATILE)?.also { modifierElement ->
element.otherModifierElements -= modifierElement element.otherModifierElements -= modifierElement
element.annotationList.annotations += element.annotationList.annotations +=
jvmAnnotation("Volatile", context.symbolProvider).withNonCodeElementsFrom(modifierElement) jvmAnnotation("Volatile", symbolProvider).withNonCodeElementsFrom(modifierElement)
} }
element.elementByModifier(OtherModifier.TRANSIENT)?.also { modifierElement -> element.elementByModifier(OtherModifier.TRANSIENT)?.also { modifierElement ->
element.otherModifierElements -= modifierElement element.otherModifierElements -= modifierElement
element.annotationList.annotations += element.annotationList.annotations +=
jvmAnnotation("Transient", context.symbolProvider).withNonCodeElementsFrom(modifierElement) jvmAnnotation("Transient", symbolProvider).withNonCodeElementsFrom(modifierElement)
} }
element.elementByModifier(OtherModifier.STRICTFP)?.also { modifierElement -> element.elementByModifier(OtherModifier.STRICTFP)?.also { modifierElement ->
element.otherModifierElements -= modifierElement element.otherModifierElements -= modifierElement
element.annotationList.annotations += element.annotationList.annotations +=
jvmAnnotation("Strictfp", context.symbolProvider).withNonCodeElementsFrom(modifierElement) jvmAnnotation("Strictfp", symbolProvider).withNonCodeElementsFrom(modifierElement)
} }
element.elementByModifier(OtherModifier.SYNCHRONIZED)?.also { modifierElement -> element.elementByModifier(OtherModifier.SYNCHRONIZED)?.also { modifierElement ->
element.otherModifierElements -= modifierElement element.otherModifierElements -= modifierElement
element.annotationList.annotations += element.annotationList.annotations +=
jvmAnnotation("Synchronized", context.symbolProvider).withNonCodeElementsFrom(modifierElement) jvmAnnotation("Synchronized", symbolProvider).withNonCodeElementsFrom(modifierElement)
} }
element.elementByModifier(OtherModifier.NATIVE)?.also { modifierElement -> element.elementByModifier(OtherModifier.NATIVE)?.also { modifierElement ->
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.nj2k.symbols.JKUnresolvedClassSymbol
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class JavaStandardMethodsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class JavaStandardMethodsConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
for (declaration in element.classBody.declarations) { for (declaration in element.classBody.declarations) {
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKTypeElementImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKTypeElementImpl
class JetbrainsNullableAnnotationsConverter(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class JetbrainsNullableAnnotationsConverter(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKAnnotationListOwner) return recurse(element) if (element !is JKAnnotationListOwner) return recurse(element)
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.asStatement import org.jetbrains.kotlin.nj2k.asStatement
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKBlockStatementWithoutBracketsImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKBlockStatementWithoutBracketsImpl
@@ -13,7 +14,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKLabeledStatementImpl
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class LabeledStatementConversion : RecursiveApplicableConversionBase() { class LabeledStatementConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKExpressionStatement) return recurse(element) if (element !is JKExpressionStatement) return recurse(element)
val labeledStatement = element.expression as? JKLabeledStatement ?: return recurse(element) val labeledStatement = element.expression as? JKLabeledStatement ?: return recurse(element)
@@ -5,11 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtLiteralExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtLiteralExpressionImpl
import java.math.BigInteger import java.math.BigInteger
class LiteralConversion : RecursiveApplicableConversionBase() { class LiteralConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaLiteralExpression) return recurse(element) if (element !is JKJavaLiteralExpression) return recurse(element)
return element.convertLiteral() return element.convertLiteral()
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKTypeElementImpl
//TODO temporary //TODO temporary
class MainFunctionConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class MainFunctionConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKMethod) return recurse(element) if (element !is JKMethod) return recurse(element)
if (element.isMainFunctionDeclaration()) { if (element.isMainFunctionDeclaration()) {
@@ -30,7 +30,7 @@ class MainFunctionConversion(private val context: NewJ2kConverterContext) : Recu
} }
element.annotationList.annotations += element.annotationList.annotations +=
JKAnnotationImpl( JKAnnotationImpl(
context.symbolProvider.provideClassSymbol("kotlin.jvm.JvmStatic"), symbolProvider.provideClassSymbol("kotlin.jvm.JvmStatic"),
emptyList() emptyList()
) )
} }
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.SequentialBaseConversion import org.jetbrains.kotlin.nj2k.SequentialBaseConversion
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
abstract class MatchBasedConversion : SequentialBaseConversion { abstract class MatchBasedConversion(override val context: NewJ2kConverterContext) : SequentialBaseConversion {
fun <R : JKTreeElement, T> applyRecursive(element: R, data: T, func: (JKTreeElement, T) -> JKTreeElement): R = fun <R : JKTreeElement, T> applyRecursive(element: R, data: T, func: (JKTreeElement, T) -> JKTreeElement): R =
org.jetbrains.kotlin.nj2k.tree.applyRecursive(element, data, ::onElementChanged, func) org.jetbrains.kotlin.nj2k.tree.applyRecursive(element, data, ::onElementChanged, func)
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class MethodReferenceToLambdaConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class MethodReferenceToLambdaConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKMethodReferenceExpression) return recurse(element) if (element !is JKMethodReferenceExpression) return recurse(element)
val symbol = element.identifier val symbol = element.identifier
@@ -59,7 +59,7 @@ class MethodReferenceToLambdaConversion(private val context: NewJ2kConverterCont
} else emptyList() } else emptyList()
val arguments = parameters.map { parameter -> val arguments = parameters.map { parameter ->
val parameterSymbol = context.symbolProvider.provideUniverseSymbol(parameter) val parameterSymbol = symbolProvider.provideUniverseSymbol(parameter)
JKArgumentImpl(JKFieldAccessExpressionImpl(parameterSymbol)) JKArgumentImpl(JKFieldAccessExpressionImpl(parameterSymbol))
} }
val callExpression = val callExpression =
@@ -75,7 +75,7 @@ class MethodReferenceToLambdaConversion(private val context: NewJ2kConverterCont
} }
val qualifier = when { val qualifier = when {
receiverParameter != null -> receiverParameter != null ->
JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(receiverParameter)) JKFieldAccessExpressionImpl(symbolProvider.provideUniverseSymbol(receiverParameter))
element.isConstructorCall -> element.qualifier.safeAs<JKQualifiedExpression>()?.let { it::receiver.detached() } element.isConstructorCall -> element.qualifier.safeAs<JKQualifiedExpression>()?.let { it::receiver.detached() }
else -> element::qualifier.detached().nullIfStubExpression() else -> element::qualifier.detached().nullIfStubExpression()
} }
@@ -111,12 +111,12 @@ class MethodReferenceToLambdaConversion(private val context: NewJ2kConverterCont
.firstOrNull { !it.hasModifier(JvmModifier.STATIC) } .firstOrNull { !it.hasModifier(JvmModifier.STATIC) }
?.parameterList ?.parameterList
?.parameters ?.parameters
?.map { it.type.toJK(context.symbolProvider).substituteTypeParameters(this) } ?.map { it.type.toJK(symbolProvider).substituteTypeParameters(this) }
is JKMultiverseKtClassSymbol -> reference.target.body is JKMultiverseKtClassSymbol -> reference.target.body
?.functions ?.functions
?.singleOrNull() ?.singleOrNull()
?.valueParameters ?.valueParameters
?.map { it.typeReference?.toJK(context.symbolProvider)?.substituteTypeParameters(this) ?: return null } ?.map { it.typeReference?.toJK(symbolProvider)?.substituteTypeParameters(this) ?: return null }
is JKUniverseClassSymbol -> reference.target.classBody.declarations.firstIsInstanceOrNull<JKMethod>() is JKUniverseClassSymbol -> reference.target.classBody.declarations.firstIsInstanceOrNull<JKMethod>()
?.parameters ?.parameters
?.map { it.type.type.substituteTypeParameters(this) } ?.map { it.type.type.substituteTypeParameters(this) }
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKOtherModifierElementImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKOtherModifierElementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.psi import org.jetbrains.kotlin.nj2k.tree.impl.psi
class ModalityConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class ModalityConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
when (element) { when (element) {
is JKClass -> processClass(element) is JKClass -> processClass(element)
@@ -5,11 +5,12 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKClassBody import org.jetbrains.kotlin.nj2k.tree.JKClassBody
import org.jetbrains.kotlin.nj2k.tree.JKKtInitDeclaration import org.jetbrains.kotlin.nj2k.tree.JKKtInitDeclaration
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
class MoveInitBlocksToTheEndConversion : RecursiveApplicableConversionBase() { class MoveInitBlocksToTheEndConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClassBody) return recurse(element) if (element !is JKClassBody) return recurse(element)
element.declarations = element.declarations.sortedBy { element.declarations = element.declarations.sortedBy {
@@ -5,10 +5,11 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKClass import org.jetbrains.kotlin.nj2k.tree.JKClass
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
class NonCodeElementsConversion : RecursiveApplicableConversionBase() { class NonCodeElementsConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
when (element) { when (element) {
is JKClass -> { is JKClass -> {
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class OperatorExpressionConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class OperatorExpressionConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKOperatorExpression) return recurse(element) if (element !is JKOperatorExpression) return recurse(element)
val operator = element.operator as? JKJavaOperatorImpl ?: return recurse(element) val operator = element.operator as? JKJavaOperatorImpl ?: return recurse(element)
@@ -34,7 +34,7 @@ class OperatorExpressionConversion(private val context: NewJ2kConverterContext)
is JKPostfixExpression -> { is JKPostfixExpression -> {
val operatorToken = operator.token.toKtToken() val operatorToken = operator.token.toKtToken()
val operand = applyToElement(element::expression.detached()) as JKExpression val operand = applyToElement(element::expression.detached()) as JKExpression
recurse(kotlinPostfixExpression(operand, operatorToken, context.symbolProvider)) recurse(kotlinPostfixExpression(operand, operatorToken, symbolProvider))
} }
else -> TODO(element.javaClass.toString()) else -> TODO(element.javaClass.toString())
}.withNonCodeElementsFrom(element) }.withNonCodeElementsFrom(element)
@@ -43,13 +43,13 @@ class OperatorExpressionConversion(private val context: NewJ2kConverterContext)
private fun convertPrefixExpression(operand: JKExpression, javaOperator: JKJavaOperatorImpl) = private fun convertPrefixExpression(operand: JKExpression, javaOperator: JKJavaOperatorImpl) =
convertTildeExpression(operand, javaOperator) convertTildeExpression(operand, javaOperator)
?: kotlinPrefixExpression(operand, javaOperator.token.toKtToken(), context.symbolProvider) ?: kotlinPrefixExpression(operand, javaOperator.token.toKtToken(), symbolProvider)
private fun convertTildeExpression(operand: JKExpression, javaOperator: JKJavaOperatorImpl): JKExpression? = private fun convertTildeExpression(operand: JKExpression, javaOperator: JKJavaOperatorImpl): JKExpression? =
if (javaOperator.token.psiToken == JavaTokenType.TILDE) { if (javaOperator.token.psiToken == JavaTokenType.TILDE) {
val invCall = val invCall =
JKKtCallExpressionImpl( JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.Int.inv"),//TODO check if Long symbolProvider.provideMethodSymbol("kotlin.Int.inv"),//TODO check if Long
JKArgumentListImpl() JKArgumentListImpl()
) )
JKQualifiedExpressionImpl( JKQualifiedExpressionImpl(
@@ -61,21 +61,21 @@ class OperatorExpressionConversion(private val context: NewJ2kConverterContext)
private fun convertBinaryExpression(left: JKExpression, right: JKExpression, token: JKKtOperatorToken): JKBinaryExpression = private fun convertBinaryExpression(left: JKExpression, right: JKExpression, token: JKKtOperatorToken): JKBinaryExpression =
convertStringImplicitConcatenation(left, right, token) convertStringImplicitConcatenation(left, right, token)
?: kotlinBinaryExpression(left, right, token, context.symbolProvider) ?: kotlinBinaryExpression(left, right, token, symbolProvider)
private fun convertStringImplicitConcatenation(left: JKExpression, right: JKExpression, token: JKKtOperatorToken): JKBinaryExpression? = private fun convertStringImplicitConcatenation(left: JKExpression, right: JKExpression, token: JKKtOperatorToken): JKBinaryExpression? =
if (token is JKKtSingleValueOperatorToken if (token is JKKtSingleValueOperatorToken
&& token.psiToken == KtTokens.PLUS && token.psiToken == KtTokens.PLUS
&& right.type(context.symbolProvider)?.isStringType() == true && right.type(symbolProvider)?.isStringType() == true
&& left.type(context.symbolProvider)?.isStringType() == false && left.type(symbolProvider)?.isStringType() == false
) { ) {
val toStringCall = val toStringCall =
JKKtCallExpressionImpl( JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.Any.toString"), symbolProvider.provideMethodSymbol("kotlin.Any.toString"),
JKArgumentListImpl() JKArgumentListImpl()
) )
val qualifiedCall = JKQualifiedExpressionImpl(left, JKKtQualifierImpl.DOT, toStringCall) val qualifiedCall = JKQualifiedExpressionImpl(left, JKKtQualifierImpl.DOT, toStringCall)
kotlinBinaryExpression(qualifiedCall, right, KtTokens.PLUS, context.symbolProvider) kotlinBinaryExpression(qualifiedCall, right, KtTokens.PLUS, symbolProvider)
} else null } else null
} }
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class ParameterModificationInMethodCallsConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class ParameterModificationInMethodCallsConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKMethod) return recurse(element) if (element !is JKMethod) return recurse(element)
val newVariables = val newVariables =
@@ -21,7 +21,7 @@ class ParameterModificationInMethodCallsConversion(private val context: NewJ2kCo
val parameterType = val parameterType =
if (parameter.isVarArgs) { if (parameter.isVarArgs) {
JKClassTypeImpl( JKClassTypeImpl(
context.symbolProvider.provideClassSymbol(parameter.type.type.arrayFqName()), symbolProvider.provideClassSymbol(parameter.type.type.arrayFqName()),
if (parameter.type.type is JKJavaPrimitiveType) emptyList() if (parameter.type.type is JKJavaPrimitiveType) emptyList()
else listOf( else listOf(
JKVarianceTypeParameterTypeImpl( JKVarianceTypeParameterTypeImpl(
@@ -36,7 +36,7 @@ class ParameterModificationInMethodCallsConversion(private val context: NewJ2kCo
JKLocalVariableImpl( JKLocalVariableImpl(
JKTypeElementImpl(parameterType), JKTypeElementImpl(parameterType),
JKNameIdentifierImpl(parameter.name.value), JKNameIdentifierImpl(parameter.name.value),
JKFieldAccessExpressionImpl(context.symbolProvider.provideUniverseSymbol(parameter)), JKFieldAccessExpressionImpl(symbolProvider.provideUniverseSymbol(parameter)),
JKMutabilityModifierElementImpl(Mutability.MUTABLE) JKMutabilityModifierElementImpl(Mutability.MUTABLE)
) )
} else null } else null
@@ -5,13 +5,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.parenthesizeIfBinaryExpression import org.jetbrains.kotlin.nj2k.parenthesizeIfBinaryExpression
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKBinaryExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKBinaryExpressionImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKParenthesizedExpressionImpl
class PolyadicExpressionConversion : RecursiveApplicableConversionBase() { class PolyadicExpressionConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaPolyadicExpression) return recurse(element) if (element !is JKJavaPolyadicExpression) return recurse(element)
val needParenthesis = element.operands.any { it.containsNewLine() } val needParenthesis = element.operands.any { it.containsNewLine() }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtInitDeclarationImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtInitDeclarationImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtPrimaryConstructorImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtPrimaryConstructorImpl
class PrimaryConstructorDetectConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class PrimaryConstructorDetectConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element is JKClass && if (element is JKClass &&
(element.classKind == JKClass.ClassKind.CLASS || element.classKind == JKClass.ClassKind.ENUM) (element.classKind == JKClass.ClassKind.CLASS || element.classKind == JKClass.ClassKind.ENUM)
@@ -54,7 +54,7 @@ class PrimaryConstructorDetectConversion(private val context: NewJ2kConverterCon
primaryConstructorCandidate.modalityElement primaryConstructorCandidate.modalityElement
).withNonCodeElementsFrom(primaryConstructorCandidate) ).withNonCodeElementsFrom(primaryConstructorCandidate)
context.symbolProvider.transferSymbol(primaryConstructor, primaryConstructorCandidate) symbolProvider.transferSymbol(primaryConstructor, primaryConstructorCandidate)
element.classBody.declarations += primaryConstructor element.classBody.declarations += primaryConstructor
} }
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
abstract class RecursiveApplicableConversionBase : MatchBasedConversion() { abstract class RecursiveApplicableConversionBase(context: NewJ2kConverterContext) : MatchBasedConversion(context) {
override fun onElementChanged(new: JKTreeElement, old: JKTreeElement) { override fun onElementChanged(new: JKTreeElement, old: JKTreeElement) {
somethingChanged = true somethingChanged = true
} }
@@ -5,9 +5,10 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
class RemoveWrongExtraModifiersForSingleFunctionsConversion : RecursiveApplicableConversionBase() { class RemoveWrongExtraModifiersForSingleFunctionsConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKOtherModifiersOwner) return recurse(element) if (element !is JKOtherModifiersOwner) return recurse(element)
if (element.parentOfType<JKClass>() == null) { if (element.parentOfType<JKClass>() == null) {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.asStatement import org.jetbrains.kotlin.nj2k.asStatement
import org.jetbrains.kotlin.nj2k.copyTreeAndDetach import org.jetbrains.kotlin.nj2k.copyTreeAndDetach
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
@@ -13,7 +14,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKLabeledStatementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKNameIdentifierImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKNameIdentifierImpl
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class ReturnStatementInLambdaExpressionConversion : RecursiveApplicableConversionBase() { class ReturnStatementInLambdaExpressionConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
companion object { companion object {
const val DEFAULT_LABEL_NAME = "label" const val DEFAULT_LABEL_NAME = "label"
} }
@@ -5,13 +5,14 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.createCompanion import org.jetbrains.kotlin.nj2k.createCompanion
import org.jetbrains.kotlin.nj2k.getCompanion import org.jetbrains.kotlin.nj2k.getCompanion
import org.jetbrains.kotlin.nj2k.replace import org.jetbrains.kotlin.nj2k.replace
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtInitDeclarationImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtInitDeclarationImpl
class StaticInitDeclarationConversion : RecursiveApplicableConversionBase() { class StaticInitDeclarationConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
val staticInitDeclarations = val staticInitDeclarations =
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class StaticMemberAccessConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class StaticMemberAccessConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
val symbol = val symbol =
when (element) { when (element) {
@@ -71,17 +71,17 @@ class StaticMemberAccessConversion(private val context: NewJ2kConverterContext)
target.getStrictParentOfType<KtClassOrObject>()?.let { klass -> target.getStrictParentOfType<KtClassOrObject>()?.let { klass ->
if (klass is KtObjectDeclaration && klass.isCompanion()) klass.containingClass() if (klass is KtObjectDeclaration && klass.isCompanion()) klass.containingClass()
else klass else klass
}?.let { context.symbolProvider.provideDirectSymbol(it) } }?.let { symbolProvider.provideDirectSymbol(it) }
is PsiElement -> target.getContainingClass()?.let { is PsiElement -> target.getContainingClass()?.let {
context.symbolProvider.provideDirectSymbol(it) symbolProvider.provideDirectSymbol(it)
} }
is JKTreeElement -> is JKTreeElement ->
target.parentOfType<JKClass>()?.let { klass -> target.parentOfType<JKClass>()?.let { klass ->
if (klass.classKind == JKClass.ClassKind.COMPANION) klass.parentOfType<JKClass>() if (klass.classKind == JKClass.ClassKind.COMPANION) klass.parentOfType<JKClass>()
else klass else klass
}?.let { context.symbolProvider.provideUniverseSymbol(it) } }?.let { symbolProvider.provideUniverseSymbol(it) }
else -> error("bad isStaticMember") else -> error("bad isStaticMember")
} as JKClassSymbol? } as JKClassSymbol?
} }
@@ -5,10 +5,11 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.getOrCreateCompanionObject import org.jetbrains.kotlin.nj2k.getOrCreateCompanionObject
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
class StaticsToCompanionExtractConversion : RecursiveApplicableConversionBase() { class StaticsToCompanionExtractConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKClass) return recurse(element) if (element !is JKClass) return recurse(element)
if (element.classKind == JKClass.ClassKind.COMPANION || element.classKind == JKClass.ClassKind.OBJECT) return element if (element.classKind == JKClass.ClassKind.COMPANION || element.classKind == JKClass.ClassKind.OBJECT) return element
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class SwitchStatementConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class SwitchStatementConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaSwitchStatementImpl) return recurse(element) if (element !is JKJavaSwitchStatementImpl) return recurse(element)
element.invalidate() element.invalidate()
@@ -86,7 +86,7 @@ class SwitchStatementConversion(private val context: NewJ2kConverterContext) : R
when (statement) { when (statement) {
is JKBlockStatement -> is JKBlockStatement ->
JKExpressionStatementImpl( JKExpressionStatementImpl(
runExpression(statement, context.symbolProvider) runExpression(statement, symbolProvider)
) )
else -> statement else -> statement
} }
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.tree.withNonCodeElementsFrom import org.jetbrains.kotlin.nj2k.tree.withNonCodeElementsFrom
class SynchronizedStatementConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class SynchronizedStatementConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaSynchronizedStatement) return recurse(element) if (element !is JKJavaSynchronizedStatement) return recurse(element)
element.invalidate() element.invalidate()
@@ -22,7 +22,7 @@ class SynchronizedStatementConversion(private val context: NewJ2kConverterContex
) )
val synchronizedCall = val synchronizedCall =
JKKtCallExpressionImpl( JKKtCallExpressionImpl(
context.symbolProvider.provideMethodSymbol("kotlin.synchronized"), symbolProvider.provideMethodSymbol("kotlin.synchronized"),
JKArgumentListImpl( JKArgumentListImpl(
element.lockExpression, element.lockExpression,
lambdaBody lambdaBody
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.JKJavaThrowStatement import org.jetbrains.kotlin.nj2k.tree.JKJavaThrowStatement
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
import org.jetbrains.kotlin.nj2k.tree.detached import org.jetbrains.kotlin.nj2k.tree.detached
@@ -12,7 +13,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.JKExpressionStatementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKKtThrowExpressionImpl import org.jetbrains.kotlin.nj2k.tree.impl.JKKtThrowExpressionImpl
class ThrowStatementConversion : RecursiveApplicableConversionBase() { class ThrowStatementConversion(context : NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaThrowStatement) return recurse(element) if (element !is JKJavaThrowStatement) return recurse(element)
val throwExpression = JKKtThrowExpressionImpl(element::exception.detached()) val throwExpression = JKKtThrowExpressionImpl(element::exception.detached())
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.nj2k.tree.impl.*
import org.jetbrains.kotlin.nj2k.useExpression import org.jetbrains.kotlin.nj2k.useExpression
class TryStatementConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class TryStatementConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKJavaTryStatement) return recurse(element) if (element !is JKJavaTryStatement) return recurse(element)
return if (element.resourceDeclarations.isEmpty()) return if (element.resourceDeclarations.isEmpty())
@@ -59,7 +59,7 @@ class TryStatementConversion(private val context: NewJ2kConverterContext) : Recu
receiver = (variable as JKLocalVariable)::initializer.detached(), receiver = (variable as JKLocalVariable)::initializer.detached(),
variableIdentifier = variable::name.detached(), variableIdentifier = variable::name.detached(),
body = inner, body = inner,
symbolProvider = context.symbolProvider symbolProvider = symbolProvider
) )
) )
} }
@@ -5,14 +5,10 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiVariable
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.j2k.*
import org.jetbrains.kotlin.j2k.ast.Mutability
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.j2k.toKotlinMutableTypesMap
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.kotlinTypeByName import org.jetbrains.kotlin.nj2k.kotlinTypeByName
@@ -21,7 +17,7 @@ import org.jetbrains.kotlin.nj2k.symbols.JKUniverseClassSymbol
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.* import org.jetbrains.kotlin.nj2k.tree.impl.*
class TypeMappingConversion(val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() { class TypeMappingConversion(context: NewJ2kConverterContext) : RecursiveApplicableConversionBase(context) {
override fun applyToElement(element: JKTreeElement): JKTreeElement { override fun applyToElement(element: JKTreeElement): JKTreeElement {
when (element) { when (element) {
is JKTypeElement -> { is JKTypeElement -> {
@@ -56,7 +52,7 @@ class TypeMappingConversion(val context: NewJ2kConverterContext) : RecursiveAppl
JKTypeElementImpl( JKTypeElementImpl(
kotlinTypeByName( kotlinTypeByName(
KotlinBuiltIns.FQ_NAMES.any.toSafe().asString(), KotlinBuiltIns.FQ_NAMES.any.toSafe().asString(),
context.symbolProvider, symbolProvider,
Nullability.Nullable Nullability.Nullable
) )
) )
@@ -86,12 +82,12 @@ class TypeMappingConversion(val context: NewJ2kConverterContext) : RecursiveAppl
is JKJavaVoidType -> is JKJavaVoidType ->
kotlinTypeByName( kotlinTypeByName(
KotlinBuiltIns.FQ_NAMES.unit.toSafe().asString(), KotlinBuiltIns.FQ_NAMES.unit.toSafe().asString(),
context.symbolProvider, symbolProvider,
Nullability.NotNull Nullability.NotNull
) )
is JKJavaArrayType -> is JKJavaArrayType ->
JKClassTypeImpl( JKClassTypeImpl(
context.symbolProvider.provideClassSymbol(type.arrayFqName()), symbolProvider.provideClassSymbol(type.arrayFqName()),
if (type is JKJavaPrimitiveType) emptyList() else listOf(type.mapType(typeElement)), if (type is JKJavaPrimitiveType) emptyList() else listOf(type.mapType(typeElement)),
nullability nullability
) )
@@ -115,7 +111,7 @@ class TypeMappingConversion(val context: NewJ2kConverterContext) : RecursiveAppl
val newFqName = kotlinCollectionClassName() val newFqName = kotlinCollectionClassName()
?: kotlinStandardType() ?: kotlinStandardType()
?: fqName ?: fqName
return context.symbolProvider.provideClassSymbol(newFqName) return symbolProvider.provideClassSymbol(newFqName)
} }
private fun JKClassType.mapClassType(typeElement: JKTypeElement?): JKClassType = private fun JKClassType.mapClassType(typeElement: JKTypeElement?): JKClassType =
@@ -136,7 +132,7 @@ class TypeMappingConversion(val context: NewJ2kConverterContext) : RecursiveAppl
private fun JKJavaPrimitiveType.mapPrimitiveType(): JKClassType { private fun JKJavaPrimitiveType.mapPrimitiveType(): JKClassType {
val fqName = jvmPrimitiveType.primitiveType.typeFqName val fqName = jvmPrimitiveType.primitiveType.typeFqName
return JKClassTypeImpl( return JKClassTypeImpl(
context.symbolProvider.provideClassSymbol(fqName), symbolProvider.provideClassSymbol(fqName),
nullability = Nullability.NotNull nullability = Nullability.NotNull
) )
} }