TypeScript AST 转换删除所有空行

alj*_*sim 8 abstract-syntax-tree typescript visual-studio-code 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();
Run Code Online (Sandbox Code Playgroud)

Ser*_*-Tm 5

解决方法:

  • 用注释替换空行
  • 转变
  • 用空行替换注释

    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);
    
    Run Code Online (Sandbox Code Playgroud)


Mik*_*hke 1

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

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

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