diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassInitializer.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassInitializer.java index 82c219a795a..6fe6ff0ec73 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassInitializer.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/JetClassInitializer.java @@ -58,6 +58,11 @@ public class JetClassInitializer extends JetDeclarationStub(element) { override fun getText() = JetBundle.message("add.init.keyword") - override fun getFamilyName() = JetBundle.message("add.init.keyword") + override fun getFamilyName() = JetBundle.message("add.init.keyword.family") override fun invoke(project: Project, editor: Editor?, file: JetFile) { - val initializer = element.copy() as JetClassInitializer - val aClass = JetPsiFactory(file).createClass("""class A { - ${initializer.getModifierList()?.getText() ?: ""} init ${initializer.getBody().getText()} - }""" - ) - val newInitializers = aClass.getAnonymousInitializers() - assert(newInitializers.size() == 1) - element.replace(newInitializers[0]) + addInitKeyword(file, element) } - override fun isAvailable(project: Project, editor: Editor?, file: PsiFile?): Boolean { - return super.isAvailable(project, editor, file) - } + class object Factory : JetSingleIntentionActionFactory() { + fun addInitKeyword(file: JetFile, element: JetClassInitializer) { + if (element.hasInitKeyword()) return - class object : JetSingleIntentionActionFactory() { + val psiFactory = JetPsiFactory(file) + val initKeyword = psiFactory.createInitKeyword() + val anchor = element.getBody() + element.addBefore(initKeyword, anchor) + element.addBefore(psiFactory.createWhiteSpace(), anchor) + + val prevLeaf: PsiElement? = element.prevLeafSkipWhitespaces() + if (prevLeaf?.getNode()?.getElementType() == JetTokens.SEMICOLON) { + prevLeaf!!.delete() + } + } override fun createAction(diagnostic: Diagnostic): IntentionAction? { return AddInitKeywordFix(diagnostic.getPsiElement().getNonStrictParentOfType() ?: return null) } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java index 5fd725ce3ee..280f651fcf1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java @@ -300,6 +300,6 @@ public class QuickFixRegistrar { QuickFixes.factories.put(DEPRECATED_CLASS_OBJECT_SYNTAX, ClassObjectToCompanionObjectFix.Factory); QuickFixes.factories.put(DEPRECATED_CLASS_OBJECT_SYNTAX, ClassObjectToCompanionObjectInWholeProjectFix.Factory); - QuickFixes.factories.put(INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED, AddInitKeywordFix.OBJECT$); + QuickFixes.factories.put(INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED, AddInitKeywordFix.Factory); } } diff --git a/idea/testData/quickfix/modifiers/afterAddInitKeywordRemoveSemicolon.kt b/idea/testData/quickfix/modifiers/afterAddInitKeywordRemoveSemicolon.kt new file mode 100644 index 00000000000..e9a3c91bd34 --- /dev/null +++ b/idea/testData/quickfix/modifiers/afterAddInitKeywordRemoveSemicolon.kt @@ -0,0 +1,9 @@ +// "Add 'init' keyword" "true" +fun foo() = 1 +class A { + val prop = foo() + + init { + + } +} diff --git a/idea/testData/quickfix/modifiers/afterAddInitKeywordRemoveSemicolonSameLine.kt b/idea/testData/quickfix/modifiers/afterAddInitKeywordRemoveSemicolonSameLine.kt new file mode 100644 index 00000000000..e9a3c91bd34 --- /dev/null +++ b/idea/testData/quickfix/modifiers/afterAddInitKeywordRemoveSemicolonSameLine.kt @@ -0,0 +1,9 @@ +// "Add 'init' keyword" "true" +fun foo() = 1 +class A { + val prop = foo() + + init { + + } +} diff --git a/idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolon.kt b/idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolon.kt new file mode 100644 index 00000000000..d8d9b260ea3 --- /dev/null +++ b/idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolon.kt @@ -0,0 +1,9 @@ +// "Add 'init' keyword" "true" +fun foo() = 1 +class A { + val prop = foo(); + + { + + } +} diff --git a/idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolonSameLine.kt b/idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolonSameLine.kt new file mode 100644 index 00000000000..0eb341e3a2c --- /dev/null +++ b/idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolonSameLine.kt @@ -0,0 +1,8 @@ +// "Add 'init' keyword" "true" +fun foo() = 1 +class A { + val prop = foo() + ;{ + + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 76b3986d043..23ddb779f60 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -2985,6 +2985,18 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeAddInitKeywordRemoveSemicolon.kt") + public void testAddInitKeywordRemoveSemicolon() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolon.kt"); + doTest(fileName); + } + + @TestMetadata("beforeAddInitKeywordRemoveSemicolonSameLine.kt") + public void testAddInitKeywordRemoveSemicolonSameLine() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolonSameLine.kt"); + doTest(fileName); + } + @TestMetadata("beforeAddInitKeywordWithModifiers.kt") public void testAddInitKeywordWithModifiers() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeAddInitKeywordWithModifiers.kt");