Move resolve during import optimizing to background thread (KT-27106, KT-30018)
#KT-27106 Fixed
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user