Skip to content

Commit cd371da

Browse files
authoredAug 28, 2019
Fix writing multi-line text without semicolons (#32903)
* Fix semicolon-omitting writer * Use writeTrailingSemicolon for do statements
1 parent ccf41ef commit cd371da

File tree

6 files changed

+25
-7
lines changed

6 files changed

+25
-7
lines changed
 

‎src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3522,7 +3522,7 @@ namespace ts {
35223522
const sig = nodeBuilder.signatureToSignatureDeclaration(signature, sigOutput, enclosingDeclaration, toNodeBuilderFlags(flags) | NodeBuilderFlags.IgnoreErrors | NodeBuilderFlags.WriteTypeParametersInQualifiedName);
35233523
const printer = createPrinter({ removeComments: true, omitTrailingSemicolon: true });
35243524
const sourceFile = enclosingDeclaration && getSourceFileOfNode(enclosingDeclaration);
3525-
printer.writeNode(EmitHint.Unspecified, sig!, /*sourceFile*/ sourceFile, getTrailingSemicolonOmittingWriter(writer)); // TODO: GH#18217
3525+
printer.writeNode(EmitHint.Unspecified, sig!, /*sourceFile*/ sourceFile, getTrailingSemicolonDeferringWriter(writer)); // TODO: GH#18217
35263526
return writer;
35273527
}
35283528
}

‎src/compiler/emitter.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,7 @@ namespace ts {
10531053

10541054
function setWriter(_writer: EmitTextWriter | undefined, _sourceMapGenerator: SourceMapGenerator | undefined) {
10551055
if (_writer && printerOptions.omitTrailingSemicolon) {
1056-
_writer = getTrailingSemicolonOmittingWriter(_writer);
1056+
_writer = getTrailingSemicolonDeferringWriter(_writer);
10571057
}
10581058

10591059
writer = _writer!; // TODO: GH#18217
@@ -2511,7 +2511,7 @@ namespace ts {
25112511
}
25122512

25132513
emitWhileClause(node, node.statement.end);
2514-
writePunctuation(";");
2514+
writeTrailingSemicolon();
25152515
}
25162516

25172517
function emitWhileStatement(node: WhileStatement) {

‎src/compiler/utilities.ts

+19-1
Original file line numberDiff line numberDiff line change
@@ -3374,7 +3374,11 @@ namespace ts {
33743374
};
33753375
}
33763376

3377-
export function getTrailingSemicolonOmittingWriter(writer: EmitTextWriter): EmitTextWriter {
3377+
export interface TrailingSemicolonDeferringWriter extends EmitTextWriter {
3378+
resetPendingTrailingSemicolon(): void;
3379+
}
3380+
3381+
export function getTrailingSemicolonDeferringWriter(writer: EmitTextWriter): TrailingSemicolonDeferringWriter {
33783382
let pendingTrailingSemicolon = false;
33793383

33803384
function commitPendingTrailingSemicolon() {
@@ -3440,10 +3444,24 @@ namespace ts {
34403444
decreaseIndent() {
34413445
commitPendingTrailingSemicolon();
34423446
writer.decreaseIndent();
3447+
},
3448+
resetPendingTrailingSemicolon() {
3449+
pendingTrailingSemicolon = false;
34433450
}
34443451
};
34453452
}
34463453

3454+
export function getTrailingSemicolonOmittingWriter(writer: EmitTextWriter): EmitTextWriter {
3455+
const deferringWriter = getTrailingSemicolonDeferringWriter(writer);
3456+
return {
3457+
...deferringWriter,
3458+
writeLine() {
3459+
deferringWriter.resetPendingTrailingSemicolon();
3460+
writer.writeLine();
3461+
},
3462+
};
3463+
}
3464+
34473465
export function getResolvedExternalModuleName(host: EmitHost, file: SourceFile, referenceFile?: SourceFile): string {
34483466
return file.moduleName || getExternalModuleNameFromPath(host, file.fileName, referenceFile && referenceFile.fileName);
34493467
}

‎src/services/textChanges.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ namespace ts.textChanges {
854854
const omitTrailingSemicolon = !!sourceFile && !probablyUsesSemicolons(sourceFile);
855855
const writer = createWriter(newLineCharacter, omitTrailingSemicolon);
856856
const newLine = newLineCharacter === "\n" ? NewLineKind.LineFeed : NewLineKind.CarriageReturnLineFeed;
857-
createPrinter({ newLine, neverAsciiEscape: true, omitTrailingSemicolon }, writer).writeNode(EmitHint.Unspecified, node, sourceFile, writer);
857+
createPrinter({ newLine, neverAsciiEscape: true }, writer).writeNode(EmitHint.Unspecified, node, sourceFile, writer);
858858
return { text: writer.getText(), node: assignPositionsToNode(node) };
859859
}
860860
}

‎tests/cases/fourslash/convertFunctionToEs6Class_objectLiteralInArrowFunction.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ verify.codeFix({
1515
constructor() {
1616
}
1717
foo() {
18-
({ bar: () => { } });
18+
({ bar: () => { } })
1919
}
2020
}
2121
`,

‎tests/cases/fourslash/extract-method25.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ edit.applyRefactor({
1818
q[0]++
1919
2020
function newFunction() {
21-
return [0];
21+
return [0]
2222
}
2323
}`
2424
});

0 commit comments

Comments
 (0)