几个月前,阿里开源了p3c,我也接到了老大交给我的技术改造。是这样的,app是老项目了,半年前接入了ARouter,由于Activity繁多,就没有去全局支持ARouter,这不,技术改造来了,就是定义一个规则,全局的在项目里面搜一遍,所有Activity如果没有@Route()注解,就把它揪出来。那么来吧。
于是到同性恋交友网站(github)上面,把阿里代码检查(这里附上链接https://github.com/alibaba/p3c)下下来之后就傻眼了,用Kotlin写的,我尼玛。。。好吧骚年,撸起袖子加油干。学点Kotlin,总还是好的。
我们现在打开idea-plugin这个项目,代码主要是在p3c-common这个包里面,我们先来看一下包结构吧
这里画圈两个包比较重要,inspection是所有的检查逻辑,idea-sandbox是插件输出的位置。
那是哪里调用inspection的呢?
class AliLocalInspectionToolProvider : InspectionToolProvider {
...
companion object {
val ruleInfoMap: MutableMap<String, RuleInfo> = Maps.newHashMap<String, RuleInfo>()
private val LOGGER = Logger.getInstance(AliLocalInspectionToolProvider::class.java)
val ruleNames: MutableList<String> = Lists.newArrayList<String>()!!
private val CLASS_LIST = Lists.newArrayList<Class<*>>()
private val nativeInspectionToolClass = arrayListOf<Class<out LocalInspectionTool>>(
AliMissingOverrideAnnotationInspection::class.java,
TuoMissingAcitvityRouteInspection::class.java,
AliAccessStaticViaInstanceInspection::class.java,
AliDeprecationInspection::class.java,
MapOrSetKeyShouldOverrideHashCodeEqualsInspection::class.java,
AliArrayNamingShouldHaveBracketInspection::class.java,
AliControlFlowStatementWithoutBracesInspection::class.java,
AliEqualsAvoidNullInspection::class.java,
AliLongLiteralsEndingWithLowercaseLInspection::class.java,
AliWrapperTypeEqualityInspection::class.java
)
...
}
...
}
我们看到这个数组常量nativeInspectionToolClass,这里装的就是你点击检查时候检查的所有规则的类。
private fun initNativeInspection() {
val pool = ClassPool.getDefault()
pool.insertClassPath(ClassClassPath(DelegateLocalInspectionTo