From 2c03633edaf36c81bb2cb5da5f325fceab5cc9c5 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Mon, 21 Mar 2016 15:58:28 -0700 Subject: [PATCH] Fix emit for accessors with missing bodies --- src/compiler/binder.ts | 3 ++- src/compiler/transformers/ts.ts | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 79340afad86..b9ee80eb4c0 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2108,7 +2108,8 @@ namespace ts { // A GetAccessor or SetAccessor is TypeScript syntax if it is either abstract, // or has both a computed property name and a decorator. - if (hasModifier(node, ModifierFlags.Abstract) + if ((node).body === undefined + || hasModifier(node, ModifierFlags.Abstract) || (subtreeFlags & TransformFlags.ContainsDecorators && subtreeFlags & TransformFlags.ContainsComputedPropertyName)) { transformFlags = TransformFlags.AssertTypeScript; diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index a595534f0b4..a8619495f11 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -1810,18 +1810,28 @@ namespace ts { * @param node The get accessor node. */ function visitGetAccessor(node: GetAccessorDeclaration) { - if (shouldElideFunctionLikeDeclaration(node)) { + if (shouldElideAccessorDeclaration(node)) { return undefined; } return createGetAccessor( visitNodes(node.modifiers, visitor, isModifier), visitPropertyNameOfClassElement(node), - visitEachChild(node.body, visitor, context), + node.body ? visitEachChild(node.body, visitor, context) : createBlock([]), node ); } + /** + * Determines whether a function-like declaration should be elided. A declaration should + * be elided if it is an overload, is abstract, or is an ambient declaration. + * + * @param node The declaration node. + */ + function shouldElideAccessorDeclaration(node: AccessorDeclaration) { + return hasModifier(node, ModifierFlags.Abstract | ModifierFlags.Ambient); + } + /** * Visits a set accessor declaration of a class. * @@ -1832,7 +1842,7 @@ namespace ts { * @param node The set accessor node. */ function visitSetAccessor(node: SetAccessorDeclaration) { - if (shouldElideFunctionLikeDeclaration(node)) { + if (shouldElideAccessorDeclaration(node)) { return undefined; } @@ -1840,7 +1850,7 @@ namespace ts { visitNodes(node.modifiers, visitor, isModifier), visitPropertyNameOfClassElement(node), visitNode(firstOrUndefined(node.parameters), visitor, isParameter), - visitEachChild(node.body, visitor, context), + node.body ? visitEachChild(node.body, visitor, context) : createBlock([]), node ); }