diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index fc0ec25d033..3523e3f23bc 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.j2k +import org.jetbrains.kotlin.j2k.conversions.AssignmentAsExpressionToAlsoConversion import org.jetbrains.kotlin.j2k.conversions.FieldToPropertyConversion import org.jetbrains.kotlin.j2k.conversions.JavaMethodToKotlinFunctionConversion import org.jetbrains.kotlin.j2k.conversions.TypeMappingConversion @@ -28,6 +29,7 @@ object ConversionsRunner { trees.forEach { FieldToPropertyConversion().runConversion(it, context) TypeMappingConversion(context).runConversion(it, context) + AssignmentAsExpressionToAlsoConversion(context).runConversion(it, context) JavaMethodToKotlinFunctionConversion().runConversion(it, context) } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentAsExpressionToAlsoConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentAsExpressionToAlsoConversion.kt new file mode 100644 index 00000000000..4949f9e77a6 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/AssignmentAsExpressionToAlsoConversion.kt @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.conversions + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.j2k.ConversionContext +import org.jetbrains.kotlin.j2k.tree.JKJavaAssignmentExpression +import org.jetbrains.kotlin.j2k.tree.JKTreeElement +import org.jetbrains.kotlin.j2k.tree.impl.* +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtDotQualifiedExpression +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.analysisContext +import org.jetbrains.kotlin.psi.psiUtil.getChildOfType +import org.jetbrains.kotlin.resolve.ImportPath + +class AssignmentAsExpressionToAlsoConversion(val context: ConversionContext) : RecursiveApplicableConversionBase() { + + override fun applyToElement(element: JKTreeElement): JKTreeElement { + if (element !is JKJavaAssignmentExpression) return recurse(element) + + // TODO: Check if inside variable initializer + //if (element.parent) + + val alsoElement = resolveFqName(ClassId.fromString("kotlin/also"), element) ?: return recurse(element) + val alsoSymbol = context.symbolProvider.provideSymbol(alsoElement) as? JKMethodSymbol ?: return recurse(element) + element.invalidate() + + return JKQualifiedExpressionImpl( + element.rExpression, + JKKtQualifierImpl.DOT, + JKKtCallExpressionImpl(alsoSymbol, JKExpressionListImpl()) + ) + } + + private fun resolveFqName(classId: ClassId, contextElement: JKTreeElement): PsiElement? { + val element = context.backAnnotator(contextElement) ?: return null + val importDirective = KtPsiFactory(element).createImportDirective(ImportPath(classId.asSingleFqName(), false)) + importDirective.containingKtFile.analysisContext = element.containingFile + return importDirective.getChildOfType() + ?.selectorExpression + ?.let { + it.references.mapNotNull { it.resolve() }.first() + } + } + +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/RecursiveApplicableConversionBase.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/RecursiveApplicableConversionBase.kt new file mode 100644 index 00000000000..0e7ed413bfd --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/RecursiveApplicableConversionBase.kt @@ -0,0 +1,29 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.conversions + +import org.jetbrains.kotlin.j2k.ConversionContext +import org.jetbrains.kotlin.j2k.tree.JKTreeElement + +abstract class RecursiveApplicableConversionBase : MatchBasedConversion() { + override fun onElementChanged(new: JKTreeElement, old: JKTreeElement) { + somethingChanged = true + } + + override fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean { + val root = applyToElement(treeRoot) + assert(root === treeRoot) + return somethingChanged + } + + protected var somethingChanged = false + + abstract fun applyToElement(element: JKTreeElement): JKTreeElement + + inline fun recurse(element: JKTreeElement): JKTreeElement { + return applyRecursive(element, ::applyToElement) + } +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index 0edb84676e0..bdf86c2bd45 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -28,7 +28,7 @@ interface JKJavaMethod : JKMethod, JKBranchElement { interface JKJavaForLoop : JKLoop -interface JKJavaAssignmentExpression : JKExpression { +interface JKJavaAssignmentExpression : JKExpression, JKBranchElement { var lExpression: JKExpression var rExpression: JKExpression }