看了几个lint相关的实现,其实很容易可以看出,lint实现的根本在于继承Detector和实现Scanner方法,而且Detector中已经其实已经实现了所有的Scanner方法,但是都只是空方法,需要覆盖,包括ResourceXmlDetector其实都是一样的。
对于不同的检查方法,其实只是针对的文件不一样而已,JAVA_FILE针对java文件,RESOURCE_FILE针对资源文件,CLASS_FILE针对class文件,将通过Issue将具体的Detector与scope关联起来。
lint中涉及了两个方面的东西,一个是lambo.ast,另一个才是lint(关于ast,在分析JavaScanner的lint时涉及到了一些,此处先挖坑)。在分析源码时基于ast来进行上下文的分析,并在合适的时候将ast中的Node对象通过JavaContext转换为JavaParser.ResolvedXXX对象来分析,两者的区别从我目前的角度来看就是,AST着重于语法树上的节点属性,如名字,有什么参数等,而JavaParser.Resolved则是将Node节点信息转换成方便我们分析的结构,如获取上下文的信息等。关键在于在什么时候使用Node,什么时候使用JavaParser.ResolvedXXX。
从目前来看,lint其实可以做的东西也十分有限,更多是用于分析编码规范等,一旦涉及到可能出错的问题分析,就需要编写大量的判断代码,感觉略为繁琐,但用于分析编码规范等则十分有效,在团队中可以起到约束的作用。
另外,也可以参看android关于lint的一些例子,这些例子其实就是我们现在正在用的规则。
地址