Skip to content

Commit 10db652

Browse files
authored
Move complex parameter lists of async function into downlevel generator body (#56296)
1 parent c5a8636 commit 10db652

File tree

56 files changed

+1081
-287
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+1081
-287
lines changed

src/compiler/checker.ts

+16-8
Original file line numberDiff line numberDiff line change
@@ -28739,17 +28739,25 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2873928739
return errorType;
2874028740
}
2874128741

28742-
const container = getContainingFunction(node)!;
28743-
if (languageVersion < ScriptTarget.ES2015) {
28744-
if (container.kind === SyntaxKind.ArrowFunction) {
28745-
error(node, Diagnostics.The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression);
28742+
let container = getContainingFunction(node);
28743+
if (container) {
28744+
if (languageVersion < ScriptTarget.ES2015) {
28745+
if (container.kind === SyntaxKind.ArrowFunction) {
28746+
error(node, Diagnostics.The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression);
28747+
}
28748+
else if (hasSyntacticModifier(container, ModifierFlags.Async)) {
28749+
error(node, Diagnostics.The_arguments_object_cannot_be_referenced_in_an_async_function_or_method_in_ES3_and_ES5_Consider_using_a_standard_function_or_method);
28750+
}
2874628751
}
28747-
else if (hasSyntacticModifier(container, ModifierFlags.Async)) {
28748-
error(node, Diagnostics.The_arguments_object_cannot_be_referenced_in_an_async_function_or_method_in_ES3_and_ES5_Consider_using_a_standard_function_or_method);
28752+
28753+
getNodeLinks(container).flags |= NodeCheckFlags.CaptureArguments;
28754+
while (container && isArrowFunction(container)) {
28755+
container = getContainingFunction(container);
28756+
if (container) {
28757+
getNodeLinks(container).flags |= NodeCheckFlags.CaptureArguments;
28758+
}
2874928759
}
2875028760
}
28751-
28752-
getNodeLinks(container).flags |= NodeCheckFlags.CaptureArguments;
2875328761
return getTypeOfSymbol(symbol);
2875428762
}
2875528763

src/compiler/factory/emitHelpers.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
isIdentifier,
2727
memoize,
2828
ObjectLiteralElementLike,
29+
ParameterDeclaration,
2930
PrivateIdentifier,
3031
ScriptTarget,
3132
setEmitFlags,
@@ -115,7 +116,7 @@ export interface EmitHelperFactory {
115116
// ES2018 Destructuring Helpers
116117
createRestHelper(value: Expression, elements: readonly BindingOrAssignmentElement[], computedTempVariables: readonly Expression[] | undefined, location: TextRange): Expression;
117118
// ES2017 Helpers
118-
createAwaiterHelper(hasLexicalThis: boolean, hasLexicalArguments: boolean, promiseConstructor: EntityName | Expression | undefined, body: Block): Expression;
119+
createAwaiterHelper(hasLexicalThis: boolean, argumentsExpression: Expression | undefined, promiseConstructor: EntityName | Expression | undefined, parameters: readonly ParameterDeclaration[] | undefined, body: Block): Expression;
119120
// ES2015 Helpers
120121
createExtendsHelper(name: Identifier): Expression;
121122
createTemplateObjectHelper(cooked: ArrayLiteralExpression, raw: ArrayLiteralExpression): Expression;
@@ -497,15 +498,15 @@ export function createEmitHelperFactory(context: TransformationContext): EmitHel
497498

498499
// ES2017 Helpers
499500

500-
function createAwaiterHelper(hasLexicalThis: boolean, hasLexicalArguments: boolean, promiseConstructor: EntityName | Expression | undefined, body: Block) {
501+
function createAwaiterHelper(hasLexicalThis: boolean, argumentsExpression: Expression | undefined, promiseConstructor: EntityName | Expression | undefined, parameters: readonly ParameterDeclaration[], body: Block) {
501502
context.requestEmitHelper(awaiterHelper);
502503

503504
const generatorFunc = factory.createFunctionExpression(
504505
/*modifiers*/ undefined,
505506
factory.createToken(SyntaxKind.AsteriskToken),
506507
/*name*/ undefined,
507508
/*typeParameters*/ undefined,
508-
/*parameters*/ [],
509+
parameters ?? [],
509510
/*type*/ undefined,
510511
body,
511512
);
@@ -518,7 +519,7 @@ export function createEmitHelperFactory(context: TransformationContext): EmitHel
518519
/*typeArguments*/ undefined,
519520
[
520521
hasLexicalThis ? factory.createThis() : factory.createVoidZero(),
521-
hasLexicalArguments ? factory.createIdentifier("arguments") : factory.createVoidZero(),
522+
argumentsExpression ?? factory.createVoidZero(),
522523
promiseConstructor ? createExpressionFromEntityName(factory, promiseConstructor) : factory.createVoidZero(),
523524
generatorFunc,
524525
],

0 commit comments

Comments
 (0)