FIR IDE: Enable add initializer quickfix for MUST_BE_INITIALIZED.

This commit is contained in:
Mark Punzalan
2021-06-05 06:47:48 +00:00
committed by teamcityserver
parent bb2246ebaf
commit befa8aaac7
14 changed files with 23 additions and 29 deletions
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.idea.fir.api.fixes.KtQuickFixesList
import org.jetbrains.kotlin.idea.fir.api.fixes.KtQuickFixesListBuilder import org.jetbrains.kotlin.idea.fir.api.fixes.KtQuickFixesListBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.diagnostics.KtFirDiagnostic import org.jetbrains.kotlin.idea.frontend.api.fir.diagnostics.KtFirDiagnostic
import org.jetbrains.kotlin.idea.quickfix.fixes.* import org.jetbrains.kotlin.idea.quickfix.fixes.*
import org.jetbrains.kotlin.idea.quickfix.fixes.InitializePropertyQuickFixFactory
class MainKtQuickFixRegistrar : KtQuickFixRegistrar() { class MainKtQuickFixRegistrar : KtQuickFixRegistrar() {
private val keywords = KtQuickFixesListBuilder.registerPsiQuickFix { private val keywords = KtQuickFixesListBuilder.registerPsiQuickFix {
@@ -74,7 +73,7 @@ class MainKtQuickFixRegistrar : KtQuickFixRegistrar() {
KtFirDiagnostic.MustBeInitializedOrBeAbstract::class, KtFirDiagnostic.MustBeInitializedOrBeAbstract::class,
AddModifierFix.addAbstractModifier, AddModifierFix.addAbstractModifier,
) )
registerApplicator(InitializePropertyQuickFixFactory.initializePropertyFactory) registerApplicators(InitializePropertyQuickFixFactories.initializePropertyFactory)
registerApplicator(AddLateInitFactory.addLateInitFactory) registerApplicator(AddLateInitFactory.addLateInitFactory)
registerApplicator(AddAccessorsFactories.addAccessorsToUninitializedProperty) registerApplicator(AddAccessorsFactories.addAccessorsToUninitializedProperty)
} }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.idea.api.applicator.HLApplicator
import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput import org.jetbrains.kotlin.idea.api.applicator.HLApplicatorInput
import org.jetbrains.kotlin.idea.api.applicator.applicator import org.jetbrains.kotlin.idea.api.applicator.applicator
import org.jetbrains.kotlin.idea.fir.api.fixes.HLQuickFix import org.jetbrains.kotlin.idea.fir.api.fixes.HLQuickFix
import org.jetbrains.kotlin.idea.fir.api.fixes.diagnosticFixFactory import org.jetbrains.kotlin.idea.fir.api.fixes.diagnosticFixFactories
import org.jetbrains.kotlin.idea.frontend.api.fir.diagnostics.KtFirDiagnostic import org.jetbrains.kotlin.idea.frontend.api.fir.diagnostics.KtFirDiagnostic
import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtProperty
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset
object InitializePropertyQuickFixFactory { object InitializePropertyQuickFixFactories {
data class AddInitializerInput(val initializerText: String?) : HLApplicatorInput data class AddInitializerInput(val initializerText: String?) : HLApplicatorInput
@@ -38,8 +38,15 @@ object InitializePropertyQuickFixFactory {
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
val initializePropertyFactory = val initializePropertyFactory =
diagnosticFixFactory(KtFirDiagnostic.MustBeInitializedOrBeAbstract::class) { diagnostic -> diagnosticFixFactories(
KtFirDiagnostic.MustBeInitialized::class,
KtFirDiagnostic.MustBeInitializedOrBeAbstract::class
) { diagnostic ->
val property: KtProperty = diagnostic.psi val property: KtProperty = diagnostic.psi
// An extension property cannot be initialized because it has no backing field
if (property.receiverTypeReference != null) return@diagnosticFixFactories emptyList()
buildList { buildList {
add( add(
HLQuickFix( HLQuickFix(
@@ -2,5 +2,4 @@
class A { class A {
<caret>var n: Int <caret>var n: Int
get() = 1 get() = 1
} }
/* IGNORE_FIR */
@@ -2,5 +2,4 @@
class A { class A {
var n: Int = <selection>0</selection><caret> var n: Int = <selection>0</selection><caret>
get() = 1 get() = 1
} }
/* IGNORE_FIR */
@@ -2,5 +2,4 @@
class A { class A {
<caret>var n: Int <caret>var n: Int
set(value: Int) {} set(value: Int) {}
} }
/* IGNORE_FIR */
@@ -2,5 +2,4 @@
class A { class A {
var n: Int = <selection>0</selection><caret> var n: Int = <selection>0</selection><caret>
set(value: Int) {} set(value: Int) {}
} }
/* IGNORE_FIR */
+1 -2
View File
@@ -1,3 +1,2 @@
// "Add initializer" "true" // "Add initializer" "true"
<caret>val n: Int <caret>val n: Int
/* IGNORE_FIR */
@@ -1,3 +1,2 @@
// "Add initializer" "true" // "Add initializer" "true"
val n: Int = <selection>0</selection><caret> val n: Int = <selection>0</selection><caret>
/* IGNORE_FIR */
@@ -1,5 +1,4 @@
// "Add initializer" "true" // "Add initializer" "true"
// WITH_RUNTIME // WITH_RUNTIME
class A class A
<caret>var label: A <caret>var label: A
/* IGNORE_FIR */
@@ -1,5 +1,4 @@
// "Add initializer" "true" // "Add initializer" "true"
// WITH_RUNTIME // WITH_RUNTIME
class A class A
var label: A = TODO() var label: A = TODO()
/* IGNORE_FIR */
@@ -1,4 +1,3 @@
// "Add initializer" "true" // "Add initializer" "true"
<caret>var n: Int <caret>var n: Int
get() = 1 get() = 1
/* IGNORE_FIR */
@@ -1,4 +1,3 @@
// "Add initializer" "true" // "Add initializer" "true"
var n: Int = <selection>0</selection><caret> var n: Int = <selection>0</selection><caret>
get() = 1 get() = 1
/* IGNORE_FIR */
@@ -1,4 +1,3 @@
// "Add initializer" "true" // "Add initializer" "true"
<caret>var n: Int <caret>var n: Int
set(value: Int) {} set(value: Int) {}
/* IGNORE_FIR */
@@ -1,4 +1,3 @@
// "Add initializer" "true" // "Add initializer" "true"
var n: Int = <selection>0</selection><caret> var n: Int = <selection>0</selection><caret>
set(value: Int) {} set(value: Int) {}
/* IGNORE_FIR */