diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtOperationReferenceExpression.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtOperationReferenceExpression.kt index 861418b0e54..f5580b8161d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtOperationReferenceExpression.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtOperationReferenceExpression.kt @@ -20,10 +20,7 @@ import com.intellij.lang.ASTNode import com.intellij.psi.PsiElement import com.intellij.psi.impl.source.tree.TreeElement import org.jetbrains.kotlin.lexer.KtSingleValueToken -import org.jetbrains.kotlin.lexer.KtToken -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.parsing.KotlinExpressionParsing -import org.jetbrains.kotlin.resolve.constants.evaluate.binaryOperations import org.jetbrains.kotlin.types.expressions.OperatorConventions class KtOperationReferenceExpression(node: ASTNode) : KtSimpleNameExpressionImpl(node) { @@ -31,4 +28,9 @@ class KtOperationReferenceExpression(node: ASTNode) : KtSimpleNameExpressionImpl val operationSignTokenType: KtSingleValueToken? get() = (firstChild as? TreeElement)?.elementType as? KtSingleValueToken + + fun isConventionOperator(): Boolean { + val tokenType = operationSignTokenType ?: return false + return OperatorConventions.getNameForOperationSymbol(tokenType) != null + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt index 1bc8b1c6c24..d165f0ebdb9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallResolverUtil.kt @@ -131,7 +131,7 @@ fun isConventionCall(call: Call): Boolean { val callElement = call.callElement if (callElement is KtArrayAccessExpression || callElement is KtDestructuringDeclarationEntry) return true val calleeExpression = call.calleeExpression as? KtOperationReferenceExpression ?: return false - return calleeExpression.operationSignTokenType != null + return calleeExpression.isConventionOperator() } fun isInfixCall(call: Call): Boolean { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/OperatorCallChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/OperatorCallChecker.kt index 3a032690b5b..4fb68b77f58 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/OperatorCallChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/OperatorCallChecker.kt @@ -57,7 +57,7 @@ class OperatorCallChecker : CallChecker { return } - val isConventionOperator = element is KtOperationReferenceExpression && element.operationSignTokenType != null + val isConventionOperator = element is KtOperationReferenceExpression && element.isConventionOperator() if (isConventionOperator || element is KtArrayAccessExpression) { if (!functionDescriptor.isOperator) { report(reportOn, functionDescriptor, context.trace) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt index 633e5b3a1e0..62d83187d45 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt @@ -213,16 +213,15 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere val tokenType = element.operationSignTokenType if (tokenType != null) { val name = OperatorConventions.getNameForOperationSymbol( - tokenType, element.parent is KtUnaryExpression, element.parent is KtBinaryExpression) - if (name != null) { // can it be null ever? - val counterpart = OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS[tokenType] - if (counterpart != null) { - val counterpartName = OperatorConventions.getNameForOperationSymbol(counterpart, false, true)!! - return listOf(name, counterpartName) - } - else { - return listOf(name) - } + tokenType, element.parent is KtUnaryExpression, element.parent is KtBinaryExpression + ) ?: return emptyList() + val counterpart = OperatorConventions.ASSIGNMENT_OPERATION_COUNTERPARTS[tokenType] + if (counterpart != null) { + val counterpartName = OperatorConventions.getNameForOperationSymbol(counterpart, false, true)!! + return listOf(name, counterpartName) + } + else { + return listOf(name) } } }