diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/KotlinAddImportAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/KotlinAddImportAction.kt index 1afc7304a1d..9a423d0c8ad 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/KotlinAddImportAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/KotlinAddImportAction.kt @@ -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 diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt index c685dc3a01c..877b9f7b7fb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt @@ -127,9 +127,9 @@ internal abstract class ImportFixBase 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) } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinReferenceImporter.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinReferenceImporter.kt index bd8eba38d2a..30ad9940d4c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinReferenceImporter.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinReferenceImporter.kt @@ -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? = 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? { + var importFix: ImportFixBase? = null + DaemonCodeAnalyzerEx.processHighlights(editor.document, file.project, null, offset, offset) { info -> + importFix = info.quickFixActionRanges.map { it.first.action }.filterIsInstance>().firstOrNull() + importFix == null + } + return importFix + } + companion object { // TODO: use in table cell