Skip to content

Commit 2c03633

Browse files
committed
Fix emit for accessors with missing bodies
1 parent 25998ae commit 2c03633

2 files changed

Lines changed: 16 additions & 5 deletions

File tree

src/compiler/binder.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2108,7 +2108,8 @@ namespace ts {
21082108

21092109
// A GetAccessor or SetAccessor is TypeScript syntax if it is either abstract,
21102110
// or has both a computed property name and a decorator.
2111-
if (hasModifier(node, ModifierFlags.Abstract)
2111+
if ((<AccessorDeclaration>node).body === undefined
2112+
|| hasModifier(node, ModifierFlags.Abstract)
21122113
|| (subtreeFlags & TransformFlags.ContainsDecorators
21132114
&& subtreeFlags & TransformFlags.ContainsComputedPropertyName)) {
21142115
transformFlags = TransformFlags.AssertTypeScript;

src/compiler/transformers/ts.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1810,18 +1810,28 @@ namespace ts {
18101810
* @param node The get accessor node.
18111811
*/
18121812
function visitGetAccessor(node: GetAccessorDeclaration) {
1813-
if (shouldElideFunctionLikeDeclaration(node)) {
1813+
if (shouldElideAccessorDeclaration(node)) {
18141814
return undefined;
18151815
}
18161816

18171817
return createGetAccessor(
18181818
visitNodes(node.modifiers, visitor, isModifier),
18191819
visitPropertyNameOfClassElement(node),
1820-
visitEachChild(node.body, visitor, context),
1820+
node.body ? visitEachChild(node.body, visitor, context) : createBlock([]),
18211821
node
18221822
);
18231823
}
18241824

1825+
/**
1826+
* Determines whether a function-like declaration should be elided. A declaration should
1827+
* be elided if it is an overload, is abstract, or is an ambient declaration.
1828+
*
1829+
* @param node The declaration node.
1830+
*/
1831+
function shouldElideAccessorDeclaration(node: AccessorDeclaration) {
1832+
return hasModifier(node, ModifierFlags.Abstract | ModifierFlags.Ambient);
1833+
}
1834+
18251835
/**
18261836
* Visits a set accessor declaration of a class.
18271837
*
@@ -1832,15 +1842,15 @@ namespace ts {
18321842
* @param node The set accessor node.
18331843
*/
18341844
function visitSetAccessor(node: SetAccessorDeclaration) {
1835-
if (shouldElideFunctionLikeDeclaration(node)) {
1845+
if (shouldElideAccessorDeclaration(node)) {
18361846
return undefined;
18371847
}
18381848

18391849
return createSetAccessor(
18401850
visitNodes(node.modifiers, visitor, isModifier),
18411851
visitPropertyNameOfClassElement(node),
18421852
visitNode(firstOrUndefined(node.parameters), visitor, isParameter),
1843-
visitEachChild(node.body, visitor, context),
1853+
node.body ? visitEachChild(node.body, visitor, context) : createBlock([]),
18441854
node
18451855
);
18461856
}

0 commit comments

Comments
 (0)