Improve creation of compile constants for equals and compareTo

This commit is contained in:
Natalia Ukhorskaya
2013-11-18 15:07:08 +04:00
parent cbe04a6adf
commit 0bffa9f0ac
@@ -282,8 +282,8 @@ public class ConstantExpressionEvaluator private (val trace: BindingTrace) : Jet
private fun createCompileTimeConstantForEquals(result: Any?, operationToken: IElementType): CompileTimeConstant<*>? { private fun createCompileTimeConstantForEquals(result: Any?, operationToken: IElementType): CompileTimeConstant<*>? {
if (result is Boolean) { if (result is Boolean) {
return when (operationToken) { return when (operationToken) {
JetTokens.EQEQ -> if (result) BooleanValue.TRUE else BooleanValue.FALSE JetTokens.EQEQ -> BooleanValue.valueOf(result)
JetTokens.EXCLEQ -> if (result) BooleanValue.FALSE else BooleanValue.TRUE JetTokens.EXCLEQ -> BooleanValue.valueOf(!result)
else -> throw IllegalStateException("Unknown equals operation token: $operationToken") else -> throw IllegalStateException("Unknown equals operation token: $operationToken")
} }
} }
@@ -292,23 +292,12 @@ private fun createCompileTimeConstantForEquals(result: Any?, operationToken: IEl
private fun createCompileTimeConstantForCompareTo(result: Any?, operationToken: IElementType): CompileTimeConstant<*>? { private fun createCompileTimeConstantForCompareTo(result: Any?, operationToken: IElementType): CompileTimeConstant<*>? {
if (result is Int) { if (result is Int) {
return when (result) { return when (operationToken) {
-1 -> when (operationToken) { JetTokens.LT -> BooleanValue.valueOf(result < 0)
JetTokens.LT -> BooleanValue.TRUE JetTokens.LTEQ -> BooleanValue.valueOf(result <= 0)
JetTokens.LTEQ -> BooleanValue.TRUE JetTokens.GT -> BooleanValue.valueOf(result > 0)
else -> BooleanValue.FALSE JetTokens.GTEQ -> BooleanValue.valueOf(result >= 0)
} else -> throw IllegalStateException("Unknown compareTo operation token: $operationToken")
0 -> when (operationToken) {
JetTokens.LTEQ -> BooleanValue.TRUE
JetTokens.GTEQ -> BooleanValue.TRUE
else -> BooleanValue.FALSE
}
1 -> when (operationToken) {
JetTokens.GT -> BooleanValue.TRUE
JetTokens.GTEQ -> BooleanValue.TRUE
else -> BooleanValue.FALSE
}
else -> null
} }
} }
return null return null