TypeScript AST转换删除所有空白行

时间:2018-07-16 02:53:00

标签: typescript abstract-syntax-tree vscode-extensions

我写了一个VS Code扩展,它使用TypeScrpt AST API来组织类成员。我的问题是,在运行ts.transform(...)并将转换后的语法树转换回文本之后,所有空行都丢失了,从而导致生成的源代码格式错误。如何防止AST API删除空白行?

我正在使用的代码示例:

let sourceFile: ts.SourceFile;
let sourceCode: string;

sourceCode = editor.document.getText();
sourceFile = ts.createSourceFile(editor.document.fileName, sourceCode, ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);
  transformation = ts.transform(sourceFile, [organizeTransformer]);
  sourceCode = transformation.transformed[0].getFullText();

2 个答案:

答案 0 :(得分:1)

解析器不是用于代码格式化的最佳工具:

  • 它要求输入内容无错误。
  • 它通常跳过空格和注释,因为它们与解析无关。
  • AST /解析树以最适合语言处理而不是代码生成的最适合的方式表示输入结构。

实际上,漂亮的打印根本不需要解析。它是源到源转换的源头,而所需的只是一个词法分析器,用于识别各种类型的输入元素(因为它们与格式相关,尤其是空格和注释)。您可以在my vscode extension vscode-antlr4中看到一种实现代码格式化程序的方法。原理很简单:为列表中的每个非空白元素(包括注释)收集源位置(而非源文本)。也添加格式空格。然后通过将原始文本复制到输出中,从该列表中生成新文本。这样就避免了引号,数字基数,注释类型等麻烦,解析器可能会对其进行转换,以使其易于处理,但不一定代表原始格式。

答案 1 :(得分:0)

解决方法:

  • 用评论替换空行
  • 转换
  • 用空行替换注释

    import {decodeEmptyLines, encodeEmptyLines} from 'ts-empty-line-encoder';
    
    let sourceCode = editor.document.getText();
    //encode empty lines
    sourceCode = encodeEmptyLines(sourceCode);
    const sourceFile = ts.createSourceFile(editor.document.fileName, sourceCode, ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);
    const transformation = ts.transform(sourceFile, [organizeTransformer]);
    sourceCode = transformation.transformed[0].getFullText();
    //decode empty lines
    sourceCode = decodeEmptyLines(sourceCode);