Fixed check for convention operator

This commit is contained in:
Valentin Kipyatkov
2016-09-30 13:26:13 +03:00
parent 57faa5a39a
commit a55273646a
4 changed files with 16 additions and 15 deletions
@@ -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
}
}
@@ -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 {
@@ -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)
@@ -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)
}
}
}