diff --git a/src/compiler/transformers/es2015.ts b/src/compiler/transformers/es2015.ts index 5b29d34da9387..0dee5c1497ed3 100644 --- a/src/compiler/transformers/es2015.ts +++ b/src/compiler/transformers/es2015.ts @@ -2777,7 +2777,7 @@ export function transformES2015(context: TransformationContext): (x: SourceFile * * @param node A VariableDeclarationList node. */ - function visitVariableDeclarationList(node: VariableDeclarationList): VariableDeclarationList { + function visitVariableDeclarationList(node: VariableDeclarationList): VariableDeclarationList | undefined { if (node.flags & NodeFlags.BlockScoped || node.transformFlags & TransformFlags.ContainsBindingPattern) { if (node.flags & NodeFlags.BlockScoped) { enableSubstitutionsForBlockScopedBindings(); @@ -2791,6 +2791,10 @@ export function transformES2015(context: TransformationContext): (x: SourceFile isVariableDeclaration, ); + if (!declarations.length) { + return; + } + const declarationList = factory.createVariableDeclarationList(declarations); setOriginalNode(declarationList, node); setTextRange(declarationList, node); diff --git a/src/compiler/visitorPublic.ts b/src/compiler/visitorPublic.ts index f3e71e026d9be..665fdd4ba191a 100644 --- a/src/compiler/visitorPublic.ts +++ b/src/compiler/visitorPublic.ts @@ -604,7 +604,7 @@ export function visitEachChild(node: T | undefined, visitor: Vis return fn === undefined ? node : fn(node, visitor, context, nodesVisitor, nodeVisitor, tokenVisitor); } -type VisitEachChildFunction = (node: T, visitor: Visitor, context: TransformationContext, nodesVisitor: NodesVisitor, nodeVisitor: NodeVisitor, tokenVisitor: Visitor | undefined) => T; +type VisitEachChildFunction = (node: T, visitor: Visitor, context: TransformationContext, nodesVisitor: NodesVisitor, nodeVisitor: NodeVisitor, tokenVisitor: Visitor | undefined) => T | undefined; // A type that correlates a `SyntaxKind` to a `VisitEachChildFunction`, for nodes in the `HasChildren` union. // This looks something like: @@ -1280,10 +1280,14 @@ const visitEachChildTable: VisitEachChildTable = { }, [SyntaxKind.VariableStatement]: function visitEachChildOfVariableStatement(node, visitor, context, nodesVisitor, nodeVisitor, _tokenVisitor) { + const declarationList = nodeVisitor(node.declarationList, visitor, isVariableDeclarationList); + if (!declarationList) { + return; + } return context.factory.updateVariableStatement( node, nodesVisitor(node.modifiers, visitor, isModifierLike), - Debug.checkDefined(nodeVisitor(node.declarationList, visitor, isVariableDeclarationList)), + declarationList, ); }, diff --git a/tests/baselines/reference/NonInitializedExportInInternalModule.js b/tests/baselines/reference/NonInitializedExportInInternalModule.js index 0e4bd13bfb8ea..e7145c0c792f1 100644 --- a/tests/baselines/reference/NonInitializedExportInInternalModule.js +++ b/tests/baselines/reference/NonInitializedExportInInternalModule.js @@ -41,7 +41,6 @@ var Inner; (function (Inner) { var ; let; - var ; var A = /** @class */ (function () { function A() { } diff --git a/tests/baselines/reference/downlevelLetConst1.js b/tests/baselines/reference/downlevelLetConst1.js index b363965f30b4b..ab1d0f9a0c1ee 100644 --- a/tests/baselines/reference/downlevelLetConst1.js +++ b/tests/baselines/reference/downlevelLetConst1.js @@ -4,4 +4,3 @@ const //// [downlevelLetConst1.js] -var ; diff --git a/tests/baselines/reference/emptyArrayBindingPattern01.js b/tests/baselines/reference/emptyArrayBindingPattern01.js new file mode 100644 index 0000000000000..247059f89f0a7 --- /dev/null +++ b/tests/baselines/reference/emptyArrayBindingPattern01.js @@ -0,0 +1,35 @@ +//// [tests/cases/conformance/es6/destructuring/emptyArrayBindingPattern01.ts] //// + +//// [emptyArrayBindingPattern01.ts] +export const cilBlurLinear1: string[][] = [[]]; +const [,] = cilBlurLinear1; + +export const cilBlurLinear2: string[][] = [[]]; +let [,] = cilBlurLinear2; + +export const cilBlurLinear3: string[][] = [[]]; +var [,] = cilBlurLinear3; + +export const cilBlurLinear4: string[][] = [[]]; +const [[]] = cilBlurLinear4; + +export const cilBlurLinear5: string[][] = [[]]; +let [[]] = cilBlurLinear5; + +export const cilBlurLinear6: string[][] = [[]]; +var [[]] = cilBlurLinear6; + + +//// [emptyArrayBindingPattern01.js] +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.cilBlurLinear6 = exports.cilBlurLinear5 = exports.cilBlurLinear4 = exports.cilBlurLinear3 = exports.cilBlurLinear2 = exports.cilBlurLinear1 = void 0; +exports.cilBlurLinear1 = [[]]; +exports.cilBlurLinear2 = [[]]; +exports.cilBlurLinear3 = [[]]; +exports.cilBlurLinear4 = [[]]; +var _a = exports.cilBlurLinear4[0]; +exports.cilBlurLinear5 = [[]]; +var _b = exports.cilBlurLinear5[0]; +exports.cilBlurLinear6 = [[]]; +var _c = exports.cilBlurLinear6[0]; diff --git a/tests/baselines/reference/emptyArrayBindingPattern01.symbols b/tests/baselines/reference/emptyArrayBindingPattern01.symbols new file mode 100644 index 0000000000000..d6a32b78b75e0 --- /dev/null +++ b/tests/baselines/reference/emptyArrayBindingPattern01.symbols @@ -0,0 +1,39 @@ +//// [tests/cases/conformance/es6/destructuring/emptyArrayBindingPattern01.ts] //// + +=== emptyArrayBindingPattern01.ts === +export const cilBlurLinear1: string[][] = [[]]; +>cilBlurLinear1 : Symbol(cilBlurLinear1, Decl(emptyArrayBindingPattern01.ts, 0, 12)) + +const [,] = cilBlurLinear1; +>cilBlurLinear1 : Symbol(cilBlurLinear1, Decl(emptyArrayBindingPattern01.ts, 0, 12)) + +export const cilBlurLinear2: string[][] = [[]]; +>cilBlurLinear2 : Symbol(cilBlurLinear2, Decl(emptyArrayBindingPattern01.ts, 3, 12)) + +let [,] = cilBlurLinear2; +>cilBlurLinear2 : Symbol(cilBlurLinear2, Decl(emptyArrayBindingPattern01.ts, 3, 12)) + +export const cilBlurLinear3: string[][] = [[]]; +>cilBlurLinear3 : Symbol(cilBlurLinear3, Decl(emptyArrayBindingPattern01.ts, 6, 12)) + +var [,] = cilBlurLinear3; +>cilBlurLinear3 : Symbol(cilBlurLinear3, Decl(emptyArrayBindingPattern01.ts, 6, 12)) + +export const cilBlurLinear4: string[][] = [[]]; +>cilBlurLinear4 : Symbol(cilBlurLinear4, Decl(emptyArrayBindingPattern01.ts, 9, 12)) + +const [[]] = cilBlurLinear4; +>cilBlurLinear4 : Symbol(cilBlurLinear4, Decl(emptyArrayBindingPattern01.ts, 9, 12)) + +export const cilBlurLinear5: string[][] = [[]]; +>cilBlurLinear5 : Symbol(cilBlurLinear5, Decl(emptyArrayBindingPattern01.ts, 12, 12)) + +let [[]] = cilBlurLinear5; +>cilBlurLinear5 : Symbol(cilBlurLinear5, Decl(emptyArrayBindingPattern01.ts, 12, 12)) + +export const cilBlurLinear6: string[][] = [[]]; +>cilBlurLinear6 : Symbol(cilBlurLinear6, Decl(emptyArrayBindingPattern01.ts, 15, 12)) + +var [[]] = cilBlurLinear6; +>cilBlurLinear6 : Symbol(cilBlurLinear6, Decl(emptyArrayBindingPattern01.ts, 15, 12)) + diff --git a/tests/baselines/reference/emptyArrayBindingPattern01.types b/tests/baselines/reference/emptyArrayBindingPattern01.types new file mode 100644 index 0000000000000..23ba88275feea --- /dev/null +++ b/tests/baselines/reference/emptyArrayBindingPattern01.types @@ -0,0 +1,81 @@ +//// [tests/cases/conformance/es6/destructuring/emptyArrayBindingPattern01.ts] //// + +=== emptyArrayBindingPattern01.ts === +export const cilBlurLinear1: string[][] = [[]]; +>cilBlurLinear1 : string[][] +> : ^^^^^^^^^^ +>[[]] : undefined[][] +> : ^^^^^^^^^^^^^ +>[] : undefined[] +> : ^^^^^^^^^^^ + +const [,] = cilBlurLinear1; +> : undefined +> : ^^^^^^^^^ +>cilBlurLinear1 : string[][] +> : ^^^^^^^^^^ + +export const cilBlurLinear2: string[][] = [[]]; +>cilBlurLinear2 : string[][] +> : ^^^^^^^^^^ +>[[]] : undefined[][] +> : ^^^^^^^^^^^^^ +>[] : undefined[] +> : ^^^^^^^^^^^ + +let [,] = cilBlurLinear2; +> : undefined +> : ^^^^^^^^^ +>cilBlurLinear2 : string[][] +> : ^^^^^^^^^^ + +export const cilBlurLinear3: string[][] = [[]]; +>cilBlurLinear3 : string[][] +> : ^^^^^^^^^^ +>[[]] : undefined[][] +> : ^^^^^^^^^^^^^ +>[] : undefined[] +> : ^^^^^^^^^^^ + +var [,] = cilBlurLinear3; +> : undefined +> : ^^^^^^^^^ +>cilBlurLinear3 : string[][] +> : ^^^^^^^^^^ + +export const cilBlurLinear4: string[][] = [[]]; +>cilBlurLinear4 : string[][] +> : ^^^^^^^^^^ +>[[]] : undefined[][] +> : ^^^^^^^^^^^^^ +>[] : undefined[] +> : ^^^^^^^^^^^ + +const [[]] = cilBlurLinear4; +>cilBlurLinear4 : string[][] +> : ^^^^^^^^^^ + +export const cilBlurLinear5: string[][] = [[]]; +>cilBlurLinear5 : string[][] +> : ^^^^^^^^^^ +>[[]] : undefined[][] +> : ^^^^^^^^^^^^^ +>[] : undefined[] +> : ^^^^^^^^^^^ + +let [[]] = cilBlurLinear5; +>cilBlurLinear5 : string[][] +> : ^^^^^^^^^^ + +export const cilBlurLinear6: string[][] = [[]]; +>cilBlurLinear6 : string[][] +> : ^^^^^^^^^^ +>[[]] : undefined[][] +> : ^^^^^^^^^^^^^ +>[] : undefined[] +> : ^^^^^^^^^^^ + +var [[]] = cilBlurLinear6; +>cilBlurLinear6 : string[][] +> : ^^^^^^^^^^ + diff --git a/tests/baselines/reference/exportNonInitializedVariablesAMD.js b/tests/baselines/reference/exportNonInitializedVariablesAMD.js index 946fb84f34f07..a651457431f93 100644 --- a/tests/baselines/reference/exportNonInitializedVariablesAMD.js +++ b/tests/baselines/reference/exportNonInitializedVariablesAMD.js @@ -42,7 +42,6 @@ define(["require", "exports"], function (require, exports) { exports.h1 = exports.g1 = exports.f1 = exports.e1 = exports.d1 = exports.c1 = exports.b1 = exports.a1 = exports.f = exports.e = exports.d = exports.c = exports.b = exports.a = void 0; var ; let; - var ; var A = /** @class */ (function () { function A() { } diff --git a/tests/baselines/reference/exportNonInitializedVariablesCommonJS.js b/tests/baselines/reference/exportNonInitializedVariablesCommonJS.js index 58d02ba7b9316..ffaf22f3d10c4 100644 --- a/tests/baselines/reference/exportNonInitializedVariablesCommonJS.js +++ b/tests/baselines/reference/exportNonInitializedVariablesCommonJS.js @@ -41,7 +41,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.h1 = exports.g1 = exports.f1 = exports.e1 = exports.d1 = exports.c1 = exports.b1 = exports.a1 = exports.f = exports.e = exports.d = exports.c = exports.b = exports.a = void 0; var ; let; -var ; var A = /** @class */ (function () { function A() { } diff --git a/tests/baselines/reference/exportNonInitializedVariablesUMD.js b/tests/baselines/reference/exportNonInitializedVariablesUMD.js index c711aba2b3e35..3b8c33c53ac76 100644 --- a/tests/baselines/reference/exportNonInitializedVariablesUMD.js +++ b/tests/baselines/reference/exportNonInitializedVariablesUMD.js @@ -50,7 +50,6 @@ export let h1: D = new D; exports.h1 = exports.g1 = exports.f1 = exports.e1 = exports.d1 = exports.c1 = exports.b1 = exports.a1 = exports.f = exports.e = exports.d = exports.c = exports.b = exports.a = void 0; var ; let; - var ; var A = /** @class */ (function () { function A() { } diff --git a/tests/cases/conformance/es6/destructuring/emptyArrayBindingPattern01.ts b/tests/cases/conformance/es6/destructuring/emptyArrayBindingPattern01.ts new file mode 100644 index 0000000000000..9359e89c26718 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/emptyArrayBindingPattern01.ts @@ -0,0 +1,20 @@ +// @module: commonjs +// @target: es5 + +export const cilBlurLinear1: string[][] = [[]]; +const [,] = cilBlurLinear1; + +export const cilBlurLinear2: string[][] = [[]]; +let [,] = cilBlurLinear2; + +export const cilBlurLinear3: string[][] = [[]]; +var [,] = cilBlurLinear3; + +export const cilBlurLinear4: string[][] = [[]]; +const [[]] = cilBlurLinear4; + +export const cilBlurLinear5: string[][] = [[]]; +let [[]] = cilBlurLinear5; + +export const cilBlurLinear6: string[][] = [[]]; +var [[]] = cilBlurLinear6;