From 4432e96bedbc783e658ca8ea0a0cb6a0d4398ed8 Mon Sep 17 00:00:00 2001 From: islandryu Date: Thu, 13 Jan 2022 01:51:26 +0900 Subject: [PATCH 1/9] fix emit when one line variable declaration removeComment false --- src/compiler/emitter.ts | 6 ++++- src/compiler/factory/emitNode.ts | 12 +++++++++- src/compiler/transformers/ts.ts | 6 ++++- src/compiler/types.ts | 1 + .../reference/api/tsserverlibrary.d.ts | 2 ++ tests/baselines/reference/api/typescript.d.ts | 2 ++ ...eVariableDeclarationRemoveCommentsFalse.js | 14 +++++++++++ ...ableDeclarationRemoveCommentsFalse.symbols | 18 ++++++++++++++ ...riableDeclarationRemoveCommentsFalse.types | 24 +++++++++++++++++++ ...eVariableDeclarationRemoveCommentsFalse.ts | 7 ++++++ 10 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.js create mode 100644 tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.symbols create mode 100644 tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.types create mode 100644 tests/cases/compiler/emitOneLineVariableDeclarationRemoveCommentsFalse.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 445537d3de873..7af5b51450fe8 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3102,7 +3102,7 @@ namespace ts { emit(node.name); emit(node.exclamationToken); emitTypeAnnotation(node.type); - emitInitializer(node.initializer, node.type ? node.type.end : node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma); + emitInitializer(node.initializer, node.type ? node.type.end : node.name.emitNode?.typeNode ? node.name.emitNode.typeNode.end : node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma); } function emitVariableDeclarationList(node: VariableDeclarationList) { @@ -5325,6 +5325,10 @@ namespace ts { commentsDisabled = false; } emitTrailingCommentsOfNode(node, emitFlags, commentRange.pos, commentRange.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); + const typeNode = getTypeNode(node); + if(typeNode){ + emitTrailingCommentsOfNode(node, emitFlags, typeNode.pos, typeNode.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); + } } function emitLeadingCommentsOfNode(node: Node, emitFlags: EmitFlags, pos: number, end: number) { diff --git a/src/compiler/factory/emitNode.ts b/src/compiler/factory/emitNode.ts index ebb7300efdeec..0445497f1dfb6 100644 --- a/src/compiler/factory/emitNode.ts +++ b/src/compiler/factory/emitNode.ts @@ -279,4 +279,14 @@ namespace ts { getOrCreateEmitNode(node).flags |= EmitFlags.IgnoreSourceNewlines; return node; } -} \ No newline at end of file + + export function setTypeNode(node: T, type: TypeNode): T { + const emitNode = getOrCreateEmitNode(node); + emitNode.typeNode = type; + return node; + } + + export function getTypeNode(node: T): TypeNode | undefined { + return node.emitNode?.typeNode; + } +} diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 86dedd9d6d2c3..43ce89605c329 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -2209,12 +2209,16 @@ namespace ts { } function visitVariableDeclaration(node: VariableDeclaration) { - return factory.updateVariableDeclaration( + const updated = factory.updateVariableDeclaration( node, visitNode(node.name, visitor, isBindingName), /*exclamationToken*/ undefined, /*type*/ undefined, visitNode(node.initializer, visitor, isExpression)); + if(node.type){ + setTypeNode(updated.name, node.type); + } + return updated; } function visitParenthesizedExpression(node: ParenthesizedExpression): Expression { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index dcea2e7e38526..417868def712a 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -6835,6 +6835,7 @@ namespace ts { helpers?: EmitHelper[]; // Emit helpers for the node startsOnNewLine?: boolean; // If the node should begin on a new line snippetElement?: SnippetElement; // Snippet element of the node + typeNode?: TypeNode; // VariableDeclaration type } /* @internal */ diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index f822907cd1430..509fe8f5b1654 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -4525,6 +4525,8 @@ declare namespace ts { * Moves matching emit helpers from a source node to a target node. */ function moveEmitHelpers(source: Node, target: Node, predicate: (helper: EmitHelper) => boolean): void; + function setTypeNode(node: T, type: TypeNode): T; + function getTypeNode(node: T): TypeNode | undefined; } declare namespace ts { function isNumericLiteral(node: Node): node is NumericLiteral; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 0137fbeb78a75..3bcca1aa09ca0 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -4525,6 +4525,8 @@ declare namespace ts { * Moves matching emit helpers from a source node to a target node. */ function moveEmitHelpers(source: Node, target: Node, predicate: (helper: EmitHelper) => boolean): void; + function setTypeNode(node: T, type: TypeNode): T; + function getTypeNode(node: T): TypeNode | undefined; } declare namespace ts { function isNumericLiteral(node: Node): node is NumericLiteral; diff --git a/tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.js b/tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.js new file mode 100644 index 0000000000000..46cbed2dfdae7 --- /dev/null +++ b/tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.js @@ -0,0 +1,14 @@ +//// [emitOneLineVariableDeclarationRemoveCommentsFalse.ts] +let a = /*[[${something}]]*/ {}; +let b: any = /*[[${something}]]*/ {}; +let c: { hoge: boolean } = /*[[${something}]]*/ { hoge: true }; +let d: any /*[[${something}]]*/ = {}; +let e/*[[${something}]]*/: any = {}; + + +//// [emitOneLineVariableDeclarationRemoveCommentsFalse.js] +var a = /*[[${something}]]*/ {}; +var b = /*[[${something}]]*/ {}; +var c = /*[[${something}]]*/ { hoge: true }; +var d /*[[${something}]]*/ = {}; +var e /*[[${something}]]*/ = {}; diff --git a/tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.symbols b/tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.symbols new file mode 100644 index 0000000000000..b7b8f9346fb28 --- /dev/null +++ b/tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.symbols @@ -0,0 +1,18 @@ +=== tests/cases/compiler/emitOneLineVariableDeclarationRemoveCommentsFalse.ts === +let a = /*[[${something}]]*/ {}; +>a : Symbol(a, Decl(emitOneLineVariableDeclarationRemoveCommentsFalse.ts, 0, 3)) + +let b: any = /*[[${something}]]*/ {}; +>b : Symbol(b, Decl(emitOneLineVariableDeclarationRemoveCommentsFalse.ts, 1, 3)) + +let c: { hoge: boolean } = /*[[${something}]]*/ { hoge: true }; +>c : Symbol(c, Decl(emitOneLineVariableDeclarationRemoveCommentsFalse.ts, 2, 3)) +>hoge : Symbol(hoge, Decl(emitOneLineVariableDeclarationRemoveCommentsFalse.ts, 2, 8)) +>hoge : Symbol(hoge, Decl(emitOneLineVariableDeclarationRemoveCommentsFalse.ts, 2, 49)) + +let d: any /*[[${something}]]*/ = {}; +>d : Symbol(d, Decl(emitOneLineVariableDeclarationRemoveCommentsFalse.ts, 3, 3)) + +let e/*[[${something}]]*/: any = {}; +>e : Symbol(e, Decl(emitOneLineVariableDeclarationRemoveCommentsFalse.ts, 4, 3)) + diff --git a/tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.types b/tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.types new file mode 100644 index 0000000000000..539366d96260c --- /dev/null +++ b/tests/baselines/reference/emitOneLineVariableDeclarationRemoveCommentsFalse.types @@ -0,0 +1,24 @@ +=== tests/cases/compiler/emitOneLineVariableDeclarationRemoveCommentsFalse.ts === +let a = /*[[${something}]]*/ {}; +>a : {} +>{} : {} + +let b: any = /*[[${something}]]*/ {}; +>b : any +>{} : {} + +let c: { hoge: boolean } = /*[[${something}]]*/ { hoge: true }; +>c : { hoge: boolean; } +>hoge : boolean +>{ hoge: true } : { hoge: true; } +>hoge : true +>true : true + +let d: any /*[[${something}]]*/ = {}; +>d : any +>{} : {} + +let e/*[[${something}]]*/: any = {}; +>e : any +>{} : {} + diff --git a/tests/cases/compiler/emitOneLineVariableDeclarationRemoveCommentsFalse.ts b/tests/cases/compiler/emitOneLineVariableDeclarationRemoveCommentsFalse.ts new file mode 100644 index 0000000000000..5305e4f549883 --- /dev/null +++ b/tests/cases/compiler/emitOneLineVariableDeclarationRemoveCommentsFalse.ts @@ -0,0 +1,7 @@ +// @removeComments: false + +let a = /*[[${something}]]*/ {}; +let b: any = /*[[${something}]]*/ {}; +let c: { hoge: boolean } = /*[[${something}]]*/ { hoge: true }; +let d: any /*[[${something}]]*/ = {}; +let e/*[[${something}]]*/: any = {}; From d6784474ad600c0cc3b3fc99632d56bea0f9bf10 Mon Sep 17 00:00:00 2001 From: islandryu Date: Thu, 17 Feb 2022 18:36:41 +0900 Subject: [PATCH 2/9] Add internal to typeNode functions --- src/compiler/factory/emitNode.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/compiler/factory/emitNode.ts b/src/compiler/factory/emitNode.ts index 0445497f1dfb6..155e62892ca57 100644 --- a/src/compiler/factory/emitNode.ts +++ b/src/compiler/factory/emitNode.ts @@ -280,12 +280,14 @@ namespace ts { return node; } + /* @internal */ export function setTypeNode(node: T, type: TypeNode): T { const emitNode = getOrCreateEmitNode(node); emitNode.typeNode = type; return node; } + /* @internal */ export function getTypeNode(node: T): TypeNode | undefined { return node.emitNode?.typeNode; } From 648354fab5b2bac576aae4555013ca4547002eb9 Mon Sep 17 00:00:00 2001 From: islandryu <65934663+islandryu@users.noreply.github.com> Date: Thu, 17 Feb 2022 18:40:18 +0900 Subject: [PATCH 3/9] Update src/compiler/emitter.ts Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com> --- src/compiler/emitter.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 7af5b51450fe8..8608a250bed94 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3102,7 +3102,8 @@ namespace ts { emit(node.name); emit(node.exclamationToken); emitTypeAnnotation(node.type); - emitInitializer(node.initializer, node.type ? node.type.end : node.name.emitNode?.typeNode ? node.name.emitNode.typeNode.end : node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma); + emitInitializer(node.initializer, node.type?.end ?? node.name.emitNode?.typeNode?.end ?? node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma); + } function emitVariableDeclarationList(node: VariableDeclarationList) { From 2b7da30b7deb6fc630125bc90e58c9bb89dc5a76 Mon Sep 17 00:00:00 2001 From: islandryu <65934663+islandryu@users.noreply.github.com> Date: Thu, 17 Feb 2022 18:40:27 +0900 Subject: [PATCH 4/9] Update src/compiler/transformers/ts.ts Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com> --- src/compiler/transformers/ts.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 43ce89605c329..dae38ea4d44ed 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -2215,7 +2215,8 @@ namespace ts { /*exclamationToken*/ undefined, /*type*/ undefined, visitNode(node.initializer, visitor, isExpression)); - if(node.type){ + if (node.type){ + setTypeNode(updated.name, node.type); } return updated; From 37d61491a53c810f96119f338a9df86d2a21da50 Mon Sep 17 00:00:00 2001 From: islandryu <65934663+islandryu@users.noreply.github.com> Date: Sat, 19 Feb 2022 00:38:56 +0900 Subject: [PATCH 5/9] Update src/compiler/emitter.ts Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com> --- src/compiler/emitter.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 8608a250bed94..6b85e2d56b5ac 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -5327,7 +5327,8 @@ namespace ts { } emitTrailingCommentsOfNode(node, emitFlags, commentRange.pos, commentRange.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); const typeNode = getTypeNode(node); - if(typeNode){ + if (typeNode) { + emitTrailingCommentsOfNode(node, emitFlags, typeNode.pos, typeNode.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); } } From 5f47501a1093a7c2bbdf1847c5d4f5f715c9714a Mon Sep 17 00:00:00 2001 From: islandryu <65934663+islandryu@users.noreply.github.com> Date: Sat, 19 Feb 2022 00:39:03 +0900 Subject: [PATCH 6/9] Update src/compiler/transformers/ts.ts Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com> --- src/compiler/transformers/ts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index dae38ea4d44ed..2e5cfe06a4097 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -2215,7 +2215,7 @@ namespace ts { /*exclamationToken*/ undefined, /*type*/ undefined, visitNode(node.initializer, visitor, isExpression)); - if (node.type){ + if (node.type) { setTypeNode(updated.name, node.type); } From 6dafbef84ea9ec4142aeb547050e4d943d02bf6b Mon Sep 17 00:00:00 2001 From: islandryu <65934663+islandryu@users.noreply.github.com> Date: Mon, 21 Feb 2022 18:31:29 +0900 Subject: [PATCH 7/9] Update src/compiler/emitter.ts Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com> --- src/compiler/emitter.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 6b85e2d56b5ac..2f175eb1d2ef8 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -5328,7 +5328,6 @@ namespace ts { emitTrailingCommentsOfNode(node, emitFlags, commentRange.pos, commentRange.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); const typeNode = getTypeNode(node); if (typeNode) { - emitTrailingCommentsOfNode(node, emitFlags, typeNode.pos, typeNode.end, savedContainerPos, savedContainerEnd, savedDeclarationListContainerEnd); } } From 5b7c3797170096f56a82a49b4da487bf3cae61af Mon Sep 17 00:00:00 2001 From: islandryu <65934663+islandryu@users.noreply.github.com> Date: Mon, 21 Feb 2022 18:31:50 +0900 Subject: [PATCH 8/9] Update src/compiler/transformers/ts.ts Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com> --- src/compiler/transformers/ts.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 2e5cfe06a4097..ed1168f8c6ca9 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -2216,7 +2216,6 @@ namespace ts { /*type*/ undefined, visitNode(node.initializer, visitor, isExpression)); if (node.type) { - setTypeNode(updated.name, node.type); } return updated; From d922a4476133b8aff27eaa154e20d6b1a42081ae Mon Sep 17 00:00:00 2001 From: islandryu Date: Thu, 24 Feb 2022 00:54:59 +0900 Subject: [PATCH 9/9] baseline accept --- src/compiler/emitter.ts | 1 - tests/baselines/reference/api/tsserverlibrary.d.ts | 2 -- tests/baselines/reference/api/typescript.d.ts | 2 -- 3 files changed, 5 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 2f175eb1d2ef8..a8b372d6abfcf 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3103,7 +3103,6 @@ namespace ts { emit(node.exclamationToken); emitTypeAnnotation(node.type); emitInitializer(node.initializer, node.type?.end ?? node.name.emitNode?.typeNode?.end ?? node.name.end, node, parenthesizer.parenthesizeExpressionForDisallowedComma); - } function emitVariableDeclarationList(node: VariableDeclarationList) { diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 509fe8f5b1654..f822907cd1430 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -4525,8 +4525,6 @@ declare namespace ts { * Moves matching emit helpers from a source node to a target node. */ function moveEmitHelpers(source: Node, target: Node, predicate: (helper: EmitHelper) => boolean): void; - function setTypeNode(node: T, type: TypeNode): T; - function getTypeNode(node: T): TypeNode | undefined; } declare namespace ts { function isNumericLiteral(node: Node): node is NumericLiteral; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 3bcca1aa09ca0..0137fbeb78a75 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -4525,8 +4525,6 @@ declare namespace ts { * Moves matching emit helpers from a source node to a target node. */ function moveEmitHelpers(source: Node, target: Node, predicate: (helper: EmitHelper) => boolean): void; - function setTypeNode(node: T, type: TypeNode): T; - function getTypeNode(node: T): TypeNode | undefined; } declare namespace ts { function isNumericLiteral(node: Node): node is NumericLiteral;