typescript 4.7.0-dev.20220225 → 4.7.0-dev.20220228

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -294,7 +294,7 @@ var ts;
294
294
  // The following is baselined as a literal template type without intervention
295
295
  /** The version of the TypeScript compiler release */
296
296
  // eslint-disable-next-line @typescript-eslint/no-inferrable-types
297
- ts.version = ts.versionMajorMinor + ".0-dev.20220225";
297
+ ts.version = ts.versionMajorMinor + ".0-dev.20220228";
298
298
  /* @internal */
299
299
  var Comparison;
300
300
  (function (Comparison) {
@@ -33667,10 +33667,10 @@ var ts;
33667
33667
  setDecoratorContext(/*val*/ false);
33668
33668
  }
33669
33669
  var pos = getNodePos();
33670
- var expr = parseAssignmentExpressionOrHigher();
33670
+ var expr = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
33671
33671
  var operatorToken;
33672
33672
  while ((operatorToken = parseOptionalToken(27 /* CommaToken */))) {
33673
- expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher(), pos);
33673
+ expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false), pos);
33674
33674
  }
33675
33675
  if (saveDecoratorContext) {
33676
33676
  setDecoratorContext(/*val*/ true);
@@ -33678,9 +33678,9 @@ var ts;
33678
33678
  return expr;
33679
33679
  }
33680
33680
  function parseInitializer() {
33681
- return parseOptional(63 /* EqualsToken */) ? parseAssignmentExpressionOrHigher() : undefined;
33681
+ return parseOptional(63 /* EqualsToken */) ? parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false) : undefined;
33682
33682
  }
33683
- function parseAssignmentExpressionOrHigher() {
33683
+ function parseAssignmentExpressionOrHigher(disallowReturnTypeInArrowFunction) {
33684
33684
  // AssignmentExpression[in,yield]:
33685
33685
  // 1) ConditionalExpression[?in,?yield]
33686
33686
  // 2) LeftHandSideExpression = AssignmentExpression[?in,?yield]
@@ -33706,7 +33706,7 @@ var ts;
33706
33706
  // If we do successfully parse arrow-function, we must *not* recurse for productions 1, 2 or 3. An ArrowFunction is
33707
33707
  // not a LeftHandSideExpression, nor does it start a ConditionalExpression. So we are done
33708
33708
  // with AssignmentExpression if we see one.
33709
- var arrowExpression = tryParseParenthesizedArrowFunctionExpression() || tryParseAsyncSimpleArrowFunctionExpression();
33709
+ var arrowExpression = tryParseParenthesizedArrowFunctionExpression(disallowReturnTypeInArrowFunction) || tryParseAsyncSimpleArrowFunctionExpression(disallowReturnTypeInArrowFunction);
33710
33710
  if (arrowExpression) {
33711
33711
  return arrowExpression;
33712
33712
  }
@@ -33725,7 +33725,7 @@ var ts;
33725
33725
  // parameter ('x => ...') above. We handle it here by checking if the parsed expression was a single
33726
33726
  // identifier and the current token is an arrow.
33727
33727
  if (expr.kind === 79 /* Identifier */ && token() === 38 /* EqualsGreaterThanToken */) {
33728
- return parseSimpleArrowFunctionExpression(pos, expr, /*asyncModifier*/ undefined);
33728
+ return parseSimpleArrowFunctionExpression(pos, expr, disallowReturnTypeInArrowFunction, /*asyncModifier*/ undefined);
33729
33729
  }
33730
33730
  // Now see if we might be in cases '2' or '3'.
33731
33731
  // If the expression was a LHS expression, and we have an assignment operator, then
@@ -33734,7 +33734,7 @@ var ts;
33734
33734
  // Note: we call reScanGreaterToken so that we get an appropriately merged token
33735
33735
  // for cases like `> > =` becoming `>>=`
33736
33736
  if (ts.isLeftHandSideExpression(expr) && ts.isAssignmentOperator(reScanGreaterToken())) {
33737
- return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher(), pos);
33737
+ return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher(disallowReturnTypeInArrowFunction), pos);
33738
33738
  }
33739
33739
  // It wasn't an assignment or a lambda. This is a conditional expression:
33740
33740
  return parseConditionalExpressionRest(expr, pos);
@@ -33777,7 +33777,7 @@ var ts;
33777
33777
  nextToken();
33778
33778
  if (!scanner.hasPrecedingLineBreak() &&
33779
33779
  (token() === 41 /* AsteriskToken */ || isStartOfExpression())) {
33780
- return finishNode(factory.createYieldExpression(parseOptionalToken(41 /* AsteriskToken */), parseAssignmentExpressionOrHigher()), pos);
33780
+ return finishNode(factory.createYieldExpression(parseOptionalToken(41 /* AsteriskToken */), parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false)), pos);
33781
33781
  }
33782
33782
  else {
33783
33783
  // if the next token is not on the same line as yield. or we don't have an '*' or
@@ -33785,7 +33785,7 @@ var ts;
33785
33785
  return finishNode(factory.createYieldExpression(/*asteriskToken*/ undefined, /*expression*/ undefined), pos);
33786
33786
  }
33787
33787
  }
