()
| 78883 | return (target.flags & 98304 /* TypeFlags.Nullable */) !== 0 || isTypeComparableTo(source, target); |
| 78884 | } |
| 78885 | function createCheckBinaryExpression() { |
| 78886 | var trampoline = ts.createBinaryExpressionTrampoline(onEnter, onLeft, onOperator, onRight, onExit, foldState); |
| 78887 | return function (node, checkMode) { |
| 78888 | var result = trampoline(node, checkMode); |
| 78889 | ts.Debug.assertIsDefined(result); |
| 78890 | return result; |
| 78891 | }; |
| 78892 | function onEnter(node, state, checkMode) { |
| 78893 | if (state) { |
| 78894 | state.stackIndex++; |
| 78895 | state.skip = false; |
| 78896 | setLeftType(state, /*type*/ undefined); |
| 78897 | setLastResult(state, /*type*/ undefined); |
| 78898 | } |
| 78899 | else { |
| 78900 | state = { |
| 78901 | checkMode: checkMode, |
| 78902 | skip: false, |
| 78903 | stackIndex: 0, |
| 78904 | typeStack: [undefined, undefined], |
| 78905 | }; |
| 78906 | } |
| 78907 | if (ts.isInJSFile(node) && ts.getAssignedExpandoInitializer(node)) { |
| 78908 | state.skip = true; |
| 78909 | setLastResult(state, checkExpression(node.right, checkMode)); |
| 78910 | return state; |
| 78911 | } |
| 78912 | checkGrammarNullishCoalesceWithLogicalExpression(node); |
| 78913 | var operator = node.operatorToken.kind; |
| 78914 | if (operator === 63 /* SyntaxKind.EqualsToken */ && (node.left.kind === 205 /* SyntaxKind.ObjectLiteralExpression */ || node.left.kind === 204 /* SyntaxKind.ArrayLiteralExpression */)) { |
| 78915 | state.skip = true; |
| 78916 | setLastResult(state, checkDestructuringAssignment(node.left, checkExpression(node.right, checkMode), checkMode, node.right.kind === 108 /* SyntaxKind.ThisKeyword */)); |
| 78917 | return state; |
| 78918 | } |
| 78919 | return state; |
| 78920 | } |
| 78921 | function onLeft(left, state, _node) { |
| 78922 | if (!state.skip) { |
| 78923 | return maybeCheckExpression(state, left); |
| 78924 | } |
| 78925 | } |
| 78926 | function onOperator(operatorToken, state, node) { |
| 78927 | if (!state.skip) { |
| 78928 | var leftType = getLastResult(state); |
| 78929 | ts.Debug.assertIsDefined(leftType); |
| 78930 | setLeftType(state, leftType); |
| 78931 | setLastResult(state, /*type*/ undefined); |
| 78932 | var operator = operatorToken.kind; |
| 78933 | if (operator === 55 /* SyntaxKind.AmpersandAmpersandToken */ || operator === 56 /* SyntaxKind.BarBarToken */ || operator === 60 /* SyntaxKind.QuestionQuestionToken */) { |
| 78934 | if (operator === 55 /* SyntaxKind.AmpersandAmpersandToken */) { |
| 78935 | var parent = ts.walkUpParenthesizedExpressions(node.parent); |
| 78936 | checkTestingKnownTruthyCallableOrAwaitableType(node.left, ts.isIfStatement(parent) ? parent.thenStatement : undefined); |
| 78937 | } |
| 78938 | checkTruthinessOfType(leftType, node.left); |
| 78939 | } |
| 78940 | } |
| 78941 | } |
| 78942 | function onRight(right, state, _node) { |
no test coverage detected
searching dependent graphs…