diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index f6fa14dc329..2971bb73c52 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -105,6 +105,7 @@ class QuickFixRegistrar : QuickFixContributor { val removeRedundantModifierFactory = RemoveModifierFix.createRemoveModifierFactory(true) REDUNDANT_MODIFIER.registerFactory(removeRedundantModifierFactory) REDUNDANT_OPEN_IN_INTERFACE.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OPEN_KEYWORD)) + UNNECESSARY_LATEINIT.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerFactory(LATEINIT_KEYWORD)) REDUNDANT_PROJECTION.registerFactory(RemoveModifierFix.createRemoveProjectionFactory(true)) INCOMPATIBLE_MODIFIERS.registerFactory(RemoveModifierFix.createRemoveModifierFactory(false)) diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithConstructor.kt b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithConstructor.kt new file mode 100644 index 00000000000..7b0afbc7942 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithConstructor.kt @@ -0,0 +1,9 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + lateinit var bar: String + + constructor(baz: Int) { + bar = "" + } +} diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithConstructor.kt.after b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithConstructor.kt.after new file mode 100644 index 00000000000..b52aa46ef44 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithConstructor.kt.after @@ -0,0 +1,9 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + var bar: String + + constructor(baz: Int) { + bar = "" + } +} diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithInit.kt b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithInit.kt new file mode 100644 index 00000000000..e7aeeddb8bc --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithInit.kt @@ -0,0 +1,9 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + lateinit var bar: String + + init { + bar = "" + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithInit.kt.after b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithInit.kt.after new file mode 100644 index 00000000000..e859c66a3ec --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithInit.kt.after @@ -0,0 +1,9 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + var bar: String + + init { + bar = "" + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructors.kt b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructors.kt new file mode 100644 index 00000000000..66bc38f2f17 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructors.kt @@ -0,0 +1,13 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + lateinit var bar: String + + constructor() { + bar = "" + } + + constructor(baz: Int) { + bar = "" + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructors.kt.after b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructors.kt.after new file mode 100644 index 00000000000..27c7c521fd4 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructors.kt.after @@ -0,0 +1,13 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + var bar: String + + constructor() { + bar = "" + } + + constructor(baz: Int) { + bar = "" + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructorsAndDelegation.kt b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructorsAndDelegation.kt new file mode 100644 index 00000000000..8c51b726e04 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructorsAndDelegation.kt @@ -0,0 +1,15 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + lateinit var bar: String + + constructor() { + bar = "" + } + + constructor(a: Int) : this() { + } + + constructor(a: Int, b: Int) : this(a) { + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructorsAndDelegation.kt.after b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructorsAndDelegation.kt.after new file mode 100644 index 00000000000..5df792131d9 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructorsAndDelegation.kt.after @@ -0,0 +1,15 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + var bar: String + + constructor() { + bar = "" + } + + constructor(a: Int) : this() { + } + + constructor(a: Int, b: Int) : this(a) { + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleInit.kt b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleInit.kt new file mode 100644 index 00000000000..26607b0e947 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleInit.kt @@ -0,0 +1,14 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + lateinit var bar: String + var baz: Int + + init { + baz = 1 + } + + init { + bar = "" + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleInit.kt.after b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleInit.kt.after new file mode 100644 index 00000000000..72fd993ff22 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleInit.kt.after @@ -0,0 +1,14 @@ +// "Remove 'lateinit' modifier" "true" + +class Foo { + var bar: String + var baz: Int + + init { + baz = 1 + } + + init { + bar = "" + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/unnecessaryLateinit/secondaryConstructorDelegateItself.kt b/idea/testData/quickfix/unnecessaryLateinit/secondaryConstructorDelegateItself.kt new file mode 100644 index 00000000000..a98a1e8bb28 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/secondaryConstructorDelegateItself.kt @@ -0,0 +1,14 @@ +// "Remove 'lateinit' modifier" "true" +// ERROR: There's a cycle in the delegation calls chain + +class Foo { + lateinit var bar: String + + constructor() { + bar = "" + } + + constructor(a: Int) : this(a) { + bar = "a" + } +} diff --git a/idea/testData/quickfix/unnecessaryLateinit/secondaryConstructorDelegateItself.kt.after b/idea/testData/quickfix/unnecessaryLateinit/secondaryConstructorDelegateItself.kt.after new file mode 100644 index 00000000000..1bb936d17f3 --- /dev/null +++ b/idea/testData/quickfix/unnecessaryLateinit/secondaryConstructorDelegateItself.kt.after @@ -0,0 +1,14 @@ +// "Remove 'lateinit' modifier" "true" +// ERROR: There's a cycle in the delegation calls chain + +class Foo { + var bar: String + + constructor() { + bar = "" + } + + constructor(a: Int) : this(a) { + bar = "a" + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 38a41e00d53..aa7e67f527f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9362,6 +9362,51 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/unnecessaryLateinit") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class UnnecessaryLateinit extends AbstractQuickFixTest { + public void testAllFilesPresentInUnnecessaryLateinit() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/unnecessaryLateinit"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); + } + + @TestMetadata("lateinitWithConstructor.kt") + public void testLateinitWithConstructor() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/unnecessaryLateinit/lateinitWithConstructor.kt"); + doTest(fileName); + } + + @TestMetadata("lateinitWithInit.kt") + public void testLateinitWithInit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/unnecessaryLateinit/lateinitWithInit.kt"); + doTest(fileName); + } + + @TestMetadata("lateinitWithMultipleConstructors.kt") + public void testLateinitWithMultipleConstructors() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructors.kt"); + doTest(fileName); + } + + @TestMetadata("lateinitWithMultipleConstructorsAndDelegation.kt") + public void testLateinitWithMultipleConstructorsAndDelegation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleConstructorsAndDelegation.kt"); + doTest(fileName); + } + + @TestMetadata("lateinitWithMultipleInit.kt") + public void testLateinitWithMultipleInit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/unnecessaryLateinit/lateinitWithMultipleInit.kt"); + doTest(fileName); + } + + @TestMetadata("secondaryConstructorDelegateItself.kt") + public void testSecondaryConstructorDelegateItself() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/unnecessaryLateinit/secondaryConstructorDelegateItself.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/unusedSuppressAnnotation") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)