From d1de2f65c93a77e11ae9f852360c7f2633a258f6 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 16 Oct 2015 23:11:05 +0300 Subject: [PATCH] Rewritten AddOperatorModifierInspection to be based on an intention (shouldn't we drop the inspection at all?) --- ...Modifier.html => AddOperatorModifier.html} | 0 .../after.kt.template | 1 + .../before.kt.template | 1 + .../description.html | 5 ++ idea/src/META-INF/plugin.xml | 7 +- .../AddOperatorModifierInspection.kt | 46 +++++++++++++ .../inspections/OperatorModifierInspection.kt | 67 ------------------- .../migration/operatorModifier/.inspection | 2 +- 8 files changed, 60 insertions(+), 69 deletions(-) rename idea/resources/inspectionDescriptions/{OperatorModifier.html => AddOperatorModifier.html} (100%) create mode 100644 idea/resources/intentionDescriptions/AddOperatorModifierIntention/after.kt.template create mode 100644 idea/resources/intentionDescriptions/AddOperatorModifierIntention/before.kt.template create mode 100644 idea/resources/intentionDescriptions/AddOperatorModifierIntention/description.html create mode 100644 idea/src/org/jetbrains/kotlin/idea/inspections/AddOperatorModifierInspection.kt delete mode 100644 idea/src/org/jetbrains/kotlin/idea/inspections/OperatorModifierInspection.kt diff --git a/idea/resources/inspectionDescriptions/OperatorModifier.html b/idea/resources/inspectionDescriptions/AddOperatorModifier.html similarity index 100% rename from idea/resources/inspectionDescriptions/OperatorModifier.html rename to idea/resources/inspectionDescriptions/AddOperatorModifier.html diff --git a/idea/resources/intentionDescriptions/AddOperatorModifierIntention/after.kt.template b/idea/resources/intentionDescriptions/AddOperatorModifierIntention/after.kt.template new file mode 100644 index 00000000000..8287e078ba7 --- /dev/null +++ b/idea/resources/intentionDescriptions/AddOperatorModifierIntention/after.kt.template @@ -0,0 +1 @@ +operator fun X.get(index: Int): String \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/AddOperatorModifierIntention/before.kt.template b/idea/resources/intentionDescriptions/AddOperatorModifierIntention/before.kt.template new file mode 100644 index 00000000000..4ca9328c501 --- /dev/null +++ b/idea/resources/intentionDescriptions/AddOperatorModifierIntention/before.kt.template @@ -0,0 +1 @@ +fun X.get(index: Int): String \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/AddOperatorModifierIntention/description.html b/idea/resources/intentionDescriptions/AddOperatorModifierIntention/description.html new file mode 100644 index 00000000000..cbea1c3fab4 --- /dev/null +++ b/idea/resources/intentionDescriptions/AddOperatorModifierIntention/description.html @@ -0,0 +1,5 @@ + + +This intention to add the 'operator' modifier to a function that matches one of the operator conventions but is not annotated as operator. + + diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 174a5e4246b..d1c0f227430 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -1077,6 +1077,11 @@ Kotlin + + org.jetbrains.kotlin.idea.inspections.AddOperatorModifierIntention + Kotlin + + - ( + listOf(IntentionBasedInspection.IntentionData(AddOperatorModifierIntention())), + "Function defines an operator but isn't annotated as such", + JetNamedFunction::class.java) + +class AddOperatorModifierIntention : JetSelfTargetingRangeIntention(JetNamedFunction::class.java, "Add 'operator' modifier") { + override fun applicabilityRange(element: JetNamedFunction): TextRange? { + val nameIdentifier = element.nameIdentifier ?: return null + val functionDescriptor = element.resolveToDescriptor() as? FunctionDescriptor ?: return null + if (functionDescriptor.isOperator || !OperatorChecks.canBeOperator(functionDescriptor)) return null + return nameIdentifier.textRange + } + + override fun applyTo(element: JetNamedFunction, editor: Editor) { + element.addModifier(JetTokens.OPERATOR_KEYWORD) + } +} + diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/OperatorModifierInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/OperatorModifierInspection.kt deleted file mode 100644 index b80e37864a4..00000000000 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/OperatorModifierInspection.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.inspections - -import com.intellij.codeInsight.intention.IntentionAction -import com.intellij.codeInspection.LocalInspectionToolSession -import com.intellij.codeInspection.LocalQuickFix -import com.intellij.codeInspection.ProblemDescriptor -import com.intellij.codeInspection.ProblemsHolder -import com.intellij.openapi.project.Project -import com.intellij.psi.PsiElementVisitor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters2 -import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor -import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde -import org.jetbrains.kotlin.idea.quickfix.AddModifierFix -import org.jetbrains.kotlin.idea.quickfix.CleanupFix -import org.jetbrains.kotlin.idea.quickfix.JetSingleIntentionActionFactory -import org.jetbrains.kotlin.lexer.JetModifierKeywordToken -import org.jetbrains.kotlin.lexer.JetTokens -import org.jetbrains.kotlin.psi.JetModifierListOwner -import org.jetbrains.kotlin.psi.JetNamedFunction -import org.jetbrains.kotlin.psi.JetVisitorVoid -import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType -import org.jetbrains.kotlin.util.OperatorChecks - -public class OperatorModifierInspection : AbstractKotlinInspection() { - override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession): PsiElementVisitor { - return object : JetVisitorVoid() { - override fun visitNamedFunction(function: JetNamedFunction) { - val nameIdentifier = function.nameIdentifier ?: return - val functionDescriptor = function.resolveToDescriptor() as? FunctionDescriptor ?: return - if (!functionDescriptor.isOperator && OperatorChecks.canBeOperator(functionDescriptor)) { - holder.registerProblem(nameIdentifier, "Function defines an operator but isn't annotated as such", - AddOperatorModifierFix()) - } - } - - } - } - - private class AddOperatorModifierFix() : LocalQuickFix { - override fun getName(): String = "Add 'operator' modifier" - override fun getFamilyName(): String = getName() - - override fun applyFix(project: Project, descriptor: ProblemDescriptor) { - val function = descriptor.psiElement.getNonStrictParentOfType() - function?.addModifier(JetTokens.OPERATOR_KEYWORD) - } - } -} - diff --git a/idea/testData/quickfix/migration/operatorModifier/.inspection b/idea/testData/quickfix/migration/operatorModifier/.inspection index c9bccbc41b6..7e35b9d67a5 100644 --- a/idea/testData/quickfix/migration/operatorModifier/.inspection +++ b/idea/testData/quickfix/migration/operatorModifier/.inspection @@ -1 +1 @@ -org.jetbrains.kotlin.idea.inspections.OperatorModifierInspection \ No newline at end of file +org.jetbrains.kotlin.idea.inspections.AddOperatorModifierInspection \ No newline at end of file