diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index c0b0d170de8..0cbb961e9f7 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -860,6 +860,7 @@ namespace ts { emitDecorators(node, node.decorators); emitModifiers(node, node.modifiers); emit(node.name); + writeIfPresent(node.questionToken, "?"); emitWithPrefix(": ", node.type); emitExpressionWithPrefix(" = ", node.initializer); write(";"); @@ -881,6 +882,7 @@ namespace ts { emitModifiers(node, node.modifiers); writeIfPresent(node.asteriskToken, "*"); emit(node.name); + writeIfPresent(node.questionToken, "?"); emitSignatureAndBody(node, emitSignatureHead); } diff --git a/src/harness/unittests/printer.ts b/src/harness/unittests/printer.ts index 0c6d4bfe8f7..aedaacbf76c 100644 --- a/src/harness/unittests/printer.ts +++ b/src/harness/unittests/printer.ts @@ -98,8 +98,40 @@ namespace ts { ) ]) ); + + // https://github.com/Microsoft/TypeScript/issues/15971 + const classWithOptionalMethodAndProperty = createClassDeclaration( + undefined, + /* modifiers */ createNodeArray([createToken(SyntaxKind.DeclareKeyword)]), + /* name */ createIdentifier("X"), + undefined, + undefined, + createNodeArray([ + createMethod( + undefined, + undefined, + undefined, + /* name */ createIdentifier("method"), + /* questionToken */ createToken(SyntaxKind.QuestionToken), + undefined, + undefined, + /* type */ createKeywordTypeNode(SyntaxKind.VoidKeyword), + undefined + ), + createProperty( + undefined, + undefined, + /* name */ createIdentifier("property"), + /* questionToken */ createToken(SyntaxKind.QuestionToken), + /* type */ createKeywordTypeNode(SyntaxKind.StringKeyword), + undefined + ), + ]) + ); + // tslint:enable boolean-trivia printsCorrectly("class", {}, printer => printer.printNode(EmitHint.Unspecified, syntheticNode, sourceFile)); + printsCorrectly("classWithOptionalMethodAndProperty", {}, printer => printer.printNode(EmitHint.Unspecified, classWithOptionalMethodAndProperty, sourceFile)); }); }); } diff --git a/tests/baselines/reference/printerApi/printsNodeCorrectly.classWithOptionalMethodAndProperty.js b/tests/baselines/reference/printerApi/printsNodeCorrectly.classWithOptionalMethodAndProperty.js new file mode 100644 index 00000000000..6626f2e35c9 --- /dev/null +++ b/tests/baselines/reference/printerApi/printsNodeCorrectly.classWithOptionalMethodAndProperty.js @@ -0,0 +1,4 @@ +declare class X { + method?(): void; + property?: string; +} \ No newline at end of file