33788
- function parseSimpleArrowFunctionExpression(pos, identifier, asyncModifier) {
33788
+ function parseSimpleArrowFunctionExpression(pos, identifier, disallowReturnTypeInArrowFunction, asyncModifier) {
33789
33789
  ts.Debug.assert(token() === 38 /* EqualsGreaterThanToken */, "parseSimpleArrowFunctionExpression should only have been called if we had a =>");
33790
33790
  var parameter = factory.createParameterDeclaration(
33791
33791
  /*decorators*/ undefined,
@@ -33797,11 +33797,11 @@ var ts;
33797
33797
  finishNode(parameter, identifier.pos);
33798
33798
  var parameters = createNodeArray([parameter], parameter.pos, parameter.end);
33799
33799
  var equalsGreaterThanToken = parseExpectedToken(38 /* EqualsGreaterThanToken */);
33800
- var body = parseArrowFunctionExpressionBody(/*isAsync*/ !!asyncModifier);
33800
+ var body = parseArrowFunctionExpressionBody(/*isAsync*/ !!asyncModifier, disallowReturnTypeInArrowFunction);
33801
33801
  var node = factory.createArrowFunction(asyncModifier, /*typeParameters*/ undefined, parameters, /*type*/ undefined, equalsGreaterThanToken, body);
33802
33802
  return addJSDocComment(finishNode(node, pos));
33803
33803
  }
33804
- function tryParseParenthesizedArrowFunctionExpression() {
33804
+ function tryParseParenthesizedArrowFunctionExpression(disallowReturnTypeInArrowFunction) {
33805
33805
  var triState = isParenthesizedArrowFunctionExpression();
33806
33806
  if (triState === 0 /* False */) {
33807
33807
  // It's definitely not a parenthesized arrow function expression.
@@ -33812,8 +33812,8 @@ var ts;
33812
33812
  // it out, but don't allow any ambiguity, and return 'undefined' if this could be an
33813
33813
  // expression instead.
33814
33814
  return triState === 1 /* True */ ?
33815
- parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ true) :
33816
- tryParse(parsePossibleParenthesizedArrowFunctionExpression);
33815
+ parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ true, /*disallowReturnTypeInArrowFunction*/ false) :
33816
+ tryParse(function () { return parsePossibleParenthesizedArrowFunctionExpression(disallowReturnTypeInArrowFunction); });
33817
33817
  }
33818
33818
  // True -> We definitely expect a parenthesized arrow function here.
33819
33819
  // False -> There *cannot* be a parenthesized arrow function here.
@@ -33943,25 +33943,25 @@ var ts;
33943
33943
  return 2 /* Unknown */;
33944
33944
  }
33945
33945
  }
33946
- function parsePossibleParenthesizedArrowFunctionExpression() {
33946
+ function parsePossibleParenthesizedArrowFunctionExpression(disallowReturnTypeInArrowFunction) {
33947
33947
  var tokenPos = scanner.getTokenPos();
33948
33948
  if (notParenthesizedArrow === null || notParenthesizedArrow === void 0 ? void 0 : notParenthesizedArrow.has(tokenPos)) {
33949
33949
  return undefined;
33950
33950
  }
33951
- var result = parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ false);
33951
+ var result = parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ false, disallowReturnTypeInArrowFunction);
33952
33952
  if (!result) {
33953
33953
  (notParenthesizedArrow || (notParenthesizedArrow = new ts.Set())).add(tokenPos);
33954
33954
  }
33955
33955
  return result;
33956
33956
  }
33957
- function tryParseAsyncSimpleArrowFunctionExpression() {
33957
+ function tryParseAsyncSimpleArrowFunctionExpression(disallowReturnTypeInArrowFunction) {
33958
33958
  // We do a check here so that we won't be doing unnecessarily call to "lookAhead"
33959
33959
  if (token() === 131 /* AsyncKeyword */) {
33960
33960
  if (lookAhead(isUnParenthesizedAsyncArrowFunctionWorker) === 1 /* True */) {
33961
33961
  var pos = getNodePos();
33962
33962
  var asyncModifier = parseModifiersForArrowFunction();
33963
33963
  var expr = parseBinaryExpressionOrHigher(0 /* Lowest */);
33964
- return parseSimpleArrowFunctionExpression(pos, expr, asyncModifier);
33964
+ return parseSimpleArrowFunctionExpression(pos, expr, disallowReturnTypeInArrowFunction, asyncModifier);
33965
33965
  }
33966
33966
  }
33967
33967
  return undefined;
@@ -33985,7 +33985,7 @@ var ts;
33985
33985
  }
33986
33986
  return 0 /* False */;
33987
33987
  }
33988
- function parseParenthesizedArrowFunctionExpression(allowAmbiguity) {
33988
+ function parseParenthesizedArrowFunctionExpression(allowAmbiguity, disallowReturnTypeInArrowFunction) {
33989
33989
  var pos = getNodePos();
33990
33990
  var hasJSDoc = hasPrecedingJSDocComment();
33991
33991
  var modifiers = parseModifiersForArrowFunction();
@@ -34011,6 +34011,23 @@ var ts;
34011
34011
  return undefined;
34012
34012
  }
34013
34013
  }
