From 1db769d566f81316372cadd6f7b872b1f2efed94 Mon Sep 17 00:00:00 2001 From: Wesley Wigham Date: Tue, 27 Mar 2018 15:16:56 -0700 Subject: [PATCH] Transform setter bodies if they contain es2015 (#22931) --- src/compiler/transformers/es2015.ts | 19 ++++++++---------- ...s5SetterparameterDestructuringNotElided.js | 16 +++++++++++++++ ...terparameterDestructuringNotElided.symbols | 17 ++++++++++++++++ ...etterparameterDestructuringNotElided.types | 20 +++++++++++++++++++ ...s5SetterparameterDestructuringNotElided.ts | 7 +++++++ 5 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 tests/baselines/reference/es5SetterparameterDestructuringNotElided.js create mode 100644 tests/baselines/reference/es5SetterparameterDestructuringNotElided.symbols create mode 100644 tests/baselines/reference/es5SetterparameterDestructuringNotElided.types create mode 100644 tests/cases/compiler/es5SetterparameterDestructuringNotElided.ts diff --git a/src/compiler/transformers/es2015.ts b/src/compiler/transformers/es2015.ts index 53b2152bd05..f9cb9ac87a8 100644 --- a/src/compiler/transformers/es2015.ts +++ b/src/compiler/transformers/es2015.ts @@ -1922,7 +1922,7 @@ namespace ts { return block; } - function visitFunctionBodyDownLevel(node: FunctionDeclaration | FunctionExpression) { + function visitFunctionBodyDownLevel(node: FunctionDeclaration | FunctionExpression | AccessorDeclaration) { const updated = visitFunctionBody(node.body, functionBodyVisitor, context); return updateBlock( updated, @@ -3196,18 +3196,15 @@ namespace ts { convertedLoopState = undefined; const ancestorFacts = enterSubtree(HierarchyFacts.FunctionExcludes, HierarchyFacts.FunctionIncludes); let updated: AccessorDeclaration; - if (node.transformFlags & TransformFlags.ContainsCapturedLexicalThis) { - const parameters = visitParameterList(node.parameters, visitor, context); - const body = transformFunctionBody(node); - if (node.kind === SyntaxKind.GetAccessor) { - updated = updateGetAccessor(node, node.decorators, node.modifiers, node.name, parameters, node.type, body); - } - else { - updated = updateSetAccessor(node, node.decorators, node.modifiers, node.name, parameters, body); - } + const parameters = visitParameterList(node.parameters, visitor, context); + const body = node.transformFlags & (TransformFlags.ContainsCapturedLexicalThis | TransformFlags.ContainsES2015) + ? transformFunctionBody(node) + : visitFunctionBodyDownLevel(node); + if (node.kind === SyntaxKind.GetAccessor) { + updated = updateGetAccessor(node, node.decorators, node.modifiers, node.name, parameters, node.type, body); } else { - updated = visitEachChild(node, visitor, context); + updated = updateSetAccessor(node, node.decorators, node.modifiers, node.name, parameters, body); } exitSubtree(ancestorFacts, HierarchyFacts.PropagateNewTargetMask, HierarchyFacts.None); convertedLoopState = savedConvertedLoopState; diff --git a/tests/baselines/reference/es5SetterparameterDestructuringNotElided.js b/tests/baselines/reference/es5SetterparameterDestructuringNotElided.js new file mode 100644 index 00000000000..4fcc7cc3888 --- /dev/null +++ b/tests/baselines/reference/es5SetterparameterDestructuringNotElided.js @@ -0,0 +1,16 @@ +//// [es5SetterparameterDestructuringNotElided.ts] +const foo = { + set foo([start, end]: [any, any]) { + void start; + void end; + }, +}; + +//// [es5SetterparameterDestructuringNotElided.js] +var foo = { + set foo(_a) { + var start = _a[0], end = _a[1]; + void start; + void end; + }, +}; diff --git a/tests/baselines/reference/es5SetterparameterDestructuringNotElided.symbols b/tests/baselines/reference/es5SetterparameterDestructuringNotElided.symbols new file mode 100644 index 00000000000..e5abe49aa03 --- /dev/null +++ b/tests/baselines/reference/es5SetterparameterDestructuringNotElided.symbols @@ -0,0 +1,17 @@ +=== tests/cases/compiler/es5SetterparameterDestructuringNotElided.ts === +const foo = { +>foo : Symbol(foo, Decl(es5SetterparameterDestructuringNotElided.ts, 0, 5)) + + set foo([start, end]: [any, any]) { +>foo : Symbol(foo, Decl(es5SetterparameterDestructuringNotElided.ts, 0, 13)) +>start : Symbol(start, Decl(es5SetterparameterDestructuringNotElided.ts, 1, 13)) +>end : Symbol(end, Decl(es5SetterparameterDestructuringNotElided.ts, 1, 19)) + + void start; +>start : Symbol(start, Decl(es5SetterparameterDestructuringNotElided.ts, 1, 13)) + + void end; +>end : Symbol(end, Decl(es5SetterparameterDestructuringNotElided.ts, 1, 19)) + + }, +}; diff --git a/tests/baselines/reference/es5SetterparameterDestructuringNotElided.types b/tests/baselines/reference/es5SetterparameterDestructuringNotElided.types new file mode 100644 index 00000000000..ae58debaebc --- /dev/null +++ b/tests/baselines/reference/es5SetterparameterDestructuringNotElided.types @@ -0,0 +1,20 @@ +=== tests/cases/compiler/es5SetterparameterDestructuringNotElided.ts === +const foo = { +>foo : { foo: [any, any]; } +>{ set foo([start, end]: [any, any]) { void start; void end; },} : { foo: [any, any]; } + + set foo([start, end]: [any, any]) { +>foo : [any, any] +>start : any +>end : any + + void start; +>void start : undefined +>start : any + + void end; +>void end : undefined +>end : any + + }, +}; diff --git a/tests/cases/compiler/es5SetterparameterDestructuringNotElided.ts b/tests/cases/compiler/es5SetterparameterDestructuringNotElided.ts new file mode 100644 index 00000000000..dd6587e9654 --- /dev/null +++ b/tests/cases/compiler/es5SetterparameterDestructuringNotElided.ts @@ -0,0 +1,7 @@ +// @target: es5 +const foo = { + set foo([start, end]: [any, any]) { + void start; + void end; + }, +}; \ No newline at end of file