diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt index 4d45a7c31d0..d4a7e4a6356 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/jetPsiUtil.kt @@ -473,7 +473,7 @@ private fun findFirstLeafWhollyInRange(file: PsiFile, range: TextRange): PsiElem var element = file.findElementAt(range.getStartOffset()) ?: return null var elementRange = element.getTextRange() if (elementRange.getStartOffset() < range.getStartOffset()) { - element = file.findElementAt(elementRange.getEndOffset()) ?: return null + element = element.nextLeaf(skipEmptyElements = true) ?: return null elementRange = element.getTextRange() } assert(elementRange.getStartOffset() >= range.getStartOffset()) diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt index fd217cfc90d..3b5f3474fab 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/JavaToKotlinAction.kt @@ -35,6 +35,7 @@ import com.intellij.psi.PsiManager import com.intellij.psi.codeStyle.CodeStyleManager import org.jetbrains.kotlin.idea.j2k.IdeaResolverForConverter import org.jetbrains.kotlin.idea.j2k.J2kPostProcessor +import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.j2k.ConverterSettings import org.jetbrains.kotlin.j2k.IdeaReferenceSearcher import org.jetbrains.kotlin.j2k.JavaToKotlinConverter @@ -59,7 +60,7 @@ public class JavaToKotlinAction : AnAction() { if (!ProgressManager.getInstance().runProcessWithProgressSynchronously( { - ApplicationManager.getApplication().runReadAction(::convert) + runReadAction(::convert) }, "Converting Java to Kotlin", true, @@ -70,7 +71,7 @@ public class JavaToKotlinAction : AnAction() { override fun run() { CommandProcessor.getInstance().markCurrentCommandAsGlobal(project) - val newFiles = saveResults(javaFiles, convertedTexts!!, project) + val newFiles = saveResults(javaFiles, convertedTexts!!) deleteFiles(javaFiles) newFiles.singleOrNull()?.let { @@ -87,7 +88,7 @@ public class JavaToKotlinAction : AnAction() { private fun selectedJavaFiles(e: AnActionEvent): Sequence { val virtualFiles = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY) ?: return sequenceOf() - val project = CommonDataKeys.PROJECT.getData(e.getDataContext()) ?: return sequenceOf() + val project = e.getProject() ?: return sequenceOf() return allJavaFiles(virtualFiles, project) } @@ -112,11 +113,11 @@ public class JavaToKotlinAction : AnAction() { return result } - private fun saveResults(javaFiles: List, convertedTexts: List, project: Project): List { + private fun saveResults(javaFiles: List, convertedTexts: List): List { val result = ArrayList() - for ((i, psiFile) in javaFiles.withIndex()) { + for ((psiFile, text) in javaFiles.zip(convertedTexts)) { ApplicationManager.getApplication().runWriteAction { - result.addIfNotNull(saveConversionResult(psiFile.getVirtualFile(), convertedTexts[i], project)) + result.addIfNotNull(saveConversionResult(psiFile.getVirtualFile(), text, psiFile.getProject())) } } return result diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt index dec423be59e..da7e20278b8 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInsight/KotlinCopyPasteReferenceProcessor.kt @@ -205,16 +205,15 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor) { + public fun processReferenceData(project: Project, file: JetFile, blockStart: Int, referenceData: Array) { PsiDocumentManager.getInstance(project).commitAllDocuments() - val referencesPossibleToRestore = findReferencesToRestore(file, boundStart, referenceData) + val referencesPossibleToRestore = findReferencesToRestore(file, blockStart, referenceData) val selectedReferencesToRestore = showRestoreReferencesDialog(project, referencesPossibleToRestore) if (selectedReferencesToRestore.isEmpty()) return @@ -224,11 +223,11 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor): List { + private fun findReferencesToRestore(file: PsiFile, blockStart: Int, referenceData: Array): List { if (file !is JetFile) return listOf() return referenceData.map { - val referenceElement = findReference(it, file, boundStart) + val referenceElement = findReference(it, file, blockStart) if (referenceElement != null) createReferenceToRestoreData(referenceElement, it) else @@ -236,9 +235,9 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor, values: List) { if (DumbService.getInstance(project).isDumb()) return + val jetEditorOptions = JetEditorOptions.getInstance() + if (!jetEditorOptions.isEnableJavaToKotlinConversion()) return val data = values.single() if (data !is CopiedJavaCode) return @@ -94,7 +97,7 @@ public class ConvertJavaCopyPastePostProcessor : CopyPastePostProcessor>? = null - fun doConversionAndInsertImportsIfNoConversion(): Boolean { + fun doConversionAndInsertImportsIfUnchanged(): Boolean { conversionResult = doConversion() val text = conversionResult!!.first @@ -106,19 +109,18 @@ public class ConvertJavaCopyPastePostProcessor : CopyPastePostProcessor { - contextPrefix = "fun ${generateDummyFunctionName(text)}() {\n" - contextSuffix = "\n}" - } - - ParseContext.TOP_LEVEL -> { - contextPrefix = "" - contextSuffix = "" - } - - //TODO: see KT-7264 - else -> { - contextPrefix = "" - contextSuffix = "" - } + val (contextPrefix, contextSuffix) = when (parseContext) { + ParseContext.CODE_BLOCK -> "fun ${generateDummyFunctionName(text)}() {\n" to "\n}" + ParseContext.TOP_LEVEL -> "" to "" } append(contextPrefix) diff --git a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt index 09cf92dcfe6..0070ca6bf01 100644 --- a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt @@ -88,7 +88,7 @@ public class J2kPostProcessor(private val formatCode: Boolean) : PostProcessor { if (rangeMarker == null) return RangeFilterResult.PROCESS if (!rangeMarker.isValid()) return RangeFilterResult.SKIP val range = TextRange(rangeMarker.getStartOffset(), rangeMarker.getEndOffset()) - val elementRange = element.getTextRange()!! + val elementRange = element.getTextRange() return when { range.contains(elementRange) -> RangeFilterResult.PROCESS range.intersects(elementRange) -> RangeFilterResult.GO_INSIDE diff --git a/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinConverter.kt index 7a689e6c783..9bce8fd8c1d 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/JavaToKotlinConverter.kt @@ -147,7 +147,10 @@ public class JavaToKotlinConverter(private val project: Project, intermediateResults[i] = null // to not hold unused objects in the heap } - if (postProcessor == null) return results + if (postProcessor == null) { + assert(progress is EmptyProgressIndicator, "Progress indicator not supported for postProcessor == null") + return results + } val finalResults = ArrayList(elementCount) processFilesWithProgress(0.5) { i -> @@ -156,7 +159,7 @@ public class JavaToKotlinConverter(private val project: Project, try { //TODO: post processing does not work correctly for ParseContext different from TOP_LEVEL val kotlinFile = JetPsiFactory(project).createAnalyzableFile("dummy.kt", result.text, inputElements[i].postProcessingContext!!) - AfterConversionPass(project, postProcessor).run(kotlinFile, null) + AfterConversionPass(project, postProcessor).run(kotlinFile, range = null) finalResults.add(Result(kotlinFile.getText(), result.parseContext)) } catch(e: ProcessCanceledException) {