Clang库&&插件

使用 libclang 来进行语法分析

使用libclang里面提供的方法对源文件进行语法分析,分析语法树,遍历语法树上每个节点。

LibTooling 对语法树完全的控制

因为LibTooling能够完全控制语法树,那么就可以做很多事情了

  • 可以改变clang生成代码的方式
  • 增加更强的类型检查
  • 按照自己的定义进行代码的检查分析
  • 对源码做任意类型分析,甚至重写程序
  • 给clang添加一些自定义的分析,创建自己的重构器
  • 基于现有代码做出大量的修改
  • 基于工程生成相关图形或文档
  • 检查命名是否规范,还能够进行语言的转换,比如把OC转为JS或者Swift

官方有个文档开发者可以按照这个里面的说明去构造 LLVM,clang 和其工具: Tutorial for building tools using LibTooling and LibASTMatchers — Clang 4.0 documentation

Clang Plugin

通过自己写个插件,比如上面写的LibTooling的clang工具,可以将这个插件动态的加载到编译器中,对编译进行控制,可以再LLVM的目录看到一些范例llvm/tools/clang/tools

动态化方案DynamicCocoa中就是使用了一个将OC源码转JS的插件来进行代码的转换,这里整理了些利用clang转js的库 clangtojs资源 - Lmsgsendnilself ,JSPatch 是直接手写 JS 而没有转换的过程,所以也就没有多出这一步,而鹅厂的OCS更猛,直接在端内写了个编译器。在 C 函数的调用上孙源有个slides可以看看:Calling Conventions in Cocoa by sunnyxx bang 也有篇文章:如何动态调用 C 函数 « bang’s blog

滴滴的王康在做瘦身时也实现了一个自定义的 clang 插件,具体自定义插件的实现可以查看他的这文章 《基于clang插件的一种iOS包大小瘦身方案》