diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 537d593778b..bc426483ce7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -469,6 +469,7 @@ class QuickFixRegistrar : QuickFixContributor { INAPPLICABLE_LATEINIT_MODIFIER.registerFactory(ChangeVariableMutabilityFix.LATEINIT_VAL_FACTORY) INAPPLICABLE_LATEINIT_MODIFIER.registerFactory(RemoveNullableFix.LATEINIT_FACTORY) + INAPPLICABLE_LATEINIT_MODIFIER.registerFactory(RemovePartsFromPropertyFix.createLateInitFactory()) OVERLOADS_ABSTRACT.registerFactory(RemoveAnnotationFix.JvmOverloads) OVERLOADS_INTERFACE.registerFactory(RemoveAnnotationFix.JvmOverloads) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.java b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.java index c0c1a9c6ea9..71655ea5d13 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.java +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemovePartsFromPropertyFix.java @@ -24,6 +24,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.diagnostics.Diagnostic; +import org.jetbrains.kotlin.diagnostics.Errors; import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil; import org.jetbrains.kotlin.idea.intentions.SpecifyTypeExplicitlyIntention; @@ -135,4 +136,23 @@ public class RemovePartsFromPropertyFix extends KotlinQuickFixAction } }; } + + public static KotlinSingleIntentionActionFactory createLateInitFactory() { + return new KotlinSingleIntentionActionFactory() { + @Override + public KotlinQuickFixAction createAction(@NotNull Diagnostic diagnostic) { + PsiElement element = Errors.INAPPLICABLE_LATEINIT_MODIFIER.cast(diagnostic).getPsiElement(); + KtProperty property = PsiTreeUtil.getParentOfType(element, KtProperty.class); + if (property == null) return null; + + boolean hasInitializer = property.hasInitializer(); + boolean hasGetter = property.getGetter() != null && property.getGetter().getBodyExpression() != null; + boolean hasSetter = property.getSetter() != null && property.getSetter().getBodyExpression() != null; + if (!hasInitializer && !hasGetter && !hasSetter) return null; + + return new RemovePartsFromPropertyFix(property, hasInitializer, hasGetter, hasSetter); + } + }; + } + } diff --git a/idea/testData/quickfix/lateinit/withGetter.kt b/idea/testData/quickfix/lateinit/withGetter.kt new file mode 100644 index 00000000000..198aab17e0d --- /dev/null +++ b/idea/testData/quickfix/lateinit/withGetter.kt @@ -0,0 +1,6 @@ +// "Remove getter from property" "true" + +class A { + lateinit var str: String + get() = "" +} \ No newline at end of file diff --git a/idea/testData/quickfix/lateinit/withGetter.kt.after b/idea/testData/quickfix/lateinit/withGetter.kt.after new file mode 100644 index 00000000000..9569b3b1e29 --- /dev/null +++ b/idea/testData/quickfix/lateinit/withGetter.kt.after @@ -0,0 +1,6 @@ +// "Remove getter from property" "true" + +class A { + lateinit var str: String + +} \ No newline at end of file diff --git a/idea/testData/quickfix/lateinit/withGetterSetter.kt b/idea/testData/quickfix/lateinit/withGetterSetter.kt new file mode 100644 index 00000000000..b7fdf0ff95a --- /dev/null +++ b/idea/testData/quickfix/lateinit/withGetterSetter.kt @@ -0,0 +1,7 @@ +// "Remove getter and setter from property" "true" + +class A { + lateinit var str: String + get() = "" + set(value) {} +} \ No newline at end of file diff --git a/idea/testData/quickfix/lateinit/withGetterSetter.kt.after b/idea/testData/quickfix/lateinit/withGetterSetter.kt.after new file mode 100644 index 00000000000..17542b060ab --- /dev/null +++ b/idea/testData/quickfix/lateinit/withGetterSetter.kt.after @@ -0,0 +1,6 @@ +// "Remove getter and setter from property" "true" + +class A { + lateinit var str: String + +} \ No newline at end of file diff --git a/idea/testData/quickfix/lateinit/withInitializer.kt b/idea/testData/quickfix/lateinit/withInitializer.kt new file mode 100644 index 00000000000..18ad2b5d7d2 --- /dev/null +++ b/idea/testData/quickfix/lateinit/withInitializer.kt @@ -0,0 +1,5 @@ +// "Remove initializer from property" "true" + +class A { + lateinit var str = "" +} \ No newline at end of file diff --git a/idea/testData/quickfix/lateinit/withInitializer.kt.after b/idea/testData/quickfix/lateinit/withInitializer.kt.after new file mode 100644 index 00000000000..b44ecb8bfb8 --- /dev/null +++ b/idea/testData/quickfix/lateinit/withInitializer.kt.after @@ -0,0 +1,5 @@ +// "Remove initializer from property" "true" + +class A { + lateinit var str: String +} \ No newline at end of file diff --git a/idea/testData/quickfix/lateinit/withSetter.kt b/idea/testData/quickfix/lateinit/withSetter.kt new file mode 100644 index 00000000000..3548ee72331 --- /dev/null +++ b/idea/testData/quickfix/lateinit/withSetter.kt @@ -0,0 +1,6 @@ +// "Remove setter from property" "true" + +class A { + lateinit var str: String + set(value) {} +} \ No newline at end of file diff --git a/idea/testData/quickfix/lateinit/withSetter.kt.after b/idea/testData/quickfix/lateinit/withSetter.kt.after new file mode 100644 index 00000000000..8cba5136811 --- /dev/null +++ b/idea/testData/quickfix/lateinit/withSetter.kt.after @@ -0,0 +1,6 @@ +// "Remove setter from property" "true" + +class A { + lateinit var str: String + +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 9d1b2967ee4..0647a06f7e9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6580,6 +6580,30 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/lateinit/val.kt"); doTest(fileName); } + + @TestMetadata("withGetter.kt") + public void testWithGetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/lateinit/withGetter.kt"); + doTest(fileName); + } + + @TestMetadata("withGetterSetter.kt") + public void testWithGetterSetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/lateinit/withGetterSetter.kt"); + doTest(fileName); + } + + @TestMetadata("withInitializer.kt") + public void testWithInitializer() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/lateinit/withInitializer.kt"); + doTest(fileName); + } + + @TestMetadata("withSetter.kt") + public void testWithSetter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/lateinit/withSetter.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/leakingThis")