Fix for KT-14205

If detected unfinished expression it passed through, added warning on action "Convert Java to Kotlin", if Java files contains syntax errors.

(cherry picked from commit e763565)
This commit is contained in:
Simon Ogorodnik
2016-10-10 19:34:03 +03:00
committed by Simon Ogorodnik
parent 9f6cc77989
commit 3304bb32c5
6 changed files with 62 additions and 2 deletions

View File

@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.idea.actions
import com.intellij.codeInsight.navigation.NavigationUtil
import com.intellij.ide.scratch.ScratchFileService
import com.intellij.ide.scratch.ScratchRootType
import com.intellij.openapi.actionSystem.AnAction
@@ -33,8 +34,10 @@ import com.intellij.openapi.vfs.VfsUtilCore
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileVisitor
import com.intellij.psi.PsiDocumentManager
import com.intellij.psi.PsiErrorElement
import com.intellij.psi.PsiJavaFile
import com.intellij.psi.PsiManager
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.j2k.IdeaJavaToKotlinServices
import org.jetbrains.kotlin.idea.j2k.J2kPostProcessor
@@ -61,6 +64,8 @@ class JavaToKotlinAction : AnAction() {
}
}
val title = "Convert Java to Kotlin"
private fun saveResults(javaFiles: List<PsiJavaFile>, convertedTexts: List<String>): List<VirtualFile> {
val result = ArrayList<VirtualFile>()
for ((psiFile, text) in javaFiles.zip(convertedTexts)) {
@@ -99,7 +104,7 @@ class JavaToKotlinAction : AnAction() {
converterResult = converter.filesToKotlin(javaFiles, J2kPostProcessor(formatCode = true), ProgressManager.getInstance().progressIndicator)
}
val title = "Convert Java to Kotlin"
if (!ProgressManager.getInstance().runProcessWithProgressSynchronously(
{
runReadAction(::convert)
@@ -145,6 +150,30 @@ class JavaToKotlinAction : AnAction() {
override fun actionPerformed(e: AnActionEvent) {
val javaFiles = selectedJavaFiles(e).toList()
val project = CommonDataKeys.PROJECT.getData(e.dataContext)!!
val firstSyntaxError = javaFiles.asSequence().map { PsiTreeUtil.findChildOfType(it, PsiErrorElement::class.java) }.firstOrNull()
if (firstSyntaxError != null) {
val count = javaFiles.filter { PsiTreeUtil.hasErrorElements(it) }.count()
val question = firstSyntaxError.containingFile.name +
(if (count > 1) " and ${count - 1} more Java files" else " file") +
" contain syntax errors, the conversion result may be incorrect"
val okText = "Investigate Errors"
val cancelText = "Proceed with Conversion"
if (Messages.showOkCancelDialog(
project,
question,
title,
okText,
cancelText,
Messages.getWarningIcon()
) == Messages.OK) {
NavigationUtil.activateFileWithPsiElement(firstSyntaxError.navigationElement)
return
}
}
convertFiles(javaFiles, project)
}

View File

@@ -536,7 +536,11 @@ class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
return
}
val referenceName = expression.referenceName!!
val referenceName = expression.referenceName ?: run {
result = LiteralExpression(expression.text).assignNoPrototype()
return
}
val target = expression.resolve()
val isNullable = target is PsiVariable && isNullable(target)

View File

@@ -0,0 +1,7 @@
public class JavaClass {
public String v = "";
public void m(String s) {
s.
this.v.
}
}

View File

@@ -0,0 +1,8 @@
// ERROR: The expression cannot be a selector (occur after a dot)
class JavaClass {
var v = ""
fun m(s: String) {
s.
this.v.
}
}

View File

@@ -3039,6 +3039,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/issues/spaceBeforeAssignment.java");
doTest(fileName);
}
@TestMetadata("unfinishedReferenceExpression.java")
public void testUnfinishedReferenceExpression() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/issues/unfinishedReferenceExpression.java");
doTest(fileName);
}
}
@TestMetadata("j2k/testData/fileOrElement/kotlinApiAccess")

View File

@@ -3039,6 +3039,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/issues/spaceBeforeAssignment.java");
doTest(fileName);
}
@TestMetadata("unfinishedReferenceExpression.java")
public void testUnfinishedReferenceExpression() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/issues/unfinishedReferenceExpression.java");
doTest(fileName);
}
}
@TestMetadata("j2k/testData/fileOrElement/kotlinApiAccess")