Import reference at offset uses existing import fix (KT-23235)

If we have a valid autoimport fix at given offset, don't recalculate
variants; use existing ones
This commit is contained in:
Dmitry Jemerov
2018-03-27 17:38:27 +02:00
parent 5b04d99eeb
commit 6f1881b9ff
3 changed files with 30 additions and 2 deletions
@@ -140,6 +140,10 @@ class KotlinAddImportAction internal constructor(
return true
}
fun isUnambiguous(): Boolean {
return variants.size == 1
}
override fun execute(): Boolean {
PsiDocumentManager.getInstance(project).commitAllDocuments()
if (!element.isValid) return false
@@ -127,9 +127,9 @@ internal abstract class ImportFixBase<T : KtExpression> protected constructor(
override fun startInWriteAction() = true
private fun isOutdated() = modificationCountOnCreate != PsiModificationTracker.SERVICE.getInstance(project).modificationCount
fun isOutdated() = modificationCountOnCreate != PsiModificationTracker.SERVICE.getInstance(project).modificationCount
protected open fun createAction(project: Project, editor: Editor, element: KtExpression): KotlinAddImportAction {
open fun createAction(project: Project, editor: Editor, element: KtExpression): KotlinAddImportAction {
return createSingleImportAction(project, editor, element, suggestions)
}
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.codeInsight.CodeInsightSettings
import com.intellij.codeInsight.daemon.ReferenceImporter
import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerEx
import com.intellij.codeInsight.daemon.impl.DaemonListeners
import com.intellij.openapi.command.CommandProcessor
import com.intellij.openapi.editor.Editor
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference
import org.jetbrains.kotlin.idea.core.targetDescriptors
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
@@ -45,9 +47,31 @@ class KotlinReferenceImporter : ReferenceImporter {
val nameExpression = file.findElementAt(offset)?.parent as? KtSimpleNameExpression ?: return false
val importFix: ImportFixBase<out KtExpression>? = findImportFixAt(editor, file, offset)
if (importFix != null && !importFix.isOutdated()) {
val addImportAction = importFix.createAction(file.project, editor, nameExpression)
if (addImportAction.isUnambiguous()) {
addImportAction.execute()
}
return true
}
return nameExpression.autoImport(editor, file)
}
private fun findImportFixAt(
editor: Editor,
file: KtFile,
offset: Int
): ImportFixBase<out KtExpression>? {
var importFix: ImportFixBase<out KtExpression>? = null
DaemonCodeAnalyzerEx.processHighlights(editor.document, file.project, null, offset, offset) { info ->
importFix = info.quickFixActionRanges.map { it.first.action }.filterIsInstance<ImportFixBase<*>>().firstOrNull()
importFix == null
}
return importFix
}
companion object {
// TODO: use in table cell