From a55273646a22b05ab3dd40e36c32b02c1915cb0e Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 30 Sep 2016 13:26:13 +0300 Subject: [PATCH] Fixed check for convention operator --- .../psi/KtOperationReferenceExpression.kt | 8 +++++--- .../kotlin/resolve/calls/CallResolverUtil.kt | 2 +- .../calls/checkers/OperatorCallChecker.kt | 2 +- .../idea/references/KtSimpleNameReference.kt | 19 +++++++++---------- 4 files changed, 16 insertions(+), 15 deletions(-) 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) } } }