From 40222d1a77a32ae412df8bda49f7ff20cfd8c3ba Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Mon, 16 Oct 2017 12:57:23 -0700 Subject: [PATCH] Fix for-in emit under systemjs (#19223) --- src/compiler/transformers/module/system.ts | 5 ++++- .../reference/systemJsForInNoException.js | 19 ++++++++++++++++++ .../systemJsForInNoException.symbols | 16 +++++++++++++++ .../reference/systemJsForInNoException.types | 20 +++++++++++++++++++ .../compiler/systemJsForInNoException.ts | 5 +++++ 5 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/systemJsForInNoException.js create mode 100644 tests/baselines/reference/systemJsForInNoException.symbols create mode 100644 tests/baselines/reference/systemJsForInNoException.types create mode 100644 tests/cases/compiler/systemJsForInNoException.ts diff --git a/src/compiler/transformers/module/system.ts b/src/compiler/transformers/module/system.ts index ed943eb90ce..d674546efb9 100644 --- a/src/compiler/transformers/module/system.ts +++ b/src/compiler/transformers/module/system.ts @@ -826,7 +826,7 @@ namespace ts { /*needsValue*/ false, createAssignment ) - : createAssignment(node.name, visitNode(node.initializer, destructuringAndImportCallVisitor, isExpression)); + : node.initializer ? createAssignment(node.name, visitNode(node.initializer, destructuringAndImportCallVisitor, isExpression)) : node.name; } /** @@ -1296,6 +1296,9 @@ namespace ts { let expressions: Expression[]; for (const variable of node.declarations) { expressions = append(expressions, transformInitializedVariable(variable, /*isExportedDeclaration*/ false)); + if (!variable.initializer) { + hoistBindingElement(variable); + } } return expressions ? inlineExpressions(expressions) : createOmittedExpression(); diff --git a/tests/baselines/reference/systemJsForInNoException.js b/tests/baselines/reference/systemJsForInNoException.js new file mode 100644 index 00000000000..2ac31e18416 --- /dev/null +++ b/tests/baselines/reference/systemJsForInNoException.js @@ -0,0 +1,19 @@ +//// [systemJsForInNoException.ts] +export const obj = { a: 1 }; +for (var key in obj) + console.log(obj[key]); + +//// [systemJsForInNoException.js] +System.register([], function (exports_1, context_1) { + "use strict"; + var __moduleName = context_1 && context_1.id; + var obj, key; + return { + setters: [], + execute: function () { + exports_1("obj", obj = { a: 1 }); + for (key in obj) + console.log(obj[key]); + } + }; +}); diff --git a/tests/baselines/reference/systemJsForInNoException.symbols b/tests/baselines/reference/systemJsForInNoException.symbols new file mode 100644 index 00000000000..4d4d2e0206c --- /dev/null +++ b/tests/baselines/reference/systemJsForInNoException.symbols @@ -0,0 +1,16 @@ +=== tests/cases/compiler/systemJsForInNoException.ts === +export const obj = { a: 1 }; +>obj : Symbol(obj, Decl(systemJsForInNoException.ts, 0, 12)) +>a : Symbol(a, Decl(systemJsForInNoException.ts, 0, 20)) + +for (var key in obj) +>key : Symbol(key, Decl(systemJsForInNoException.ts, 1, 8)) +>obj : Symbol(obj, Decl(systemJsForInNoException.ts, 0, 12)) + + console.log(obj[key]); +>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, --, --)) +>obj : Symbol(obj, Decl(systemJsForInNoException.ts, 0, 12)) +>key : Symbol(key, Decl(systemJsForInNoException.ts, 1, 8)) + diff --git a/tests/baselines/reference/systemJsForInNoException.types b/tests/baselines/reference/systemJsForInNoException.types new file mode 100644 index 00000000000..6d9dbbb6e7b --- /dev/null +++ b/tests/baselines/reference/systemJsForInNoException.types @@ -0,0 +1,20 @@ +=== tests/cases/compiler/systemJsForInNoException.ts === +export const obj = { a: 1 }; +>obj : { a: number; } +>{ a: 1 } : { a: number; } +>a : number +>1 : 1 + +for (var key in obj) +>key : string +>obj : { a: number; } + + console.log(obj[key]); +>console.log(obj[key]) : void +>console.log : (message?: any, ...optionalParams: any[]) => void +>console : Console +>log : (message?: any, ...optionalParams: any[]) => void +>obj[key] : any +>obj : { a: number; } +>key : string + diff --git a/tests/cases/compiler/systemJsForInNoException.ts b/tests/cases/compiler/systemJsForInNoException.ts new file mode 100644 index 00000000000..e35c3aa24a3 --- /dev/null +++ b/tests/cases/compiler/systemJsForInNoException.ts @@ -0,0 +1,5 @@ +// @module: system +// @lib: es6,dom +export const obj = { a: 1 }; +for (var key in obj) + console.log(obj[key]); \ No newline at end of file