Fix writing multi-line text without semicolons (#32903)

* Fix semicolon-omitting writer

* Use writeTrailingSemicolon for do statements
This commit is contained in:
Andrew Branch 2019-08-28 16:28:31 -07:00 committed by GitHub
parent ccf41ef803
commit cd371daf77
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 25 additions and 7 deletions

View File

@ -3522,7 +3522,7 @@ namespace ts {
const sig = nodeBuilder.signatureToSignatureDeclaration(signature, sigOutput, enclosingDeclaration, toNodeBuilderFlags(flags) | NodeBuilderFlags.IgnoreErrors | NodeBuilderFlags.WriteTypeParametersInQualifiedName);
const printer = createPrinter({ removeComments: true, omitTrailingSemicolon: true });
const sourceFile = enclosingDeclaration && getSourceFileOfNode(enclosingDeclaration);
printer.writeNode(EmitHint.Unspecified, sig!, /*sourceFile*/ sourceFile, getTrailingSemicolonOmittingWriter(writer)); // TODO: GH#18217
printer.writeNode(EmitHint.Unspecified, sig!, /*sourceFile*/ sourceFile, getTrailingSemicolonDeferringWriter(writer)); // TODO: GH#18217
return writer;
}
}

View File

@ -1053,7 +1053,7 @@ namespace ts {
function setWriter(_writer: EmitTextWriter | undefined, _sourceMapGenerator: SourceMapGenerator | undefined) {
if (_writer && printerOptions.omitTrailingSemicolon) {
_writer = getTrailingSemicolonOmittingWriter(_writer);
_writer = getTrailingSemicolonDeferringWriter(_writer);
}
writer = _writer!; // TODO: GH#18217
@ -2511,7 +2511,7 @@ namespace ts {
}
emitWhileClause(node, node.statement.end);
writePunctuation(";");
writeTrailingSemicolon();
}
function emitWhileStatement(node: WhileStatement) {

View File

@ -3374,7 +3374,11 @@ namespace ts {
};
}
export function getTrailingSemicolonOmittingWriter(writer: EmitTextWriter): EmitTextWriter {
export interface TrailingSemicolonDeferringWriter extends EmitTextWriter {
resetPendingTrailingSemicolon(): void;
}
export function getTrailingSemicolonDeferringWriter(writer: EmitTextWriter): TrailingSemicolonDeferringWriter {
let pendingTrailingSemicolon = false;
function commitPendingTrailingSemicolon() {
@ -3440,10 +3444,24 @@ namespace ts {
decreaseIndent() {
commitPendingTrailingSemicolon();
writer.decreaseIndent();
},
resetPendingTrailingSemicolon() {
pendingTrailingSemicolon = false;
}
};
}
export function getTrailingSemicolonOmittingWriter(writer: EmitTextWriter): EmitTextWriter {
const deferringWriter = getTrailingSemicolonDeferringWriter(writer);
return {
...deferringWriter,
writeLine() {
deferringWriter.resetPendingTrailingSemicolon();
writer.writeLine();
},
};
}
export function getResolvedExternalModuleName(host: EmitHost, file: SourceFile, referenceFile?: SourceFile): string {
return file.moduleName || getExternalModuleNameFromPath(host, file.fileName, referenceFile && referenceFile.fileName);
}

View File

@ -854,7 +854,7 @@ namespace ts.textChanges {
const omitTrailingSemicolon = !!sourceFile && !probablyUsesSemicolons(sourceFile);
const writer = createWriter(newLineCharacter, omitTrailingSemicolon);
const newLine = newLineCharacter === "\n" ? NewLineKind.LineFeed : NewLineKind.CarriageReturnLineFeed;
createPrinter({ newLine, neverAsciiEscape: true, omitTrailingSemicolon }, writer).writeNode(EmitHint.Unspecified, node, sourceFile, writer);
createPrinter({ newLine, neverAsciiEscape: true }, writer).writeNode(EmitHint.Unspecified, node, sourceFile, writer);
return { text: writer.getText(), node: assignPositionsToNode(node) };
}
}

View File

@ -15,7 +15,7 @@ verify.codeFix({
constructor() {
}
foo() {
({ bar: () => { } });
({ bar: () => { } })
}
}
`,

View File

@ -18,7 +18,7 @@ edit.applyRefactor({
q[0]++
function newFunction() {
return [0];
return [0]
}
}`
});