34014
+ // Given:
34015
+ // x ? y => ({ y }) : z => ({ z })
34016
+ // We try to parse the body of the first arrow function by looking at:
34017
+ // ({ y }) : z => ({ z })
34018
+ // This is a valid arrow function with "z" as the return type.
34019
+ //
34020
+ // But, if we're in the true side of a conditional expression, this colon
34021
+ // terminates the expression, so we cannot allow a return type if we aren't
34022
+ // certain whether or not the preceding text was parsed as a parameter list.
34023
+ //
34024
+ // For example,
34025
+ // a() ? (b: number, c?: string): void => d() : e
34026
+ // is determined by isParenthesizedArrowFunctionExpression to unambiguously
34027
+ // be an arrow expression, so we allow a return type.
34028
+ if (disallowReturnTypeInArrowFunction && token() === 58 /* ColonToken */) {
34029
+ return undefined;
34030
+ }
34014
34031
  var type = parseReturnType(58 /* ColonToken */, /*isType*/ false);
34015
34032
  if (type && !allowAmbiguity && typeHasArrowFunctionBlockingParseError(type)) {
34016
34033
  return undefined;
@@ -34039,12 +34056,12 @@ var ts;
34039
34056
  var lastToken = token();
34040
34057
  var equalsGreaterThanToken = parseExpectedToken(38 /* EqualsGreaterThanToken */);
34041
34058
  var body = (lastToken === 38 /* EqualsGreaterThanToken */ || lastToken === 18 /* OpenBraceToken */)
34042
- ? parseArrowFunctionExpressionBody(ts.some(modifiers, ts.isAsyncModifier))
34059
+ ? parseArrowFunctionExpressionBody(ts.some(modifiers, ts.isAsyncModifier), disallowReturnTypeInArrowFunction)
34043
34060
  : parseIdentifier();
34044
34061
  var node = factory.createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body);
34045
34062
  return withJSDoc(finishNode(node, pos), hasJSDoc);
34046
34063
  }
34047
- function parseArrowFunctionExpressionBody(isAsync) {
34064
+ function parseArrowFunctionExpressionBody(isAsync, disallowReturnTypeInArrowFunction) {
34048
34065
  if (token() === 18 /* OpenBraceToken */) {
34049
34066
  return parseFunctionBlock(isAsync ? 2 /* Await */ : 0 /* None */);
34050
34067
  }
@@ -34072,8 +34089,8 @@ var ts;
34072
34089
  var savedTopLevel = topLevel;
34073
34090
  topLevel = false;
34074
34091
  var node = isAsync
34075
- ? doInAwaitContext(parseAssignmentExpressionOrHigher)
34076
- : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher);
34092
+ ? doInAwaitContext(function () { return parseAssignmentExpressionOrHigher(disallowReturnTypeInArrowFunction); })
34093
+ : doOutsideOfAwaitContext(function () { return parseAssignmentExpressionOrHigher(disallowReturnTypeInArrowFunction); });
34077
34094
  topLevel = savedTopLevel;
34078
34095
  return node;
34079
34096
  }
@@ -34086,8 +34103,8 @@ var ts;
34086
34103
  // Note: we explicitly 'allowIn' in the whenTrue part of the condition expression, and
34087
34104
  // we do not that for the 'whenFalse' part.
34088
34105
  var colonToken;
34089
- return finishNode(factory.createConditionalExpression(leftOperand, questionToken, doOutsideOfContext(disallowInAndDecoratorContext, parseAssignmentExpressionOrHigher), colonToken = parseExpectedToken(58 /* ColonToken */), ts.nodeIsPresent(colonToken)
34090
- ? parseAssignmentExpressionOrHigher()
34106
+ return finishNode(factory.createConditionalExpression(leftOperand, questionToken, doOutsideOfContext(disallowInAndDecoratorContext, function () { return parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ true); }), colonToken = parseExpectedToken(58 /* ColonToken */), ts.nodeIsPresent(colonToken)
34107
+ ? parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ true)
34091
34108
  : createMissingNode(79 /* Identifier */, /*reportAtCurrentPosition*/ false, ts.Diagnostics._0_expected, ts.tokenToString(58 /* ColonToken */))), pos);
34092
34109
  }
