Skip to content

Commit bef4582

Browse files
Copilotjakebailey
andauthored
Fix downlevel async super in default parameters (#4104)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jakebailey <5341706+jakebailey@users.noreply.github.com>
1 parent 109f18b commit bef4582

3 files changed

Lines changed: 88 additions & 14 deletions

File tree

internal/transformers/estransforms/async.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -722,12 +722,25 @@ func (tx *asyncTransformer) transformAsyncFunctionParameterList(node *ast.Node)
722722
}
723723

724724
func (tx *asyncTransformer) transformAsyncFunctionBody(node *ast.Node, outerParameters *ast.NodeList) *ast.Node {
725+
isArrow := node.Kind == ast.KindArrowFunction
726+
savedCapturedSuperProperties := tx.capturedSuperProperties
727+
savedHasSuperElementAccess := tx.hasSuperElementAccess
728+
savedHasSuperPropertyAssignment := tx.hasSuperPropertyAssignment
729+
savedSuperBinding := tx.superBinding
730+
savedSuperIndexBinding := tx.superIndexBinding
731+
if !isArrow {
732+
tx.capturedSuperProperties = &collections.OrderedSet[string]{}
733+
tx.hasSuperElementAccess = false
734+
tx.hasSuperPropertyAssignment = false
735+
tx.superBinding = tx.Factory().NewUniqueNameEx("_super", printer.AutoGenerateOptions{Flags: printer.GeneratedIdentifierFlagsOptimistic | printer.GeneratedIdentifierFlagsFileLevel})
736+
tx.superIndexBinding = tx.Factory().NewUniqueNameEx("_superIndex", printer.AutoGenerateOptions{Flags: printer.GeneratedIdentifierFlagsOptimistic | printer.GeneratedIdentifierFlagsFileLevel})
737+
}
738+
725739
innerParameters := (*ast.NodeList)(nil)
726740
if !isSimpleParameterList(node.Parameters()) {
727741
innerParameters = tx.EmitContext().VisitParameters(node.ParameterList(), tx.Visitor())
728742
}
729743

730-
isArrow := node.Kind == ast.KindArrowFunction
731744
savedLexicalArguments := tx.lexicalArguments
732745
captureLexicalArguments := tx.lexicalArguments.binding == nil
733746
if captureLexicalArguments {
@@ -773,19 +786,6 @@ func (tx *asyncTransformer) transformAsyncFunctionBody(node *ast.Node, outerPara
773786
tx.recordDeclarationName(parameter, tx.enclosingFunctionParameterNames)
774787
}
775788

776-
savedCapturedSuperProperties := tx.capturedSuperProperties
777-
savedHasSuperElementAccess := tx.hasSuperElementAccess
778-
savedHasSuperPropertyAssignment := tx.hasSuperPropertyAssignment
779-
savedSuperBinding := tx.superBinding
780-
savedSuperIndexBinding := tx.superIndexBinding
781-
if !isArrow {
782-
tx.capturedSuperProperties = &collections.OrderedSet[string]{}
783-
tx.hasSuperElementAccess = false
784-
tx.hasSuperPropertyAssignment = false
785-
tx.superBinding = tx.Factory().NewUniqueNameEx("_super", printer.AutoGenerateOptions{Flags: printer.GeneratedIdentifierFlagsOptimistic | printer.GeneratedIdentifierFlagsFileLevel})
786-
tx.superIndexBinding = tx.Factory().NewUniqueNameEx("_superIndex", printer.AutoGenerateOptions{Flags: printer.GeneratedIdentifierFlagsOptimistic | printer.GeneratedIdentifierFlagsFileLevel})
787-
}
788-
789789
hasLexicalThis := tx.inHasLexicalThisContext()
790790

791791
asyncBody := tx.transformAsyncFunctionBodyWorker(node.Body())
@@ -799,6 +799,7 @@ func (tx *asyncTransformer) transformAsyncFunctionBody(node *ast.Node, outerPara
799799
emitSuperHelpers := tx.capturedSuperProperties != nil &&
800800
(tx.capturedSuperProperties.Size() > 0 || tx.hasSuperElementAccess)
801801
if emitSuperHelpers {
802+
innerParameters = tx.superAccessVisitor.VisitNodes(innerParameters)
802803
asyncBody = tx.substituteSuperAccessesInBody(asyncBody)
803804
}
804805

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//// [tests/cases/compiler/asyncSuperDefaultParameters.ts] ////
2+
3+
//// [asyncSuperDefaultParameters.ts]
4+
class B {
5+
m() {
6+
return 1;
7+
}
8+
}
9+
10+
class C extends B {
11+
f() {
12+
const g = async (b = super.m()) => b;
13+
return g();
14+
}
15+
16+
async h(b = super.m()) {
17+
return b;
18+
}
19+
}
20+
21+
22+
//// [asyncSuperDefaultParameters.js]
23+
"use strict";
24+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
25+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
26+
return new (P || (P = Promise))(function (resolve, reject) {
27+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
28+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
29+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
30+
step((generator = generator.apply(thisArg, _arguments || [])).next());
31+
});
32+
};
33+
class B {
34+
m() {
35+
return 1;
36+
}
37+
}
38+
class C extends B {
39+
f() {
40+
const _super = Object.create(null, {
41+
m: { get: () => super.m }
42+
});
43+
const g = (...args_1) => __awaiter(this, [...args_1], void 0, function* (b = _super.m.call(this)) { return b; });
44+
return g();
45+
}
46+
h() {
47+
const _super = Object.create(null, {
48+
m: { get: () => super.m }
49+
});
50+
return __awaiter(this, arguments, void 0, function* (b = _super.m.call(this)) {
51+
return b;
52+
});
53+
}
54+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @target: es2015
2+
// @noTypesAndSymbols: true
3+
4+
class B {
5+
m() {
6+
return 1;
7+
}
8+
}
9+
10+
class C extends B {
11+
f() {
12+
const g = async (b = super.m()) => b;
13+
return g();
14+
}
15+
16+
async h(b = super.m()) {
17+
return b;
18+
}
19+
}

0 commit comments

Comments
 (0)