in src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java [4840:4863]
protected static ClassNode getGroupOperationResultType(final ClassNode a, final ClassNode b) {
if (isBigIntCategory(a) && isBigIntCategory(b)) return BigInteger_TYPE;
if (isBigDecCategory(a) && isBigDecCategory(b)) return BigDecimal_TYPE;
if (isBigDecimalType(a) || isBigDecimalType(b)) return BigDecimal_TYPE;
if (isBigIntegerType(a) || isBigIntegerType(b)) {
if (isBigIntCategory(a) && isBigIntCategory(b)) return BigInteger_TYPE;
return BigDecimal_TYPE;
}
if (isPrimitiveDouble(a) || isPrimitiveDouble(b)) return double_TYPE;
if (isWrapperDouble(a) || isWrapperDouble(b)) return Double_TYPE;
if (isPrimitiveFloat(a) || isPrimitiveFloat(b)) return float_TYPE;
if (isWrapperFloat(a) || isWrapperFloat(b)) return Float_TYPE;
if (isPrimitiveLong(a) || isPrimitiveLong(b)) return long_TYPE;
if (isWrapperLong(a) || isWrapperLong(b)) return Long_TYPE;
if (isPrimitiveInt(a) || isPrimitiveInt(b)) return int_TYPE;
if (isWrapperInteger(a) || isWrapperInteger(b)) return Integer_TYPE;
if (isPrimitiveShort(a) || isPrimitiveShort(b)) return short_TYPE;
if (isWrapperShort(a) || isWrapperShort(b)) return Short_TYPE;
if (isPrimitiveByte(a) || isPrimitiveByte(b)) return byte_TYPE;
if (isWrapperByte(a) || isWrapperByte(b)) return Byte_TYPE;
if (isPrimitiveChar(a) || isPrimitiveChar(b)) return char_TYPE;
if (isWrapperCharacter(a) || isWrapperCharacter(b)) return Character_TYPE;
return Number_TYPE;
}