34093
34110
  function parseBinaryExpressionOrHigher(precedence) {
@@ -35003,13 +35020,13 @@ var ts;
35003
35020
  function parseSpreadElement() {
35004
35021
  var pos = getNodePos();
35005
35022
  parseExpected(25 /* DotDotDotToken */);
35006
- var expression = parseAssignmentExpressionOrHigher();
35023
+ var expression = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
35007
35024
  return finishNode(factory.createSpreadElement(expression), pos);
35008
35025
  }
35009
35026
  function parseArgumentOrArrayLiteralElement() {
35010
35027
  return token() === 25 /* DotDotDotToken */ ? parseSpreadElement() :
35011
35028
  token() === 27 /* CommaToken */ ? finishNode(factory.createOmittedExpression(), getNodePos()) :
35012
- parseAssignmentExpressionOrHigher();
35029
+ parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
35013
35030
  }
35014
35031
  function parseArgumentExpression() {
35015
35032
  return doOutsideOfContext(disallowInAndDecoratorContext, parseArgumentOrArrayLiteralElement);
@@ -35026,7 +35043,7 @@ var ts;
35026
35043
  var pos = getNodePos();
35027
35044
  var hasJSDoc = hasPrecedingJSDocComment();
35028
35045
  if (parseOptionalToken(25 /* DotDotDotToken */)) {
35029
- var expression = parseAssignmentExpressionOrHigher();
35046
+ var expression = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
35030
35047
  return withJSDoc(finishNode(factory.createSpreadAssignment(expression), pos), hasJSDoc);
35031
35048
  }
35032
35049
  var decorators = parseDecorators();
@@ -35055,7 +35072,7 @@ var ts;
35055
35072
  var isShorthandPropertyAssignment = tokenIsIdentifier && (token() !== 58 /* ColonToken */);
35056
35073
  if (isShorthandPropertyAssignment) {
35057
35074
  var equalsToken = parseOptionalToken(63 /* EqualsToken */);
35058
- var objectAssignmentInitializer = equalsToken ? allowInAnd(parseAssignmentExpressionOrHigher) : undefined;
35075
+ var objectAssignmentInitializer = equalsToken ? allowInAnd(function () { return parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false); }) : undefined;
35059
35076
  node = factory.createShorthandPropertyAssignment(name, objectAssignmentInitializer);
35060
35077
  // Save equals token for error reporting.
35061
35078
  // TODO(rbuckton): Consider manufacturing this when we need to report an error as it is otherwise not useful.
@@ -35063,7 +35080,7 @@ var ts;
35063
35080
  }
35064
35081
  else {
35065
35082
  parseExpected(58 /* ColonToken */);
35066
- var initializer = allowInAnd(parseAssignmentExpressionOrHigher);
35083
+ var initializer = allowInAnd(function () { return parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false); });
35067
35084
  node = factory.createPropertyAssignment(name, initializer);
35068
35085
  }
35069
35086
  // Decorators, Modifiers, questionToken, and exclamationToken are not supported by property assignments and are reported in the grammar checker
@@ -35243,7 +35260,7 @@ var ts;
35243
35260
  }
35244
35261
  var node;
35245
35262
  if (awaitToken ? parseExpected(159 /* OfKeyword */) : parseOptional(159 /* OfKeyword */)) {
35246
- var expression = allowInAnd(parseAssignmentExpressionOrHigher);
35263
+ var expression = allowInAnd(function () { return parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false); });
35247
35264
  parseExpected(21 /* CloseParenToken */);
35248
35265
  node = factory.createForOfStatement(awaitToken, initializer, expression, parseStatement());
35249
35266
  }
@@ -36410,7 +36427,7 @@ var ts;
36410
36427
  var pos = getNodePos();
36411
36428
  var name = ts.tokenIsIdentifierOrKeyword(token()) ? parseIdentifierName() : parseLiteralLikeNode(10 /* StringLiteral */);
36412
36429
  parseExpected(58 /* ColonToken */);
36413
- var value = parseAssignmentExpressionOrHigher();
36430
+ var value = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
36414
36431
  return finishNode(factory.createAssertEntry(name, value), pos);
36415
36432
  }
36416
36433
  function parseAssertClause() {
@@ -36647,7 +36664,7 @@ var ts;
36647
36664
  else {
36648
36665
  parseExpected(88 /* DefaultKeyword */);
36649
36666
  }
36650
- var expression = parseAssignmentExpressionOrHigher();
36667
+ var expression = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
36651
36668
  parseSemicolon();
36652
36669
  setAwaitContext(savedAwaitContext);
36653
36670
  var node = factory.createExportAssignment(decorators, modifiers, isExportEquals, expression);
@@ -135521,6 +135538,9 @@ var ts;
135521
135538
  // *don’t* include readonly member modifiers.
135522
135539
  return getAllReferencesForKeyword(sourceFiles, node.kind, cancellationToken, node.kind === 144 /* ReadonlyKeyword */ ? isReadonlyTypeOperator : undefined);
135523
135540
  }
135541
+ if (ts.isImportMeta(node.parent) && node.parent.name === node) {
135542
+ return getAllReferencesForImportMeta(sourceFiles, cancellationToken);
135543
+ }
135524
135544
  if (ts.isStaticModifier(node) && ts.isClassStaticBlockDeclaration(node.parent)) {
135525
135545
  return [{ definition: { type: 2 /* Keyword */, node: node }, references: [nodeEntry(node)] }];
135526
135546
  }
@@ -136002,6 +136022,18 @@ var ts;
136002
136022
  return false;
136003
136023
  }
136004
136024
  }
