漂亮的印刷和词法保存
您可以将JavaParser用于不同的目的。
最常见的两个是代码生成和代码转换。
在这两种情况下,您最终都将生成Java代码,可能将其存储在扩展名为.java的文件中。
在 CompilationUnit 上对 toString() 的简单调用将返回一个字符串,可用于编写源代码。
我们面临的问题是:它将如何格式化AST中的代码?
答案是两种方式之一:
使用漂亮的印刷
使用词法保留打印
什么是漂亮印刷?
漂亮的打印意味着当我们将代码作为源代码写出时,文本表示将以格式正确,标准的方式打印。
例如,如果要解析一个现有的java类,如下所示:
class A { int
a;}
然后,您决定使用JavaParser对它进行漂亮的打印,您将获得以下代码表示形式:
class A {
int a;
}
什么是词法保留打印?
保留词汇的印刷是指保持原始布局的印刷。
当我们编写代码时,有一些信息对于编译器而言并不是严格意义上的,但对人类而言却很重要。
即空格和注释的位置。
如果您解析了一些代码,然后以保留词法的打印方式将其打印回来,您将获得与解析后相同的代码。
如果解析某些代码,对其进行修改,然后使用lexicalpreserving打印将其打印回去,您将获得与原始代码非常接近的代码,并且更改仅限于已明确更改的节点。
即使在以编程方式构建且未从源解析的AST上,也可以始终使用保留词法的打印。
在这种情况下,没有原始布局可保留,并且代码将默认为漂亮的打印形式。
当您解析代码并将某些以编程方式创建的新节点添加到AST时,情况也是如此:您解析的代码部分将附加布局信息,而您创建的节点将没有布局信息,并且它们将被漂亮地打印。
在漂亮打印和保留词汇的打印之间进行选择
我们已经看到,使用JavaParser从AST生成代码时,可以使用两种不同的样式。
下一个要考虑的问题是何时应该使用一个,何时应该使用另一个?
从我们已经看到的情况来看,很多情况下都涉及将JavaParser用于在大型代码库上执行转换。
在这种情况下,您通常会希望使用词法保留打印。
原因是,您的转换未修改的所有代码将保持完全不变。
通常,这会使开发人员更加放心,当提交大型(甚至安全)更改时,开发人员可能会感到紧张。
这也使我们可以使用更小的diff文件,从而使手动代码审查变得容易。
最后,它使我们能够保留具有意义的复杂布局或格式。
当生成不用于手动审阅的代码或转换代码时,您可以选择漂亮的打印。
如果要强制执行特定的打印,漂亮的打印也是一个不错的选择
代码样式:每次保存代码时,都可以确保它格式正确,没有任何例外。
这些是我们认为普遍的考虑因素,但请记住,JavaParser和JavaSymbolSolver旨在用作在许多不同上下文中使用的工具。
作为开发人员,您必须分析您的上下文并为您做出适当的选择。
我们已经看到了漂亮打印和词法保留打印之间的区别。
现在,让我们看看如何使用它们以及它们如何工作。
格式化输出
代码
package com.github.houbb.javaparser.learn.chap4;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.comments.LineComment;
import com.github.javaparser.printer.PrettyPrinter;
import com.github.javaparser.printer.PrettyPrinterConfiguration;
/**
* @author binbin.hou