Skip to content

Commit 3515e58

Browse files
committed
2 parents 6904edb + f9cf821 commit 3515e58

748 files changed

Lines changed: 31767 additions & 4191 deletions

File tree

Some content is hidden

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

.github/workflows/close-issues.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ jobs:
3131
3232
close_issues() {
3333
echo "Closing issues marked as '$1'."
34-
for issue in $(gh issue list --label "$1" --repo ${{ github.repository }} --state open --search "updated:<$DATE" --json number --jq '.[].number'); do
34+
for issue in $(gh issue list --limit 100 --label "$1" --repo ${{ github.repository }} --state open --search "updated:<$DATE" --json number --jq '.[].number'); do
3535
echo "Closing https://github.com/${{ github.repository }}/issues/$issue"
36-
gh issue close $issue --repo ${{ github.repository }} --reason "not planned" --comment "This issue has been marked as '$1' and has seen no recent activity. It has been automatically closed for house-keeping purposes."
36+
gh issue close $issue --repo ${{ github.repository }} --reason "not planned" --comment "This issue has been marked as \"$1\" and has seen no recent activity. It has been automatically closed for house-keeping purposes."
3737
done
3838
}
3939
@@ -43,3 +43,7 @@ jobs:
4343
close_issues "External"
4444
close_issues "Working as Intended"
4545
close_issues "Question"
46+
close_issues "Out of Scope"
47+
close_issues "Declined"
48+
close_issues "Won't Fix"
49+
close_issues "Too Complex"

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,4 @@ TEST-results.xml
6262
package-lock.json
6363
.eslintcache
6464
*v8.log
65-
lib/
65+
/lib/

package-lock.json

Lines changed: 320 additions & 320 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/compiler/_namespaces/ts.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ export * from "../visitorPublic";
3333
export * from "../sourcemap";
3434
export * from "../transformers/utilities";
3535
export * from "../transformers/destructuring";
36+
export * from "../transformers/classThis";
37+
export * from "../transformers/namedEvaluation";
3638
export * from "../transformers/taggedTemplate";
3739
export * from "../transformers/ts";
3840
export * from "../transformers/classFields";

