Fix binary incompatibility of createRemoveModifierFromListOwnerFactory

This commit is contained in:
Ilya Kirillov
2021-02-04 12:14:48 +01:00
parent 8fc6e50dd1
commit cf56c59ca2
8 changed files with 43 additions and 10 deletions
@@ -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())
}
@@ -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<KtModifierListOwner>(element), KotlinUniversalQuickFix {
@@ -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<IntentionAction> = listOfNotNull(createAction(diagnostic))
companion object {
inline fun <reified PSI : PsiElement> createFromQuickFixesPsiBasedFactory(
psiBasedFactory: QuickFixesPsiBasedFactory<PSI>
): 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")
}
}
}
}
}
@@ -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)
@@ -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<PsiElement> =
createRemoveModifierFromListOwnerFactoryByModifierListOwner(
modifier,
@@ -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(
@@ -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)
@@ -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)