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