——基于阿里巴巴代码规范插件(P3C)
“交流互鉴是文明发展的本质要求。只有同其他文明交流互鉴、取长补短,才能保持旺盛生命活力。” 这说的是文明,但映射到计算机技术本身也是相通的,开源代码/项目就是一种很好的技术交流方式。怎么借鉴开源代码来打造一些自身面对的问题解决方案?也许有一些Demo来进行回答演示或许更为贴近地气些。这里打算写一些玩转源码为主题的文字来实践的回答,最近在看P3C的一些源码,那就从这开始吧。
P3C-IDEA插件基本结构
主体功能上首先是菜单上的三个部分编码规约扫描、实时扫描开关、多语言切换,对应到Idea插件结构中的三个action:AliInspectionAction、ToggleProjectInspectionAction、SwitchLanguageAction 相关类都在com.alibaba.p3c.idea.action 包下面。三个action组成一个工具菜单(ToolMenu)组:com.alibaba.p3c.analytics.action_group 。3各action都是继承Idea插件SDK中的 AnAciton,具体执行逻辑在 actionPerformed(e: AnActionEvent) 中进行执行。
Aciton设计中,其中一个有意思的点在于利用update(e: AnActionEvent) 来进行多语言的支持。这种设计如果有需要实现Idea 插件多语言支持上都值得借鉴。
另外在Idea插件扩展上,注册了一个 AliLocalInspectionToolProvider 用于完成实时代码扫描相关构建,一些详细设计后续再细读。一个比较巧妙的点在于利用 javassist 动态构建注册相关代码规则相关执行类。
总结来说,初读完整体结构后就可以借鉴到一些设计;比如上述提及到的,Idea插件如何进行多语言设计、在大量某类代码需要进行类似改写可以利用 javassist 来进行动态注册。当然也有些觉着不好的点比如尽量还是不要进行语言混写(Icons单拎出来各 java写,而整体框架是 kotlin写)等,推测可能是由于一些插件SDK历史兼容问题导致。可以发现,在阅读源码过程种了解到的一些技术设计处理方式,这其实就是本文开头说提到的 “交流互鉴” ,这些设计技巧都可以参考应用到其他也有类似需求插件代码实践中去。在此,附上一张源码基本结构示意图:
先简单改改,添加皮肤功能
初步分析基本结构后,其实就可以利用源码进行一些尝试修改了。最近被某人吐槽不懂”emo”的含义。特别从网上搜了下意义,“在悲伤的基调下,一切的情绪不稳定皆可‘emo’。”,想到当遇到各类bug时候,程序员的心情不正是‘emo’。估且就把修改代码,取个项目名:Emo-coding-guardian,也声明下仅供研究、学习用途。
其实可以看到P3C插件做的非常精致,菜单中的图标、文字表述、状态变化后的图标都有相关设计。在了解其主体结构后,不妨添加一个自定义皮肤Config来自定义下皮肤。
先把icon相关的资源文件独立到一个文件夹进行管理,并新建一个 emo皮肤文件集合。并新建一个 SkinConfig 作为皮肤的配置类来进行相关设置,图标的ICON相关的主要在P3cIcons.java考虑语言统一性,这里用kotlin改写了下。同时,把对应的menu代码修改,在初始化阶段对ICON进行设置,如下:
相关皮肤资源的文件结构:
最终一些效果如下:
可以看到,我们在掌握了开源代码基本结构后,可以对其中一些点进行修改尝试。一方面验证是否符合我们理解,一方面也是更深入理解细节的过程。
当然打造企业自己代码规范插件并非改改皮肤,更重要的在于,如何利用P3C进行相关代码规则的编写工作。且请关注,在后续的文章中,我们再接着进行探索。
附上相关代码github链接:https://github.com/ariesfly/emo-coding-guardian
如有遇到问题欢迎公众号私信留言