Uast
uast 是 jetbrains 用来表示 java 和 kotlin 的 ast 库。没有文档,有的内容诡异。作为 Android lint 的基础库,是写 lint 绕不过去的神坑。
粗犷的说,uast 分为两大簇类:声明类和指令类。声明类主要是描述 OOP 相关的语法树,指令类主要是描述过程相关的语法树。
声明类结构
所有元素,包括:
- UElement,基类,约等于 ASTNode,并没有啥特别的接口
- UDeclaration,基类,是 UAnnotated。单独列出了 final 、static 和 visibility
- UAnnotated,mixin,持有一个 annotation list。对应到我自己的 AnnotationOwner
- UAnnotation,Annotation,attribute 被声明为 UNamedExpression,而不是 UMethod/ UField。不是 UClass 的子类。对应到我自己的 AnnotationMatcher,但是:
- AnnotationMatcher 是 TypeMatcher 的子类
- AnnotationMatcher 的 attribute 被定成了 field
- UClass,类。所有内容都被抽象成 UDeclaration list。对应我的 ClassMatcher,我这里为了明确匹配方式声明了 fields 和 methods,区别对待了 superClass 和 interface
- PsiTypeParameter,泛型(泛型居然没有 Uast 体系的表示类,无力吐槽),PsiClass 子类,增加了 extendsList,具体啥内容需要运行测试//todo。对应我的 GenericMatcher,明确加上了 extends、super 和 raw 的三种泛型。因为不会有人关心泛型是啥样子的,所以没有继承 ClassMatcher
- UAnonymousClass,匿名内部类。多了一个对所在类的引用。对应我的 AnnonymousClassMatcher
- UMethod,方法声明。有一些关于继承、override 的相关状态。对应我的 MethodMatcher。
- UAnnotationMethod,Annotation 中的 Method,多了一个 default 值匹配。为啥没有放到 UAnnotation 里不清楚。
- UParameter,方法入参。继承自 UVariable,只是多了一个是否是变长参数。对应我的 ParameterMatcher。
- UField,成员变量。继承自 UVariable,没啥区别。对应我的 FieldMatcher。