From 1fdf08bec568f5b2219bd3f7c8e8438f22a824c1 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 5 Oct 2015 20:52:24 +0200 Subject: [PATCH] quickfix to migrate function type parameter lists to new syntax --- .../idea/formatter/kotlinSpacingRules.kt | 1 + .../inspections/KotlinCleanupInspection.kt | 3 +- .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 3 ++ .../migration/MigrateTypeParameterListFix.kt | 49 +++++++++++++++++++ idea/testData/inspections/cleanup/cleanup.kt | 3 ++ .../inspections/cleanup/cleanup.kt.after | 3 ++ .../migration/typeParameterList/basic.kt | 2 + .../typeParameterList/basic.kt.after | 2 + .../idea/quickfix/QuickFixTestGenerated.java | 15 ++++++ 9 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateTypeParameterListFix.kt create mode 100644 idea/testData/quickfix/migration/typeParameterList/basic.kt create mode 100644 idea/testData/quickfix/migration/typeParameterList/basic.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt b/idea/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt index 4d1664e700d..ae8f9fc4d39 100644 --- a/idea/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt +++ b/idea/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt @@ -140,6 +140,7 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder { betweenInside(FUN_KEYWORD, IDENTIFIER, FUN).spaces(1) betweenInside(FUN_KEYWORD, TYPE_REFERENCE, FUN).spaces(1) + betweenInside(TYPE_PARAMETER_LIST, IDENTIFIER, FUN).spaces(1) betweenInside(FUN_KEYWORD, VALUE_PARAMETER_LIST, FUN).spacing(0, 0, 0, false, 0) betweenInside(TYPE_REFERENCE, DOT, FUN).spacing(0, 0, 0, false, 0) betweenInside(DOT, IDENTIFIER, FUN).spacing(0, 0, 0, false, 0) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt index 32e5d1545cf..d42a403b999 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinCleanupInspection.kt @@ -92,7 +92,8 @@ public class KotlinCleanupInspection(): LocalInspectionTool(), CleanupLocalInspe Errors.NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION, Errors.BACKING_FIELD_SYNTAX_DEPRECATED, Errors.OPERATOR_MODIFIER_REQUIRED, - Errors.CALLABLE_REFERENCE_TO_MEMBER_OR_EXTENSION_WITH_EMPTY_LHS + Errors.CALLABLE_REFERENCE_TO_MEMBER_OR_EXTENSION_WITH_EMPTY_LHS, + Errors.DEPRECATED_TYPE_PARAMETER_SYNTAX ) private fun Diagnostic.isObsoleteLabel(): Boolean { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 54d886dc4e0..3448bc85c0b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createClass.CreateClas import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createVariable.CreateLocalVariableActionFactory import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createVariable.CreateParameterByNamedArgumentActionFactory import org.jetbrains.kotlin.idea.quickfix.createFromUsage.createVariable.CreateParameterByRefActionFactory +import org.jetbrains.kotlin.idea.quickfix.migration.MigrateTypeParameterListFix import org.jetbrains.kotlin.idea.quickfix.replaceWith.DeprecatedSymbolUsageFix import org.jetbrains.kotlin.idea.quickfix.replaceWith.DeprecatedSymbolUsageInWholeProjectFix import org.jetbrains.kotlin.lexer.JetTokens.* @@ -335,5 +336,7 @@ public class QuickFixRegistrar : QuickFixContributor { UNDERSCORE_IS_DEPRECATED.registerFactory(RenameUnderscoreFix) CALLABLE_REFERENCE_TO_MEMBER_OR_EXTENSION_WITH_EMPTY_LHS.registerFactory(AddTypeToLHSOfCallableReferenceFix) + + DEPRECATED_TYPE_PARAMETER_SYNTAX.registerFactory(MigrateTypeParameterListFix) } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateTypeParameterListFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateTypeParameterListFix.kt new file mode 100644 index 00000000000..93682c812a8 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/migration/MigrateTypeParameterListFix.kt @@ -0,0 +1,49 @@ +/* + * 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.migration + +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.quickfix.CleanupFix +import org.jetbrains.kotlin.idea.quickfix.JetIntentionAction +import org.jetbrains.kotlin.idea.quickfix.JetSingleIntentionActionFactory +import org.jetbrains.kotlin.psi.JetFile +import org.jetbrains.kotlin.psi.JetNamedFunction +import org.jetbrains.kotlin.psi.JetTypeParameterList +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType + +class MigrateTypeParameterListFix(typeParameterList: JetTypeParameterList) + : JetIntentionAction(typeParameterList), CleanupFix { + + override fun getFamilyName(): String = "Migrate type parameter list syntax" + override fun getText(): String = familyName + + override fun invoke(project: Project, editor: Editor?, file: JetFile) { + val function = element.getStrictParentOfType() ?: return + function.addBefore(element, function.nameIdentifier) + element.delete() + } + + companion object : JetSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val typeParameterList = diagnostic.psiElement as? JetTypeParameterList ?: return null + return MigrateTypeParameterListFix(typeParameterList) + } + } +} diff --git a/idea/testData/inspections/cleanup/cleanup.kt b/idea/testData/inspections/cleanup/cleanup.kt index 2bc25afeee5..cd21ee0722b 100644 --- a/idea/testData/inspections/cleanup/cleanup.kt +++ b/idea/testData/inspections/cleanup/cleanup.kt @@ -60,3 +60,6 @@ class C { fun bar() = ::foo } + +fun typed() { +} diff --git a/idea/testData/inspections/cleanup/cleanup.kt.after b/idea/testData/inspections/cleanup/cleanup.kt.after index fc5df6036a9..06a012c6886 100644 --- a/idea/testData/inspections/cleanup/cleanup.kt.after +++ b/idea/testData/inspections/cleanup/cleanup.kt.after @@ -59,3 +59,6 @@ class C { fun bar() = C::foo } + +fun typed() { +} diff --git a/idea/testData/quickfix/migration/typeParameterList/basic.kt b/idea/testData/quickfix/migration/typeParameterList/basic.kt new file mode 100644 index 00000000000..490806ce10b --- /dev/null +++ b/idea/testData/quickfix/migration/typeParameterList/basic.kt @@ -0,0 +1,2 @@ +// "Migrate type parameter list syntax" "true" +fun f() {} diff --git a/idea/testData/quickfix/migration/typeParameterList/basic.kt.after b/idea/testData/quickfix/migration/typeParameterList/basic.kt.after new file mode 100644 index 00000000000..0e4efc76ac9 --- /dev/null +++ b/idea/testData/quickfix/migration/typeParameterList/basic.kt.after @@ -0,0 +1,2 @@ +// "Migrate type parameter list syntax" "true" +fun f() {} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index cc8b038d680..2eea42e2e24 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -4321,6 +4321,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } } + + @TestMetadata("idea/testData/quickfix/migration/typeParameterList") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class TypeParameterList extends AbstractQuickFixTest { + public void testAllFilesPresentInTypeParameterList() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/migration/typeParameterList"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); + } + + @TestMetadata("basic.kt") + public void testBasic() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/migration/typeParameterList/basic.kt"); + doTest(fileName); + } + } } @TestMetadata("idea/testData/quickfix/modifiers")