Support identity equals in contracts

This commit is contained in:
Dmitry Savvinov
2018-08-20 14:35:46 +03:00
committed by Ilya Gorbunov
parent cf033fa78a
commit a6bb7d1e89
@@ -103,6 +103,7 @@ internal class PsiConditionParser(
when (expression.operationToken) { when (expression.operationToken) {
KtTokens.ANDAND -> operationConstructor = ::LogicalAnd KtTokens.ANDAND -> operationConstructor = ::LogicalAnd
KtTokens.OROR -> operationConstructor = ::LogicalOr KtTokens.OROR -> operationConstructor = ::LogicalOr
KtTokens.EXCLEQEQEQ, KtTokens.EQEQEQ -> return parseIdentityEquals(expression)
else -> return super.visitBinaryExpression(expression, data) // pass binary expression further else -> return super.visitBinaryExpression(expression, data) // pass binary expression further
} }
@@ -111,6 +112,13 @@ internal class PsiConditionParser(
return operationConstructor(left, right) return operationConstructor(left, right)
} }
private fun parseIdentityEquals(expression: KtBinaryExpression): BooleanExpression? {
val lhs = dispatcher.parseValue(expression.left) ?: return null
val rhs = dispatcher.parseValue(expression.right) ?: return null
return processEquals(lhs, rhs, expression.operationToken == KtTokens.EXCLEQEQEQ, expression)
}
private fun processEquals( private fun processEquals(
left: ContractDescriptionValue, left: ContractDescriptionValue,
right: ContractDescriptionValue, right: ContractDescriptionValue,