Move resolve during import optimizing to background thread (KT-27106, KT-30018)

#KT-27106 Fixed
This commit is contained in:
Nikolay Krasko
2019-04-04 16:11:50 +03:00
parent 25636c9c39
commit aea33a3214
2 changed files with 26 additions and 24 deletions
@@ -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<ImportPath>? {
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() {
@@ -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
}
}