136025
+ function getAllReferencesForImportMeta(sourceFiles, cancellationToken) {
136026
+ var references = ts.flatMap(sourceFiles, function (sourceFile) {
136027
+ cancellationToken.throwIfCancellationRequested();
136028
+ return ts.mapDefined(getPossibleSymbolReferenceNodes(sourceFile, "meta", sourceFile), function (node) {
136029
+ var parent = node.parent;
136030
+ if (ts.isImportMeta(parent)) {
136031
+ return nodeEntry(parent);
136032
+ }
136033
+ });
136034
+ });
136035
+ return references.length ? [{ definition: { type: 2 /* Keyword */, node: references[0].node }, references: references }] : undefined;
136036
+ }
136005
136037
  function getAllReferencesForKeyword(sourceFiles, keywordKind, cancellationToken, filter) {
136006
136038
  var references = ts.flatMap(sourceFiles, function (sourceFile) {
136007
136039
  cancellationToken.throwIfCancellationRequested();
@@ -137714,6 +137746,9 @@ var ts;
137714
137746
  if (node === sourceFile) {
137715
137747
  return undefined;
137716
137748
  }
137749
+ if (ts.isImportMeta(node.parent) && node.parent.name === node) {
137750
+ return definitionFromType(typeChecker.getTypeAtLocation(node.parent), typeChecker, node.parent);
137751
+ }
137717
137752
  var symbol = getSymbol(node, typeChecker);
137718
137753
  if (!symbol)
137719
137754
  return undefined;
@@ -162842,6 +162877,9 @@ var ts;
162842
162877
  if (ts.isNamedTupleMember(node.parent) && node.pos === node.parent.pos) {
162843
162878
  return node.parent;
162844
162879
  }
162880
+ if (ts.isImportMeta(node.parent) && node.parent.name === node) {
162881
+ return node.parent;
162882
+ }
162845
162883
  return node;
162846
162884
  }
162847
162885
  function shouldGetType(sourceFile, node, position) {
@@ -162857,6 +162895,8 @@ var ts;
162857
162895
  case 106 /* SuperKeyword */:
162858
162896
  case 196 /* NamedTupleMember */:
162859
162897
  return true;
162898
+ case 230 /* MetaProperty */:
162899
+ return ts.isImportMeta(node);
162860
162900
  default:
162861
162901
  return false;
162862
162902
  }
@@ -89,7 +89,7 @@ var ts;
89
89
  // The following is baselined as a literal template type without intervention
90
90
  /** The version of the TypeScript compiler release */
91
91
  // eslint-disable-next-line @typescript-eslint/no-inferrable-types
92
- ts.version = ts.versionMajorMinor + ".0-dev.20220225";
92
+ ts.version = ts.versionMajorMinor + ".0-dev.20220228";
93
93
  /* @internal */
94
94
  var Comparison;
95
95
  (function (Comparison) {
@@ -33462,10 +33462,10 @@ var ts;
33462
33462
  setDecoratorContext(/*val*/ false);
33463
33463
  }
33464
33464
  var pos = getNodePos();
33465
- var expr = parseAssignmentExpressionOrHigher();
33465
+ var expr = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
33466
33466
  var operatorToken;
33467
33467
  while ((operatorToken = parseOptionalToken(27 /* CommaToken */))) {
33468
- expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher(), pos);
33468
+ expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false), pos);
33469
33469
  }
33470
33470
  if (saveDecoratorContext) {
33471
33471
  setDecoratorContext(/*val*/ true);
@@ -33473,9 +33473,9 @@ var ts;
33473
33473
  return expr;
33474
33474
  }
33475
33475
  function parseInitializer() {
33476
- return parseOptional(63 /* EqualsToken */) ? parseAssignmentExpressionOrHigher() : undefined;
33476
+ return parseOptional(63 /* EqualsToken */) ? parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false) : undefined;
33477
33477
  }
33478
- function parseAssignmentExpressionOrHigher() {
33478
+ function parseAssignmentExpressionOrHigher(disallowReturnTypeInArrowFunction) {
33479
33479
  // AssignmentExpression[in,yield]:
33480
33480
  // 1) ConditionalExpression[?in,?yield]
33481
33481
  // 2) LeftHandSideExpression = AssignmentExpression[?in,?yield]
@@ -33501,7 +33501,7 @@ var ts;
33501
33501
  // If we do successfully parse arrow-function, we must *not* recurse for productions 1, 2 or 3. An ArrowFunction is
33502
33502
  // not a LeftHandSideExpression, nor does it start a ConditionalExpression. So we are done
33503
33503
  // with AssignmentExpression if we see one.
33504
- var arrowExpression = tryParseParenthesizedArrowFunctionExpression() || tryParseAsyncSimpleArrowFunctionExpression();
33504
+ var arrowExpression = tryParseParenthesizedArrowFunctionExpression(disallowReturnTypeInArrowFunction) || tryParseAsyncSimpleArrowFunctionExpression(disallowReturnTypeInArrowFunction);
33505
33505
  if (arrowExpression) {
33506
33506
  return arrowExpression;
33507
33507
  }
@@ -33520,7 +33520,7 @@ var ts;
33520
33520
  // parameter ('x => ...') above. We handle it here by checking if the parsed expression was a single
33521
33521
  // identifier and the current token is an arrow.
33522
33522
  if (expr.kind === 79 /* Identifier */ && token() === 38 /* EqualsGreaterThanToken */) {
33523
- return parseSimpleArrowFunctionExpression(pos, expr, /*asyncModifier*/ undefined);
33523
+ return parseSimpleArrowFunctionExpression(pos, expr, disallowReturnTypeInArrowFunction, /*asyncModifier*/ undefined);
33524
33524
  }
33525
33525
  // Now see if we might be in cases '2' or '3'.
33526
33526
  // If the expression was a LHS expression, and we have an assignment operator, then
@@ -33529,7 +33529,7 @@ var ts;
33529
33529
  // Note: we call reScanGreaterToken so that we get an appropriately merged token
33530
33530
  // for cases like `> > =` becoming `>>=`
33531
33531
  if (ts.isLeftHandSideExpression(expr) && ts.isAssignmentOperator(reScanGreaterToken())) {
33532
- return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher(), pos);
33532
+ return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher(disallowReturnTypeInArrowFunction), pos);
33533
33533
  }
