use of com.google.javascript.jscomp.NodeUtil.ValueType in project closure-compiler by google.
the class PeepholeFoldConstants method tryAbstractEqualityComparison.
/**
* http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison
*/
private static Tri tryAbstractEqualityComparison(AbstractPeepholeOptimization peepholeOptimization, Node left, Node right) {
// Evaluate based on the general type.
ValueType leftValueType = NodeUtil.getKnownValueType(left);
ValueType rightValueType = NodeUtil.getKnownValueType(right);
if (leftValueType != ValueType.UNDETERMINED && rightValueType != ValueType.UNDETERMINED) {
// Delegate to strict equality comparison for values of the same type.
if (leftValueType == rightValueType) {
return tryStrictEqualityComparison(peepholeOptimization, left, right);
}
if ((leftValueType == ValueType.NULL && rightValueType == ValueType.VOID) || (leftValueType == ValueType.VOID && rightValueType == ValueType.NULL)) {
return Tri.TRUE;
}
if ((leftValueType == ValueType.NUMBER && rightValueType == ValueType.STRING) || rightValueType == ValueType.BOOLEAN) {
Double rv = peepholeOptimization.getSideEffectFreeNumberValue(right);
return rv == null ? Tri.UNKNOWN : tryAbstractEqualityComparison(peepholeOptimization, left, NodeUtil.numberNode(rv, right));
}
if ((leftValueType == ValueType.STRING && rightValueType == ValueType.NUMBER) || leftValueType == ValueType.BOOLEAN) {
Double lv = peepholeOptimization.getSideEffectFreeNumberValue(left);
return lv == null ? Tri.UNKNOWN : tryAbstractEqualityComparison(peepholeOptimization, NodeUtil.numberNode(lv, left), right);
}
if (leftValueType == ValueType.BIGINT || rightValueType == ValueType.BIGINT) {
BigInteger lv = peepholeOptimization.getSideEffectFreeBigIntValue(left);
BigInteger rv = peepholeOptimization.getSideEffectFreeBigIntValue(right);
if (lv != null && rv != null) {
return Tri.forBoolean(lv.equals(rv));
}
}
if ((leftValueType == ValueType.STRING || leftValueType == ValueType.NUMBER) && rightValueType == ValueType.OBJECT) {
return Tri.UNKNOWN;
}
if (leftValueType == ValueType.OBJECT && (rightValueType == ValueType.STRING || rightValueType == ValueType.NUMBER)) {
return Tri.UNKNOWN;
}
return Tri.FALSE;
}
// In general, the rest of the cases cannot be folded.
return Tri.UNKNOWN;
}
Aggregations