Hvordan man genererer ekstra nye linjer mellem noder med Typescript compiler API-printeren
Når jeg genererer min Typescript-kode ved hjælp af compiler API'ens Printer, genereres min kode som følger:
namespace Something {
export function foo() {
...
}
export function bar() {
...
}
}
namespace SomethingElse {
export function baz() {
...
}
}
For læsbarhed vil jeg gerne generere ekstra tomme linjer mellem foo↔bar og Something↔SomethingElse. Er dette muligt ved at bruge TypeScript-kompilatorens API?
Svar #1
En alternativ løsning, der er så tæt som muligt på blot at indsætte en ny linje mellem AST-træknuder, er at misbruge createIdentifier-fabrikfunktionen en smule. Hvis man bruger compiler-API'en til i det væsentlige at pretty-printe AST-træer, kan dette være den bedste nuværende tilgængelige mulighed. Her er tricket:
ts.factory.createIdentifier("\n");
Så kan man indsætte identifikatoren (eller endda flere af dem) efter hver node, der skal adskilles, før man kalder Printer-metoderne.
Svar #2
Selvom jeg heller ikke kunne finde en officiel måde at indsætte rene linjeskift eller mellemrumstrivia på, løste jeg problemet for mig ved at indsætte enkeltlinjekommentarer, som derefter tillader at tilføje afsluttende linjeskift:
ts.addSyntheticTrailingComment(oldNode, ts.SyntaxKind.SingleLineCommentTrivia, '', true /*trailing newline*/)
ts.addSyntheticLeadingComment(oldNode, ts.SyntaxKind.SingleLineCommentTrivia, '', true /*trailing newline*/)
Bemærk, at dette faktisk også vil generere en enkelt linje kommentar, hvilket måske ikke er ønsket i alle scenarier. Til brugssituationer, hvor du bare vil have den genererede kode lidt mere læsbar, fungerer de efterfølgende kommentarer godt.
