From a1d82fc9dcced6ca6bde6e21c385d152d083679f Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Mon, 17 Oct 2022 10:49:56 -0700 Subject: [PATCH 01/25] Remove some unnecessary code discovered by rollup (#51204) --- src/compiler/checker.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d439ec7db63..9d4e0a8341b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -41414,18 +41414,6 @@ namespace ts { if (isGlobalAugmentation) { return; } - const symbol = getSymbolOfNode(node); - if (symbol) { - // module augmentations cannot introduce new names on the top level scope of the module - // this is done it two steps - // 1. quick check - if symbol for node is not merged - this is local symbol to this augmentation - report error - // 2. main check - report error if value declaration of the parent symbol is module augmentation) - let reportError = !(symbol.flags & SymbolFlags.Transient); - if (!reportError) { - // symbol should not originate in augmentation - reportError = !!symbol.parent?.declarations && isExternalModuleAugmentation(symbol.parent.declarations[0]); - } - } break; } } From 7406ee9c145cd7d6117391818d5a1eca2d66ca8f Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Mon, 17 Oct 2022 23:14:23 +0300 Subject: [PATCH 02/25] fix(51170): Completing an unimplemented property overwrites rest of line (#51175) * fix(51170): skip insertText for class members with existing initializer * skip insertText for class members with existing tokens --- src/services/completions.ts | 5 +++-- ...ts => completionsOverridingProperties1.ts} | 0 .../completionsOverridingProperties2.ts | 21 +++++++++++++++++++ .../completionsOverridingProperties3.ts | 21 +++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) rename tests/cases/fourslash/{completionsOverridingProperties.ts => completionsOverridingProperties1.ts} (100%) create mode 100644 tests/cases/fourslash/completionsOverridingProperties2.ts create mode 100644 tests/cases/fourslash/completionsOverridingProperties3.ts diff --git a/src/services/completions.ts b/src/services/completions.ts index bff90e2d3e7..9bdc38195da 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -764,7 +764,7 @@ namespace ts.Completions { if (preferences.includeCompletionsWithClassMemberSnippets && preferences.includeCompletionsWithInsertText && completionKind === CompletionKind.MemberLike && - isClassLikeMemberCompletion(symbol, location)) { + isClassLikeMemberCompletion(symbol, location, sourceFile)) { let importAdder; ({ insertText, isSnippet, importAdder, replacementSpan } = getEntryForMemberCompletion(host, program, options, preferences, name, symbol, location, contextToken, formatContext)); sortText = SortText.ClassMemberSnippets; // sortText has to be lower priority than the sortText for keywords. See #47852. @@ -846,7 +846,7 @@ namespace ts.Completions { }; } - function isClassLikeMemberCompletion(symbol: Symbol, location: Node): boolean { + function isClassLikeMemberCompletion(symbol: Symbol, location: Node, sourceFile: SourceFile): boolean { // TODO: support JS files. if (isInJSFile(location)) { return false; @@ -884,6 +884,7 @@ namespace ts.Completions { location.parent.parent && isClassElement(location.parent) && location === location.parent.name && + location.parent.getLastToken(sourceFile) === location.parent.name && isClassLike(location.parent.parent) ) || ( diff --git a/tests/cases/fourslash/completionsOverridingProperties.ts b/tests/cases/fourslash/completionsOverridingProperties1.ts similarity index 100% rename from tests/cases/fourslash/completionsOverridingProperties.ts rename to tests/cases/fourslash/completionsOverridingProperties1.ts diff --git a/tests/cases/fourslash/completionsOverridingProperties2.ts b/tests/cases/fourslash/completionsOverridingProperties2.ts new file mode 100644 index 00000000000..8938b8bb7fe --- /dev/null +++ b/tests/cases/fourslash/completionsOverridingProperties2.ts @@ -0,0 +1,21 @@ +/// + +////interface I { +//// prop: string; +////} +////class C implements I { +//// public pr/**/: string = 'foo'; +////} + +verify.completions({ + marker: "", + includes: [ + { name: "prop", isSnippet: undefined, insertText: undefined } + ], + isNewIdentifierLocation: true, + preferences: { + includeCompletionsWithInsertText: true, + includeCompletionsWithSnippetText: true, + includeCompletionsWithClassMemberSnippets: true, + } +}); diff --git a/tests/cases/fourslash/completionsOverridingProperties3.ts b/tests/cases/fourslash/completionsOverridingProperties3.ts new file mode 100644 index 00000000000..c13ddadd90b --- /dev/null +++ b/tests/cases/fourslash/completionsOverridingProperties3.ts @@ -0,0 +1,21 @@ +/// + +////interface I { +//// prop: string; +////} +////class C implements I { +//// public pr/**/: string | number; +////} + +verify.completions({ + marker: "", + includes: [ + { name: "prop", isSnippet: undefined, insertText: undefined } + ], + isNewIdentifierLocation: true, + preferences: { + includeCompletionsWithInsertText: true, + includeCompletionsWithSnippetText: true, + includeCompletionsWithClassMemberSnippets: true, + } +}); From f25bcb7c27d78ce89e9c9356d27058cf86dbfb5c Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 18 Oct 2022 03:35:08 +0300 Subject: [PATCH 03/25] fix(49196): add jsdoc snippet for interface member functions (#51135) --- src/services/jsDoc.ts | 10 +++++++-- ...ntTemplateInterfacePropertyFunctionType.ts | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 tests/cases/fourslash/docCommentTemplateInterfacePropertyFunctionType.ts diff --git a/src/services/jsDoc.ts b/src/services/jsDoc.ts index 257531c14e8..a8d4c1a4e03 100644 --- a/src/services/jsDoc.ts +++ b/src/services/jsDoc.ts @@ -439,12 +439,18 @@ namespace ts.JsDoc { case SyntaxKind.ClassDeclaration: case SyntaxKind.InterfaceDeclaration: - case SyntaxKind.PropertySignature: case SyntaxKind.EnumDeclaration: case SyntaxKind.EnumMember: case SyntaxKind.TypeAliasDeclaration: return { commentOwner }; + case SyntaxKind.PropertySignature: { + const host = commentOwner as PropertySignature; + return host.type && isFunctionTypeNode(host.type) + ? { commentOwner, parameters: host.type.parameters, hasReturn: hasReturn(host.type, options) } + : { commentOwner }; + } + case SyntaxKind.VariableStatement: { const varStatement = commentOwner as VariableStatement; const varDeclarations = varStatement.declarationList.declarations; @@ -486,7 +492,7 @@ namespace ts.JsDoc { function hasReturn(node: Node, options: DocCommentTemplateOptions | undefined) { return !!options?.generateReturnInDocTemplate && - (isArrowFunction(node) && isExpression(node.body) + (isFunctionTypeNode(node) || isArrowFunction(node) && isExpression(node.body) || isFunctionLikeDeclaration(node) && node.body && isBlock(node.body) && !!forEachReturnStatement(node.body, n => n)); } diff --git a/tests/cases/fourslash/docCommentTemplateInterfacePropertyFunctionType.ts b/tests/cases/fourslash/docCommentTemplateInterfacePropertyFunctionType.ts new file mode 100644 index 00000000000..d14274800e6 --- /dev/null +++ b/tests/cases/fourslash/docCommentTemplateInterfacePropertyFunctionType.ts @@ -0,0 +1,21 @@ +/// + +////interface I { +//// /**/ +//// foo: (a: number, b: string) => void; +////} + +verify.docCommentTemplateAt("", 12, + `/** + * + * @param a + * @param b + * @returns + */`); + +verify.docCommentTemplateAt("", 12, + `/** + * + * @param a + * @param b + */`, { generateReturnInDocTemplate: false }); From 4c9afe8812fcdb4658472ccbced4a5cd4bae70ea Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Tue, 18 Oct 2022 06:31:08 +0000 Subject: [PATCH 04/25] Update package-lock.json --- package-lock.json | 206 +++++++++++++++++++++++++--------------------- 1 file changed, 110 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index f73d17d0f15..56504754eeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,9 +74,9 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz", - "integrity": "sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.32.0.tgz", + "integrity": "sha512-sbA+4b9VZSf9DJqGrTRS6jxclyA5WpWiKXWxVqEN5HP4LOECJGfZlTS82l9w/byp4pXGPYsf5WQrW2iDG7+cKw==", "dev": true, "dependencies": { "comment-parser": "1.3.1", @@ -582,6 +582,12 @@ "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", + "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "dev": true + }, "node_modules/@types/source-map-support": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", @@ -645,14 +651,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.0.tgz", - "integrity": "sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz", + "integrity": "sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/type-utils": "5.40.0", - "@typescript-eslint/utils": "5.40.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/type-utils": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -677,14 +683,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.0.tgz", - "integrity": "sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.1.tgz", + "integrity": "sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "debug": "^4.3.4" }, "engines": { @@ -704,13 +710,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.0.tgz", - "integrity": "sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz", + "integrity": "sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0" + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -721,13 +727,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.0.tgz", - "integrity": "sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz", + "integrity": "sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.40.0", - "@typescript-eslint/utils": "5.40.0", + "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -748,9 +754,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.0.tgz", - "integrity": "sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.1.tgz", + "integrity": "sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -761,13 +767,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.0.tgz", - "integrity": "sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz", + "integrity": "sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -788,15 +794,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.0.tgz", - "integrity": "sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.1.tgz", + "integrity": "sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -813,12 +820,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.0.tgz", - "integrity": "sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz", + "integrity": "sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.40.0", + "@typescript-eslint/types": "5.40.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2450,17 +2457,17 @@ "dev": true }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.6.tgz", - "integrity": "sha512-R6dZ4t83qPdMhIOGr7g2QII2pwCjYyKP+z0tPOfO1bbAbQyKC20Y2Rd6z1te86Lq3T7uM8bNo+VD9YFpE8HU/g==", + "version": "39.3.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.13.tgz", + "integrity": "sha512-yF16kYmoz8pcEZXxX2kdaBwWFvXrUpxuF+ZgG/0PKLKcT9lGKFi4Mn0Mk/KqJeMgUprFDCzNTjnzYGf8tdNrAA==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.31.0", + "@es-joy/jsdoccomment": "~0.32.0", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.4.0", - "semver": "^7.3.7", + "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" }, "engines": { @@ -8661,9 +8668,9 @@ }, "dependencies": { "@es-joy/jsdoccomment": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz", - "integrity": "sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.32.0.tgz", + "integrity": "sha512-sbA+4b9VZSf9DJqGrTRS6jxclyA5WpWiKXWxVqEN5HP4LOECJGfZlTS82l9w/byp4pXGPYsf5WQrW2iDG7+cKw==", "dev": true, "requires": { "comment-parser": "1.3.1", @@ -9086,6 +9093,12 @@ "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==", "dev": true }, + "@types/semver": { + "version": "7.3.12", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", + "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "dev": true + }, "@types/source-map-support": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", @@ -9149,14 +9162,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.0.tgz", - "integrity": "sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.40.1.tgz", + "integrity": "sha512-FsWboKkWdytGiXT5O1/R9j37YgcjO8MKHSUmWnIEjVaz0krHkplPnYi7mwdb+5+cs0toFNQb0HIrN7zONdIEWg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/type-utils": "5.40.0", - "@typescript-eslint/utils": "5.40.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/type-utils": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "ignore": "^5.2.0", "regexpp": "^3.2.0", @@ -9165,53 +9178,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.0.tgz", - "integrity": "sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.40.1.tgz", + "integrity": "sha512-IK6x55va5w4YvXd4b3VrXQPldV9vQTxi5ov+g4pMANsXPTXOcfjx08CRR1Dfrcc51syPtXHF5bgLlMHYFrvQtg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.0.tgz", - "integrity": "sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.40.1.tgz", + "integrity": "sha512-jkn4xsJiUQucI16OLCXrLRXDZ3afKhOIqXs4R3O+M00hdQLKR58WuyXPZZjhKLFCEP2g+TXdBRtLQ33UfAdRUg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0" + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1" } }, "@typescript-eslint/type-utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.0.tgz", - "integrity": "sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.40.1.tgz", + "integrity": "sha512-DLAs+AHQOe6n5LRraXiv27IYPhleF0ldEmx6yBqBgBLaNRKTkffhV1RPsjoJBhVup2zHxfaRtan8/YRBgYhU9Q==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.40.0", - "@typescript-eslint/utils": "5.40.0", + "@typescript-eslint/typescript-estree": "5.40.1", + "@typescript-eslint/utils": "5.40.1", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.0.tgz", - "integrity": "sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.40.1.tgz", + "integrity": "sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.0.tgz", - "integrity": "sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.40.1.tgz", + "integrity": "sha512-5QTP/nW5+60jBcEPfXy/EZL01qrl9GZtbgDZtDPlfW5zj/zjNrdI2B5zMUHmOsfvOr2cWqwVdWjobCiHcedmQA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/visitor-keys": "5.40.0", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/visitor-keys": "5.40.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -9220,27 +9233,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.0.tgz", - "integrity": "sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.40.1.tgz", + "integrity": "sha512-a2TAVScoX9fjryNrW6BZRnreDUszxqm9eQ9Esv8n5nXApMW0zeANUYlwh/DED04SC/ifuBvXgZpIK5xeJHQ3aw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.40.0", - "@typescript-eslint/types": "5.40.0", - "@typescript-eslint/typescript-estree": "5.40.0", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.40.1", + "@typescript-eslint/types": "5.40.1", + "@typescript-eslint/typescript-estree": "5.40.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.0.tgz", - "integrity": "sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ==", + "version": "5.40.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.40.1.tgz", + "integrity": "sha512-A2DGmeZ+FMja0geX5rww+DpvILpwo1OsiQs0M+joPWJYsiEFBLsH0y1oFymPNul6Z5okSmHpP4ivkc2N0Cgfkw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.40.0", + "@typescript-eslint/types": "5.40.1", "eslint-visitor-keys": "^3.3.0" } }, @@ -10565,17 +10579,17 @@ } }, "eslint-plugin-jsdoc": { - "version": "39.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.6.tgz", - "integrity": "sha512-R6dZ4t83qPdMhIOGr7g2QII2pwCjYyKP+z0tPOfO1bbAbQyKC20Y2Rd6z1te86Lq3T7uM8bNo+VD9YFpE8HU/g==", + "version": "39.3.13", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.13.tgz", + "integrity": "sha512-yF16kYmoz8pcEZXxX2kdaBwWFvXrUpxuF+ZgG/0PKLKcT9lGKFi4Mn0Mk/KqJeMgUprFDCzNTjnzYGf8tdNrAA==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.31.0", + "@es-joy/jsdoccomment": "~0.32.0", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.4.0", - "semver": "^7.3.7", + "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" } }, From 11066b264f5d30fb5ac1f6c2f3a155c0190e75d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 18 Oct 2022 21:58:39 +0200 Subject: [PATCH 05/25] Rename internal functions to `narrowTypeBySwitchOnTypeOf` and `narrowTypeByInKeyword` (#51215) --- src/compiler/checker.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9d4e0a8341b..94e891ea255 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -25037,7 +25037,7 @@ namespace ts { type = narrowTypeBySwitchOnDiscriminant(type, flow.switchStatement, flow.clauseStart, flow.clauseEnd); } else if (expr.kind === SyntaxKind.TypeOfExpression && isMatchingReference(reference, (expr as TypeOfExpression).expression)) { - type = narrowBySwitchOnTypeOf(type, flow.switchStatement, flow.clauseStart, flow.clauseEnd); + type = narrowTypeBySwitchOnTypeOf(type, flow.switchStatement, flow.clauseStart, flow.clauseEnd); } else { if (strictNullChecks) { @@ -25329,7 +25329,7 @@ namespace ts { !!getApplicableIndexInfoForName(type, propName) || !assumeTrue; } - function narrowByInKeyword(type: Type, nameType: StringLiteralType | NumberLiteralType | UniqueESSymbolType, assumeTrue: boolean) { + function narrowTypeByInKeyword(type: Type, nameType: StringLiteralType | NumberLiteralType | UniqueESSymbolType, assumeTrue: boolean) { const name = getPropertyNameFromType(nameType); const isKnownProperty = someType(type, t => isTypePresencePossible(t, name, /*assumeTrue*/ true)); if (isKnownProperty) { @@ -25411,7 +25411,7 @@ namespace ts { return getTypeWithFacts(type, assumeTrue ? TypeFacts.NEUndefined : TypeFacts.EQUndefined); } if (isMatchingReference(reference, target)) { - return narrowByInKeyword(type, leftType as StringLiteralType | NumberLiteralType | UniqueESSymbolType, assumeTrue); + return narrowTypeByInKeyword(type, leftType as StringLiteralType | NumberLiteralType | UniqueESSymbolType, assumeTrue); } } break; @@ -25611,7 +25611,7 @@ namespace ts { neverType); } - function narrowBySwitchOnTypeOf(type: Type, switchStatement: SwitchStatement, clauseStart: number, clauseEnd: number): Type { + function narrowTypeBySwitchOnTypeOf(type: Type, switchStatement: SwitchStatement, clauseStart: number, clauseEnd: number): Type { const witnesses = getSwitchClauseTypeOfWitnesses(switchStatement); if (!witnesses) { return type; From 1f8959f5dc04b2b2c2fc8a7dc53b6ac761e1f754 Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Tue, 18 Oct 2022 16:46:51 -0400 Subject: [PATCH 06/25] fix: avoid downleveled dynamic import closing over specifier expression (#49663) * fix: evaluate dynamic import specifier expressions synchronously * refactor * Update src/compiler/transformers/module/module.ts Co-authored-by: Ron Buckton * [Experiment] Co-authored-by: Ron Buckton --- src/compiler/transformers/module/module.ts | 38 +++++++++------- .../reference/asyncImportNestedYield.js | 5 ++- .../dynamicImportEvaluateSpecifier.js | 31 +++++++++++++ .../dynamicImportEvaluateSpecifier.symbols | 29 ++++++++++++ .../dynamicImportEvaluateSpecifier.types | 44 +++++++++++++++++++ .../reference/dynamicImportTrailingComma.js | 3 +- .../importCallExpressionDeclarationEmit1.js | 12 ++--- .../importCallExpressionGrammarError.js | 5 ++- .../importCallExpressionNestedCJS.js | 3 +- .../importCallExpressionNestedCJS2.js | 3 +- .../importCallExpressionReturnPromiseOfAny.js | 18 ++++---- ...llExpressionSpecifierNotStringTypeError.js | 11 ++--- .../baselines/reference/jsdocInTypeScript.js | 3 +- .../dynamicImportEvaluateSpecifier.ts | 17 +++++++ 14 files changed, 180 insertions(+), 42 deletions(-) create mode 100644 tests/baselines/reference/dynamicImportEvaluateSpecifier.js create mode 100644 tests/baselines/reference/dynamicImportEvaluateSpecifier.symbols create mode 100644 tests/baselines/reference/dynamicImportEvaluateSpecifier.types create mode 100644 tests/cases/compiler/dynamicImportEvaluateSpecifier.ts diff --git a/src/compiler/transformers/module/module.ts b/src/compiler/transformers/module/module.ts index 9b3b8e6ee12..fbab915e871 100644 --- a/src/compiler/transformers/module/module.ts +++ b/src/compiler/transformers/module/module.ts @@ -721,7 +721,7 @@ namespace ts { return createImportCallExpressionUMD(argument ?? factory.createVoidZero(), containsLexicalThis); case ModuleKind.CommonJS: default: - return createImportCallExpressionCommonJS(argument, containsLexicalThis); + return createImportCallExpressionCommonJS(argument); } } @@ -745,7 +745,7 @@ namespace ts { return factory.createConditionalExpression( /*condition*/ factory.createIdentifier("__syncRequire"), /*questionToken*/ undefined, - /*whenTrue*/ createImportCallExpressionCommonJS(arg, containsLexicalThis), + /*whenTrue*/ createImportCallExpressionCommonJS(arg), /*colonToken*/ undefined, /*whenFalse*/ createImportCallExpressionAMD(argClone, containsLexicalThis) ); @@ -755,7 +755,7 @@ namespace ts { return factory.createComma(factory.createAssignment(temp, arg), factory.createConditionalExpression( /*condition*/ factory.createIdentifier("__syncRequire"), /*questionToken*/ undefined, - /*whenTrue*/ createImportCallExpressionCommonJS(temp, containsLexicalThis), + /*whenTrue*/ createImportCallExpressionCommonJS(temp, /* isInlineable */ true), /*colonToken*/ undefined, /*whenFalse*/ createImportCallExpressionAMD(temp, containsLexicalThis) )); @@ -820,14 +820,25 @@ namespace ts { return promise; } - function createImportCallExpressionCommonJS(arg: Expression | undefined, containsLexicalThis: boolean): Expression { - // import("./blah") + function createImportCallExpressionCommonJS(arg: Expression | undefined, isInlineable?: boolean): Expression { + // import(x) // emit as - // Promise.resolve().then(function () { return require(x); }) /*CommonJs Require*/ + // var _a; + // (_a = x, Promise.resolve().then(() => require(_a)) /*CommonJs Require*/ // We have to wrap require in then callback so that require is done in asynchronously // if we simply do require in resolve callback in Promise constructor. We will execute the loading immediately - const promiseResolveCall = factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("Promise"), "resolve"), /*typeArguments*/ undefined, /*argumentsArray*/ []); - let requireCall: Expression = factory.createCallExpression(factory.createIdentifier("require"), /*typeArguments*/ undefined, arg ? [arg] : []); + // If the arg is not inlineable, we have to evaluate it in the current scope with a temp var + const temp = arg && !isSimpleInlineableExpression(arg) && !isInlineable ? factory.createTempVariable(hoistVariableDeclaration) : undefined; + const promiseResolveCall = factory.createCallExpression( + factory.createPropertyAccessExpression(factory.createIdentifier("Promise"), "resolve"), + /*typeArguments*/ undefined, + /*argumentsArray*/ [], + ); + let requireCall: Expression = factory.createCallExpression( + factory.createIdentifier("require"), + /*typeArguments*/ undefined, + temp ? [temp] : arg ? [arg] : [], + ); if (getESModuleInterop(compilerOptions)) { requireCall = emitHelpers().createImportStarHelper(requireCall); } @@ -851,16 +862,11 @@ namespace ts { /*parameters*/ [], /*type*/ undefined, factory.createBlock([factory.createReturnStatement(requireCall)])); - - // if there is a lexical 'this' in the import call arguments, ensure we indicate - // that this new function expression indicates it captures 'this' so that the - // es2015 transformer will properly substitute 'this' with '_this'. - if (containsLexicalThis) { - setEmitFlags(func, EmitFlags.CapturesThis); - } } - return factory.createCallExpression(factory.createPropertyAccessExpression(promiseResolveCall, "then"), /*typeArguments*/ undefined, [func]); + const downleveledImport = factory.createCallExpression(factory.createPropertyAccessExpression(promiseResolveCall, "then"), /*typeArguments*/ undefined, [func]); + + return temp === undefined ? downleveledImport : factory.createCommaListExpression([factory.createAssignment(temp, arg!), downleveledImport]); } function getHelperExpressionForExport(node: ExportDeclaration, innerExpr: Expression) { diff --git a/tests/baselines/reference/asyncImportNestedYield.js b/tests/baselines/reference/asyncImportNestedYield.js index b92065950fb..a9d64fbd3fa 100644 --- a/tests/baselines/reference/asyncImportNestedYield.js +++ b/tests/baselines/reference/asyncImportNestedYield.js @@ -46,12 +46,13 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function foo() { return __asyncGenerator(this, arguments, function foo_1() { return __generator(this, function (_a) { + var _b, _c; switch (_a.label) { case 0: return [4 /*yield*/, __await("foo")]; case 1: return [4 /*yield*/, _a.sent()]; - case 2: return [4 /*yield*/, __await.apply(void 0, [Promise.resolve().then(function () { return require(_a.sent()); })])]; + case 2: return [4 /*yield*/, __await.apply(void 0, [(_b = _a.sent(), Promise.resolve().then(function () { return require(_b); }))])]; case 3: - Promise.resolve().then(function () { return require((_a.sent())["default"]); }); + _c = (_a.sent())["default"], Promise.resolve().then(function () { return require(_c); }); return [2 /*return*/]; } }); diff --git a/tests/baselines/reference/dynamicImportEvaluateSpecifier.js b/tests/baselines/reference/dynamicImportEvaluateSpecifier.js new file mode 100644 index 00000000000..60c4a9f3d1f --- /dev/null +++ b/tests/baselines/reference/dynamicImportEvaluateSpecifier.js @@ -0,0 +1,31 @@ +//// [dynamicImportEvaluateSpecifier.ts] +// https://github.com/microsoft/TypeScript/issues/48285 +let i = 0; + +import(String(i++)); +import(String(i++)); + +const getPath = async () => { + /* in reality this would do some async FS operation, or a web request */ + return "/root/my/cool/path"; +}; + +const someFunction = async () => { + const result = await import(await getPath()); +}; + + +//// [dynamicImportEvaluateSpecifier.js] +var _a, _b; +// https://github.com/microsoft/TypeScript/issues/48285 +let i = 0; +_a = String(i++), Promise.resolve().then(() => require(_a)); +_b = String(i++), Promise.resolve().then(() => require(_b)); +const getPath = async () => { + /* in reality this would do some async FS operation, or a web request */ + return "/root/my/cool/path"; +}; +const someFunction = async () => { + var _a; + const result = await (_a = await getPath(), Promise.resolve().then(() => require(_a))); +}; diff --git a/tests/baselines/reference/dynamicImportEvaluateSpecifier.symbols b/tests/baselines/reference/dynamicImportEvaluateSpecifier.symbols new file mode 100644 index 00000000000..0ce2c94fdd3 --- /dev/null +++ b/tests/baselines/reference/dynamicImportEvaluateSpecifier.symbols @@ -0,0 +1,29 @@ +=== tests/cases/compiler/dynamicImportEvaluateSpecifier.ts === +// https://github.com/microsoft/TypeScript/issues/48285 +let i = 0; +>i : Symbol(i, Decl(dynamicImportEvaluateSpecifier.ts, 1, 3)) + +import(String(i++)); +>String : Symbol(String, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --) ... and 3 more) +>i : Symbol(i, Decl(dynamicImportEvaluateSpecifier.ts, 1, 3)) + +import(String(i++)); +>String : Symbol(String, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --) ... and 3 more) +>i : Symbol(i, Decl(dynamicImportEvaluateSpecifier.ts, 1, 3)) + +const getPath = async () => { +>getPath : Symbol(getPath, Decl(dynamicImportEvaluateSpecifier.ts, 6, 5)) + + /* in reality this would do some async FS operation, or a web request */ + return "/root/my/cool/path"; +}; + +const someFunction = async () => { +>someFunction : Symbol(someFunction, Decl(dynamicImportEvaluateSpecifier.ts, 11, 5)) + + const result = await import(await getPath()); +>result : Symbol(result, Decl(dynamicImportEvaluateSpecifier.ts, 12, 6)) +>getPath : Symbol(getPath, Decl(dynamicImportEvaluateSpecifier.ts, 6, 5)) + +}; + diff --git a/tests/baselines/reference/dynamicImportEvaluateSpecifier.types b/tests/baselines/reference/dynamicImportEvaluateSpecifier.types new file mode 100644 index 00000000000..20443b78f92 --- /dev/null +++ b/tests/baselines/reference/dynamicImportEvaluateSpecifier.types @@ -0,0 +1,44 @@ +=== tests/cases/compiler/dynamicImportEvaluateSpecifier.ts === +// https://github.com/microsoft/TypeScript/issues/48285 +let i = 0; +>i : number +>0 : 0 + +import(String(i++)); +>import(String(i++)) : Promise +>String(i++) : string +>String : StringConstructor +>i++ : number +>i : number + +import(String(i++)); +>import(String(i++)) : Promise +>String(i++) : string +>String : StringConstructor +>i++ : number +>i : number + +const getPath = async () => { +>getPath : () => Promise +>async () => { /* in reality this would do some async FS operation, or a web request */ return "/root/my/cool/path";} : () => Promise + + /* in reality this would do some async FS operation, or a web request */ + return "/root/my/cool/path"; +>"/root/my/cool/path" : "/root/my/cool/path" + +}; + +const someFunction = async () => { +>someFunction : () => Promise +>async () => { const result = await import(await getPath());} : () => Promise + + const result = await import(await getPath()); +>result : any +>await import(await getPath()) : any +>import(await getPath()) : Promise +>await getPath() : string +>getPath() : Promise +>getPath : () => Promise + +}; + diff --git a/tests/baselines/reference/dynamicImportTrailingComma.js b/tests/baselines/reference/dynamicImportTrailingComma.js index bbbc9794af7..d28e9be5776 100644 --- a/tests/baselines/reference/dynamicImportTrailingComma.js +++ b/tests/baselines/reference/dynamicImportTrailingComma.js @@ -3,5 +3,6 @@ const path = './foo'; import(path,); //// [dynamicImportTrailingComma.js] +var _a; var path = './foo'; -Promise.resolve().then(function () { return require(path); }); +_a = path, Promise.resolve().then(function () { return require(_a); }); diff --git a/tests/baselines/reference/importCallExpressionDeclarationEmit1.js b/tests/baselines/reference/importCallExpressionDeclarationEmit1.js index 154e2f0a5e9..89e42ee7f63 100644 --- a/tests/baselines/reference/importCallExpressionDeclarationEmit1.js +++ b/tests/baselines/reference/importCallExpressionDeclarationEmit1.js @@ -15,12 +15,14 @@ function returnDynamicLoad(path: string) { } //// [importCallExpressionDeclarationEmit1.js] -Promise.resolve().then(() => require(getSpecifier())); -var p0 = Promise.resolve().then(() => require(`${directory}\\${moduleFile}`)); -var p1 = Promise.resolve().then(() => require(getSpecifier())); -const p2 = Promise.resolve().then(() => require(whatToLoad ? getSpecifier() : "defaulPath")); +var _a, _b, _c, _d; +_a = getSpecifier(), Promise.resolve().then(() => require(_a)); +var p0 = (_b = `${directory}\\${moduleFile}`, Promise.resolve().then(() => require(_b))); +var p1 = (_c = getSpecifier(), Promise.resolve().then(() => require(_c))); +const p2 = (_d = whatToLoad ? getSpecifier() : "defaulPath", Promise.resolve().then(() => require(_d))); function returnDynamicLoad(path) { - return Promise.resolve().then(() => require(path)); + var _a; + return _a = path, Promise.resolve().then(() => require(_a)); } diff --git a/tests/baselines/reference/importCallExpressionGrammarError.js b/tests/baselines/reference/importCallExpressionGrammarError.js index 61b47759581..0a502e5e289 100644 --- a/tests/baselines/reference/importCallExpressionGrammarError.js +++ b/tests/baselines/reference/importCallExpressionGrammarError.js @@ -10,8 +10,9 @@ const p2 = import(); const p4 = import("pathToModule", "secondModule"); //// [importCallExpressionGrammarError.js] +var _a, _b; var a = ["./0"]; -Promise.resolve().then(() => require(...["PathModule"])); -var p1 = Promise.resolve().then(() => require(...a)); +_a = (...["PathModule"]), Promise.resolve().then(() => require(_a)); +var p1 = (_b = (...a), Promise.resolve().then(() => require(_b))); const p2 = Promise.resolve().then(() => require()); const p4 = Promise.resolve().then(() => require("pathToModule")); diff --git a/tests/baselines/reference/importCallExpressionNestedCJS.js b/tests/baselines/reference/importCallExpressionNestedCJS.js index 5b6abef5e0e..f099c9bc5fc 100644 --- a/tests/baselines/reference/importCallExpressionNestedCJS.js +++ b/tests/baselines/reference/importCallExpressionNestedCJS.js @@ -24,6 +24,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; function foo() { return __awaiter(this, void 0, void 0, function* () { - return yield Promise.resolve().then(() => require((yield Promise.resolve().then(() => require("./foo"))).default)); + var _a; + return yield (_a = (yield Promise.resolve().then(() => require("./foo"))).default, Promise.resolve().then(() => require(_a))); }); } diff --git a/tests/baselines/reference/importCallExpressionNestedCJS2.js b/tests/baselines/reference/importCallExpressionNestedCJS2.js index 104a01b5bd9..b4dc9745b41 100644 --- a/tests/baselines/reference/importCallExpressionNestedCJS2.js +++ b/tests/baselines/reference/importCallExpressionNestedCJS2.js @@ -52,9 +52,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) { function foo() { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { + var _b; switch (_a.label) { case 0: return [4 /*yield*/, Promise.resolve().then(function () { return require("./foo"); })]; - case 1: return [4 /*yield*/, Promise.resolve().then(function () { return require((_a.sent()).default); })]; + case 1: return [4 /*yield*/, (_b = (_a.sent()).default, Promise.resolve().then(function () { return require(_b); }))]; case 2: return [2 /*return*/, _a.sent()]; } }); diff --git a/tests/baselines/reference/importCallExpressionReturnPromiseOfAny.js b/tests/baselines/reference/importCallExpressionReturnPromiseOfAny.js index b7db3e18d22..b3d787c94a5 100644 --- a/tests/baselines/reference/importCallExpressionReturnPromiseOfAny.js +++ b/tests/baselines/reference/importCallExpressionReturnPromiseOfAny.js @@ -42,21 +42,23 @@ class C { exports.C = C; //// [1.js] "use strict"; +var _a, _b, _c, _d, _e, _f, _g; Object.defineProperty(exports, "__esModule", { value: true }); -Promise.resolve().then(() => require(`${directory}\\${moduleFile}`)); -Promise.resolve().then(() => require(getSpecifier())); -var p1 = Promise.resolve().then(() => require(ValidSomeCondition() ? "./0" : "externalModule")); -var p1 = Promise.resolve().then(() => require(getSpecifier())); -var p11 = Promise.resolve().then(() => require(getSpecifier())); -const p2 = Promise.resolve().then(() => require(whatToLoad ? getSpecifier() : "defaulPath")); +_a = `${directory}\\${moduleFile}`, Promise.resolve().then(() => require(_a)); +_b = getSpecifier(), Promise.resolve().then(() => require(_b)); +var p1 = (_c = ValidSomeCondition() ? "./0" : "externalModule", Promise.resolve().then(() => require(_c))); +var p1 = (_d = getSpecifier(), Promise.resolve().then(() => require(_d))); +var p11 = (_e = getSpecifier(), Promise.resolve().then(() => require(_e))); +const p2 = (_f = whatToLoad ? getSpecifier() : "defaulPath", Promise.resolve().then(() => require(_f))); p1.then(zero => { return zero.foo(); // ok, zero is any }); let j; -var p3 = Promise.resolve().then(() => require(j = getSpecifier())); +var p3 = (_g = j = getSpecifier(), Promise.resolve().then(() => require(_g))); function* loadModule(directories) { + var _a; for (const directory of directories) { const path = `${directory}\\moduleFile`; - Promise.resolve().then(() => require(yield path)); + _a = yield path, Promise.resolve().then(() => require(_a)); } } diff --git a/tests/baselines/reference/importCallExpressionSpecifierNotStringTypeError.js b/tests/baselines/reference/importCallExpressionSpecifierNotStringTypeError.js index 5e2ace1c401..ab2785a63d2 100644 --- a/tests/baselines/reference/importCallExpressionSpecifierNotStringTypeError.js +++ b/tests/baselines/reference/importCallExpressionSpecifierNotStringTypeError.js @@ -14,12 +14,13 @@ var p3 = import(["path1", "path2"]); var p4 = import(()=>"PathToModule"); //// [importCallExpressionSpecifierNotStringTypeError.js] +var _a, _b, _c, _d, _e; // Error specifier is not assignable to string -Promise.resolve().then(() => require(getSpecifier())); -var p1 = Promise.resolve().then(() => require(getSpecifier())); -const p2 = Promise.resolve().then(() => require(whatToLoad ? getSpecifier() : "defaulPath")); +_a = getSpecifier(), Promise.resolve().then(() => require(_a)); +var p1 = (_b = getSpecifier(), Promise.resolve().then(() => require(_b))); +const p2 = (_c = whatToLoad ? getSpecifier() : "defaulPath", Promise.resolve().then(() => require(_c))); p1.then(zero => { return zero.foo(); // ok, zero is any }); -var p3 = Promise.resolve().then(() => require(["path1", "path2"])); -var p4 = Promise.resolve().then(() => require(() => "PathToModule")); +var p3 = (_d = ["path1", "path2"], Promise.resolve().then(() => require(_d))); +var p4 = (_e = () => "PathToModule", Promise.resolve().then(() => require(_e))); diff --git a/tests/baselines/reference/jsdocInTypeScript.js b/tests/baselines/reference/jsdocInTypeScript.js index 037d655ccf0..39b8f917e05 100644 --- a/tests/baselines/reference/jsdocInTypeScript.js +++ b/tests/baselines/reference/jsdocInTypeScript.js @@ -58,6 +58,7 @@ var v = import(String()); //// [jsdocInTypeScript.js] +var _a; var T = /** @class */ (function () { function T() { } @@ -92,4 +93,4 @@ var E = {}; E[""]; // make sure import types in JSDoc are not resolved /** @type {import("should-not-be-resolved").Type} */ -var v = Promise.resolve().then(function () { return require(String()); }); +var v = (_a = String(), Promise.resolve().then(function () { return require(_a); })); diff --git a/tests/cases/compiler/dynamicImportEvaluateSpecifier.ts b/tests/cases/compiler/dynamicImportEvaluateSpecifier.ts new file mode 100644 index 00000000000..0acd8b11881 --- /dev/null +++ b/tests/cases/compiler/dynamicImportEvaluateSpecifier.ts @@ -0,0 +1,17 @@ +// @lib: es2019 +// @target: es2019 +// @module: commonjs +// https://github.com/microsoft/TypeScript/issues/48285 +let i = 0; + +import(String(i++)); +import(String(i++)); + +const getPath = async () => { + /* in reality this would do some async FS operation, or a web request */ + return "/root/my/cool/path"; +}; + +const someFunction = async () => { + const result = await import(await getPath()); +}; From 85d405a1d74c0730a9d8d6307b26e8d6f3f75421 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 18 Oct 2022 23:10:03 +0200 Subject: [PATCH 07/25] Fixed a false positive "await has no effect on the type" diagnostic with mixed generic union (#50833) --- src/compiler/checker.ts | 2 +- .../codeFixRemoveUnnecessaryAwait_mixedUnion.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/codeFixRemoveUnnecessaryAwait_mixedUnion.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 94e891ea255..ee02a3532eb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -37104,7 +37104,7 @@ namespace ts { // We only need `Awaited` if `T` is a type variable that has no base constraint, or the base constraint of `T` is `any`, `unknown`, `{}`, `object`, // or is promise-like. if (baseConstraint ? - baseConstraint.flags & TypeFlags.AnyOrUnknown || isEmptyObjectType(baseConstraint) || isThenableType(baseConstraint) : + baseConstraint.flags & TypeFlags.AnyOrUnknown || isEmptyObjectType(baseConstraint) || someType(baseConstraint, isThenableType) : maybeTypeOfKind(type, TypeFlags.TypeVariable)) { return true; } diff --git a/tests/cases/fourslash/codeFixRemoveUnnecessaryAwait_mixedUnion.ts b/tests/cases/fourslash/codeFixRemoveUnnecessaryAwait_mixedUnion.ts new file mode 100644 index 00000000000..605e5b97481 --- /dev/null +++ b/tests/cases/fourslash/codeFixRemoveUnnecessaryAwait_mixedUnion.ts @@ -0,0 +1,12 @@ +/// + +// @target: esnext +//// async function fn1(a: Promise | void) { +//// await a; +//// } +//// +//// async function fn2 | void>(a: T) { +//// await a; +//// } + +verify.getSuggestionDiagnostics([]); From d0f0e35c88ae017fc4c1213eb2f83303ee22ebde Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 18 Oct 2022 17:30:42 -0700 Subject: [PATCH 08/25] Remove old tslint comments (#51220) --- src/compiler/factory/baseNodeFactory.ts | 4 +--- src/compiler/factory/nodeFactory.ts | 3 --- src/compiler/parser.ts | 2 -- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/compiler/factory/baseNodeFactory.ts b/src/compiler/factory/baseNodeFactory.ts index 26be7e95ef2..a2eb7a2d0bb 100644 --- a/src/compiler/factory/baseNodeFactory.ts +++ b/src/compiler/factory/baseNodeFactory.ts @@ -17,13 +17,11 @@ namespace ts { * Creates a `BaseNodeFactory` which can be used to create `Node` instances from the constructors provided by the object allocator. */ export function createBaseNodeFactory(): BaseNodeFactory { - // tslint:disable variable-name let NodeConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node; let TokenConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node; let IdentifierConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node; let PrivateIdentifierConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node; let SourceFileConstructor: new (kind: SyntaxKind, pos?: number, end?: number) => Node; - // tslint:enable variable-name return { createBaseSourceFileNode, @@ -53,4 +51,4 @@ namespace ts { return new (NodeConstructor || (NodeConstructor = objectAllocator.getNodeConstructor()))(kind, /*pos*/ -1, /*end*/ -1); } } -} \ No newline at end of file +} diff --git a/src/compiler/factory/nodeFactory.ts b/src/compiler/factory/nodeFactory.ts index debe8949ac1..713df9c8678 100644 --- a/src/compiler/factory/nodeFactory.ts +++ b/src/compiler/factory/nodeFactory.ts @@ -6407,11 +6407,9 @@ namespace ts { rawTextScanner.setText("`" + rawText + "`"); break; case SyntaxKind.TemplateHead: - // tslint:disable-next-line no-invalid-template-strings rawTextScanner.setText("`" + rawText + "${"); break; case SyntaxKind.TemplateMiddle: - // tslint:disable-next-line no-invalid-template-strings rawTextScanner.setText("}" + rawText + "${"); break; case SyntaxKind.TemplateTail: @@ -6840,7 +6838,6 @@ namespace ts { return node; } - // tslint:disable-next-line variable-name let SourceMapSource: new (fileName: string, text: string, skipTrivia?: (pos: number) => number) => SourceMapSource; /** diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 1f19b2b87e4..3b242daf5cc 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1027,13 +1027,11 @@ namespace ts { const disallowInAndDecoratorContext = NodeFlags.DisallowInContext | NodeFlags.DecoratorContext; // capture constructors in 'initializeState' to avoid null checks - // tslint:disable variable-name let NodeConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let TokenConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let IdentifierConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let PrivateIdentifierConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; let SourceFileConstructor: new (kind: SyntaxKind, pos: number, end: number) => Node; - // tslint:enable variable-name function countNode(node: Node) { nodeCount++; From 5ef2634f3df138323383c7f2e5a05163a924ee86 Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Wed, 19 Oct 2022 06:34:14 +0000 Subject: [PATCH 09/25] Update package-lock.json --- package-lock.json | 56 +++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 56504754eeb..9a6914902cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,9 +74,9 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.32.0.tgz", - "integrity": "sha512-sbA+4b9VZSf9DJqGrTRS6jxclyA5WpWiKXWxVqEN5HP4LOECJGfZlTS82l9w/byp4pXGPYsf5WQrW2iDG7+cKw==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.33.0.tgz", + "integrity": "sha512-bkxMGTlHPE4vfarXt1L1fOm81O18jTRFNgh3Fm4iPKctfWxcpJw4cpth5BhLkGZy4HFzGn/KfD/zGks/J+ZIIw==", "dev": true, "dependencies": { "comment-parser": "1.3.1", @@ -84,7 +84,7 @@ "jsdoc-type-pratt-parser": "~3.1.0" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18" + "node": "^14 || ^16 || ^17 || ^18 || ^19" } }, "node_modules/@eslint/eslintrc": { @@ -577,9 +577,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz", - "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==", + "version": "18.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", + "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", "dev": true }, "node_modules/@types/semver": { @@ -2457,12 +2457,12 @@ "dev": true }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.3.13", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.13.tgz", - "integrity": "sha512-yF16kYmoz8pcEZXxX2kdaBwWFvXrUpxuF+ZgG/0PKLKcT9lGKFi4Mn0Mk/KqJeMgUprFDCzNTjnzYGf8tdNrAA==", + "version": "39.3.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.14.tgz", + "integrity": "sha512-kle7ot5xvzXwWzg7ElzTPM/y1IWUo0kfa5X+ZwOC/7Jw81OJaqIaNEk+2ZH+HcKkbwRUQ3RTdK9qsm4p5vbXAQ==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.32.0", + "@es-joy/jsdoccomment": "~0.33.0", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", @@ -2471,7 +2471,7 @@ "spdx-expression-parse": "^3.0.1" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18" + "node": "^14 || ^16 || ^17 || ^18 || ^19" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" @@ -4587,9 +4587,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -8668,9 +8668,9 @@ }, "dependencies": { "@es-joy/jsdoccomment": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.32.0.tgz", - "integrity": "sha512-sbA+4b9VZSf9DJqGrTRS6jxclyA5WpWiKXWxVqEN5HP4LOECJGfZlTS82l9w/byp4pXGPYsf5WQrW2iDG7+cKw==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.33.0.tgz", + "integrity": "sha512-bkxMGTlHPE4vfarXt1L1fOm81O18jTRFNgh3Fm4iPKctfWxcpJw4cpth5BhLkGZy4HFzGn/KfD/zGks/J+ZIIw==", "dev": true, "requires": { "comment-parser": "1.3.1", @@ -9088,9 +9088,9 @@ "dev": true }, "@types/node": { - "version": "18.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.0.tgz", - "integrity": "sha512-IOXCvVRToe7e0ny7HpT/X9Rb2RYtElG1a+VshjwT00HxrM2dWBApHQoqsI6WiY7Q03vdf2bCrIGzVrkF/5t10w==", + "version": "18.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", + "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", "dev": true }, "@types/semver": { @@ -10579,12 +10579,12 @@ } }, "eslint-plugin-jsdoc": { - "version": "39.3.13", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.13.tgz", - "integrity": "sha512-yF16kYmoz8pcEZXxX2kdaBwWFvXrUpxuF+ZgG/0PKLKcT9lGKFi4Mn0Mk/KqJeMgUprFDCzNTjnzYGf8tdNrAA==", + "version": "39.3.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.14.tgz", + "integrity": "sha512-kle7ot5xvzXwWzg7ElzTPM/y1IWUo0kfa5X+ZwOC/7Jw81OJaqIaNEk+2ZH+HcKkbwRUQ3RTdK9qsm4p5vbXAQ==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.32.0", + "@es-joy/jsdoccomment": "~0.33.0", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", @@ -12235,9 +12235,9 @@ "dev": true }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" From 2dff34e8c4a91c0005ca9ccfb7e045e225b6f2e4 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Wed, 19 Oct 2022 13:24:01 -0400 Subject: [PATCH 10/25] markAliasReferenced should include ExportValue as well (#51219) --- src/compiler/checker.ts | 4 +-- .../importElisionExportNonExportAndDefault.js | 20 +++++++++++++ ...rtElisionExportNonExportAndDefault.symbols | 25 ++++++++++++++++ ...portElisionExportNonExportAndDefault.types | 30 +++++++++++++++++++ .../importElisionExportNonExportAndDefault.ts | 13 ++++++++ 5 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/importElisionExportNonExportAndDefault.js create mode 100644 tests/baselines/reference/importElisionExportNonExportAndDefault.symbols create mode 100644 tests/baselines/reference/importElisionExportNonExportAndDefault.types create mode 100644 tests/cases/compiler/importElisionExportNonExportAndDefault.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ee02a3532eb..7a726c0757f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26035,13 +26035,13 @@ namespace ts { function markAliasReferenced(symbol: Symbol, location: Node) { if (isNonLocalAlias(symbol, /*excludes*/ SymbolFlags.Value) && !isInTypeQuery(location) && !getTypeOnlyAliasDeclaration(symbol, SymbolFlags.Value)) { const target = resolveAlias(symbol); - if (getAllSymbolFlags(target) & SymbolFlags.Value) { + if (getAllSymbolFlags(target) & (SymbolFlags.Value | SymbolFlags.ExportValue)) { // An alias resolving to a const enum cannot be elided if (1) 'isolatedModules' is enabled // (because the const enum value will not be inlined), or if (2) the alias is an export // of a const enum declaration that will be preserved. if (compilerOptions.isolatedModules || shouldPreserveConstEnums(compilerOptions) && isExportOrExportExpression(location) || - !isConstEnumOrConstEnumOnlyModule(target) + !isConstEnumOrConstEnumOnlyModule(getExportSymbolOfValueSymbolIfExported(target)) ) { markAliasSymbolAsReferenced(symbol); } diff --git a/tests/baselines/reference/importElisionExportNonExportAndDefault.js b/tests/baselines/reference/importElisionExportNonExportAndDefault.js new file mode 100644 index 00000000000..ed9a318447a --- /dev/null +++ b/tests/baselines/reference/importElisionExportNonExportAndDefault.js @@ -0,0 +1,20 @@ +//// [tests/cases/compiler/importElisionExportNonExportAndDefault.ts] //// + +//// [main.ts] +import MyFunction from "./MyComponent"; + +MyFunction({msg: "Hello World"}); + + +//// [MyComponent.ts] +interface MyFunction { msg: string; } + +export const MyFunction = ({ msg }: MyFunction) => console.log(`Got message "${msg}"`); +export default MyFunction; + +//// [MyComponent.js] +export const MyFunction = ({ msg }) => console.log(`Got message "${msg}"`); +export default MyFunction; +//// [main.js] +import MyFunction from "./MyComponent"; +MyFunction({ msg: "Hello World" }); diff --git a/tests/baselines/reference/importElisionExportNonExportAndDefault.symbols b/tests/baselines/reference/importElisionExportNonExportAndDefault.symbols new file mode 100644 index 00000000000..310c072f3e9 --- /dev/null +++ b/tests/baselines/reference/importElisionExportNonExportAndDefault.symbols @@ -0,0 +1,25 @@ +=== tests/cases/compiler/main.ts === +import MyFunction from "./MyComponent"; +>MyFunction : Symbol(MyFunction, Decl(main.ts, 0, 6)) + +MyFunction({msg: "Hello World"}); +>msg : Symbol(msg, Decl(main.ts, 2, 12)) + + +=== tests/cases/compiler/MyComponent.ts === +interface MyFunction { msg: string; } +>MyFunction : Symbol(MyFunction, Decl(MyComponent.ts, 0, 0), Decl(MyComponent.ts, 2, 12)) +>msg : Symbol(MyFunction.msg, Decl(MyComponent.ts, 0, 22)) + +export const MyFunction = ({ msg }: MyFunction) => console.log(`Got message "${msg}"`); +>MyFunction : Symbol(MyFunction, Decl(MyComponent.ts, 2, 12)) +>msg : Symbol(msg, Decl(MyComponent.ts, 2, 28)) +>MyFunction : Symbol(MyFunction, Decl(MyComponent.ts, 0, 0), Decl(MyComponent.ts, 2, 12)) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>msg : Symbol(msg, Decl(MyComponent.ts, 2, 28)) + +export default MyFunction; +>MyFunction : Symbol(MyFunction, Decl(MyComponent.ts, 0, 0), Decl(MyComponent.ts, 2, 12)) + diff --git a/tests/baselines/reference/importElisionExportNonExportAndDefault.types b/tests/baselines/reference/importElisionExportNonExportAndDefault.types new file mode 100644 index 00000000000..69aa6233ab6 --- /dev/null +++ b/tests/baselines/reference/importElisionExportNonExportAndDefault.types @@ -0,0 +1,30 @@ +=== tests/cases/compiler/main.ts === +import MyFunction from "./MyComponent"; +>MyFunction : any + +MyFunction({msg: "Hello World"}); +>MyFunction({msg: "Hello World"}) : error +>MyFunction : error +>{msg: "Hello World"} : { msg: string; } +>msg : string +>"Hello World" : "Hello World" + + +=== tests/cases/compiler/MyComponent.ts === +interface MyFunction { msg: string; } +>msg : string + +export const MyFunction = ({ msg }: MyFunction) => console.log(`Got message "${msg}"`); +>MyFunction : ({ msg }: MyFunction) => void +>({ msg }: MyFunction) => console.log(`Got message "${msg}"`) : ({ msg }: MyFunction) => void +>msg : string +>console.log(`Got message "${msg}"`) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>`Got message "${msg}"` : string +>msg : string + +export default MyFunction; +>MyFunction : MyFunction + diff --git a/tests/cases/compiler/importElisionExportNonExportAndDefault.ts b/tests/cases/compiler/importElisionExportNonExportAndDefault.ts new file mode 100644 index 00000000000..cc66bcd75c0 --- /dev/null +++ b/tests/cases/compiler/importElisionExportNonExportAndDefault.ts @@ -0,0 +1,13 @@ +// @target: esnext +// @module: esnext +// @filename: main.ts +import MyFunction from "./MyComponent"; + +MyFunction({msg: "Hello World"}); + + +// @filename: MyComponent.ts +interface MyFunction { msg: string; } + +export const MyFunction = ({ msg }: MyFunction) => console.log(`Got message "${msg}"`); +export default MyFunction; \ No newline at end of file From 245a02cbed7ad50a21289730159abc8d19a66f40 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 19 Oct 2022 21:32:39 +0300 Subject: [PATCH 11/25] fix(51222): Go-to-definition on return statements should jump to the containing function declaration (#51227) * fix(51222): add go-to-definition return statement to containing function * add additional tests --- src/services/goToDefinition.ts | 6 ++++++ tests/cases/fourslash/goToDefinitionReturn1.ts | 7 +++++++ tests/cases/fourslash/goToDefinitionReturn2.ts | 9 +++++++++ tests/cases/fourslash/goToDefinitionReturn3.ts | 9 +++++++++ tests/cases/fourslash/goToDefinitionReturn4.ts | 5 +++++ tests/cases/fourslash/goToDefinitionReturn5.ts | 9 +++++++++ tests/cases/fourslash/goToDefinitionReturn6.ts | 9 +++++++++ tests/cases/fourslash/goToDefinitionReturn7.ts | 9 +++++++++ 8 files changed, 63 insertions(+) create mode 100644 tests/cases/fourslash/goToDefinitionReturn1.ts create mode 100644 tests/cases/fourslash/goToDefinitionReturn2.ts create mode 100644 tests/cases/fourslash/goToDefinitionReturn3.ts create mode 100644 tests/cases/fourslash/goToDefinitionReturn4.ts create mode 100644 tests/cases/fourslash/goToDefinitionReturn5.ts create mode 100644 tests/cases/fourslash/goToDefinitionReturn6.ts create mode 100644 tests/cases/fourslash/goToDefinitionReturn7.ts diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index 866588c51b9..285c9e51c59 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -26,6 +26,12 @@ namespace ts.GoToDefinition { return label ? [createDefinitionInfoFromName(typeChecker, label, ScriptElementKind.label, node.text, /*containerName*/ undefined!)] : undefined; // TODO: GH#18217 } + if (node.kind === SyntaxKind.ReturnKeyword) { + const functionDeclaration = findAncestor(node.parent, n => + isClassStaticBlockDeclaration(n) ? "quit" : isFunctionLikeDeclaration(n)) as FunctionLikeDeclaration; + return functionDeclaration ? [createDefinitionFromSignatureDeclaration(typeChecker, functionDeclaration)] : undefined; + } + if (isStaticModifier(node) && isClassStaticBlockDeclaration(node.parent)) { const classDecl = node.parent.parent; const { symbol, failedAliasResolution } = getSymbol(classDecl, typeChecker, stopAtAlias); diff --git a/tests/cases/fourslash/goToDefinitionReturn1.ts b/tests/cases/fourslash/goToDefinitionReturn1.ts new file mode 100644 index 00000000000..6c8c1550c31 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn1.ts @@ -0,0 +1,7 @@ +/// + +////function /*end*/foo() { +//// [|/*start*/return|] 10; +////} + +verify.goToDefinition("start", "end"); diff --git a/tests/cases/fourslash/goToDefinitionReturn2.ts b/tests/cases/fourslash/goToDefinitionReturn2.ts new file mode 100644 index 00000000000..a101880397a --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn2.ts @@ -0,0 +1,9 @@ +/// + +////function foo() { +//// return /*end*/() => { +//// [|/*start*/return|] 10; +//// } +////} + +verify.goToDefinition("start", "end"); diff --git a/tests/cases/fourslash/goToDefinitionReturn3.ts b/tests/cases/fourslash/goToDefinitionReturn3.ts new file mode 100644 index 00000000000..e3f1f952fa2 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn3.ts @@ -0,0 +1,9 @@ +/// + +////class C { +//// /*end*/m() { +//// [|/*start*/return|] 1; +//// } +////} + +verify.goToDefinition("start", "end"); diff --git a/tests/cases/fourslash/goToDefinitionReturn4.ts b/tests/cases/fourslash/goToDefinitionReturn4.ts new file mode 100644 index 00000000000..d86f8227e8d --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn4.ts @@ -0,0 +1,5 @@ +/// + +////[|/*start*/return|]; + +verify.goToDefinition("start", []); diff --git a/tests/cases/fourslash/goToDefinitionReturn5.ts b/tests/cases/fourslash/goToDefinitionReturn5.ts new file mode 100644 index 00000000000..12dd4302063 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn5.ts @@ -0,0 +1,9 @@ +/// + +////function foo() { +//// class Foo { +//// static { [|/*start*/return|]; } +//// } +////} + +verify.goToDefinition("start", []); diff --git a/tests/cases/fourslash/goToDefinitionReturn6.ts b/tests/cases/fourslash/goToDefinitionReturn6.ts new file mode 100644 index 00000000000..500e2043fdf --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn6.ts @@ -0,0 +1,9 @@ +/// + +////function foo() { +//// return /*end*/function () { +//// [|/*start*/return|] 10; +//// } +////} + +verify.goToDefinition("start", "end"); diff --git a/tests/cases/fourslash/goToDefinitionReturn7.ts b/tests/cases/fourslash/goToDefinitionReturn7.ts new file mode 100644 index 00000000000..b2a2c70b5c9 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionReturn7.ts @@ -0,0 +1,9 @@ +/// + +////function foo(a: string, b: string): string; +////function foo(a: number, b: number): number; +////function /*end*/foo(a: any, b: any): any { +//// [|/*start*/return|] a + b; +////} + +verify.goToDefinition("start", "end"); From 8ac465239f52de1da3ada8cdc4c3f107f4d62e45 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 19 Oct 2022 22:38:37 +0300 Subject: [PATCH 12/25] change type (#51231) --- src/services/goToDefinition.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index 285c9e51c59..0ed8284b5df 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -28,7 +28,7 @@ namespace ts.GoToDefinition { if (node.kind === SyntaxKind.ReturnKeyword) { const functionDeclaration = findAncestor(node.parent, n => - isClassStaticBlockDeclaration(n) ? "quit" : isFunctionLikeDeclaration(n)) as FunctionLikeDeclaration; + isClassStaticBlockDeclaration(n) ? "quit" : isFunctionLikeDeclaration(n)) as FunctionLikeDeclaration | undefined; return functionDeclaration ? [createDefinitionFromSignatureDeclaration(typeChecker, functionDeclaration)] : undefined; } From 906ebe49334a3a9c2dbd73cd3c902898bc712b66 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Wed, 19 Oct 2022 15:46:00 -0700 Subject: [PATCH 13/25] Revert structuredTypeRelatedTo change and fix isUnitLikeType (#51076) * Revert structuredTypeRelatedTo change, fix isUnitLikeType * Accept new baselines * Add regression tests * Fix formatting in test --- src/compiler/checker.ts | 5 +- .../reference/unknownControlFlow.errors.txt | 27 +++++++ .../baselines/reference/unknownControlFlow.js | 43 +++++++++++ .../reference/unknownControlFlow.symbols | 72 +++++++++++++++++++ .../reference/unknownControlFlow.types | 55 +++++++++++++- .../types/unknown/unknownControlFlow.ts | 27 +++++++ 6 files changed, 224 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7a726c0757f..3c7b1060eae 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -19663,7 +19663,7 @@ namespace ts { // For example, if `T extends 1 | 2` and `U extends 2 | 3` and we compare `T & U` to `T & U & (1 | 2 | 3)` if (!result && (source.flags & TypeFlags.Intersection || source.flags & TypeFlags.TypeParameter && target.flags & TypeFlags.Union)) { const constraint = getEffectiveConstraintOfIntersection(source.flags & TypeFlags.Intersection ? (source as IntersectionType).types: [source], !!(target.flags & TypeFlags.Union)); - if (constraint && !(constraint.flags & TypeFlags.Never) && everyType(constraint, c => c !== source)) { // Skip comparison if expansion contains the source itself + if (constraint && everyType(constraint, c => c !== source)) { // Skip comparison if expansion contains the source itself // TODO: Stack errors so we get a pyramid for the "normal" comparison above, _and_ a second for this result = isRelatedTo(constraint, target, RecursionFlags.Source, /*reportErrors*/ false, /*headMessage*/ undefined, intersectionState); } @@ -21630,8 +21630,7 @@ namespace ts { } function isUnitLikeType(type: Type): boolean { - return type.flags & TypeFlags.Intersection ? some((type as IntersectionType).types, isUnitType) : - !!(type.flags & TypeFlags.Unit); + return isUnitType(getBaseConstraintOrType(type)); } function extractUnitType(type: Type) { diff --git a/tests/baselines/reference/unknownControlFlow.errors.txt b/tests/baselines/reference/unknownControlFlow.errors.txt index b49b386e32c..410237e3133 100644 --- a/tests/baselines/reference/unknownControlFlow.errors.txt +++ b/tests/baselines/reference/unknownControlFlow.errors.txt @@ -417,4 +417,31 @@ tests/cases/conformance/types/unknown/unknownControlFlow.ts(293,5): error TS2345 value; } } + + // Repro from #51009 + + type TypeA = { + A: 'A', + B: 'B', + } + + type TypeB = { + A: 'A', + B: 'B', + C: 'C', + } + + type R = + T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never; + + type R2 = + T extends keyof TypeA ? T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never : never; + + // Repro from #51041 + + type AB = "A" | "B"; + + function x(x: T_AB & undefined, y: any) { + let r2: never = y as T_AB & undefined; + } \ No newline at end of file diff --git a/tests/baselines/reference/unknownControlFlow.js b/tests/baselines/reference/unknownControlFlow.js index a67326b14b1..a4979179cfb 100644 --- a/tests/baselines/reference/unknownControlFlow.js +++ b/tests/baselines/reference/unknownControlFlow.js @@ -400,6 +400,33 @@ function doSomething2(value: unknown): void { value; } } + +// Repro from #51009 + +type TypeA = { + A: 'A', + B: 'B', +} + +type TypeB = { + A: 'A', + B: 'B', + C: 'C', +} + +type R = + T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never; + +type R2 = + T extends keyof TypeA ? T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never : never; + +// Repro from #51041 + +type AB = "A" | "B"; + +function x(x: T_AB & undefined, y: any) { + let r2: never = y as T_AB & undefined; +} //// [unknownControlFlow.js] @@ -742,6 +769,9 @@ function doSomething2(value) { value; } } +function x(x, y) { + var r2 = y; +} //// [unknownControlFlow.d.ts] @@ -801,3 +831,16 @@ declare function fx10(x: string | number, y: number): void; declare function SendBlob(encoding: unknown): void; declare function doSomething1(value: T): T; declare function doSomething2(value: unknown): void; +type TypeA = { + A: 'A'; + B: 'B'; +}; +type TypeB = { + A: 'A'; + B: 'B'; + C: 'C'; +}; +type R = T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never; +type R2 = T extends keyof TypeA ? T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never : never; +type AB = "A" | "B"; +declare function x(x: T_AB & undefined, y: any): void; diff --git a/tests/baselines/reference/unknownControlFlow.symbols b/tests/baselines/reference/unknownControlFlow.symbols index 1644306428a..d69e69fe08e 100644 --- a/tests/baselines/reference/unknownControlFlow.symbols +++ b/tests/baselines/reference/unknownControlFlow.symbols @@ -923,3 +923,75 @@ function doSomething2(value: unknown): void { } } +// Repro from #51009 + +type TypeA = { +>TypeA : Symbol(TypeA, Decl(unknownControlFlow.ts, 400, 1)) + + A: 'A', +>A : Symbol(A, Decl(unknownControlFlow.ts, 404, 14)) + + B: 'B', +>B : Symbol(B, Decl(unknownControlFlow.ts, 405, 11)) +} + +type TypeB = { +>TypeB : Symbol(TypeB, Decl(unknownControlFlow.ts, 407, 1)) + + A: 'A', +>A : Symbol(A, Decl(unknownControlFlow.ts, 409, 14)) + + B: 'B', +>B : Symbol(B, Decl(unknownControlFlow.ts, 410, 11)) + + C: 'C', +>C : Symbol(C, Decl(unknownControlFlow.ts, 411, 11)) +} + +type R = +>R : Symbol(R, Decl(unknownControlFlow.ts, 413, 1)) +>T : Symbol(T, Decl(unknownControlFlow.ts, 415, 7)) +>TypeA : Symbol(TypeA, Decl(unknownControlFlow.ts, 400, 1)) + + T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never; +>T : Symbol(T, Decl(unknownControlFlow.ts, 415, 7)) +>TypeB : Symbol(TypeB, Decl(unknownControlFlow.ts, 407, 1)) +>TypeA : Symbol(TypeA, Decl(unknownControlFlow.ts, 400, 1)) +>T : Symbol(T, Decl(unknownControlFlow.ts, 415, 7)) +>TypeB : Symbol(TypeB, Decl(unknownControlFlow.ts, 407, 1)) +>T : Symbol(T, Decl(unknownControlFlow.ts, 415, 7)) + +type R2 = +>R2 : Symbol(R2, Decl(unknownControlFlow.ts, 416, 57)) +>T : Symbol(T, Decl(unknownControlFlow.ts, 418, 8)) +>PropertyKey : Symbol(PropertyKey, Decl(lib.es5.d.ts, --, --)) + + T extends keyof TypeA ? T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never : never; +>T : Symbol(T, Decl(unknownControlFlow.ts, 418, 8)) +>TypeA : Symbol(TypeA, Decl(unknownControlFlow.ts, 400, 1)) +>T : Symbol(T, Decl(unknownControlFlow.ts, 418, 8)) +>TypeB : Symbol(TypeB, Decl(unknownControlFlow.ts, 407, 1)) +>TypeA : Symbol(TypeA, Decl(unknownControlFlow.ts, 400, 1)) +>T : Symbol(T, Decl(unknownControlFlow.ts, 418, 8)) +>TypeB : Symbol(TypeB, Decl(unknownControlFlow.ts, 407, 1)) +>T : Symbol(T, Decl(unknownControlFlow.ts, 418, 8)) + +// Repro from #51041 + +type AB = "A" | "B"; +>AB : Symbol(AB, Decl(unknownControlFlow.ts, 419, 89)) + +function x(x: T_AB & undefined, y: any) { +>x : Symbol(x, Decl(unknownControlFlow.ts, 423, 20)) +>T_AB : Symbol(T_AB, Decl(unknownControlFlow.ts, 425, 11)) +>AB : Symbol(AB, Decl(unknownControlFlow.ts, 419, 89)) +>x : Symbol(x, Decl(unknownControlFlow.ts, 425, 28)) +>T_AB : Symbol(T_AB, Decl(unknownControlFlow.ts, 425, 11)) +>y : Symbol(y, Decl(unknownControlFlow.ts, 425, 48)) + + let r2: never = y as T_AB & undefined; +>r2 : Symbol(r2, Decl(unknownControlFlow.ts, 426, 7)) +>y : Symbol(y, Decl(unknownControlFlow.ts, 425, 48)) +>T_AB : Symbol(T_AB, Decl(unknownControlFlow.ts, 425, 11)) +} + diff --git a/tests/baselines/reference/unknownControlFlow.types b/tests/baselines/reference/unknownControlFlow.types index b2c646f56d4..2cf2c101c9d 100644 --- a/tests/baselines/reference/unknownControlFlow.types +++ b/tests/baselines/reference/unknownControlFlow.types @@ -853,7 +853,7 @@ function fx2(value: T & ({} | null)) { >42 : 42 value; // T & {} ->value : T & {} +>value : T & ({} | null) } else { value; // T & ({} | null) @@ -872,7 +872,7 @@ function fx3(value: T & ({} | null)) { >42 : 42 value; // T & {} ->value : T & {} +>value : T & ({} | null) } else { value; // T & ({} | null) @@ -1025,3 +1025,54 @@ function doSomething2(value: unknown): void { } } +// Repro from #51009 + +type TypeA = { +>TypeA : { A: 'A'; B: 'B'; } + + A: 'A', +>A : "A" + + B: 'B', +>B : "B" +} + +type TypeB = { +>TypeB : { A: 'A'; B: 'B'; C: 'C'; } + + A: 'A', +>A : "A" + + B: 'B', +>B : "B" + + C: 'C', +>C : "C" +} + +type R = +>R : R + + T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never; + +type R2 = +>R2 : R2 + + T extends keyof TypeA ? T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never : never; + +// Repro from #51041 + +type AB = "A" | "B"; +>AB : "A" | "B" + +function x(x: T_AB & undefined, y: any) { +>x : (x: T_AB & undefined, y: any) => void +>x : T_AB & undefined +>y : any + + let r2: never = y as T_AB & undefined; +>r2 : never +>y as T_AB & undefined : T_AB & undefined +>y : any +} + diff --git a/tests/cases/conformance/types/unknown/unknownControlFlow.ts b/tests/cases/conformance/types/unknown/unknownControlFlow.ts index da9bb6fe65e..082ebad7bc1 100644 --- a/tests/cases/conformance/types/unknown/unknownControlFlow.ts +++ b/tests/cases/conformance/types/unknown/unknownControlFlow.ts @@ -402,3 +402,30 @@ function doSomething2(value: unknown): void { value; } } + +// Repro from #51009 + +type TypeA = { + A: 'A', + B: 'B', +} + +type TypeB = { + A: 'A', + B: 'B', + C: 'C', +} + +type R = + T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never; + +type R2 = + T extends keyof TypeA ? T extends keyof TypeB ? [TypeA[T], TypeB[T]] : never : never; + +// Repro from #51041 + +type AB = "A" | "B"; + +function x(x: T_AB & undefined, y: any) { + let r2: never = y as T_AB & undefined; +} From 3f28fa12dfecb8dfd66ce4684bf26f64e1f092f1 Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Thu, 20 Oct 2022 06:12:31 +0000 Subject: [PATCH 14/25] Update package-lock.json --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9a6914902cb..a8889e6cfc9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -286,9 +286,9 @@ } }, "node_modules/@octokit/graphql": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.3.tgz", - "integrity": "sha512-VjhqOu2CHo2hwank1y2k8YcqF83zJW6upyP1+0l3wegvpq+4H31zOA5Rkyx76uJBUdJooUR5UnFyclBptzl86Q==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz", + "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", "dev": true, "dependencies": { "@octokit/request": "^6.0.0", @@ -8832,9 +8832,9 @@ } }, "@octokit/graphql": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.3.tgz", - "integrity": "sha512-VjhqOu2CHo2hwank1y2k8YcqF83zJW6upyP1+0l3wegvpq+4H31zOA5Rkyx76uJBUdJooUR5UnFyclBptzl86Q==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz", + "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", "dev": true, "requires": { "@octokit/request": "^6.0.0", From 1ca99b34029dafad2c18af7bdc0711f4abf7e522 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Thu, 20 Oct 2022 20:57:43 +0300 Subject: [PATCH 15/25] fix(50551): Destructuring assignment with var bypasses "variable is used before being assigned" check (2454) (#50560) * fix(50551): handle destructuring variables used before assignment * skip the error in binding elements that refer to the same destructuring * fix binding element type --- src/compiler/checker.ts | 9 ++- ...estructuringVariablesInTryCatch.errors.txt | 39 ++++++++++++ ...rolFlowDestructuringVariablesInTryCatch.js | 40 ++++++++++++ ...owDestructuringVariablesInTryCatch.symbols | 52 ++++++++++++++++ ...FlowDestructuringVariablesInTryCatch.types | 61 +++++++++++++++++++ ...olFlowInitializedDestructuringVariables.js | 11 ++++ ...wInitializedDestructuringVariables.symbols | 17 ++++++ ...lowInitializedDestructuringVariables.types | 19 ++++++ ...rolFlowDestructuringVariablesInTryCatch.ts | 22 +++++++ ...olFlowInitializedDestructuringVariables.ts | 7 +++ 10 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.errors.txt create mode 100644 tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.js create mode 100644 tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.symbols create mode 100644 tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.types create mode 100644 tests/baselines/reference/controlFlowInitializedDestructuringVariables.js create mode 100644 tests/baselines/reference/controlFlowInitializedDestructuringVariables.symbols create mode 100644 tests/baselines/reference/controlFlowInitializedDestructuringVariables.types create mode 100644 tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts create mode 100644 tests/cases/compiler/controlFlowInitializedDestructuringVariables.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3c7b1060eae..598a699459e 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26289,7 +26289,7 @@ namespace ts { // We only look for uninitialized variables in strict null checking mode, and only when we can analyze // the entire control flow graph from the variable's declaration (i.e. when the flow container and // declaration container are the same). - const assumeInitialized = isParameter || isAlias || isOuterVariable || isSpreadDestructuringAssignmentTarget || isModuleExports || isBindingElement(declaration) || + const assumeInitialized = isParameter || isAlias || isOuterVariable || isSpreadDestructuringAssignmentTarget || isModuleExports || isSameScopedBindingElement(node, declaration) || type !== autoType && type !== autoArrayType && (!strictNullChecks || (type.flags & (TypeFlags.AnyOrUnknown | TypeFlags.Void)) !== 0 || isInTypeQuery(node) || node.parent.kind === SyntaxKind.ExportSpecifier) || node.parent.kind === SyntaxKind.NonNullExpression || @@ -26319,6 +26319,13 @@ namespace ts { return assignmentKind ? getBaseTypeOfLiteralType(flowType) : flowType; } + function isSameScopedBindingElement(node: Identifier, declaration: Declaration) { + if (isBindingElement(declaration)) { + const bindingElement = findAncestor(node, isBindingElement); + return bindingElement && getRootDeclaration(bindingElement) === getRootDeclaration(declaration); + } + } + function shouldMarkIdentifierAliasReferenced(node: Identifier): boolean { const parent = node.parent; if (parent) { diff --git a/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.errors.txt b/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.errors.txt new file mode 100644 index 00000000000..dbc664da588 --- /dev/null +++ b/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.errors.txt @@ -0,0 +1,39 @@ +tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts(16,1): error TS2454: Variable 'a' is used before being assigned. +tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts(17,1): error TS2454: Variable 'b' is used before being assigned. +tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts(18,1): error TS2454: Variable 'c' is used before being assigned. +tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts(19,1): error TS2454: Variable 'd' is used before being assigned. +tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts(20,1): error TS2454: Variable 'e' is used before being assigned. + + +==== tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts (5 errors) ==== + declare function f1(): string; + declare function f2(): [b: string]; + declare function f3(): { c: string }; + + try { + var a = f1(); + var [b] = f2(); + var { c } = f3(); + + var [d = 1] = []; + var { e = 1 } = { }; + } catch { + console.error("error"); + } + + a; + ~ +!!! error TS2454: Variable 'a' is used before being assigned. + b; + ~ +!!! error TS2454: Variable 'b' is used before being assigned. + c; + ~ +!!! error TS2454: Variable 'c' is used before being assigned. + d; + ~ +!!! error TS2454: Variable 'd' is used before being assigned. + e; + ~ +!!! error TS2454: Variable 'e' is used before being assigned. + \ No newline at end of file diff --git a/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.js b/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.js new file mode 100644 index 00000000000..a64aba170d6 --- /dev/null +++ b/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.js @@ -0,0 +1,40 @@ +//// [controlFlowDestructuringVariablesInTryCatch.ts] +declare function f1(): string; +declare function f2(): [b: string]; +declare function f3(): { c: string }; + +try { + var a = f1(); + var [b] = f2(); + var { c } = f3(); + + var [d = 1] = []; + var { e = 1 } = { }; +} catch { + console.error("error"); +} + +a; +b; +c; +d; +e; + + +//// [controlFlowDestructuringVariablesInTryCatch.js] +"use strict"; +try { + var a = f1(); + var b = f2()[0]; + var c = f3().c; + var _a = [][0], d = _a === void 0 ? 1 : _a; + var _b = {}.e, e = _b === void 0 ? 1 : _b; +} +catch (_c) { + console.error("error"); +} +a; +b; +c; +d; +e; diff --git a/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.symbols b/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.symbols new file mode 100644 index 00000000000..c41f27f9ef6 --- /dev/null +++ b/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.symbols @@ -0,0 +1,52 @@ +=== tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts === +declare function f1(): string; +>f1 : Symbol(f1, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 0, 0)) + +declare function f2(): [b: string]; +>f2 : Symbol(f2, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 0, 30)) + +declare function f3(): { c: string }; +>f3 : Symbol(f3, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 1, 35)) +>c : Symbol(c, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 2, 24)) + +try { + var a = f1(); +>a : Symbol(a, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 5, 7)) +>f1 : Symbol(f1, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 0, 0)) + + var [b] = f2(); +>b : Symbol(b, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 6, 9)) +>f2 : Symbol(f2, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 0, 30)) + + var { c } = f3(); +>c : Symbol(c, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 7, 9)) +>f3 : Symbol(f3, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 1, 35)) + + var [d = 1] = []; +>d : Symbol(d, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 9, 9)) + + var { e = 1 } = { }; +>e : Symbol(e, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 10, 9)) + +} catch { + console.error("error"); +>console.error : Symbol(Console.error, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>error : Symbol(Console.error, Decl(lib.dom.d.ts, --, --)) +} + +a; +>a : Symbol(a, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 5, 7)) + +b; +>b : Symbol(b, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 6, 9)) + +c; +>c : Symbol(c, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 7, 9)) + +d; +>d : Symbol(d, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 9, 9)) + +e; +>e : Symbol(e, Decl(controlFlowDestructuringVariablesInTryCatch.ts, 10, 9)) + diff --git a/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.types b/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.types new file mode 100644 index 00000000000..2cf5b8d5ec3 --- /dev/null +++ b/tests/baselines/reference/controlFlowDestructuringVariablesInTryCatch.types @@ -0,0 +1,61 @@ +=== tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts === +declare function f1(): string; +>f1 : () => string + +declare function f2(): [b: string]; +>f2 : () => [b: string] + +declare function f3(): { c: string }; +>f3 : () => { c: string; } +>c : string + +try { + var a = f1(); +>a : string +>f1() : string +>f1 : () => string + + var [b] = f2(); +>b : string +>f2() : [b: string] +>f2 : () => [b: string] + + var { c } = f3(); +>c : string +>f3() : { c: string; } +>f3 : () => { c: string; } + + var [d = 1] = []; +>d : number +>1 : 1 +>[] : [] + + var { e = 1 } = { }; +>e : number +>1 : 1 +>{ } : { e?: number | undefined; } + +} catch { + console.error("error"); +>console.error("error") : void +>console.error : (...data: any[]) => void +>console : Console +>error : (...data: any[]) => void +>"error" : "error" +} + +a; +>a : string + +b; +>b : string + +c; +>c : string + +d; +>d : number + +e; +>e : number + diff --git a/tests/baselines/reference/controlFlowInitializedDestructuringVariables.js b/tests/baselines/reference/controlFlowInitializedDestructuringVariables.js new file mode 100644 index 00000000000..843b6939b25 --- /dev/null +++ b/tests/baselines/reference/controlFlowInitializedDestructuringVariables.js @@ -0,0 +1,11 @@ +//// [controlFlowInitializedDestructuringVariables.ts] +declare const obj: { a?: string, b?: number }; +const { + a = "0", + b = +a, +} = obj; + + +//// [controlFlowInitializedDestructuringVariables.js] +"use strict"; +var _a = obj.a, a = _a === void 0 ? "0" : _a, _b = obj.b, b = _b === void 0 ? +a : _b; diff --git a/tests/baselines/reference/controlFlowInitializedDestructuringVariables.symbols b/tests/baselines/reference/controlFlowInitializedDestructuringVariables.symbols new file mode 100644 index 00000000000..f664c9db2b9 --- /dev/null +++ b/tests/baselines/reference/controlFlowInitializedDestructuringVariables.symbols @@ -0,0 +1,17 @@ +=== tests/cases/compiler/controlFlowInitializedDestructuringVariables.ts === +declare const obj: { a?: string, b?: number }; +>obj : Symbol(obj, Decl(controlFlowInitializedDestructuringVariables.ts, 0, 13)) +>a : Symbol(a, Decl(controlFlowInitializedDestructuringVariables.ts, 0, 20)) +>b : Symbol(b, Decl(controlFlowInitializedDestructuringVariables.ts, 0, 32)) + +const { + a = "0", +>a : Symbol(a, Decl(controlFlowInitializedDestructuringVariables.ts, 1, 7)) + + b = +a, +>b : Symbol(b, Decl(controlFlowInitializedDestructuringVariables.ts, 2, 12)) +>a : Symbol(a, Decl(controlFlowInitializedDestructuringVariables.ts, 1, 7)) + +} = obj; +>obj : Symbol(obj, Decl(controlFlowInitializedDestructuringVariables.ts, 0, 13)) + diff --git a/tests/baselines/reference/controlFlowInitializedDestructuringVariables.types b/tests/baselines/reference/controlFlowInitializedDestructuringVariables.types new file mode 100644 index 00000000000..8c64c50a327 --- /dev/null +++ b/tests/baselines/reference/controlFlowInitializedDestructuringVariables.types @@ -0,0 +1,19 @@ +=== tests/cases/compiler/controlFlowInitializedDestructuringVariables.ts === +declare const obj: { a?: string, b?: number }; +>obj : { a?: string | undefined; b?: number | undefined; } +>a : string | undefined +>b : number | undefined + +const { + a = "0", +>a : string +>"0" : "0" + + b = +a, +>b : number +>+a : number +>a : string + +} = obj; +>obj : { a?: string | undefined; b?: number | undefined; } + diff --git a/tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts b/tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts new file mode 100644 index 00000000000..a3dd7e4f810 --- /dev/null +++ b/tests/cases/compiler/controlFlowDestructuringVariablesInTryCatch.ts @@ -0,0 +1,22 @@ +// @strict: true + +declare function f1(): string; +declare function f2(): [b: string]; +declare function f3(): { c: string }; + +try { + var a = f1(); + var [b] = f2(); + var { c } = f3(); + + var [d = 1] = []; + var { e = 1 } = { }; +} catch { + console.error("error"); +} + +a; +b; +c; +d; +e; diff --git a/tests/cases/compiler/controlFlowInitializedDestructuringVariables.ts b/tests/cases/compiler/controlFlowInitializedDestructuringVariables.ts new file mode 100644 index 00000000000..d87dba83a0f --- /dev/null +++ b/tests/cases/compiler/controlFlowInitializedDestructuringVariables.ts @@ -0,0 +1,7 @@ +// @strict: true + +declare const obj: { a?: string, b?: number }; +const { + a = "0", + b = +a, +} = obj; From 2625c1feae25aede35465ca835440fc57bf13d52 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 20 Oct 2022 13:23:18 -0700 Subject: [PATCH 16/25] Make the init config category order predictable (#51247) --- src/compiler/commandLineParser.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index b3dcb04c777..d13f8156e43 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -2582,12 +2582,21 @@ namespace ts { function writeConfigurations() { // Filter applicable options to place in the file - const categorizedOptions = createMultiMap(); + const categorizedOptions = new Map(); + // Set allowed categories in order + categorizedOptions.set(Diagnostics.Projects, []); + categorizedOptions.set(Diagnostics.Language_and_Environment, []); + categorizedOptions.set(Diagnostics.Modules, []); + categorizedOptions.set(Diagnostics.JavaScript_Support, []); + categorizedOptions.set(Diagnostics.Emit, []); + categorizedOptions.set(Diagnostics.Interop_Constraints, []); + categorizedOptions.set(Diagnostics.Type_Checking, []); + categorizedOptions.set(Diagnostics.Completeness, []); for (const option of optionDeclarations) { - const { category } = option; - if (isAllowedOptionForOutput(option)) { - categorizedOptions.add(getLocaleSpecificMessage(category!), option); + let listForCategory = categorizedOptions.get(option.category!); + if (!listForCategory) categorizedOptions.set(option.category!, listForCategory = []); + listForCategory.push(option); } } @@ -2599,7 +2608,7 @@ namespace ts { if (entries.length !== 0) { entries.push({ value: "" }); } - entries.push({ value: `/* ${category} */` }); + entries.push({ value: `/* ${getLocaleSpecificMessage(category)} */` }); for (const option of options) { let optionName; if (compilerOptionsMap.has(option.name)) { From eed05112180e0d94f78aa02d676d49468f15dc31 Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Fri, 21 Oct 2022 06:15:23 +0000 Subject: [PATCH 17/25] Update package-lock.json --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8889e6cfc9..71fe6a44b27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -577,9 +577,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", - "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", + "version": "18.11.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz", + "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==", "dev": true }, "node_modules/@types/semver": { @@ -9088,9 +9088,9 @@ "dev": true }, "@types/node": { - "version": "18.11.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", - "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", + "version": "18.11.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz", + "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==", "dev": true }, "@types/semver": { From 3abd351c0eea55758f27ee5558a4a1525b77f45b Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Fri, 21 Oct 2022 08:00:00 -0400 Subject: [PATCH 18/25] Fix super property transform in async arrow in method (#51240) --- src/compiler/checker.ts | 9 +- src/compiler/transformers/es2017.ts | 91 +++++++++++- src/compiler/transformers/es2018.ts | 10 +- src/compiler/types.ts | 4 +- .../reference/asyncMethodWithSuper_es6.js | 85 +++++++++++ .../asyncMethodWithSuper_es6.symbols | 98 +++++++++++++ .../reference/asyncMethodWithSuper_es6.types | 132 ++++++++++++++++++ .../async/es6/asyncMethodWithSuper_es6.ts | 26 ++++ 8 files changed, 438 insertions(+), 17 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 598a699459e..5b30941b5cc 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26706,13 +26706,16 @@ namespace ts { const immediateContainer = getSuperContainer(node, /*stopOnFunctions*/ true); let container = immediateContainer; let needToCaptureLexicalThis = false; + let inAsyncFunction = false; // adjust the container reference in case if super is used inside arrow functions with arbitrarily deep nesting if (!isCallExpression) { while (container && container.kind === SyntaxKind.ArrowFunction) { + if (hasSyntacticModifier(container, ModifierFlags.Async)) inAsyncFunction = true; container = getSuperContainer(container, /*stopOnFunctions*/ true); needToCaptureLexicalThis = languageVersion < ScriptTarget.ES2015; } + if (container && hasSyntacticModifier(container, ModifierFlags.Async)) inAsyncFunction = true; } const canUseSuperExpression = isLegalUsageOfSuperExpression(container); @@ -26824,12 +26827,12 @@ namespace ts { // as a call expression cannot be used as the target of a destructuring assignment while a property access can. // // For element access expressions (`super[x]`), we emit a generic helper that forwards the element access in both situations. - if (container.kind === SyntaxKind.MethodDeclaration && hasSyntacticModifier(container, ModifierFlags.Async)) { + if (container.kind === SyntaxKind.MethodDeclaration && inAsyncFunction) { if (isSuperProperty(node.parent) && isAssignmentTarget(node.parent)) { - getNodeLinks(container).flags |= NodeCheckFlags.AsyncMethodWithSuperBinding; + getNodeLinks(container).flags |= NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync; } else { - getNodeLinks(container).flags |= NodeCheckFlags.AsyncMethodWithSuper; + getNodeLinks(container).flags |= NodeCheckFlags.MethodWithSuperPropertyAccessInAsync; } } diff --git a/src/compiler/transformers/es2017.ts b/src/compiler/transformers/es2017.ts index 78d9f57ccdc..001f93551b4 100644 --- a/src/compiler/transformers/es2017.ts +++ b/src/compiler/transformers/es2017.ts @@ -140,8 +140,11 @@ namespace ts { return visitEachChild(node, visitor, context); case SyntaxKind.GetAccessor: + return doWithContext(ContextFlags.NonTopLevel | ContextFlags.HasLexicalThis, visitGetAccessorDeclaration, node as GetAccessorDeclaration); case SyntaxKind.SetAccessor: + return doWithContext(ContextFlags.NonTopLevel | ContextFlags.HasLexicalThis, visitSetAccessorDeclaration, node as SetAccessorDeclaration); case SyntaxKind.Constructor: + return doWithContext(ContextFlags.NonTopLevel | ContextFlags.HasLexicalThis, visitConstructorDeclaration, node as ConstructorDeclaration); case SyntaxKind.ClassDeclaration: case SyntaxKind.ClassExpression: return doWithContext(ContextFlags.NonTopLevel | ContextFlags.HasLexicalThis, visitDefault, node); @@ -278,6 +281,15 @@ namespace ts { ); } + function visitConstructorDeclaration(node: ConstructorDeclaration) { + return factory.updateConstructorDeclaration( + node, + visitNodes(node.modifiers, visitor, isModifierLike), + visitParameterList(node.parameters, visitor, context), + transformMethodBody(node) + ); + } + /** * Visits a MethodDeclaration node. * @@ -298,7 +310,28 @@ namespace ts { /*type*/ undefined, getFunctionFlags(node) & FunctionFlags.Async ? transformAsyncFunctionBody(node) - : visitFunctionBody(node.body, visitor, context) + : transformMethodBody(node) + ); + } + + function visitGetAccessorDeclaration(node: GetAccessorDeclaration) { + return factory.updateGetAccessorDeclaration( + node, + visitNodes(node.modifiers, visitor, isModifierLike), + node.name, + visitParameterList(node.parameters, visitor, context), + /*type*/ undefined, + transformMethodBody(node) + ); + } + + function visitSetAccessorDeclaration(node: SetAccessorDeclaration) { + return factory.updateSetAccessorDeclaration( + node, + visitNodes(node.modifiers, visitor, isModifierLike), + node.name, + visitParameterList(node.parameters, visitor, context), + transformMethodBody(node) ); } @@ -446,6 +479,50 @@ namespace ts { return false; } + function transformMethodBody(node: MethodDeclaration | AccessorDeclaration | ConstructorDeclaration): FunctionBody | undefined { + Debug.assertIsDefined(node.body); + + const savedCapturedSuperProperties = capturedSuperProperties; + const savedHasSuperElementAccess = hasSuperElementAccess; + capturedSuperProperties = new Set(); + hasSuperElementAccess = false; + + let updated = visitFunctionBody(node.body, visitor, context); + + // Minor optimization, emit `_super` helper to capture `super` access in an arrow. + // This step isn't needed if we eventually transform this to ES5. + const originalMethod = getOriginalNode(node, isFunctionLikeDeclaration); + const emitSuperHelpers = languageVersion >= ScriptTarget.ES2015 && + resolver.getNodeCheckFlags(node) & (NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync | NodeCheckFlags.MethodWithSuperPropertyAccessInAsync) && + (getFunctionFlags(originalMethod) & FunctionFlags.AsyncGenerator) !== FunctionFlags.AsyncGenerator; + + if (emitSuperHelpers) { + enableSubstitutionForAsyncMethodsWithSuper(); + if (capturedSuperProperties.size) { + const variableStatement = createSuperAccessVariableStatement(factory, resolver, node, capturedSuperProperties); + substitutedSuperAccessors[getNodeId(variableStatement)] = true; + + const statements = updated.statements.slice(); + insertStatementsAfterStandardPrologue(statements, [variableStatement]); + updated = factory.updateBlock(updated, statements); + } + + if (hasSuperElementAccess) { + // Emit helpers for super element access expressions (`super[x]`). + if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync) { + addEmitHelper(updated, advancedAsyncSuperHelper); + } + else if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.MethodWithSuperPropertyAccessInAsync) { + addEmitHelper(updated, asyncSuperHelper); + } + } + } + + capturedSuperProperties = savedCapturedSuperProperties; + hasSuperElementAccess = savedHasSuperElementAccess; + return updated; + } + function transformAsyncFunctionBody(node: MethodDeclaration | AccessorDeclaration | FunctionDeclaration | FunctionExpression): FunctionBody; function transformAsyncFunctionBody(node: ArrowFunction): ConciseBody; function transformAsyncFunctionBody(node: FunctionLikeDeclaration): ConciseBody { @@ -495,7 +572,7 @@ namespace ts { // Minor optimization, emit `_super` helper to capture `super` access in an arrow. // This step isn't needed if we eventually transform this to ES5. - const emitSuperHelpers = languageVersion >= ScriptTarget.ES2015 && resolver.getNodeCheckFlags(node) & (NodeCheckFlags.AsyncMethodWithSuperBinding | NodeCheckFlags.AsyncMethodWithSuper); + const emitSuperHelpers = languageVersion >= ScriptTarget.ES2015 && resolver.getNodeCheckFlags(node) & (NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync | NodeCheckFlags.MethodWithSuperPropertyAccessInAsync); if (emitSuperHelpers) { enableSubstitutionForAsyncMethodsWithSuper(); @@ -511,10 +588,10 @@ namespace ts { if (emitSuperHelpers && hasSuperElementAccess) { // Emit helpers for super element access expressions (`super[x]`). - if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.AsyncMethodWithSuperBinding) { + if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync) { addEmitHelper(block, advancedAsyncSuperHelper); } - else if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.AsyncMethodWithSuper) { + else if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.MethodWithSuperPropertyAccessInAsync) { addEmitHelper(block, asyncSuperHelper); } } @@ -601,7 +678,7 @@ namespace ts { // If we need to support substitutions for `super` in an async method, // we should track it here. if (enabledSubstitutions & ES2017SubstitutionFlags.AsyncMethodsWithSuper && isSuperContainer(node)) { - const superContainerFlags = resolver.getNodeCheckFlags(node) & (NodeCheckFlags.AsyncMethodWithSuper | NodeCheckFlags.AsyncMethodWithSuperBinding); + const superContainerFlags = resolver.getNodeCheckFlags(node) & (NodeCheckFlags.MethodWithSuperPropertyAccessInAsync | NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync); if (superContainerFlags !== enclosingSuperContainerFlags) { const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags; enclosingSuperContainerFlags = superContainerFlags; @@ -698,7 +775,7 @@ namespace ts { } function createSuperElementAccessInAsyncMethod(argumentExpression: Expression, location: TextRange): LeftHandSideExpression { - if (enclosingSuperContainerFlags & NodeCheckFlags.AsyncMethodWithSuperBinding) { + if (enclosingSuperContainerFlags & NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync) { return setTextRange( factory.createPropertyAccessExpression( factory.createCallExpression( @@ -728,7 +805,7 @@ namespace ts { export function createSuperAccessVariableStatement(factory: NodeFactory, resolver: EmitResolver, node: FunctionLikeDeclaration, names: Set<__String>) { // Create a variable declaration with a getter/setter (if binding) definition for each name: // const _super = Object.create(null, { x: { get: () => super.x, set: (v) => super.x = v }, ... }); - const hasBinding = (resolver.getNodeCheckFlags(node) & NodeCheckFlags.AsyncMethodWithSuperBinding) !== 0; + const hasBinding = (resolver.getNodeCheckFlags(node) & NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync) !== 0; const accessors: PropertyAssignment[] = []; names.forEach((_, key) => { const name = unescapeLeadingUnderscores(key); diff --git a/src/compiler/transformers/es2018.ts b/src/compiler/transformers/es2018.ts index aa1f4a5e6c4..394df42cbf3 100644 --- a/src/compiler/transformers/es2018.ts +++ b/src/compiler/transformers/es2018.ts @@ -1013,7 +1013,7 @@ namespace ts { // Minor optimization, emit `_super` helper to capture `super` access in an arrow. // This step isn't needed if we eventually transform this to ES5. - const emitSuperHelpers = languageVersion >= ScriptTarget.ES2015 && resolver.getNodeCheckFlags(node) & (NodeCheckFlags.AsyncMethodWithSuperBinding | NodeCheckFlags.AsyncMethodWithSuper); + const emitSuperHelpers = languageVersion >= ScriptTarget.ES2015 && resolver.getNodeCheckFlags(node) & (NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync | NodeCheckFlags.MethodWithSuperPropertyAccessInAsync); if (emitSuperHelpers) { enableSubstitutionForAsyncMethodsWithSuper(); @@ -1028,10 +1028,10 @@ namespace ts { const block = factory.updateBlock(node.body!, statements); if (emitSuperHelpers && hasSuperElementAccess) { - if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.AsyncMethodWithSuperBinding) { + if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync) { addEmitHelper(block, advancedAsyncSuperHelper); } - else if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.AsyncMethodWithSuper) { + else if (resolver.getNodeCheckFlags(node) & NodeCheckFlags.MethodWithSuperPropertyAccessInAsync) { addEmitHelper(block, asyncSuperHelper); } } @@ -1185,7 +1185,7 @@ namespace ts { // If we need to support substitutions for `super` in an async method, // we should track it here. if (enabledSubstitutions & ESNextSubstitutionFlags.AsyncMethodsWithSuper && isSuperContainer(node)) { - const superContainerFlags = resolver.getNodeCheckFlags(node) & (NodeCheckFlags.AsyncMethodWithSuper | NodeCheckFlags.AsyncMethodWithSuperBinding); + const superContainerFlags = resolver.getNodeCheckFlags(node) & (NodeCheckFlags.MethodWithSuperPropertyAccessInAsync | NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync); if (superContainerFlags !== enclosingSuperContainerFlags) { const savedEnclosingSuperContainerFlags = enclosingSuperContainerFlags; enclosingSuperContainerFlags = superContainerFlags; @@ -1282,7 +1282,7 @@ namespace ts { } function createSuperElementAccessInAsyncMethod(argumentExpression: Expression, location: TextRange): LeftHandSideExpression { - if (enclosingSuperContainerFlags & NodeCheckFlags.AsyncMethodWithSuperBinding) { + if (enclosingSuperContainerFlags & NodeCheckFlags.MethodWithSuperPropertyAssignmentInAsync) { return setTextRange( factory.createPropertyAccessExpression( factory.createCallExpression( diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 38984dffb65..6d16371717e 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -5527,8 +5527,8 @@ namespace ts { SuperInstance = 0x00000100, // Instance 'super' reference SuperStatic = 0x00000200, // Static 'super' reference ContextChecked = 0x00000400, // Contextual types have been assigned - AsyncMethodWithSuper = 0x00000800, // An async method that reads a value from a member of 'super'. - AsyncMethodWithSuperBinding = 0x00001000, // An async method that assigns a value to a member of 'super'. + MethodWithSuperPropertyAccessInAsync = 0x00000800, // A method that contains a SuperProperty access in an async context. + MethodWithSuperPropertyAssignmentInAsync = 0x00001000, // A method that contains a SuperProperty assignment in an async context. CaptureArguments = 0x00002000, // Lexical 'arguments' used in body EnumValuesComputed = 0x00004000, // Values for enum members have been computed, and any errors have been reported for them. LexicalModuleMergesWithClass = 0x00008000, // Instantiated lexical module declaration is merged with a previous class declaration. diff --git a/tests/baselines/reference/asyncMethodWithSuper_es6.js b/tests/baselines/reference/asyncMethodWithSuper_es6.js index a5f216d221a..514fc52f4ef 100644 --- a/tests/baselines/reference/asyncMethodWithSuper_es6.js +++ b/tests/baselines/reference/asyncMethodWithSuper_es6.js @@ -185,6 +185,32 @@ class B extends A { (async () => super["x"] = f); } } + +// https://github.com/microsoft/TypeScript/issues/46828 +class Base { + set setter(x: any) {} + get getter(): any { return; } + method(x: string): any {} + + static set setter(x: any) {} + static get getter(): any { return; } + static method(x: string): any {} +} + +class Derived extends Base { + a() { return async () => super.method('') } + b() { return async () => super.getter } + c() { return async () => super.setter = '' } + d() { return async () => super["method"]('') } + e() { return async () => super["getter"] } + f() { return async () => super["setter"] = '' } + static a() { return async () => super.method('') } + static b() { return async () => super.getter } + static c() { return async () => super.setter = '' } + static d() { return async () => super["method"]('') } + static e() { return async () => super["getter"] } + static f() { return async () => super["setter"] = '' } +} //// [asyncMethodWithSuper_es6.js] @@ -377,3 +403,62 @@ class B extends A { }); } } +// https://github.com/microsoft/TypeScript/issues/46828 +class Base { + set setter(x) { } + get getter() { return; } + method(x) { } + static set setter(x) { } + static get getter() { return; } + static method(x) { } +} +class Derived extends Base { + a() { const _super = Object.create(null, { + method: { get: () => super.method } + }); return () => __awaiter(this, void 0, void 0, function* () { return _super.method.call(this, ''); }); } + b() { const _super = Object.create(null, { + getter: { get: () => super.getter } + }); return () => __awaiter(this, void 0, void 0, function* () { return _super.getter; }); } + c() { const _super = Object.create(null, { + setter: { get: () => super.setter, set: v => super.setter = v } + }); return () => __awaiter(this, void 0, void 0, function* () { return _super.setter = ''; }); } + d() { + const _superIndex = name => super[name]; + return () => __awaiter(this, void 0, void 0, function* () { return _superIndex("method").call(this, ''); }); + } + e() { + const _superIndex = name => super[name]; + return () => __awaiter(this, void 0, void 0, function* () { return _superIndex("getter"); }); + } + f() { + const _superIndex = (function (geti, seti) { + const cache = Object.create(null); + return name => cache[name] || (cache[name] = { get value() { return geti(name); }, set value(v) { seti(name, v); } }); + })(name => super[name], (name, value) => super[name] = value); + return () => __awaiter(this, void 0, void 0, function* () { return _superIndex("setter").value = ''; }); + } + static a() { const _super = Object.create(null, { + method: { get: () => super.method } + }); return () => __awaiter(this, void 0, void 0, function* () { return _super.method.call(this, ''); }); } + static b() { const _super = Object.create(null, { + getter: { get: () => super.getter } + }); return () => __awaiter(this, void 0, void 0, function* () { return _super.getter; }); } + static c() { const _super = Object.create(null, { + setter: { get: () => super.setter, set: v => super.setter = v } + }); return () => __awaiter(this, void 0, void 0, function* () { return _super.setter = ''; }); } + static d() { + const _superIndex = name => super[name]; + return () => __awaiter(this, void 0, void 0, function* () { return _superIndex("method").call(this, ''); }); + } + static e() { + const _superIndex = name => super[name]; + return () => __awaiter(this, void 0, void 0, function* () { return _superIndex("getter"); }); + } + static f() { + const _superIndex = (function (geti, seti) { + const cache = Object.create(null); + return name => cache[name] || (cache[name] = { get value() { return geti(name); }, set value(v) { seti(name, v); } }); + })(name => super[name], (name, value) => super[name] = value); + return () => __awaiter(this, void 0, void 0, function* () { return _superIndex("setter").value = ''; }); + } +} diff --git a/tests/baselines/reference/asyncMethodWithSuper_es6.symbols b/tests/baselines/reference/asyncMethodWithSuper_es6.symbols index 59c844fa7de..ca3c70f0480 100644 --- a/tests/baselines/reference/asyncMethodWithSuper_es6.symbols +++ b/tests/baselines/reference/asyncMethodWithSuper_es6.symbols @@ -376,3 +376,101 @@ class B extends A { } } +// https://github.com/microsoft/TypeScript/issues/46828 +class Base { +>Base : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) + + set setter(x: any) {} +>setter : Symbol(Base.setter, Decl(asyncMethodWithSuper_es6.ts, 188, 12)) +>x : Symbol(x, Decl(asyncMethodWithSuper_es6.ts, 189, 15)) + + get getter(): any { return; } +>getter : Symbol(Base.getter, Decl(asyncMethodWithSuper_es6.ts, 189, 25)) + + method(x: string): any {} +>method : Symbol(Base.method, Decl(asyncMethodWithSuper_es6.ts, 190, 33)) +>x : Symbol(x, Decl(asyncMethodWithSuper_es6.ts, 191, 11)) + + static set setter(x: any) {} +>setter : Symbol(Base.setter, Decl(asyncMethodWithSuper_es6.ts, 191, 29)) +>x : Symbol(x, Decl(asyncMethodWithSuper_es6.ts, 193, 22)) + + static get getter(): any { return; } +>getter : Symbol(Base.getter, Decl(asyncMethodWithSuper_es6.ts, 193, 32)) + + static method(x: string): any {} +>method : Symbol(Base.method, Decl(asyncMethodWithSuper_es6.ts, 194, 40)) +>x : Symbol(x, Decl(asyncMethodWithSuper_es6.ts, 195, 18)) +} + +class Derived extends Base { +>Derived : Symbol(Derived, Decl(asyncMethodWithSuper_es6.ts, 196, 1)) +>Base : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) + + a() { return async () => super.method('') } +>a : Symbol(Derived.a, Decl(asyncMethodWithSuper_es6.ts, 198, 28)) +>super.method : Symbol(Base.method, Decl(asyncMethodWithSuper_es6.ts, 190, 33)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>method : Symbol(Base.method, Decl(asyncMethodWithSuper_es6.ts, 190, 33)) + + b() { return async () => super.getter } +>b : Symbol(Derived.b, Decl(asyncMethodWithSuper_es6.ts, 199, 47)) +>super.getter : Symbol(Base.getter, Decl(asyncMethodWithSuper_es6.ts, 189, 25)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>getter : Symbol(Base.getter, Decl(asyncMethodWithSuper_es6.ts, 189, 25)) + + c() { return async () => super.setter = '' } +>c : Symbol(Derived.c, Decl(asyncMethodWithSuper_es6.ts, 200, 43)) +>super.setter : Symbol(Base.setter, Decl(asyncMethodWithSuper_es6.ts, 188, 12)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>setter : Symbol(Base.setter, Decl(asyncMethodWithSuper_es6.ts, 188, 12)) + + d() { return async () => super["method"]('') } +>d : Symbol(Derived.d, Decl(asyncMethodWithSuper_es6.ts, 201, 48)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>"method" : Symbol(Base.method, Decl(asyncMethodWithSuper_es6.ts, 190, 33)) + + e() { return async () => super["getter"] } +>e : Symbol(Derived.e, Decl(asyncMethodWithSuper_es6.ts, 202, 50)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>"getter" : Symbol(Base.getter, Decl(asyncMethodWithSuper_es6.ts, 189, 25)) + + f() { return async () => super["setter"] = '' } +>f : Symbol(Derived.f, Decl(asyncMethodWithSuper_es6.ts, 203, 46)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>"setter" : Symbol(Base.setter, Decl(asyncMethodWithSuper_es6.ts, 188, 12)) + + static a() { return async () => super.method('') } +>a : Symbol(Derived.a, Decl(asyncMethodWithSuper_es6.ts, 204, 51)) +>super.method : Symbol(Base.method, Decl(asyncMethodWithSuper_es6.ts, 194, 40)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>method : Symbol(Base.method, Decl(asyncMethodWithSuper_es6.ts, 194, 40)) + + static b() { return async () => super.getter } +>b : Symbol(Derived.b, Decl(asyncMethodWithSuper_es6.ts, 205, 54)) +>super.getter : Symbol(Base.getter, Decl(asyncMethodWithSuper_es6.ts, 193, 32)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>getter : Symbol(Base.getter, Decl(asyncMethodWithSuper_es6.ts, 193, 32)) + + static c() { return async () => super.setter = '' } +>c : Symbol(Derived.c, Decl(asyncMethodWithSuper_es6.ts, 206, 50)) +>super.setter : Symbol(Base.setter, Decl(asyncMethodWithSuper_es6.ts, 191, 29)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>setter : Symbol(Base.setter, Decl(asyncMethodWithSuper_es6.ts, 191, 29)) + + static d() { return async () => super["method"]('') } +>d : Symbol(Derived.d, Decl(asyncMethodWithSuper_es6.ts, 207, 55)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>"method" : Symbol(Base.method, Decl(asyncMethodWithSuper_es6.ts, 194, 40)) + + static e() { return async () => super["getter"] } +>e : Symbol(Derived.e, Decl(asyncMethodWithSuper_es6.ts, 208, 57)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>"getter" : Symbol(Base.getter, Decl(asyncMethodWithSuper_es6.ts, 193, 32)) + + static f() { return async () => super["setter"] = '' } +>f : Symbol(Derived.f, Decl(asyncMethodWithSuper_es6.ts, 209, 53)) +>super : Symbol(Base, Decl(asyncMethodWithSuper_es6.ts, 185, 1)) +>"setter" : Symbol(Base.setter, Decl(asyncMethodWithSuper_es6.ts, 191, 29)) +} + diff --git a/tests/baselines/reference/asyncMethodWithSuper_es6.types b/tests/baselines/reference/asyncMethodWithSuper_es6.types index 5dcc642146a..a2d5bf49b89 100644 --- a/tests/baselines/reference/asyncMethodWithSuper_es6.types +++ b/tests/baselines/reference/asyncMethodWithSuper_es6.types @@ -504,3 +504,135 @@ class B extends A { } } +// https://github.com/microsoft/TypeScript/issues/46828 +class Base { +>Base : Base + + set setter(x: any) {} +>setter : any +>x : any + + get getter(): any { return; } +>getter : any + + method(x: string): any {} +>method : (x: string) => any +>x : string + + static set setter(x: any) {} +>setter : any +>x : any + + static get getter(): any { return; } +>getter : any + + static method(x: string): any {} +>method : (x: string) => any +>x : string +} + +class Derived extends Base { +>Derived : Derived +>Base : Base + + a() { return async () => super.method('') } +>a : () => () => Promise +>async () => super.method('') : () => Promise +>super.method('') : any +>super.method : (x: string) => any +>super : Base +>method : (x: string) => any +>'' : "" + + b() { return async () => super.getter } +>b : () => () => Promise +>async () => super.getter : () => Promise +>super.getter : any +>super : Base +>getter : any + + c() { return async () => super.setter = '' } +>c : () => () => Promise +>async () => super.setter = '' : () => Promise +>super.setter = '' : "" +>super.setter : any +>super : Base +>setter : any +>'' : "" + + d() { return async () => super["method"]('') } +>d : () => () => Promise +>async () => super["method"]('') : () => Promise +>super["method"]('') : any +>super["method"] : (x: string) => any +>super : Base +>"method" : "method" +>'' : "" + + e() { return async () => super["getter"] } +>e : () => () => Promise +>async () => super["getter"] : () => Promise +>super["getter"] : any +>super : Base +>"getter" : "getter" + + f() { return async () => super["setter"] = '' } +>f : () => () => Promise +>async () => super["setter"] = '' : () => Promise +>super["setter"] = '' : "" +>super["setter"] : any +>super : Base +>"setter" : "setter" +>'' : "" + + static a() { return async () => super.method('') } +>a : () => () => Promise +>async () => super.method('') : () => Promise +>super.method('') : any +>super.method : (x: string) => any +>super : typeof Base +>method : (x: string) => any +>'' : "" + + static b() { return async () => super.getter } +>b : () => () => Promise +>async () => super.getter : () => Promise +>super.getter : any +>super : typeof Base +>getter : any + + static c() { return async () => super.setter = '' } +>c : () => () => Promise +>async () => super.setter = '' : () => Promise +>super.setter = '' : "" +>super.setter : any +>super : typeof Base +>setter : any +>'' : "" + + static d() { return async () => super["method"]('') } +>d : () => () => Promise +>async () => super["method"]('') : () => Promise +>super["method"]('') : any +>super["method"] : (x: string) => any +>super : typeof Base +>"method" : "method" +>'' : "" + + static e() { return async () => super["getter"] } +>e : () => () => Promise +>async () => super["getter"] : () => Promise +>super["getter"] : any +>super : typeof Base +>"getter" : "getter" + + static f() { return async () => super["setter"] = '' } +>f : () => () => Promise +>async () => super["setter"] = '' : () => Promise +>super["setter"] = '' : "" +>super["setter"] : any +>super : typeof Base +>"setter" : "setter" +>'' : "" +} + diff --git a/tests/cases/conformance/async/es6/asyncMethodWithSuper_es6.ts b/tests/cases/conformance/async/es6/asyncMethodWithSuper_es6.ts index 41208f6e63e..0f018ca9920 100644 --- a/tests/cases/conformance/async/es6/asyncMethodWithSuper_es6.ts +++ b/tests/cases/conformance/async/es6/asyncMethodWithSuper_es6.ts @@ -187,3 +187,29 @@ class B extends A { (async () => super["x"] = f); } } + +// https://github.com/microsoft/TypeScript/issues/46828 +class Base { + set setter(x: any) {} + get getter(): any { return; } + method(x: string): any {} + + static set setter(x: any) {} + static get getter(): any { return; } + static method(x: string): any {} +} + +class Derived extends Base { + a() { return async () => super.method('') } + b() { return async () => super.getter } + c() { return async () => super.setter = '' } + d() { return async () => super["method"]('') } + e() { return async () => super["getter"] } + f() { return async () => super["setter"] = '' } + static a() { return async () => super.method('') } + static b() { return async () => super.getter } + static c() { return async () => super.setter = '' } + static d() { return async () => super["method"]('') } + static e() { return async () => super["getter"] } + static f() { return async () => super["setter"] = '' } +} From a56b254ad3c52b598bc5d44f83f3d0a1cf806068 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Fri, 21 Oct 2022 08:00:24 -0400 Subject: [PATCH 19/25] Include 'this' type parameter in isRelatedTo fast path (#51230) --- src/compiler/checker.ts | 4 ++-- .../baselines/reference/asyncFunctionReturnType.2.js | 11 +++++++++++ .../reference/asyncFunctionReturnType.2.symbols | 10 ++++++++++ .../reference/asyncFunctionReturnType.2.types | 10 ++++++++++ tests/cases/compiler/asyncFunctionReturnType.2.ts | 6 ++++++ 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/asyncFunctionReturnType.2.js create mode 100644 tests/baselines/reference/asyncFunctionReturnType.2.symbols create mode 100644 tests/baselines/reference/asyncFunctionReturnType.2.types create mode 100644 tests/cases/compiler/asyncFunctionReturnType.2.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5b30941b5cc..76b9a21d73f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -36994,7 +36994,7 @@ namespace ts { } // primitives with a `{ then() }` won't be unwrapped/adopted. - if (allTypesAssignableToKind(type, TypeFlags.Primitive | TypeFlags.Never)) { + if (allTypesAssignableToKind(getBaseConstraintOrType(type), TypeFlags.Primitive | TypeFlags.Never)) { return undefined; } @@ -37069,7 +37069,7 @@ namespace ts { * Determines whether a type is an object with a callable `then` member. */ function isThenableType(type: Type): boolean { - if (allTypesAssignableToKind(type, TypeFlags.Primitive | TypeFlags.Never)) { + if (allTypesAssignableToKind(getBaseConstraintOrType(type), TypeFlags.Primitive | TypeFlags.Never)) { // primitive types cannot be considered "thenable" since they are not objects. return false; } diff --git a/tests/baselines/reference/asyncFunctionReturnType.2.js b/tests/baselines/reference/asyncFunctionReturnType.2.js new file mode 100644 index 00000000000..9405b3f2bb5 --- /dev/null +++ b/tests/baselines/reference/asyncFunctionReturnType.2.js @@ -0,0 +1,11 @@ +//// [asyncFunctionReturnType.2.ts] +// https://github.com/microsoft/TypeScript/issues/47291 +class X { + f = async (): Promise => this; +} + +//// [asyncFunctionReturnType.2.js] +// https://github.com/microsoft/TypeScript/issues/47291 +class X { + f = async () => this; +} diff --git a/tests/baselines/reference/asyncFunctionReturnType.2.symbols b/tests/baselines/reference/asyncFunctionReturnType.2.symbols new file mode 100644 index 00000000000..2e9988be963 --- /dev/null +++ b/tests/baselines/reference/asyncFunctionReturnType.2.symbols @@ -0,0 +1,10 @@ +=== tests/cases/compiler/asyncFunctionReturnType.2.ts === +// https://github.com/microsoft/TypeScript/issues/47291 +class X { +>X : Symbol(X, Decl(asyncFunctionReturnType.2.ts, 0, 0)) + + f = async (): Promise => this; +>f : Symbol(X.f, Decl(asyncFunctionReturnType.2.ts, 1, 9)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +>this : Symbol(X, Decl(asyncFunctionReturnType.2.ts, 0, 0)) +} diff --git a/tests/baselines/reference/asyncFunctionReturnType.2.types b/tests/baselines/reference/asyncFunctionReturnType.2.types new file mode 100644 index 00000000000..1559dda5bf4 --- /dev/null +++ b/tests/baselines/reference/asyncFunctionReturnType.2.types @@ -0,0 +1,10 @@ +=== tests/cases/compiler/asyncFunctionReturnType.2.ts === +// https://github.com/microsoft/TypeScript/issues/47291 +class X { +>X : X + + f = async (): Promise => this; +>f : () => Promise +>async (): Promise => this : () => Promise +>this : this +} diff --git a/tests/cases/compiler/asyncFunctionReturnType.2.ts b/tests/cases/compiler/asyncFunctionReturnType.2.ts new file mode 100644 index 00000000000..628ecf915ef --- /dev/null +++ b/tests/cases/compiler/asyncFunctionReturnType.2.ts @@ -0,0 +1,6 @@ +// @target: esnext + +// https://github.com/microsoft/TypeScript/issues/47291 +class X { + f = async (): Promise => this; +} \ No newline at end of file From bbb42f453dc684e03d977c5b70391124d57543a9 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 21 Oct 2022 10:04:40 -0700 Subject: [PATCH 20/25] Fix typo in canWatchDirectoryOrFile found by CodeQL (#51262) --- src/compiler/resolutionCache.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/resolutionCache.ts b/src/compiler/resolutionCache.ts index 732a1114229..6f3cdf1749d 100644 --- a/src/compiler/resolutionCache.ts +++ b/src/compiler/resolutionCache.ts @@ -127,7 +127,7 @@ namespace ts { const isNonDirectorySeparatorRoot = rootLength > 1 || dirPath.charCodeAt(0) !== CharacterCodes.slash; if (isNonDirectorySeparatorRoot && dirPath.search(/[a-zA-Z]:/) !== 0 && // Non dos style paths - pathPartForUserCheck.search(/[a-zA-z]\$\//) === 0) { // Dos style nextPart + pathPartForUserCheck.search(/[a-zA-Z]\$\//) === 0) { // Dos style nextPart nextDirectorySeparator = dirPath.indexOf(directorySeparator, nextDirectorySeparator + 1); if (nextDirectorySeparator === -1) { // ignore "//vda1cs4850/c$/folderAtRoot" From ef69116c41cb6805f89e6592eacb0ccb7f02207d Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Fri, 21 Oct 2022 16:05:58 -0700 Subject: [PATCH 21/25] Generate shortest `rootDirs` module specifier instead of first possible (#51244) * Generate shortest rootDirs module specifier instead of first possible * Simplify `min` --- src/compiler/core.ts | 6 ++++-- src/compiler/moduleSpecifiers.ts | 23 ++++++++++++++------- src/services/patternMatcher.ts | 2 +- tests/cases/fourslash/autoImportRootDirs.ts | 17 +++++++++++++++ 4 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 tests/cases/fourslash/autoImportRootDirs.ts diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 698f7bb2fb7..870892d8640 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1937,8 +1937,10 @@ namespace ts { return compareValues(a?.start, b?.start) || compareValues(a?.length, b?.length); } - export function min(a: T, b: T, compare: Comparer): T { - return compare(a, b) === Comparison.LessThan ? a : b; + export function min(items: readonly [T, ...T[]], compare: Comparer): T; + export function min(items: readonly T[], compare: Comparer): T | undefined; + export function min(items: readonly T[], compare: Comparer): T | undefined { + return reduceLeft(items, (x, y) => compare(x, y) === Comparison.LessThan ? x : y); } /** diff --git a/src/compiler/moduleSpecifiers.ts b/src/compiler/moduleSpecifiers.ts index 32640fcb815..2327f8924b8 100644 --- a/src/compiler/moduleSpecifiers.ts +++ b/src/compiler/moduleSpecifiers.ts @@ -726,16 +726,23 @@ namespace ts.moduleSpecifiers { } function tryGetModuleNameFromRootDirs(rootDirs: readonly string[], moduleFileName: string, sourceDirectory: string, getCanonicalFileName: (file: string) => string, ending: Ending, compilerOptions: CompilerOptions): string | undefined { - const normalizedTargetPath = getPathRelativeToRootDirs(moduleFileName, rootDirs, getCanonicalFileName); - if (normalizedTargetPath === undefined) { + const normalizedTargetPaths = getPathsRelativeToRootDirs(moduleFileName, rootDirs, getCanonicalFileName); + if (normalizedTargetPaths === undefined) { + return undefined; + } + + const normalizedSourcePaths = getPathsRelativeToRootDirs(sourceDirectory, rootDirs, getCanonicalFileName); + const relativePaths = flatMap(normalizedSourcePaths, sourcePath => { + return map(normalizedTargetPaths, targetPath => ensurePathIsNonModuleName(getRelativePathFromDirectory(sourcePath, targetPath, getCanonicalFileName))); + }); + const shortest = min(relativePaths, compareNumberOfDirectorySeparators); + if (!shortest) { return undefined; } - const normalizedSourcePath = getPathRelativeToRootDirs(sourceDirectory, rootDirs, getCanonicalFileName); - const relativePath = normalizedSourcePath !== undefined ? ensurePathIsNonModuleName(getRelativePathFromDirectory(normalizedSourcePath, normalizedTargetPath, getCanonicalFileName)) : normalizedTargetPath; return getEmitModuleResolutionKind(compilerOptions) === ModuleResolutionKind.NodeJs - ? removeExtensionAndIndexPostFix(relativePath, ending, compilerOptions) - : removeFileExtension(relativePath); + ? removeExtensionAndIndexPostFix(shortest, ending, compilerOptions) + : removeFileExtension(shortest); } function tryGetModuleNameAsNodeModule({ path, isRedirect }: ModulePath, { getCanonicalFileName, sourceDirectory }: Info, importingSourceFile: SourceFile , host: ModuleSpecifierResolutionHost, options: CompilerOptions, userPreferences: UserPreferences, packageNameOnly?: boolean, overrideMode?: ModuleKind.ESNext | ModuleKind.CommonJS): string | undefined { @@ -882,8 +889,8 @@ namespace ts.moduleSpecifiers { } } - function getPathRelativeToRootDirs(path: string, rootDirs: readonly string[], getCanonicalFileName: GetCanonicalFileName): string | undefined { - return firstDefined(rootDirs, rootDir => { + function getPathsRelativeToRootDirs(path: string, rootDirs: readonly string[], getCanonicalFileName: GetCanonicalFileName): string[] | undefined { + return mapDefined(rootDirs, rootDir => { const relativePath = getRelativePathIfInDirectory(path, rootDir, getCanonicalFileName); return relativePath !== undefined && isPathRelativeToParent(relativePath) ? undefined : relativePath; }); diff --git a/src/services/patternMatcher.ts b/src/services/patternMatcher.ts index b0071f71240..66e4a621793 100644 --- a/src/services/patternMatcher.ts +++ b/src/services/patternMatcher.ts @@ -259,7 +259,7 @@ namespace ts { } function betterMatch(a: PatternMatch | undefined, b: PatternMatch | undefined): PatternMatch | undefined { - return min(a, b, compareMatches); + return min([a, b], compareMatches); } function compareMatches(a: PatternMatch | undefined, b: PatternMatch | undefined): Comparison { return a === undefined ? Comparison.GreaterThan : b === undefined ? Comparison.LessThan diff --git a/tests/cases/fourslash/autoImportRootDirs.ts b/tests/cases/fourslash/autoImportRootDirs.ts new file mode 100644 index 00000000000..7ca66d2d7d1 --- /dev/null +++ b/tests/cases/fourslash/autoImportRootDirs.ts @@ -0,0 +1,17 @@ +/// + +// @Filename: /tsconfig.json +//// { +//// "compilerOptions": { +//// "module": "commonjs", +//// "rootDirs": [".", "./some/other/root"] +//// } +//// } + +// @Filename: /some/other/root/types.ts +//// export type Something = {}; + +// @Filename: /index.ts +//// const s: Something/**/ + +verify.importFixModuleSpecifiers("", ["./types"]); From 61c26096e3373719ece686b84c698423890e9a5f Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Sat, 22 Oct 2022 06:11:59 +0000 Subject: [PATCH 22/25] Update package-lock.json --- package-lock.json | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71fe6a44b27..3cc60abe999 100644 --- a/package-lock.json +++ b/package-lock.json @@ -174,9 +174,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -2287,14 +2287,15 @@ } }, "node_modules/eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2310,14 +2311,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -8748,9 +8749,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", + "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -10408,14 +10409,15 @@ "dev": true }, "eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", + "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -10431,14 +10433,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", From 60934915d9ccc4ca9c0fb2cd060d7ec81601942b Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Sat, 22 Oct 2022 08:23:41 -0700 Subject: [PATCH 23/25] Fix apparent typo in getStringMappingType (#51248) --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 76b9a21d73f..2a03341ea6d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15709,7 +15709,7 @@ namespace ts { type.flags & TypeFlags.TemplateLiteral ? getTemplateLiteralType(...applyTemplateStringMapping(symbol, (type as TemplateLiteralType).texts, (type as TemplateLiteralType).types)) : // Mapping> === Mapping type.flags & TypeFlags.StringMapping && symbol === type.symbol ? type : - type.flags & (TypeFlags.Any | TypeFlags.String || type.flags & TypeFlags.StringMapping) || isGenericIndexType(type) ? getStringMappingTypeForGenericType(symbol, type) : + type.flags & (TypeFlags.Any | TypeFlags.String | TypeFlags.StringMapping) || isGenericIndexType(type) ? getStringMappingTypeForGenericType(symbol, type) : // This handles Mapping<`${number}`> and Mapping<`${bigint}`> isPatternLiteralPlaceholderType(type) ? getStringMappingTypeForGenericType(symbol, getTemplateLiteralType(["", ""], [type])) : type; From 2cc4c16a26672a7ba6c97ba16309fcf334db7cae Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Sun, 23 Oct 2022 06:13:35 +0000 Subject: [PATCH 24/25] Update package-lock.json --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3cc60abe999..b85e3b5f051 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2458,9 +2458,9 @@ "dev": true }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.3.14", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.14.tgz", - "integrity": "sha512-kle7ot5xvzXwWzg7ElzTPM/y1IWUo0kfa5X+ZwOC/7Jw81OJaqIaNEk+2ZH+HcKkbwRUQ3RTdK9qsm4p5vbXAQ==", + "version": "39.3.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.20.tgz", + "integrity": "sha512-A9pAm4lQeDKyzu6wuMUZS+FQceu6S2G18o9Mld0a48NAeLaLPg9TpoXM2Xv85LZ3AnKUtx+jR9SxXJLgCQiifQ==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.33.0", @@ -10581,9 +10581,9 @@ } }, "eslint-plugin-jsdoc": { - "version": "39.3.14", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.14.tgz", - "integrity": "sha512-kle7ot5xvzXwWzg7ElzTPM/y1IWUo0kfa5X+ZwOC/7Jw81OJaqIaNEk+2ZH+HcKkbwRUQ3RTdK9qsm4p5vbXAQ==", + "version": "39.3.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.20.tgz", + "integrity": "sha512-A9pAm4lQeDKyzu6wuMUZS+FQceu6S2G18o9Mld0a48NAeLaLPg9TpoXM2Xv85LZ3AnKUtx+jR9SxXJLgCQiifQ==", "dev": true, "requires": { "@es-joy/jsdoccomment": "~0.33.0", From 6af270dee09d62516f6dc02ec102a745ffebc037 Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Mon, 24 Oct 2022 06:34:04 +0000 Subject: [PATCH 25/25] Update package-lock.json --- package-lock.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index b85e3b5f051..fbee797571b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -577,9 +577,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.11.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz", - "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==", + "version": "18.11.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.4.tgz", + "integrity": "sha512-BxcJpBu8D3kv/GZkx/gSMz6VnTJREBj/4lbzYOQueUOELkt8WrO6zAcSPmp9uRPEW/d+lUO8QK0W2xnS1hEU0A==", "dev": true }, "node_modules/@types/semver": { @@ -2458,9 +2458,9 @@ "dev": true }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.3.20", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.20.tgz", - "integrity": "sha512-A9pAm4lQeDKyzu6wuMUZS+FQceu6S2G18o9Mld0a48NAeLaLPg9TpoXM2Xv85LZ3AnKUtx+jR9SxXJLgCQiifQ==", + "version": "39.3.23", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.23.tgz", + "integrity": "sha512-ZwutuEmsdz8sj9fCXz4r/4x3uZ4qrB6+ca3rIyH3HHEEj5t6xgOSBWIj8IkxZkBUKvoadWHM6iCPzkmXgPHpsA==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.33.0", @@ -9089,9 +9089,9 @@ "dev": true }, "@types/node": { - "version": "18.11.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.3.tgz", - "integrity": "sha512-fNjDQzzOsZeKZu5NATgXUPsaFaTxeRgFXoosrHivTl8RGeV733OLawXsGfEk9a8/tySyZUyiZ6E8LcjPFZ2y1A==", + "version": "18.11.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.4.tgz", + "integrity": "sha512-BxcJpBu8D3kv/GZkx/gSMz6VnTJREBj/4lbzYOQueUOELkt8WrO6zAcSPmp9uRPEW/d+lUO8QK0W2xnS1hEU0A==", "dev": true }, "@types/semver": { @@ -10581,9 +10581,9 @@ } }, "eslint-plugin-jsdoc": { - "version": "39.3.20", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.20.tgz", - "integrity": "sha512-A9pAm4lQeDKyzu6wuMUZS+FQceu6S2G18o9Mld0a48NAeLaLPg9TpoXM2Xv85LZ3AnKUtx+jR9SxXJLgCQiifQ==", + "version": "39.3.23", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.23.tgz", + "integrity": "sha512-ZwutuEmsdz8sj9fCXz4r/4x3uZ4qrB6+ca3rIyH3HHEEj5t6xgOSBWIj8IkxZkBUKvoadWHM6iCPzkmXgPHpsA==", "dev": true, "requires": { "@es-joy/jsdoccomment": "~0.33.0",