From df23ff347367c717bbcdb8e4953e1a172caac024 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 18 Mar 2015 11:56:34 +0300 Subject: [PATCH] Improve AddInitKeyword quickfix - Extract quickfix method - Delete redundant semicolon - Do not replace initializer PSI element --- .../kotlin/psi/JetClassInitializer.java | 7 ++++- .../org/jetbrains/kotlin/psi/JetPsiFactory.kt | 4 ++- .../kotlin/psi/psiUtil/jetPsiUtil.kt | 8 +++++ .../kotlin/idea/JetBundle.properties | 1 + .../kotlin/idea/quickfix/AddInitKeywordFix.kt | 30 +++++++++++-------- .../idea/quickfix/QuickFixRegistrar.java | 2 +- .../afterAddInitKeywordRemoveSemicolon.kt | 9 ++++++ ...erAddInitKeywordRemoveSemicolonSameLine.kt | 9 ++++++ .../beforeAddInitKeywordRemoveSemicolon.kt | 9 ++++++ ...reAddInitKeywordRemoveSemicolonSameLine.kt | 8 +++++ .../idea/quickfix/QuickFixTestGenerated.java | 12 ++++++++ 11 files changed, 83 insertions(+), 16 deletions(-) create mode 100644 idea/testData/quickfix/modifiers/afterAddInitKeywordRemoveSemicolon.kt create mode 100644 idea/testData/quickfix/modifiers/afterAddInitKeywordRemoveSemicolonSameLine.kt create mode 100644 idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolon.kt create mode 100644 idea/testData/quickfix/modifiers/beforeAddInitKeywordRemoveSemicolonSameLine.kt 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");