33534
33534
  // It wasn't an assignment or a lambda. This is a conditional expression:
33535
33535
  return parseConditionalExpressionRest(expr, pos);
@@ -33572,7 +33572,7 @@ var ts;
33572
33572
  nextToken();
33573
33573
  if (!scanner.hasPrecedingLineBreak() &&
33574
33574
  (token() === 41 /* AsteriskToken */ || isStartOfExpression())) {
33575
- return finishNode(factory.createYieldExpression(parseOptionalToken(41 /* AsteriskToken */), parseAssignmentExpressionOrHigher()), pos);
33575
+ return finishNode(factory.createYieldExpression(parseOptionalToken(41 /* AsteriskToken */), parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false)), pos);
33576
33576
  }
33577
33577
  else {
33578
33578
  // if the next token is not on the same line as yield. or we don't have an '*' or
@@ -33580,7 +33580,7 @@ var ts;
33580
33580
  return finishNode(factory.createYieldExpression(/*asteriskToken*/ undefined, /*expression*/ undefined), pos);
33581
33581
  }
33582
33582
  }
33583
- function parseSimpleArrowFunctionExpression(pos, identifier, asyncModifier) {
33583
+ function parseSimpleArrowFunctionExpression(pos, identifier, disallowReturnTypeInArrowFunction, asyncModifier) {
33584
33584
  ts.Debug.assert(token() === 38 /* EqualsGreaterThanToken */, "parseSimpleArrowFunctionExpression should only have been called if we had a =>");
33585
33585
  var parameter = factory.createParameterDeclaration(
33586
33586
  /*decorators*/ undefined,
@@ -33592,11 +33592,11 @@ var ts;
33592
33592
  finishNode(parameter, identifier.pos);
33593
33593
  var parameters = createNodeArray([parameter], parameter.pos, parameter.end);
33594
33594
  var equalsGreaterThanToken = parseExpectedToken(38 /* EqualsGreaterThanToken */);
33595
- var body = parseArrowFunctionExpressionBody(/*isAsync*/ !!asyncModifier);
33595
+ var body = parseArrowFunctionExpressionBody(/*isAsync*/ !!asyncModifier, disallowReturnTypeInArrowFunction);
33596
33596
  var node = factory.createArrowFunction(asyncModifier, /*typeParameters*/ undefined, parameters, /*type*/ undefined, equalsGreaterThanToken, body);
33597
33597
  return addJSDocComment(finishNode(node, pos));
33598
33598
  }
33599
- function tryParseParenthesizedArrowFunctionExpression() {
33599
+ function tryParseParenthesizedArrowFunctionExpression(disallowReturnTypeInArrowFunction) {
33600
33600
  var triState = isParenthesizedArrowFunctionExpression();
33601
33601
  if (triState === 0 /* False */) {
33602
33602
  // It's definitely not a parenthesized arrow function expression.
@@ -33607,8 +33607,8 @@ var ts;
33607
33607
  // it out, but don't allow any ambiguity, and return 'undefined' if this could be an
33608
33608
  // expression instead.
33609
33609
  return triState === 1 /* True */ ?
33610
- parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ true) :
33611
- tryParse(parsePossibleParenthesizedArrowFunctionExpression);
33610
+ parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ true, /*disallowReturnTypeInArrowFunction*/ false) :
33611
+ tryParse(function () { return parsePossibleParenthesizedArrowFunctionExpression(disallowReturnTypeInArrowFunction); });
33612
33612
  }
33613
33613
  // True -> We definitely expect a parenthesized arrow function here.
33614
33614
  // False -> There *cannot* be a parenthesized arrow function here.
@@ -33738,25 +33738,25 @@ var ts;
33738
33738
  return 2 /* Unknown */;
33739
33739
  }
33740
33740
  }
33741
- function parsePossibleParenthesizedArrowFunctionExpression() {
33741
+ function parsePossibleParenthesizedArrowFunctionExpression(disallowReturnTypeInArrowFunction) {
33742
33742
  var tokenPos = scanner.getTokenPos();
33743
33743
  if (notParenthesizedArrow === null || notParenthesizedArrow === void 0 ? void 0 : notParenthesizedArrow.has(tokenPos)) {
33744
33744
  return undefined;
33745
33745
  }
33746
- var result = parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ false);
33746
+ var result = parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ false, disallowReturnTypeInArrowFunction);
33747
33747
  if (!result) {
33748
33748
  (notParenthesizedArrow || (notParenthesizedArrow = new ts.Set())).add(tokenPos);
33749
33749
  }
33750
33750
  return result;
33751
33751
  }
