Fix visitLexicalEnvironment to properly merge hoisted declarations

This commit is contained in:
Ron Buckton
2019-09-03 14:02:04 -07:00
parent f41472b427
commit ffc82db6fc
5 changed files with 18 additions and 14 deletions
+2 -5
View File
@@ -141,11 +141,8 @@ namespace ts {
export function visitLexicalEnvironment(statements: NodeArray<Statement>, visitor: Visitor, context: TransformationContext, start?: number, ensureUseStrict?: boolean) {
context.startLexicalEnvironment();
statements = visitNodes(statements, visitor, isStatement, start);
if (ensureUseStrict && !startsWithUseStrict(statements)) {
statements = setTextRange(createNodeArray([createExpressionStatement(createLiteral("use strict")), ...statements]), statements);
}
const declarations = context.endLexicalEnvironment();
return setTextRange(createNodeArray(concatenate(declarations, statements)), statements);
if (ensureUseStrict) statements = ts.ensureUseStrict(statements); // tslint:disable-line no-unnecessary-qualifier
return mergeLexicalEnvironment(statements, context.endLexicalEnvironment());
}
/**
@@ -1,5 +1,6 @@
//// [instanceMemberWithComputedPropertyName.ts]
// https://github.com/microsoft/TypeScript/issues/30953
"use strict";
const x = 1;
class C {
[x] = true;
@@ -9,8 +10,9 @@ class C {
}
//// [instanceMemberWithComputedPropertyName.js]
var _a;
// https://github.com/microsoft/TypeScript/issues/30953
"use strict";
var _a;
var x = 1;
var C = /** @class */ (function () {
function C() {
@@ -1,20 +1,21 @@
=== tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName.ts ===
// https://github.com/microsoft/TypeScript/issues/30953
"use strict";
const x = 1;
>x : Symbol(x, Decl(instanceMemberWithComputedPropertyName.ts, 1, 5))
>x : Symbol(x, Decl(instanceMemberWithComputedPropertyName.ts, 2, 5))
class C {
>C : Symbol(C, Decl(instanceMemberWithComputedPropertyName.ts, 1, 12))
>C : Symbol(C, Decl(instanceMemberWithComputedPropertyName.ts, 2, 12))
[x] = true;
>[x] : Symbol(C[x], Decl(instanceMemberWithComputedPropertyName.ts, 2, 9))
>x : Symbol(x, Decl(instanceMemberWithComputedPropertyName.ts, 1, 5))
>[x] : Symbol(C[x], Decl(instanceMemberWithComputedPropertyName.ts, 3, 9))
>x : Symbol(x, Decl(instanceMemberWithComputedPropertyName.ts, 2, 5))
constructor() {
const { a, b } = { a: 1, b: 2 };
>a : Symbol(a, Decl(instanceMemberWithComputedPropertyName.ts, 5, 15))
>b : Symbol(b, Decl(instanceMemberWithComputedPropertyName.ts, 5, 18))
>a : Symbol(a, Decl(instanceMemberWithComputedPropertyName.ts, 5, 26))
>b : Symbol(b, Decl(instanceMemberWithComputedPropertyName.ts, 5, 32))
>a : Symbol(a, Decl(instanceMemberWithComputedPropertyName.ts, 6, 15))
>b : Symbol(b, Decl(instanceMemberWithComputedPropertyName.ts, 6, 18))
>a : Symbol(a, Decl(instanceMemberWithComputedPropertyName.ts, 6, 26))
>b : Symbol(b, Decl(instanceMemberWithComputedPropertyName.ts, 6, 32))
}
}
@@ -1,5 +1,8 @@
=== tests/cases/conformance/classes/propertyMemberDeclarations/instanceMemberWithComputedPropertyName.ts ===
// https://github.com/microsoft/TypeScript/issues/30953
"use strict";
>"use strict" : "use strict"
const x = 1;
>x : 1
>1 : 1
@@ -1,4 +1,5 @@
// https://github.com/microsoft/TypeScript/issues/30953
"use strict";
const x = 1;
class C {
[x] = true;