From aea33a32149a83f70891757e404709e3adc68084 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Thu, 4 Apr 2019 16:11:50 +0300 Subject: [PATCH] Move resolve during import optimizing to background thread (KT-27106, KT-30018) #KT-27106 Fixed --- .../idea/imports/KotlinImportOptimizer.kt | 31 ++++++++++--------- .../FoldingAfterOptimizeImportsTest.kt | 19 ++++++------ 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt index 6c4325eb14d..bdc4a732fc3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/imports/KotlinImportOptimizer.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.imports import com.intellij.lang.ImportOptimizer +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.progress.ProgressIndicatorProvider import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile @@ -31,7 +32,6 @@ import org.jetbrains.kotlin.idea.references.KtInvokeFunctionReference import org.jetbrains.kotlin.idea.references.KtReference import org.jetbrains.kotlin.idea.references.canBeResolvedViaImport import org.jetbrains.kotlin.idea.references.mainReference -import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName @@ -47,26 +47,29 @@ import java.util.* class KotlinImportOptimizer : ImportOptimizer { override fun supports(file: PsiFile?) = file is KtFile - override fun processFile(file: PsiFile?) = Runnable { - OptimizeProcess(file as KtFile).execute() + override fun processFile(file: PsiFile?): Runnable { + val ktFile = (file as? KtFile) ?: return Runnable { /* empty runnable */ } + val preparedImports = prepareImports(ktFile) ?: return Runnable { /* empty runnable */ } + + return Runnable { + replaceImports(ktFile, preparedImports) + } } - private class OptimizeProcess(private val file: KtFile) { - fun execute() { - val moduleInfo = file.getNullableModuleInfo() - if (moduleInfo !is ModuleSourceInfo && moduleInfo !is ScriptModuleInfo) return + private fun prepareImports(file: KtFile): List? { + ApplicationManager.getApplication().assertReadAccessAllowed() - val oldImports = file.importDirectives - if (oldImports.isEmpty()) return + val moduleInfo = file.getNullableModuleInfo() + if (moduleInfo !is ModuleSourceInfo && moduleInfo !is ScriptModuleInfo) return null - //TODO: keep existing imports? at least aliases (comments) + val oldImports = file.importDirectives + if (oldImports.isEmpty()) return null - val descriptorsToImport = collectDescriptorsToImport(file) + //TODO: keep existing imports? at least aliases (comments) - val imports = prepareOptimizedImports(file, descriptorsToImport) ?: return + val descriptorsToImport = collectDescriptorsToImport(file) - runWriteAction { replaceImports(file, imports) } - } + return prepareOptimizedImports(file, descriptorsToImport) } private class CollectUsedDescriptorsVisitor(file: KtFile) : KtVisitorVoid() { diff --git a/idea/tests/org/jetbrains/kotlin/idea/folding/FoldingAfterOptimizeImportsTest.kt b/idea/tests/org/jetbrains/kotlin/idea/folding/FoldingAfterOptimizeImportsTest.kt index f914f983579..c8f6781cbf4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/folding/FoldingAfterOptimizeImportsTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/folding/FoldingAfterOptimizeImportsTest.kt @@ -6,16 +6,14 @@ package org.jetbrains.kotlin.idea.folding import com.intellij.codeInsight.folding.CodeFoldingManager -import com.intellij.openapi.command.CommandProcessor -import com.intellij.openapi.command.UndoConfirmationPolicy import com.intellij.openapi.editor.FoldRegion -import org.jetbrains.kotlin.idea.test.PluginTestCaseBase -import java.io.File import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture -import org.jetbrains.kotlin.test.InTextDirectivesUtils -import com.intellij.openapi.editor.Editor import org.jetbrains.kotlin.idea.folding.AbstractKotlinFoldingTest.doTestWithSettings import org.jetbrains.kotlin.idea.imports.KotlinImportOptimizer +import org.jetbrains.kotlin.idea.test.PluginTestCaseBase +import org.jetbrains.kotlin.idea.util.application.executeWriteCommand +import org.jetbrains.kotlin.test.InTextDirectivesUtils +import java.io.File class FoldingAfterOptimizeImportsTest : AbstractKotlinFoldingTest() { private val fixture: JavaCodeInsightTestFixture @@ -41,11 +39,12 @@ class FoldingAfterOptimizeImportsTest : AbstractKotlinFoldingTest() { CodeFoldingManager.getInstance(fixture.project)!!.buildInitialFoldings(editor) getFoldingRegion(0).checkRegion(false, findStringWithPrefixes("// REGION BEFORE: ")) - CommandProcessor.getInstance()?.executeCommand(fixture.project, - KotlinImportOptimizer().processFile(fixture.file), - "Optimize Imports", null, - UndoConfirmationPolicy.DO_NOT_REQUEST_CONFIRMATION) + fixture.project.executeWriteCommand( + "Optimize import in tests" + ) { KotlinImportOptimizer().processFile(fixture.file).run() } + getFoldingRegion(0).checkRegion(false, findStringWithPrefixes("// REGION AFTER: ")) + null } }