常见缩写
- 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.
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在源代码文件中的位置。