From 1703e16913dd92f07d13bbf19195aeb2eece8576 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Mon, 2 Mar 2015 13:56:52 +0300 Subject: [PATCH] Add quickfix: remove 'init' modifier --- .../kotlin/idea/JetBundle.properties | 1 + .../kotlin/idea/quickfix/AddInitKeywordFix.kt | 55 +++++++++++++++++++ .../idea/quickfix/QuickFixRegistrar.java | 1 + .../quickfix/modifiers/afterAddInitKeyword.kt | 6 ++ .../afterAddInitKeywordWithModifiers.kt | 8 +++ .../modifiers/beforeAddInitKeyword.kt | 6 ++ .../beforeAddInitKeywordWithModifiers.kt | 8 +++ .../idea/quickfix/QuickFixTestGenerated.java | 12 ++++ 8 files changed, 97 insertions(+) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/AddInitKeywordFix.kt create mode 100644 idea/testData/quickfix/modifiers/afterAddInitKeyword.kt create mode 100644 idea/testData/quickfix/modifiers/afterAddInitKeywordWithModifiers.kt create mode 100644 idea/testData/quickfix/modifiers/beforeAddInitKeyword.kt create mode 100644 idea/testData/quickfix/modifiers/beforeAddInitKeywordWithModifiers.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties index f1e470eb67f..cf1f952b361 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties @@ -12,6 +12,7 @@ remove.function.body=Remove function body make.element.modifier=Make {0} {1} add.modifier=Add ''{0}'' modifier add.modifier.family=Add Modifier +add.init.keyword=Add 'init' keyword make.element.in.classifiers.open=Make ''{0}'' in {1} open make.class.annotation.class=Make ''{0}'' an annotation class make.class.annotation.class.family=Make Class an Annotation Class diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddInitKeywordFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddInitKeywordFix.kt new file mode 100644 index 00000000000..34a96cc3ab7 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddInitKeywordFix.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.quickfix + +import org.jetbrains.kotlin.psi.* +import kotlin.platform.* +import org.jetbrains.kotlin.diagnostics.* +import com.intellij.codeInsight.intention.* +import org.jetbrains.kotlin.idea.* +import com.intellij.openapi.project.* +import com.intellij.openapi.editor.* +import com.intellij.psi.* +import org.jetbrains.kotlin.psi.psiUtil.* + + +public class AddInitKeywordFix(element: JetClassInitializer) : JetIntentionAction(element) { + override fun getText() = JetBundle.message("add.init.keyword") + + override fun getFamilyName() = JetBundle.message("add.init.keyword") + + 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]) + } + + override fun isAvailable(project: Project, editor: Editor?, file: PsiFile?): Boolean { + return super.isAvailable(project, editor, file) + } + + class object : JetSingleIntentionActionFactory() { + 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 77320987546..1b171c21d5e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java @@ -298,5 +298,6 @@ public class QuickFixRegistrar { QuickFixes.factories.put(DEPRECATED_CLASS_OBJECT_SYNTAX, ClassObjectToDefaultObjectFix.Factory); QuickFixes.factories.put(DEPRECATED_CLASS_OBJECT_SYNTAX, ClassObjectToDefaultObjectInWholeProjectFix.Factory); + QuickFixes.factories.put(INIT_KEYWORD_BEFORE_CLASS_INITIALIZER_EXPECTED, AddInitKeywordFix.Default); } } diff --git a/idea/testData/quickfix/modifiers/afterAddInitKeyword.kt b/idea/testData/quickfix/modifiers/afterAddInitKeyword.kt new file mode 100644 index 00000000000..3cc90b47262 --- /dev/null +++ b/idea/testData/quickfix/modifiers/afterAddInitKeyword.kt @@ -0,0 +1,6 @@ +// "Add 'init' keyword" "true" +class A { + init { + + } +} diff --git a/idea/testData/quickfix/modifiers/afterAddInitKeywordWithModifiers.kt b/idea/testData/quickfix/modifiers/afterAddInitKeywordWithModifiers.kt new file mode 100644 index 00000000000..a977fa11aad --- /dev/null +++ b/idea/testData/quickfix/modifiers/afterAddInitKeywordWithModifiers.kt @@ -0,0 +1,8 @@ +// "Add 'init' keyword" "true" +annotation class Ann1 +annotation class Ann2 +class A { + Ann1 Ann2 init { + + } +} diff --git a/idea/testData/quickfix/modifiers/beforeAddInitKeyword.kt b/idea/testData/quickfix/modifiers/beforeAddInitKeyword.kt new file mode 100644 index 00000000000..0b3dfafe2b3 --- /dev/null +++ b/idea/testData/quickfix/modifiers/beforeAddInitKeyword.kt @@ -0,0 +1,6 @@ +// "Add 'init' keyword" "true" +class A { + { + + } +} diff --git a/idea/testData/quickfix/modifiers/beforeAddInitKeywordWithModifiers.kt b/idea/testData/quickfix/modifiers/beforeAddInitKeywordWithModifiers.kt new file mode 100644 index 00000000000..6b8b63a91ae --- /dev/null +++ b/idea/testData/quickfix/modifiers/beforeAddInitKeywordWithModifiers.kt @@ -0,0 +1,8 @@ +// "Add 'init' keyword" "true" +annotation class Ann1 +annotation class Ann2 +class A { + Ann1 Ann2 { + + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index d2bcfc613ff..57e6375142d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -2871,6 +2871,18 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("beforeAddInitKeyword.kt") + public void testAddInitKeyword() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeAddInitKeyword.kt"); + doTest(fileName); + } + + @TestMetadata("beforeAddInitKeywordWithModifiers.kt") + public void testAddInitKeywordWithModifiers() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeAddInitKeywordWithModifiers.kt"); + doTest(fileName); + } + @TestMetadata("beforeAddInnerModifier.kt") public void testAddInnerModifier() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/modifiers/beforeAddInnerModifier.kt");