用 Swift 编写的工程代码静态分析命令行工具 smck

前言

最近几周在用 swift 做一个命令行工具 smck 用来对现有 OC 工程的代码做些分析和处理。日后工程切换成 Swift 可以加上对 Swift 工程代码的支持。昨天看到喵神在微博上说他下周要直播 live coding 一个 swift 的命令行工具,传送门: 现场编程 - 用 Swift 创建命令行工具 fengniao-cli Part1 ,其实蛮期待。想想跟喵神挺有缘的,最近下了他开发的 iOS 应用 Mail Me,随时能够记录工作和准备讲座时一些灵感,smck 的一些实现还有模块的设计灵感也是通过这个应用随时记录了下来呢,所以也推荐大家使用,真心方便。还有先前 Segmentfault 邀请我这个月31号在他们的直播平台上做个讲座,传送门: 深入剖析 iOS 编译 Clang / LLVM - 戴铭 - SegmentFault 讲堂 ,先前写过一篇文章,直播可能更利于演示和详细说明一些细节吧。看来这段时间我要跟喵神做好多类似的事情了。smck 的代码今天已经放到了 Github 上,地址:https://github.com/ming1016/smck

smck 可以做哪些事情呢?

  • 简单的比如命名规则的检查,按照团队标准来,如所有继承 UIViewController 的命名末尾统一成 VC,继承 JSONModel 的命名末尾统一成 Model,还有特定功能基类的子类按照一定的命名规则来。
  • 再比如查找所有中文字符串列出每个字符串分别使用在哪个控件上。
  • 根据类是否被初始化或直接调用等规则检查来分析哪些类从来没有调用过来判断是否是没有用的类。
  • 对工程质量的检查,比如 NSString,block,NSArray 的属性检查否是为 copy,还有 protocol 是否为 weak,Array 的操作是否使用具有安全操作的 Category 来做等等。
    当然需要检查分析和处理的肯定不止这些,所以在 smck 这个程序设计成了一种非常利于添加各种检查功能模块的结构,通过简单的代码编写每个人或团队都可以方便编写添加各种 checker。

是怎么做到简单编写就能够添加功能呢?

因为代码分析的过程会通过一系列已经编写好的 parser 来完成,parser 会完成 token 的分析和上下文还有工程全局分析输出所有节点的数据信息,根据这些完整的信息和已经定义好的一系列具有完整包含关系的结构体就能够进行各种各样功能的定制化了。下面是一些 parser 和功能介绍:

parser
parser
  • ParsingMethod.swift :会返回 Method 结构体,包含了方法名,各个参数,方法内使用过的方法,方法内定义的临时变量等信息。
  • ParsingMethodContent.swift :会分析方法内的 token 根据语法形成数组结构进行处理。这里需要处理的东西很多,目前还在根据计划添加更多的数据输出。
  • ParsingMacro.swift :处理宏定义,主要是输出 token 给其它 parser 来处理。
  • ParsingImport.swift :返回 Import 结构体,包含引入的类名,包名
  • ParsingProperty.swift :会分析定义的属性 Property 信息
  • ParsingInterface.swift :会根据这个分析出一个文件中定义了多少各类,类的结构体 Object 里类名,父类名,类别名会在这里解析出。
  • ParsingProtocol.swift :会将分析出的协议设置到 Object 结构体中。
  • ParsingObject.swift : 目前主要是分析出使用过的类的信息。

生成的 File 结构体里面套装各个子结构体,断点如图:


结构体
结构体

如何调试 smck?

先填上对应的命令行参数和值,设置参数参考下图。然后运行即可。


命令行参数
命令行参数

导出成命令行工具

在 Xcode 里选择 Product - Archive - Export 即可,如图:


导出
导出

执行

./smck -o /User/your_project_path

输出如下


执行效果
执行效果

如何编写自己的检查功能?

由于工程检查规则非常多样化,所以需要编写一些 Plugin,后面我会逐渐抽出一些具有共性的放上来,目前在 Plugin 目录下我放了两个例子,在例子里可以看出来怎么通过订阅 Parser 输出的不同节点的不同数据来进行不同的检查。在控制台管理相关的 Checker 类里关联 Parser 和 Plugin 的代码由于使用了 RxSwift 也变得非常简洁明了,如下:

func doO(path:String) {
    guard path.characters.count > 0 else {
        return
    }
    UnUseObjectPlugin().plug(ob: ParsingEntire.parsing(path: path))
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,088评论 4 62
  • 转载自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子阅读 8,527评论 0 35
  • 本文的内容主要包括: Charles 的简介 将 Charles 设置成系统代理 过滤网络请求 截取 iPhone...
    DeadRabbit阅读 582评论 3 3
  • 刚来深圳的时候,找的第一份工作上班时间是9:30,每天上班7个小时,宿舍离公司步行5分钟。当时选择这份工作的原...
    米多姐姐阅读 593评论 0 1
  • 经过几天的看书,终于把蔡崇达的《皮囊》看完了,书中介绍了他身边的人和事还有物,每个人在他的生命当中起的作用都是不一...
    丁昱研阅读 373评论 0 0