33752
- function tryParseAsyncSimpleArrowFunctionExpression() {
33752
+ function tryParseAsyncSimpleArrowFunctionExpression(disallowReturnTypeInArrowFunction) {
33753
33753
  // We do a check here so that we won't be doing unnecessarily call to "lookAhead"
33754
33754
  if (token() === 131 /* AsyncKeyword */) {
33755
33755
  if (lookAhead(isUnParenthesizedAsyncArrowFunctionWorker) === 1 /* True */) {
33756
33756
  var pos = getNodePos();
33757
33757
  var asyncModifier = parseModifiersForArrowFunction();
33758
33758
  var expr = parseBinaryExpressionOrHigher(0 /* Lowest */);
33759
- return parseSimpleArrowFunctionExpression(pos, expr, asyncModifier);
33759
+ return parseSimpleArrowFunctionExpression(pos, expr, disallowReturnTypeInArrowFunction, asyncModifier);
33760
33760
  }
33761
33761
  }
33762
33762
  return undefined;
@@ -33780,7 +33780,7 @@ var ts;
33780
33780
  }
33781
33781
  return 0 /* False */;
33782
33782
  }
33783
- function parseParenthesizedArrowFunctionExpression(allowAmbiguity) {
33783
+ function parseParenthesizedArrowFunctionExpression(allowAmbiguity, disallowReturnTypeInArrowFunction) {
33784
33784
  var pos = getNodePos();
33785
33785
  var hasJSDoc = hasPrecedingJSDocComment();
33786
33786
  var modifiers = parseModifiersForArrowFunction();
@@ -33806,6 +33806,23 @@ var ts;
33806
33806
  return undefined;
33807
33807
  }
33808
33808
  }
33809
+ // Given:
33810
+ // x ? y => ({ y }) : z => ({ z })
33811
+ // We try to parse the body of the first arrow function by looking at:
33812
+ // ({ y }) : z => ({ z })
33813
+ // This is a valid arrow function with "z" as the return type.
33814
+ //
33815
+ // But, if we're in the true side of a conditional expression, this colon
33816
+ // terminates the expression, so we cannot allow a return type if we aren't
33817
+ // certain whether or not the preceding text was parsed as a parameter list.
33818
+ //
33819
+ // For example,
33820
+ // a() ? (b: number, c?: string): void => d() : e
33821
+ // is determined by isParenthesizedArrowFunctionExpression to unambiguously
33822
+ // be an arrow expression, so we allow a return type.
33823
+ if (disallowReturnTypeInArrowFunction && token() === 58 /* ColonToken */) {
33824
+ return undefined;
33825
+ }
33809
33826
  var type = parseReturnType(58 /* ColonToken */, /*isType*/ false);
33810
33827
  if (type && !allowAmbiguity && typeHasArrowFunctionBlockingParseError(type)) {
33811
33828
  return undefined;
@@ -33834,12 +33851,12 @@ var ts;
33834
33851
  var lastToken = token();
33835
33852
  var equalsGreaterThanToken = parseExpectedToken(38 /* EqualsGreaterThanToken */);
33836
33853
  var body = (lastToken === 38 /* EqualsGreaterThanToken */ || lastToken === 18 /* OpenBraceToken */)
33837
- ? parseArrowFunctionExpressionBody(ts.some(modifiers, ts.isAsyncModifier))
33854
+ ? parseArrowFunctionExpressionBody(ts.some(modifiers, ts.isAsyncModifier), disallowReturnTypeInArrowFunction)
33838
33855
  : parseIdentifier();
33839
33856
  var node = factory.createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body);
33840
33857
  return withJSDoc(finishNode(node, pos), hasJSDoc);
33841
33858
  }
33842
- function parseArrowFunctionExpressionBody(isAsync) {
33859
+ function parseArrowFunctionExpressionBody(isAsync, disallowReturnTypeInArrowFunction) {
33843
33860
  if (token() === 18 /* OpenBraceToken */) {
33844
33861
  return parseFunctionBlock(isAsync ? 2 /* Await */ : 0 /* None */);
33845
33862
  }
@@ -33867,8 +33884,8 @@ var ts;
33867
33884
  var savedTopLevel = topLevel;
33868
33885
  topLevel = false;
33869
33886
  var node = isAsync
33870
- ? doInAwaitContext(parseAssignmentExpressionOrHigher)
33871
- : doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher);
33887
+ ? doInAwaitContext(function () { return parseAssignmentExpressionOrHigher(disallowReturnTypeInArrowFunction); })
33888
+ : doOutsideOfAwaitContext(function () { return parseAssignmentExpressionOrHigher(disallowReturnTypeInArrowFunction); });
33872
33889
  topLevel = savedTopLevel;
33873
33890
  return node;
33874
33891
  }
@@ -33881,8 +33898,8 @@ var ts;
33881
33898
  // Note: we explicitly 'allowIn' in the whenTrue part of the condition expression, and
33882
33899
  // we do not that for the 'whenFalse' part.
33883
33900
  var colonToken;
33884
- return finishNode(factory.createConditionalExpression(leftOperand, questionToken, doOutsideOfContext(disallowInAndDecoratorContext, parseAssignmentExpressionOrHigher), colonToken = parseExpectedToken(58 /* ColonToken */), ts.nodeIsPresent(colonToken)
33885
- ? parseAssignmentExpressionOrHigher()
33901
+ return finishNode(factory.createConditionalExpression(leftOperand, questionToken, doOutsideOfContext(disallowInAndDecoratorContext, function () { return parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ true); }), colonToken = parseExpectedToken(58 /* ColonToken */), ts.nodeIsPresent(colonToken)
33902
+ ? parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ true)
33886
33903
  : createMissingNode(79 /* Identifier */, /*reportAtCurrentPosition*/ false, ts.Diagnostics._0_expected, ts.tokenToString(58 /* ColonToken */))), pos);
