Java Program Transformation

常见缩写

  • CtClass: compile-time class

Spoon:

Structural elements

编程语言具有不同的meta model。
一个抽象语法树(AST)或者模型,是meta model的一个实例。每一个meta model——以及相应的AST——都或多或少的取决于需要完成的工作。例如,javac的meta model是为了编译字节码而设计和优化的,而Eclipse IDE的java meta model是为了集成不同的软件开发需求(代码补全,快速修复编译错误,debug等)而设计的。
不同于基于编译器的AST(比如javac),Spoon的meta model是为了让普通java开发者容易理解而设计的,为了帮助他们编写自己的代码分析和转换工具。Spoon包含生成可编译和可执行的java程序的所有信息。
spoon meta model可以分为三部分:

  • structural part包含程序基本元素(program elements)的declarations。比如interface, class, variable, method, annotation, enum...
  • code part, executable java code, such as the one found in method bodies.
  • reference part, references to program elements
    所有element继承自CtElement, ct for compile-time CtModule element represent a module in java 9.
    Java Program Transformation

Code elements

Code elements包括CtStatement和CtExpression两种。
CtStatement是无类型的top-level指令,可以直接在代码块中使用。
CtExpression被用在Statement中。 examples: https://spoon.gforge.inria.fr/code_elements.html

References

meta model的reference part表达了这样一个事实:程序引用的elements不是必须要在meta model中有所对应(它们可能属于第三方库)。比如说,一个返回String的表达式节点被限制为对String的类型引用而不是对编译期的String.java的模型的类型引用,因为String的源代码(基本上)不是需要被分析的应用代码。
换句话说,meta model的elements使用references,以弱引用的方式引用elements。弱引用使得创建和修改program model更加灵活,不需要必须获得所有引用到的elements的强引用。 References在模型创建时被解析,解析的引用指向通过spoon input path指向的源代码中的类。 因为是弱引用,所以引用的目标即使不存在也可以被引用。 这种低耦合的代价是,当一个人需要从一个element跳转到另一个element时,他需要先跳转到引用,然后再跳转到目标。比如,从一个field获取它的类型,需要使用field.getType().getDeclaration()

Creating AST elements

Create elements with factories

当你通过processors和templates设计和实现transformations时,你需要创建新的element,赋值并把他们添加到Spoon构建的AST中。
使用Factory创建element。Factory是Spoon所有factories的入口。

  • CoreFactory,: 可以创建meta model中的任何element。
  • CodeFactory: code element和Object
  • PackageFactory: package reference
  • TypeFactory: 通过fully qualified name 或者 .class的invocation来获取任何类型,已经创建任何类型的类型引用
  • ClassFactory: TypeFactory的子类,专用于Class
  • EnumFactory: TypeFactory的子类,专用于Enum
  • InterfaceFactory: TypeFactory的子类,专用于Interface
  • ExecutableFactory: 创建executable objects and their parameters
  • ContructorFactory: subclass of ExecutableFactory, specialized for CtConstructor
  • MethodFactory: subclass of ExecutableFactory, specialized for CtMethod
  • FieldFactory: 创建Field或者Field Reference
  • AnnotationFactory: 为element添加annotation或者创建一个新的。 所有的factories都是为了创建elements。

Generating Spoon code for an element

SpoonifierVisitor v = new SpoonifierVisitor(true); 
Launcher.parseClass("class A { public String sayHello() { return \"Hello World!\";}}") 
	.getMethodsByName("sayHello") 
	.get(0) 
	.accept(v); 
System.out.println(v.getResult());

Comments and position

  • CtComment.CommentType.FILE: 文件头部的注释,一般用于licence
  • CtComment.CommentType.INLINE: //
  • CtComment.CommentType.BLOCK: /* */
  • CtComment.CommentType.JAVADOC: /** */

Source Positions

SourcePosition定义了CtElement在源代码文件中的位置。

上一篇:深入分析CopyOnWriteArrayList的源码设计


下一篇:ES6