From cf56c59ca24c822157b7bd2f61504236cf14317f Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 4 Feb 2021 12:14:48 +0100 Subject: [PATCH] Fix binary incompatibility of createRemoveModifierFromListOwnerFactory --- .../jetbrains/kotlin/idea/quickfix/QuickFixes.kt | 4 ++++ .../kotlin/idea/quickfix/AddModifierFix.kt | 2 +- .../KotlinSingleIntentionActionFactory.kt | 16 ++++++++++++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 13 +++++++------ .../kotlin/idea/quickfix/RemoveModifierFix.kt | 12 ++++++++++++ .../nj2k/postProcessing/J2kPostProcessor.kt | 2 +- .../quickfixes/ParcelableQuickFixContributor.kt | 2 +- .../quickfixes/ParcelizeQuickFixContributor.kt | 2 +- 8 files changed, 43 insertions(+), 10 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/QuickFixes.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/QuickFixes.kt index f115c3cbbab..8a32429ddb3 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/QuickFixes.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/QuickFixes.kt @@ -27,6 +27,10 @@ class QuickFixes { factories.putAll(diagnosticFactory, factory.map { it.asKotlinIntentionActionsFactory() }) } + fun register(diagnosticFactory: DiagnosticFactory<*>, vararg factory: KotlinIntentionActionsFactory) { + factories.putAll(diagnosticFactory, factory.toList()) + } + fun register(diagnosticFactory: DiagnosticFactory<*>, vararg action: IntentionAction) { actions.putAll(diagnosticFactory, action.toList()) } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt index 053596ae436..13f9422221e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddModifierFix.kt @@ -43,7 +43,7 @@ import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.TypeUtils -open class AddModifierFix( + open class AddModifierFix( element: KtModifierListOwner, protected val modifier: KtModifierKeywordToken ) : KotlinCrossLanguageQuickFixAction(element), KotlinUniversalQuickFix { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinSingleIntentionActionFactory.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinSingleIntentionActionFactory.kt index aaddf121d8e..706baf8857c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinSingleIntentionActionFactory.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/KotlinSingleIntentionActionFactory.kt @@ -17,10 +17,26 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.Diagnostic abstract class KotlinSingleIntentionActionFactory : KotlinIntentionActionsFactory() { protected abstract fun createAction(diagnostic: Diagnostic): IntentionAction? final override fun doCreateActions(diagnostic: Diagnostic): List = listOfNotNull(createAction(diagnostic)) + + companion object { + inline fun createFromQuickFixesPsiBasedFactory( + psiBasedFactory: QuickFixesPsiBasedFactory + ): KotlinSingleIntentionActionFactory = object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val factories = psiBasedFactory.createQuickFix(diagnostic.psiElement as PSI) + return when (factories.size) { + 0 -> null + 1 -> factories.single() + else -> error("To convert QuickFixesPsiBasedFactory to KotlinSingleIntentionActionFactory, it should always return one or zero quickfixes") + } + } + } + } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 82b20256d8e..184884ceaa7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.idea.inspections.InfixCallFixActionFactory import org.jetbrains.kotlin.idea.inspections.PlatformUnresolvedProvider import org.jetbrains.kotlin.idea.inspections.RemoveAnnotationFix import org.jetbrains.kotlin.idea.intentions.* +import org.jetbrains.kotlin.idea.quickfix.RemoveModifierFix.Companion.createRemoveModifierFromListOwnerPsiBasedFactory import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createCallable.* import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createClass.CreateClassFromCallWithConstructorCalleeActionFactory import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createClass.CreateClassFromConstructorCallActionFactory @@ -64,7 +65,7 @@ class QuickFixRegistrar : QuickFixContributor { quickFixes.register(this, *action) } - val removeAbstractModifierFactory = RemoveModifierFix.createRemoveModifierFromListOwnerFactory(ABSTRACT_KEYWORD) + val removeAbstractModifierFactory = createRemoveModifierFromListOwnerPsiBasedFactory(ABSTRACT_KEYWORD ) val addAbstractModifierFactory = AddModifierFix.createFactory(ABSTRACT_KEYWORD) ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS.registerFactory(removeAbstractModifierFactory) @@ -98,7 +99,7 @@ class QuickFixRegistrar : QuickFixContributor { NON_MEMBER_FUNCTION_NO_BODY.registerFactory(AddFunctionBodyFix) NOTHING_TO_OVERRIDE.registerFactory( - RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OVERRIDE_KEYWORD), + RemoveModifierFix.createRemoveModifierFromListOwnerPsiBasedFactory(OVERRIDE_KEYWORD), ChangeMemberFunctionSignatureFix, AddFunctionToSupertypeFix, AddPropertyToSupertypeFix @@ -117,15 +118,15 @@ class QuickFixRegistrar : QuickFixContributor { val removeRedundantModifierFactory = RemoveModifierFix.createRemoveModifierFactory(true) REDUNDANT_MODIFIER.registerFactory(removeRedundantModifierFactory) - REDUNDANT_OPEN_IN_INTERFACE.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OPEN_KEYWORD, true)) + REDUNDANT_OPEN_IN_INTERFACE.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerPsiBasedFactory(OPEN_KEYWORD, true)) REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE.registerFactory(RemoveModifierFix.createRemoveSuspendFactory()) - UNNECESSARY_LATEINIT.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerFactory(LATEINIT_KEYWORD)) + UNNECESSARY_LATEINIT.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerPsiBasedFactory(LATEINIT_KEYWORD)) REDUNDANT_PROJECTION.registerFactory(RemoveModifierFix.createRemoveProjectionFactory(true)) INCOMPATIBLE_MODIFIERS.registerFactory(RemoveModifierFix.createRemoveModifierFactory(false)) VARIANCE_ON_TYPE_PARAMETER_NOT_ALLOWED.registerFactory(RemoveModifierFix.createRemoveVarianceFactory()) - val removeOpenModifierFactory = RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OPEN_KEYWORD) + val removeOpenModifierFactory = RemoveModifierFix.createRemoveModifierFromListOwnerPsiBasedFactory(OPEN_KEYWORD) NON_FINAL_MEMBER_IN_FINAL_CLASS.registerFactory( AddModifierFix.createFactory(OPEN_KEYWORD, KtClass::class.java), removeOpenModifierFactory @@ -539,7 +540,7 @@ class QuickFixRegistrar : QuickFixContributor { OVERLOADS_ANNOTATION_CLASS_CONSTRUCTOR.registerFactory(RemoveAnnotationFix.JvmOverloads) OVERLOADS_ANNOTATION_CLASS_CONSTRUCTOR_WARNING.registerFactory(RemoveAnnotationFix.JvmOverloads) - ACTUAL_WITHOUT_EXPECT.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerFactory(ACTUAL_KEYWORD)) + ACTUAL_WITHOUT_EXPECT.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerPsiBasedFactory(ACTUAL_KEYWORD)) ACTUAL_WITHOUT_EXPECT.registerFactory(CreateExpectedFix) NO_ACTUAL_FOR_EXPECT.registerFactory(CreateActualFix) NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS.registerFactory(AddActualFix) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt index da71a2b01c3..20bae155702 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt @@ -50,9 +50,21 @@ class RemoveModifierFix( } companion object { + @Deprecated( + "For binary compatibility", + replaceWith = ReplaceWith("createRemoveModifierFromListOwnerPsiBasedFactory(modifier, isRedundant)") + ) fun createRemoveModifierFromListOwnerFactory( modifier: KtModifierKeywordToken, isRedundant: Boolean = false + ): KotlinSingleIntentionActionFactory = + KotlinSingleIntentionActionFactory.createFromQuickFixesPsiBasedFactory( + createRemoveModifierFromListOwnerPsiBasedFactory(modifier, isRedundant) + ) + + fun createRemoveModifierFromListOwnerPsiBasedFactory( + modifier: KtModifierKeywordToken, + isRedundant: Boolean = false ): QuickFixesPsiBasedFactory = createRemoveModifierFromListOwnerFactoryByModifierListOwner( modifier, diff --git a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/J2kPostProcessor.kt b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/J2kPostProcessor.kt index 64e78bf12ca..0dde6f9dfb7 100644 --- a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/J2kPostProcessor.kt +++ b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/J2kPostProcessor.kt @@ -133,7 +133,7 @@ private val errorsFixingDiagnosticBasedPostProcessingGroup = Errors.VIRTUAL_MEMBER_HIDDEN ), diagnosticBasedProcessing( - RemoveModifierFix.createRemoveModifierFromListOwnerFactory(KtTokens.OPEN_KEYWORD), + RemoveModifierFix.createRemoveModifierFromListOwnerPsiBasedFactory(KtTokens.OPEN_KEYWORD), Errors.NON_FINAL_MEMBER_IN_FINAL_CLASS, Errors.NON_FINAL_MEMBER_IN_OBJECT ), diagnosticBasedProcessing( diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableQuickFixContributor.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableQuickFixContributor.kt index 727fa4f7d88..a0366b07c87 100644 --- a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableQuickFixContributor.kt +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/parcel/quickfixes/ParcelableQuickFixContributor.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.lexer.KtTokens class ParcelableQuickFixContributor : QuickFixContributor { override fun registerQuickFixes(quickFixes: QuickFixes) { quickFixes.register(ErrorsAndroid.PARCELABLE_CANT_BE_INNER_CLASS, - RemoveModifierFix.createRemoveModifierFromListOwnerFactory(KtTokens.INNER_KEYWORD, false)) + RemoveModifierFix.createRemoveModifierFromListOwnerPsiBasedFactory(KtTokens.INNER_KEYWORD, false)) quickFixes.register(ErrorsAndroid.NO_PARCELABLE_SUPERTYPE, ParcelableAddSupertypeQuickfix.Factory) quickFixes.register(ErrorsAndroid.PARCELABLE_SHOULD_HAVE_PRIMARY_CONSTRUCTOR, ParcelableAddPrimaryConstructorQuickfix.Factory) diff --git a/plugins/parcelize/parcelize-ide/src/org/jetbrains/kotlin/parcelize/ide/quickfixes/ParcelizeQuickFixContributor.kt b/plugins/parcelize/parcelize-ide/src/org/jetbrains/kotlin/parcelize/ide/quickfixes/ParcelizeQuickFixContributor.kt index 2c6da3b93b4..9625e4d7e52 100644 --- a/plugins/parcelize/parcelize-ide/src/org/jetbrains/kotlin/parcelize/ide/quickfixes/ParcelizeQuickFixContributor.kt +++ b/plugins/parcelize/parcelize-ide/src/org/jetbrains/kotlin/parcelize/ide/quickfixes/ParcelizeQuickFixContributor.kt @@ -26,7 +26,7 @@ class ParcelizeQuickFixContributor : QuickFixContributor { override fun registerQuickFixes(quickFixes: QuickFixes) { quickFixes.register( ErrorsParcelize.PARCELABLE_CANT_BE_INNER_CLASS, - RemoveModifierFix.createRemoveModifierFromListOwnerFactory(KtTokens.INNER_KEYWORD, false) + RemoveModifierFix.createRemoveModifierFromListOwnerPsiBasedFactory(KtTokens.INNER_KEYWORD, false) ) quickFixes.register(ErrorsParcelize.NO_PARCELABLE_SUPERTYPE, ParcelizeAddSupertypeQuickFix.Factory)