diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 48e26403ebd..dcdf322d8b8 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -27,6 +27,7 @@ object ConversionsRunner { DefaultArgumentsConversion(context), TypeMappingConversion(context), FieldToPropertyConversion(), + PrintlnConversion(context), AssignmentAsExpressionToAlsoConversion(context), AssignmentStatementValCreationConversion(context), AssignmentStatementOperatorConversion(), diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PrintlnConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PrintlnConversion.kt new file mode 100644 index 00000000000..eb74ee75b1d --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/PrintlnConversion.kt @@ -0,0 +1,45 @@ +/* + * 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.* +import org.jetbrains.kotlin.j2k.tree.impl.JKKtCallExpressionImpl +import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol +import org.jetbrains.kotlin.name.ClassId + +// TODO: Full special methods conversion +class PrintlnConversion(private val context: ConversionContext) : RecursiveApplicableConversionBase() { + override fun applyToElement(element: JKTreeElement): JKTreeElement { + return if (element is JKQualifiedExpression) { + recurse(processQualified(element)) + } else { + recurse(element) + } + } + + private fun processQualified(element: JKQualifiedExpression): JKExpression { + val receiver = element.receiver as? JKQualifiedExpression ?: return element + val classReference = receiver.receiver as? JKClassAccessExpression ?: return element + if (classReference.identifier.fqName != "java.lang.System") return element + val fieldReference = receiver.selector as? JKFieldAccessExpression ?: return element + if (fieldReference.identifier.name != "out") return element + val selector = element.selector as? JKMethodCallExpression ?: return element + if (selector.identifier.name != "println") return element + + val contextElement = element.parentOfType() ?: return element + val targetElements = multiResolveFqName(ClassId.fromString("kotlin/io/println"), context.backAnnotator(contextElement)!!) + if (targetElements.isEmpty()) return element + selector.invalidate() + + + return JKKtCallExpressionImpl( + context.symbolProvider.provideDirectSymbol(targetElements.first()) as JKMethodSymbol, + selector.arguments + ) + } + +} \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/resolveUtil.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/resolveUtil.kt index 27234b50648..f55cca66e0b 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/resolveUtil.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/resolveUtil.kt @@ -6,10 +6,12 @@ package org.jetbrains.kotlin.j2k.conversions import com.intellij.psi.PsiElement +import com.intellij.psi.PsiPolyVariantReference import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.tree.JKTreeElement import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtDotQualifiedExpression +import org.jetbrains.kotlin.psi.KtImportDirective import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.analysisContext import org.jetbrains.kotlin.psi.psiUtil.getChildOfType @@ -22,11 +24,25 @@ internal fun resolveFqName(classId: ClassId, contextElement: JKTreeElement, cont } internal fun resolveFqName(classId: ClassId, element: PsiElement): PsiElement? { - val importDirective = KtPsiFactory(element).createImportDirective(ImportPath(classId.asSingleFqName(), false)) - importDirective.containingKtFile.analysisContext = element.containingFile - return importDirective.getChildOfType() + return constructImportDirectiveWithContext(classId, element) + .getChildOfType() ?.selectorExpression ?.let { it.references.mapNotNull { it.resolve() }.firstOrNull() } +} + +private fun constructImportDirectiveWithContext(classId: ClassId, element: PsiElement): KtImportDirective { + val importDirective = KtPsiFactory(element).createImportDirective(ImportPath(classId.asSingleFqName(), false)) + importDirective.containingKtFile.analysisContext = element.containingFile + return importDirective +} + +internal fun multiResolveFqName(classId: ClassId, elementForContext: PsiElement): List { + return constructImportDirectiveWithContext(classId, elementForContext) + .getChildOfType() + ?.selectorExpression + ?.let { + it.references.filterIsInstance().flatMap { it.multiResolve(false).mapNotNull { it.element } } + }.orEmpty() } \ No newline at end of file