From fd6512651c1728619f3b655976d3ffaa795263cd Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Thu, 20 Apr 2023 11:56:21 +0200 Subject: [PATCH] [kotlin] Make CreateCallableMemberFromUsageFactories as UnresolvedReferenceQuickFixFactory When reported diagnostic element is a reference #KTIJ-25219 GitOrigin-RevId: 63b6b68b3ed4479ed2d8c0c6175eeca982c7eec3 --- .../idea/base/fe10/codeInsight/Fe10QuickFixProviderImpl.kt | 6 +++++- .../idea/highlighter/AbstractKotlinHighlightVisitor.kt | 2 +- .../org/jetbrains/kotlin/idea/quickfix/AbstractImportFix.kt | 2 +- .../createCallable/CreateCallableMemberFromUsageFactory.kt | 3 ++- .../tests/testData/quickfix/autoImports/noImportForIndex.kt | 2 ++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/plugins/kotlin/base/fe10/code-insight/src/org/jetbrains/kotlin/idea/base/fe10/codeInsight/Fe10QuickFixProviderImpl.kt b/plugins/kotlin/base/fe10/code-insight/src/org/jetbrains/kotlin/idea/base/fe10/codeInsight/Fe10QuickFixProviderImpl.kt index ab1630315be8..25a40476035b 100644 --- a/plugins/kotlin/base/fe10/code-insight/src/org/jetbrains/kotlin/idea/base/fe10/codeInsight/Fe10QuickFixProviderImpl.kt +++ b/plugins/kotlin/base/fe10/code-insight/src/org/jetbrains/kotlin/idea/base/fe10/codeInsight/Fe10QuickFixProviderImpl.kt @@ -33,7 +33,11 @@ class Fe10QuickFixProviderImpl : Fe10QuickFixProvider { val first = diagnostics.first() for (intentionActionsFactory in intentionActionsFactories) { if ((unresolvedReferenceQuickFixOnly || replaceUnresolvedReferenceQuickFix) && intentionActionsFactory is UnresolvedReferenceQuickFixFactory) { - if (unresolvedReferenceQuickFixOnly || intentionActionsFactory.areActionsAvailable(first)) { + if ( + // UnresolvedReferenceQuickFixUpdater works only when reference is available + first.psiElement.reference != null && + (unresolvedReferenceQuickFixOnly || intentionActionsFactory.areActionsAvailable(first)) + ) { actions.putValue(first, RegisterQuickFixesLaterIntentionAction) if (unresolvedReferenceQuickFixOnly) break continue diff --git a/plugins/kotlin/base/fe10/highlighting/src/org/jetbrains/kotlin/idea/highlighter/AbstractKotlinHighlightVisitor.kt b/plugins/kotlin/base/fe10/highlighting/src/org/jetbrains/kotlin/idea/highlighter/AbstractKotlinHighlightVisitor.kt index 04decdae866a..46b8104744d7 100644 --- a/plugins/kotlin/base/fe10/highlighting/src/org/jetbrains/kotlin/idea/highlighter/AbstractKotlinHighlightVisitor.kt +++ b/plugins/kotlin/base/fe10/highlighting/src/org/jetbrains/kotlin/idea/highlighter/AbstractKotlinHighlightVisitor.kt @@ -76,7 +76,7 @@ abstract class AbstractKotlinHighlightVisitor : HighlightVisitor { // annotate diagnostics on fly: show diagnostics as soon as front-end reports them // don't create quick fixes as it could require some resolve - val highlightInfoByDiagnostic = mutableMapOf() + val highlightInfoByDiagnostic = HashMap() // render of on-fly diagnostics with descriptors could lead to recursion fun checkIfDescriptor(candidate: Any?): Boolean = diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AbstractImportFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AbstractImportFix.kt index 06d316d43d0d..960607745bc5 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AbstractImportFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/AbstractImportFix.kt @@ -140,7 +140,7 @@ internal abstract class ImportFixBase protected constructor( @IntentionName private fun calculateText(suggestionDescriptors: Collection): String { val descriptors = - suggestionDescriptors.mapTo(hashSetOf()) { it.original } + suggestionDescriptors.mapTo(hashSetOf()) { it.original }.takeIf { it.isNotEmpty() } ?: return "" val ktFile = element?.containingKtFile ?: return KotlinBundle.message("fix.import") val languageVersionSettings = ktFile.languageVersionSettings diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableMemberFromUsageFactory.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableMemberFromUsageFactory.kt index 0e2d632e9084..61510f37cdf3 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableMemberFromUsageFactory.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/createCallable/CreateCallableMemberFromUsageFactory.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable import com.intellij.codeInsight.intention.IntentionAction import com.intellij.psi.SmartPsiElementPointer import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.codeinsight.api.classic.quickfixes.UnresolvedReferenceQuickFixFactory import org.jetbrains.kotlin.idea.quickfix.IntentionActionPriority import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionFactoryWithDelegate import org.jetbrains.kotlin.idea.quickfix.QuickFixWithDelegateFactory @@ -14,7 +15,7 @@ import org.jetbrains.kotlin.psi.KtElement abstract class CreateCallableMemberFromUsageFactory( private val extensionsSupported: Boolean = true -) : KotlinIntentionActionFactoryWithDelegate>() { +) : KotlinIntentionActionFactoryWithDelegate>(), UnresolvedReferenceQuickFixFactory { private fun newCallableQuickFix( originalElementPointer: SmartPsiElementPointer, diff --git a/plugins/kotlin/idea/tests/testData/quickfix/autoImports/noImportForIndex.kt b/plugins/kotlin/idea/tests/testData/quickfix/autoImports/noImportForIndex.kt index ec0725dec292..284339808fa7 100644 --- a/plugins/kotlin/idea/tests/testData/quickfix/autoImports/noImportForIndex.kt +++ b/plugins/kotlin/idea/tests/testData/quickfix/autoImports/noImportForIndex.kt @@ -1,4 +1,6 @@ // "Import" "false" +// ACTION: Create extension function 'Some.get' +// ACTION: Create member function 'Some.get' // ERROR: Unresolved reference: some[12] // ERROR: No get method providing array access