​打造企業自己代碼規範IDEA插件(上)

——基於阿里巴巴代碼規範插件(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鏈接://github.com/ariesfly/emo-coding-guardian
如有遇到問題歡迎公眾號私信留言