src/compiler/binder.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ import {
8787
getElementOrPropertyAccessName,
8888
getEmitScriptTarget,
8989
getEnclosingBlockScopeContainer,
90+
getEnclosingContainer,
9091
getErrorSpanForNode,
9192
getEscapedTextOfIdentifierOrLiteral,
9293
getEscapedTextOfJsxNamespacedName,
@@ -455,7 +456,8 @@ function getModuleInstanceStateForAliasTarget(specifier: ExportSpecifier, visite
455456
return ModuleInstanceState.Instantiated; // Couldn't locate, assume could refer to a value
456457
}
457458

458-
const enum ContainerFlags {
459+
/** @internal */
460+
export const enum ContainerFlags {
459461
// The current node is not a container, and no container manipulation should happen before
460462
// recursing into it.
461463
None = 0,
@@ -2356,7 +2358,7 @@ function createBinder(): (file: SourceFile, options: CompilerOptions) => void {
23562358
const saveCurrentFlow = currentFlow;
23572359
for (const typeAlias of delayedTypeAliases) {
23582360
const host = typeAlias.parent.parent;
2359-
container = (findAncestor(host.parent, n => !!(getContainerFlags(n) & ContainerFlags.IsContainer)) as IsContainer | undefined) || file;
2361+
container = (getEnclosingContainer(host) as IsContainer | undefined) || file;
23602362
blockScopeContainer = (getEnclosingBlockScopeContainer(host) as IsBlockScopedContainer | undefined) || file;
23612363
currentFlow = initFlowNode({ flags: FlowFlags.Start });
23622364
parent = typeAlias;
@@ -3725,7 +3727,7 @@ function isExecutableStatement(s: Statement): boolean {
37253727
// Don't remove statements that can validly be used before they appear.
37263728
return !isFunctionDeclaration(s) && !isPurelyTypeDeclaration(s) && !isEnumDeclaration(s) &&
37273729
// `var x;` may declare a variable used above
3728-
!(isVariableStatement(s) && !(getCombinedNodeFlags(s) & (NodeFlags.Let | NodeFlags.Const)) && s.declarationList.declarations.some(d => !d.initializer));
3730+
!(isVariableStatement(s) && !(getCombinedNodeFlags(s) & (NodeFlags.BlockScoped)) && s.declarationList.declarations.some(d => !d.initializer));
37293731
}
37303732

37313733
function isPurelyTypeDeclaration(s: Statement): boolean {
@@ -3768,7 +3770,8 @@ export function isExportsOrModuleExportsOrAlias(sourceFile: SourceFile, node: Ex
37683770
return false;
37693771
}
37703772

3771-
function getContainerFlags(node: Node): ContainerFlags {
3773+
/** @internal */
3774+
export function getContainerFlags(node: Node): ContainerFlags {
37723775
switch (node.kind) {
37733776
case SyntaxKind.ClassExpression:
37743777
case SyntaxKind.ClassDeclaration:

src/compiler/checker.ts

Lines changed: 236 additions & 91 deletions
Large diffs are not rendered by default.

src/compiler/commandLineParser.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ const libEntries: [string, string][] = [
218218
["esnext.symbol", "lib.es2019.symbol.d.ts"],
219219
["esnext.asynciterable", "lib.es2018.asynciterable.d.ts"],
220220
["esnext.intl", "lib.esnext.intl.d.ts"],
221+
["esnext.disposable", "lib.esnext.disposable.d.ts"],
221222
["esnext.bigint", "lib.es2020.bigint.d.ts"],
222223
["esnext.string", "lib.es2022.string.d.ts"],
223224
["esnext.promise", "lib.es2021.promise.d.ts"],

src/compiler/diagnosticMessages.json

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -451,18 +451,14 @@
451451
"category": "Error",
452452
"code": 1149
453453
},
454-
"'const' declarations must be initialized.": {
454+
"'{0}' declarations must be initialized.": {
455455
"category": "Error",
456456
"code": 1155
457457
},
458-
"'const' declarations can only be declared inside a block.": {
458+
"'{0}' declarations can only be declared inside a block.": {
459459
"category": "Error",
460460
"code": 1156
461461
},
462-
"'let' declarations can only be declared inside a block.": {
463-
"category": "Error",
464-
"code": 1157
465-
},
466462
"Unterminated template literal.": {
467463
"category": "Error",
468464
"code": 1160
@@ -1601,6 +1597,26 @@
16011597
"category": "Error",
16021598
"code": 1490
16031599
},
1600+
"'{0}' modifier cannot appear on a 'using' declaration.": {
1601+
"category": "Error",
1602+
"code": 1491
1603+
},
1604+
"'{0}' declarations may not have binding patterns.": {
1605+
"category": "Error",
1606+
"code": 1492
1607+
},
1608+
"The left-hand side of a 'for...in' statement cannot be a 'using' declaration.": {
1609+
"category": "Error",
1610+
"code": 1493
1611+
},
1612+
"The left-hand side of a 'for...in' statement cannot be an 'await using' declaration.": {
1613+
"category": "Error",
1614+
"code": 1494
1615+
},
1616+
"'{0}' modifier cannot appear on an 'await using' declaration.": {
1617+
"category": "Error",
1618+
"code": 1495
1619+
},
16041620

16051621
"The types of '{0}' are incompatible between these types.": {
16061622
"category": "Error",
@@ -3623,6 +3639,26 @@
36233639
"category": "Error",
36243640
"code": 2849
36253641
},
3642+
"The initializer of a 'using' declaration must be either an object with a '[Symbol.dispose]()' method, or be 'null' or 'undefined'.": {
3643+
"category": "Error",
3644+
"code": 2850
3645+
},
3646+
"The initializer of an 'await using' declaration must be either an object with a '[Symbol.asyncDispose]()' or '[Symbol.dispose]()' method, or be 'null' or 'undefined'.": {
3647+
"category": "Error",
3648+
"code": 2851
3649+
},
3650+
"'await using' statements are only allowed within async functions and at the top levels of modules.": {
3651+
"category": "Error",
3652+
"code": 2852
3653+
},
3654+
"'await using' statements are only allowed at the top level of a file when that file is a module, but this file has no imports or exports. Consider adding an empty 'export {}' to make this file a module.": {
3655+
"category": "Error",
3656+
"code": 2853
3657+
},
3658+
"Top-level 'await using' statements are only allowed when the 'module' option is set to 'es2022', 'esnext', 'system', 'node16', or 'nodenext', and the 'target' option is set to 'es2017' or higher.": {
3659+
"category": "Error",
3660+
"code": 2854
3661+
},
36263662

36273663
"Import declaration '{0}' is using private name '{1}'.": {
36283664
"category": "Error",
@@ -4329,6 +4365,14 @@
43294365
"category": "Error",
43304366
"code": 5108
43314367
},
4368+
"Option 'moduleResolution' must be set to '{0}' (or left unspecified) when option 'module' is set to '{1}'.": {
4369+
"category": "Error",
4370+
"code": 5109
4371+
},
4372+
"Option 'module' must be set to '{0}' when option 'moduleResolution' is set to '{1}'.": {
4373+
"category": "Error",
4374+
"code": 5110
4375+
},
43324376

43334377
"Generates a sourcemap for each corresponding '.d.ts' file.": {
43344378
"category": "Message",
@@ -7749,11 +7793,11 @@
77497793
"category": "Error",
77507794
"code": 18036
77517795
},
7752-
"Await expression cannot be used inside a class static block.": {
7796+
"'await' expression cannot be used inside a class static block.": {
77537797
"category": "Error",
77547798
"code": 18037
77557799
},
7756-
"'For await' loops cannot be used inside a class static block.": {
7800+
"'for await' loops cannot be used inside a class static block.": {
77577801
"category": "Error",
77587802
"code": 18038
77597803
},
@@ -7812,5 +7856,9 @@
78127856
"Its type '{0}' is not a valid JSX element type.": {
78137857
"category": "Error",
78147858
"code": 18053
7859+
},
7860+
"'await using' statements cannot be used inside a class static block.": {
7861+
"category": "Error",
7862+
"code": 18054
78157863
}
78167864
}

src/compiler/emitter.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,10 @@ import {
254254
isUnparsedNode,
255255
isUnparsedPrepend,
256256
isUnparsedSource,
257+
isVarAwaitUsing,
257258
isVarConst,
258259
isVariableStatement,
260+
isVarUsing,
259261
JSDoc,
260262
JSDocAugmentsTag,
261263
JSDocCallbackTag,
@@ -3685,7 +3687,18 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
36853687
}
36863688

36873689
function emitVariableDeclarationList(node: VariableDeclarationList) {
3688-
writeKeyword(isLet(node) ? "let" : isVarConst(node) ? "const" : "var");
3690+
if (isVarAwaitUsing(node)) {
3691+
writeKeyword("await");
3692+
writeSpace();
3693+
writeKeyword("using");
3694+
}
3695+
else {
3696+
const head = isLet(node) ? "let" :
3697+
isVarConst(node) ? "const" :
3698+
isVarUsing(node) ? "using" :
3699+
"var";
3700+
writeKeyword(head);
3701+
}
36893702
writeSpace();
36903703
emitList(node, node.declarations, ListFormat.VariableDeclarationList);
36913704
}

src/compiler/factory/emitHelpers.ts

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ export interface EmitHelperFactory {
139139
createClassPrivateFieldGetHelper(receiver: Expression, state: Identifier, kind: PrivateIdentifierKind, f: Identifier | undefined): Expression;
140140
createClassPrivateFieldSetHelper(receiver: Expression, state: Identifier, value: Expression, kind: PrivateIdentifierKind, f: Identifier | undefined): Expression;
141141
createClassPrivateFieldInHelper(state: Identifier, receiver: Expression): Expression;
142+
// 'using' helpers
143+
createAddDisposableResourceHelper(envBinding: Expression, value: Expression, async: boolean): Expression;
144+
createDisposeResourcesHelper(envBinding: Expression): Expression;
142145
}
143146

144147
/** @internal */
@@ -186,7 +189,10 @@ export function createEmitHelperFactory(context: TransformationContext): EmitHel
186189
// Class Fields Helpers
187190
createClassPrivateFieldGetHelper,
188191
createClassPrivateFieldSetHelper,
189-
createClassPrivateFieldInHelper
192+
createClassPrivateFieldInHelper,
193+
// 'using' helpers
194+
createAddDisposableResourceHelper,
195+
createDisposeResourcesHelper,
190196
};
191197

192198
/**
@@ -672,6 +678,20 @@ export function createEmitHelperFactory(context: TransformationContext): EmitHel
672678
context.requestEmitHelper(classPrivateFieldInHelper);
673679
return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldIn"), /*typeArguments*/ undefined, [state, receiver]);
674680
}
681+
682+
function createAddDisposableResourceHelper(envBinding: Expression, value: Expression, async: boolean): Expression {
683+
context.requestEmitHelper(addDisposableResourceHelper);
684+
return factory.createCallExpression(
685+
getUnscopedHelperName("__addDisposableResource"),
686+
/*typeArguments*/ undefined,
687+
[envBinding, value, async ? factory.createTrue() : factory.createFalse()]
688+
);
689+
}
690+
691+
function createDisposeResourcesHelper(envBinding: Expression) {
692+
context.requestEmitHelper(disposeResourcesHelper);
693+
return factory.createCallExpression(getUnscopedHelperName("__disposeResources"), /*typeArguments*/ undefined, [envBinding]);
694+
}
675695
}
676696

677697
/** @internal */
@@ -1373,6 +1393,71 @@ export const classPrivateFieldInHelper: UnscopedEmitHelper = {
13731393
};`
13741394
};
13751395

1396+
/**
1397+
* @internal
1398+
*/
1399+
export const addDisposableResourceHelper: UnscopedEmitHelper = {
1400+
name: "typescript:addDisposableResource",
1401+
importName: "__addDisposableResource",
1402+
scoped: false,
1403+
text: `
1404+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
1405+
if (value !== null && value !== void 0) {
1406+
if (typeof value !== "object") throw new TypeError("Object expected.");
1407+
var dispose;
1408+
if (async) {
1409+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
1410+
dispose = value[Symbol.asyncDispose];
1411+
}
1412+
if (dispose === void 0) {
1413+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
1414+
dispose = value[Symbol.dispose];
1415+
}
1416+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
1417+
env.stack.push({ value: value, dispose: dispose, async: async });
1418+
}
1419+
else if (async) {
1420+
env.stack.push({ async: true });
1421+
}
1422+
return value;
1423+
};`
1424+
};
1425+
1426+
/**
1427+
* @internal
1428+
*/
1429+
export const disposeResourcesHelper: UnscopedEmitHelper = {
1430+
name: "typescript:disposeResources",
1431+
importName: "__disposeResources",
1432+
scoped: false,
1433+
text: `
1434+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
1435+
return function (env) {
1436+
function fail(e) {
1437+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
1438+
env.hasError = true;
1439+
}
1440+
function next() {
1441+
while (env.stack.length) {
1442+
var rec = env.stack.pop();
1443+
try {
1444+
var result = rec.dispose && rec.dispose.call(rec.value);
1445+
if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
1446+
}
1447+
catch (e) {
1448+
fail(e);
1449+
}
1450+
}
1451+
if (env.hasError) throw env.error;
1452+
}
1453+
return next();
1454+
};
1455+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
1456+
var e = new Error(message);
1457+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
1458+
});`
1459+
};
1460+
13761461
let allUnscopedEmitHelpers: ReadonlyMap<string, UnscopedEmitHelper> | undefined;
13771462

13781463
/** @internal */
@@ -1405,7 +1490,9 @@ export function getAllUnscopedEmitHelpers() {
14051490
classPrivateFieldSetHelper,
14061491
classPrivateFieldInHelper,
14071492
createBindingHelper,
1408-
setModuleDefaultHelper
1493+
setModuleDefaultHelper,
1494+
addDisposableResourceHelper,
1495+
disposeResourcesHelper,
14091496
], helper => helper.name));
14101497
}
14111498

0 commit comments

Comments
 (0)