[LintDsl] Uast 声明类结构

本文深入解析了JetBrains的UAST库,该库用于表示Java和Kotlin的抽象语法树,是Android Lint的基础。文章详细介绍了UAST的两大类簇——声明类和指令类,以及它们在描述OOP和过程语法树中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Uast

uast 是 jetbrains 用来表示 java 和 kotlin 的 ast 库。没有文档,有的内容诡异。作为 Android lint 的基础库,是写 lint 绕不过去的神坑。
粗犷的说,uast 分为两大簇类:声明类和指令类。声明类主要是描述 OOP 相关的语法树,指令类主要是描述过程相关的语法树。

声明类结构

UML 图
所有元素,包括:

  • 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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值