33887
33904
  }
33888
33905
  function parseBinaryExpressionOrHigher(precedence) {
@@ -34798,13 +34815,13 @@ var ts;
34798
34815
  function parseSpreadElement() {
34799
34816
  var pos = getNodePos();
34800
34817
  parseExpected(25 /* DotDotDotToken */);
34801
- var expression = parseAssignmentExpressionOrHigher();
34818
+ var expression = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
34802
34819
  return finishNode(factory.createSpreadElement(expression), pos);
34803
34820
  }
34804
34821
  function parseArgumentOrArrayLiteralElement() {
34805
34822
  return token() === 25 /* DotDotDotToken */ ? parseSpreadElement() :
34806
34823
  token() === 27 /* CommaToken */ ? finishNode(factory.createOmittedExpression(), getNodePos()) :
34807
- parseAssignmentExpressionOrHigher();
34824
+ parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
34808
34825
  }
34809
34826
  function parseArgumentExpression() {
34810
34827
  return doOutsideOfContext(disallowInAndDecoratorContext, parseArgumentOrArrayLiteralElement);
@@ -34821,7 +34838,7 @@ var ts;
34821
34838
  var pos = getNodePos();
34822
34839
  var hasJSDoc = hasPrecedingJSDocComment();
34823
34840
  if (parseOptionalToken(25 /* DotDotDotToken */)) {
34824
- var expression = parseAssignmentExpressionOrHigher();
34841
+ var expression = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
34825
34842
  return withJSDoc(finishNode(factory.createSpreadAssignment(expression), pos), hasJSDoc);
34826
34843
  }
34827
34844
  var decorators = parseDecorators();
@@ -34850,7 +34867,7 @@ var ts;
34850
34867
  var isShorthandPropertyAssignment = tokenIsIdentifier && (token() !== 58 /* ColonToken */);
34851
34868
  if (isShorthandPropertyAssignment) {
34852
34869
  var equalsToken = parseOptionalToken(63 /* EqualsToken */);
34853
- var objectAssignmentInitializer = equalsToken ? allowInAnd(parseAssignmentExpressionOrHigher) : undefined;
34870
+ var objectAssignmentInitializer = equalsToken ? allowInAnd(function () { return parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false); }) : undefined;
34854
34871
  node = factory.createShorthandPropertyAssignment(name, objectAssignmentInitializer);
34855
34872
  // Save equals token for error reporting.
34856
34873
  // TODO(rbuckton): Consider manufacturing this when we need to report an error as it is otherwise not useful.
@@ -34858,7 +34875,7 @@ var ts;
34858
34875
  }
34859
34876
  else {
34860
34877
  parseExpected(58 /* ColonToken */);
34861
- var initializer = allowInAnd(parseAssignmentExpressionOrHigher);
34878
+ var initializer = allowInAnd(function () { return parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false); });
34862
34879
  node = factory.createPropertyAssignment(name, initializer);
34863
34880
  }
34864
34881
  // Decorators, Modifiers, questionToken, and exclamationToken are not supported by property assignments and are reported in the grammar checker
@@ -35038,7 +35055,7 @@ var ts;
35038
35055
  }
35039
35056
  var node;
35040
35057
  if (awaitToken ? parseExpected(159 /* OfKeyword */) : parseOptional(159 /* OfKeyword */)) {
35041
- var expression = allowInAnd(parseAssignmentExpressionOrHigher);
35058
+ var expression = allowInAnd(function () { return parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false); });
35042
35059
  parseExpected(21 /* CloseParenToken */);
35043
35060
  node = factory.createForOfStatement(awaitToken, initializer, expression, parseStatement());
35044
35061
  }
@@ -36205,7 +36222,7 @@ var ts;
36205
36222
  var pos = getNodePos();
36206
36223
  var name = ts.tokenIsIdentifierOrKeyword(token()) ? parseIdentifierName() : parseLiteralLikeNode(10 /* StringLiteral */);
36207
36224
  parseExpected(58 /* ColonToken */);
36208
- var value = parseAssignmentExpressionOrHigher();
36225
+ var value = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
36209
36226
  return finishNode(factory.createAssertEntry(name, value), pos);
36210
36227
  }
36211
36228
  function parseAssertClause() {
@@ -36442,7 +36459,7 @@ var ts;
36442
36459
  else {
36443
36460
  parseExpected(88 /* DefaultKeyword */);
36444
36461
  }
36445
- var expression = parseAssignmentExpressionOrHigher();
36462
+ var expression = parseAssignmentExpressionOrHigher(/*disallowReturnTypeInArrowFunction*/ false);
36446
36463
  parseSemicolon();
36447
36464
  setAwaitContext(savedAwaitContext);
36448
36465
  var node = factory.createExportAssignment(decorators, modifiers, isExportEquals, expression);
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "typescript",
3
3
  "author": "Microsoft Corp.",
4
4
  "homepage": "https://www.typescriptlang.org/",
5
- "version": "4.7.0-dev.20220225",
5
+ "version": "4.7.0-dev.20220228",
6
6
  "license": "Apache-2.0",
7
7
  "description": "TypeScript is a language for application scale JavaScript development",
8
8
  "keywords": [