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

更新时间:2017-03-13 09:49:14 点击次数:1936次

用 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 可以做哪些事情呢?

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

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

parser

生成的 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))
}

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

回到顶部
嘿,我来帮您!