mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-04-17 00:21:27 +00:00
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:
committed by
Simon Ogorodnik
parent
9f6cc77989
commit
3304bb32c5
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
7
j2k/testData/fileOrElement/issues/unfinishedReferenceExpression.java
vendored
Normal file
7
j2k/testData/fileOrElement/issues/unfinishedReferenceExpression.java
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
public class JavaClass {
|
||||
public String v = "";
|
||||
public void m(String s) {
|
||||
s.
|
||||
this.v.
|
||||
}
|
||||
}
|
||||
8
j2k/testData/fileOrElement/issues/unfinishedReferenceExpression.kt
vendored
Normal file
8
j2k/testData/fileOrElement/issues/unfinishedReferenceExpression.kt
vendored
Normal 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.
|
||||
}
|
||||
}
|
||||
@@ -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")
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user