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
|
package org.jetbrains.kotlin.idea.imports
|
||||||
|
|
||||||
import com.intellij.lang.ImportOptimizer
|
import com.intellij.lang.ImportOptimizer
|
||||||
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.openapi.progress.ProgressIndicatorProvider
|
import com.intellij.openapi.progress.ProgressIndicatorProvider
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiFile
|
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.KtReference
|
||||||
import org.jetbrains.kotlin.idea.references.canBeResolvedViaImport
|
import org.jetbrains.kotlin.idea.references.canBeResolvedViaImport
|
||||||
import org.jetbrains.kotlin.idea.references.mainReference
|
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.idea.util.getResolutionScope
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -47,26 +47,29 @@ import java.util.*
|
|||||||
class KotlinImportOptimizer : ImportOptimizer {
|
class KotlinImportOptimizer : ImportOptimizer {
|
||||||
override fun supports(file: PsiFile?) = file is KtFile
|
override fun supports(file: PsiFile?) = file is KtFile
|
||||||
|
|
||||||
override fun processFile(file: PsiFile?) = Runnable {
|
override fun processFile(file: PsiFile?): Runnable {
|
||||||
OptimizeProcess(file as KtFile).execute()
|
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) {
|
private fun prepareImports(file: KtFile): List<ImportPath>? {
|
||||||
fun execute() {
|
ApplicationManager.getApplication().assertReadAccessAllowed()
|
||||||
val moduleInfo = file.getNullableModuleInfo()
|
|
||||||
if (moduleInfo !is ModuleSourceInfo && moduleInfo !is ScriptModuleInfo) return
|
|
||||||
|
|
||||||
val oldImports = file.importDirectives
|
val moduleInfo = file.getNullableModuleInfo()
|
||||||
if (oldImports.isEmpty()) return
|
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() {
|
private class CollectUsedDescriptorsVisitor(file: KtFile) : KtVisitorVoid() {
|
||||||
|
|||||||
@@ -6,16 +6,14 @@
|
|||||||
package org.jetbrains.kotlin.idea.folding
|
package org.jetbrains.kotlin.idea.folding
|
||||||
|
|
||||||
import com.intellij.codeInsight.folding.CodeFoldingManager
|
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 com.intellij.openapi.editor.FoldRegion
|
||||||
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
|
|
||||||
import java.io.File
|
|
||||||
import com.intellij.testFramework.fixtures.JavaCodeInsightTestFixture
|
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.folding.AbstractKotlinFoldingTest.doTestWithSettings
|
||||||
import org.jetbrains.kotlin.idea.imports.KotlinImportOptimizer
|
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() {
|
class FoldingAfterOptimizeImportsTest : AbstractKotlinFoldingTest() {
|
||||||
private val fixture: JavaCodeInsightTestFixture
|
private val fixture: JavaCodeInsightTestFixture
|
||||||
@@ -41,11 +39,12 @@ class FoldingAfterOptimizeImportsTest : AbstractKotlinFoldingTest() {
|
|||||||
CodeFoldingManager.getInstance(fixture.project)!!.buildInitialFoldings(editor)
|
CodeFoldingManager.getInstance(fixture.project)!!.buildInitialFoldings(editor)
|
||||||
getFoldingRegion(0).checkRegion(false, findStringWithPrefixes("// REGION BEFORE: "))
|
getFoldingRegion(0).checkRegion(false, findStringWithPrefixes("// REGION BEFORE: "))
|
||||||
|
|
||||||
CommandProcessor.getInstance()?.executeCommand(fixture.project,
|
fixture.project.executeWriteCommand(
|
||||||
KotlinImportOptimizer().processFile(fixture.file),
|
"Optimize import in tests"
|
||||||
"Optimize Imports", null,
|
) { KotlinImportOptimizer().processFile(fixture.file).run() }
|
||||||
UndoConfirmationPolicy.DO_NOT_REQUEST_CONFIRMATION)
|
|
||||||
getFoldingRegion(0).checkRegion(false, findStringWithPrefixes("// REGION AFTER: "))
|
getFoldingRegion(0).checkRegion(false, findStringWithPrefixes("// REGION AFTER: "))
|
||||||
|
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user