(left, operatorToken, right, leftType, rightType, errorNode)
| 79018 | return checkBinaryLikeExpressionWorker(left, operatorToken, right, leftType, rightType, errorNode); |
| 79019 | } |
| 79020 | function checkBinaryLikeExpressionWorker(left, operatorToken, right, leftType, rightType, errorNode) { |
| 79021 | var operator = operatorToken.kind; |
| 79022 | switch (operator) { |
| 79023 | case 41 /* SyntaxKind.AsteriskToken */: |
| 79024 | case 42 /* SyntaxKind.AsteriskAsteriskToken */: |
| 79025 | case 66 /* SyntaxKind.AsteriskEqualsToken */: |
| 79026 | case 67 /* SyntaxKind.AsteriskAsteriskEqualsToken */: |
| 79027 | case 43 /* SyntaxKind.SlashToken */: |
| 79028 | case 68 /* SyntaxKind.SlashEqualsToken */: |
| 79029 | case 44 /* SyntaxKind.PercentToken */: |
| 79030 | case 69 /* SyntaxKind.PercentEqualsToken */: |
| 79031 | case 40 /* SyntaxKind.MinusToken */: |
| 79032 | case 65 /* SyntaxKind.MinusEqualsToken */: |
| 79033 | case 47 /* SyntaxKind.LessThanLessThanToken */: |
| 79034 | case 70 /* SyntaxKind.LessThanLessThanEqualsToken */: |
| 79035 | case 48 /* SyntaxKind.GreaterThanGreaterThanToken */: |
| 79036 | case 71 /* SyntaxKind.GreaterThanGreaterThanEqualsToken */: |
| 79037 | case 49 /* SyntaxKind.GreaterThanGreaterThanGreaterThanToken */: |
| 79038 | case 72 /* SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken */: |
| 79039 | case 51 /* SyntaxKind.BarToken */: |
| 79040 | case 74 /* SyntaxKind.BarEqualsToken */: |
| 79041 | case 52 /* SyntaxKind.CaretToken */: |
| 79042 | case 78 /* SyntaxKind.CaretEqualsToken */: |
| 79043 | case 50 /* SyntaxKind.AmpersandToken */: |
| 79044 | case 73 /* SyntaxKind.AmpersandEqualsToken */: |
| 79045 | if (leftType === silentNeverType || rightType === silentNeverType) { |
| 79046 | return silentNeverType; |
| 79047 | } |
| 79048 | leftType = checkNonNullType(leftType, left); |
| 79049 | rightType = checkNonNullType(rightType, right); |
| 79050 | var suggestedOperator = void 0; |
| 79051 | // if a user tries to apply a bitwise operator to 2 boolean operands |
| 79052 | // try and return them a helpful suggestion |
| 79053 | if ((leftType.flags & 528 /* TypeFlags.BooleanLike */) && |
| 79054 | (rightType.flags & 528 /* TypeFlags.BooleanLike */) && |
| 79055 | (suggestedOperator = getSuggestedBooleanOperator(operatorToken.kind)) !== undefined) { |
| 79056 | error(errorNode || operatorToken, ts.Diagnostics.The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead, ts.tokenToString(operatorToken.kind), ts.tokenToString(suggestedOperator)); |
| 79057 | return numberType; |
| 79058 | } |
| 79059 | else { |
| 79060 | // otherwise just check each operand separately and report errors as normal |
| 79061 | var leftOk = checkArithmeticOperandType(left, leftType, ts.Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type, /*isAwaitValid*/ true); |
| 79062 | var rightOk = checkArithmeticOperandType(right, rightType, ts.Diagnostics.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_bigint_or_an_enum_type, /*isAwaitValid*/ true); |
| 79063 | var resultType_1; |
| 79064 | // If both are any or unknown, allow operation; assume it will resolve to number |
| 79065 | if ((isTypeAssignableToKind(leftType, 3 /* TypeFlags.AnyOrUnknown */) && isTypeAssignableToKind(rightType, 3 /* TypeFlags.AnyOrUnknown */)) || |
| 79066 | // Or, if neither could be bigint, implicit coercion results in a number result |
| 79067 | !(maybeTypeOfKind(leftType, 2112 /* TypeFlags.BigIntLike */) || maybeTypeOfKind(rightType, 2112 /* TypeFlags.BigIntLike */))) { |
| 79068 | resultType_1 = numberType; |
| 79069 | } |
| 79070 | // At least one is assignable to bigint, so check that both are |
| 79071 | else if (bothAreBigIntLike(leftType, rightType)) { |
| 79072 | switch (operator) { |
| 79073 | case 49 /* SyntaxKind.GreaterThanGreaterThanGreaterThanToken */: |
| 79074 | case 72 /* SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken */: |
| 79075 | reportOperatorError(); |
| 79076 | break; |
| 79077 | case 42 /* SyntaxKind.AsteriskAsteriskToken */: |
no test coverage detected
searching dependent graphs…