From 81f9d34d1a3f4efb20622661f84f74f67f07bb67 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 6 Mar 2015 19:29:17 +0300 Subject: [PATCH] Add quick fix for deprecated 'class object' syntax --- .../jetbrains/kotlin/psi/addRemoveModifier.kt | 2 +- .../kotlin/idea/JetBundle.properties | 2 + .../quickfix/ClassObjectToDefaultObjectFix.kt | 41 +++++++++++++++++++ .../idea/quickfix/QuickFixRegistrar.java | 2 + .../afterClassObjectToDefaultSingle.kt | 7 ++++ .../beforeClassObjectToDefaultSingle.kt | 7 ++++ .../idea/quickfix/QuickFixTestGenerated.java | 6 +++ 7 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/ClassObjectToDefaultObjectFix.kt create mode 100644 idea/testData/quickfix/migration/afterClassObjectToDefaultSingle.kt create mode 100644 idea/testData/quickfix/migration/beforeClassObjectToDefaultSingle.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt index a417aa673cb..c8f7b3e54e4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/addRemoveModifier.kt @@ -95,4 +95,4 @@ private val MODIFIERS_ORDER = listOf(PUBLIC_KEYWORD, PROTECTED_KEYWORD, PRIVATE_ FINAL_KEYWORD, OPEN_KEYWORD, ABSTRACT_KEYWORD, OVERRIDE_KEYWORD, INNER_KEYWORD, - ANNOTATION_KEYWORD, ENUM_KEYWORD) + ANNOTATION_KEYWORD, ENUM_KEYWORD, DEFAULT_KEYWORD) 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 a2e051928ef..541d383712f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties @@ -179,6 +179,8 @@ options.kotlin.attribute.descriptor.smart.cast=Smart-cast value options.kotlin.attribute.descriptor.label=Label change.to.function.invocation=Change to function invocation migrate.sure=Replace sure() calls by !! in project +migrate.class.object.to.default=Replace 'class' keyword with 'default' modifier +migrate.class.object.to.default.family=Replace 'class' Keyword with 'default' Modifier remove.val.var.from.parameter=Remove ''{0}'' from parameter add.override.to.equals.hashCode.toString=Add 'override' to equals, hashCode, toString in project add.when.else.branch.action.family.name=Add Else Branch diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ClassObjectToDefaultObjectFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ClassObjectToDefaultObjectFix.kt new file mode 100644 index 00000000000..8f917831ae7 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ClassObjectToDefaultObjectFix.kt @@ -0,0 +1,41 @@ +/* + * 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 com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.JetBundle +import org.jetbrains.kotlin.lexer.JetTokens +import org.jetbrains.kotlin.psi.JetFile +import org.jetbrains.kotlin.psi.JetObjectDeclaration + +public class ClassObjectToDefaultObjectFix(private val elem: JetObjectDeclaration) : JetIntentionAction(elem) { + override fun getText(): String = JetBundle.message("migrate.class.object.to.default") + + override fun getFamilyName(): String = JetBundle.message("migrate.class.object.to.default.family") + + override fun invoke(project: Project, editor: Editor, file: JetFile) { + elem.getClassKeyword()?.delete() + elem.addModifier(JetTokens.DEFAULT_KEYWORD) + } + + default object Factory : JetSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic) = + (diagnostic.getPsiElement() as? JetObjectDeclaration)?.let { ClassObjectToDefaultObjectFix(it) } + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java index a0837ba6caa..3fcfd1ebec6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.java @@ -294,5 +294,7 @@ public class QuickFixRegistrar { QuickFixes.factories.put(UNRESOLVED_REFERENCE, CreateClassFromTypeReferenceActionFactory.INSTANCE$); QuickFixes.factories.put(UNRESOLVED_REFERENCE, CreateClassFromReferenceExpressionActionFactory.INSTANCE$); QuickFixes.factories.put(UNRESOLVED_REFERENCE, CreateClassFromCallWithConstructorCalleeActionFactory.INSTANCE$); + + QuickFixes.factories.put(DEPRECATED_CLASS_OBJECT_SYNTAX, ClassObjectToDefaultObjectFix.Factory); } } diff --git a/idea/testData/quickfix/migration/afterClassObjectToDefaultSingle.kt b/idea/testData/quickfix/migration/afterClassObjectToDefaultSingle.kt new file mode 100644 index 00000000000..53dc225950d --- /dev/null +++ b/idea/testData/quickfix/migration/afterClassObjectToDefaultSingle.kt @@ -0,0 +1,7 @@ +// "Replace 'class' keyword with 'default' modifier" "true" + +class A { + public default object { + + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/migration/beforeClassObjectToDefaultSingle.kt b/idea/testData/quickfix/migration/beforeClassObjectToDefaultSingle.kt new file mode 100644 index 00000000000..9a001aebec3 --- /dev/null +++ b/idea/testData/quickfix/migration/beforeClassObjectToDefaultSingle.kt @@ -0,0 +1,7 @@ +// "Replace 'class' keyword with 'default' modifier" "true" + +class A { + public class object { + + } +} \ 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 c7dc7fc6f65..d2bcfc613ff 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -2850,6 +2850,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { public void testAllFilesPresentInMigration() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/migration"), Pattern.compile("^before(\\w+)\\.kt$"), true); } + + @TestMetadata("beforeClassObjectToDefaultSingle.kt") + public void testClassObjectToDefaultSingle() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/migration/beforeClassObjectToDefaultSingle.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/modifiers")