AST Matcher语法树实战工具之clang-query
开发过程中,写完一个matcher如何检验是否合理正确有效?如果每次都是写完之后去工程跑plugin校验,那是相当烦的。有什么快捷的办法吗?clang-query
了解一下?
clang-query
-
作用:
- test matchers :交互式检验
- explore AST:探索AST 结构&关系
-
使用:
- 首先通过make clang-query 编译获取tool(详细步骤看上篇)
- 然后准备好你的Test project & 一份导出的
compile_commands.json
- 然后执行下面命令
clang-query -p /path/to/compile_commands.json_dir \ -extra-arg-before "-isysroot/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator11.2.sdk" \ ./*.m --
注:
-p:compile_commands.json所在目录路径,
-extra-arg-before:编译指令前拼接的扩展参数
./*.m 编译当前目录下所有.m文件
-编译附加选项,添加的话不会再从database中加载,-目前没任何选择
执行之后进入clang-query 命令行界面:
//let 给匹配表达式设置个别名
clang-query> let main isExpansionInMainFile()
clang-query> match ifStmt(main,hasCondition(unaryOperator(hasOperatorName("~"),hasUnaryOperand(integerLiteral(unless(equals(false))))))).bind("false")
Match #1:
/Users/yaso/Desktop/YJ/T/Testclang/Testclang/ViewController.m:39:3: note: "false" binds here
if (~1) {
^~~~~~~~~
/Users/yaso/Desktop/YJ/T/Testclang/Testclang/ViewController.m:39:3: note: "root" binds here
if (~1) {
^~~~~~~~~
1 match.
clang-query>
如上,直接match matcher,然后执行正确匹配到相应的结果,并且高亮提示我们bind 的字符串,下面的root 是系统自带,可以set bind-root false
关闭。且写matcher过程中,支持tab提示补全很方便。
提示补全
结语
所以多熟悉熟悉AST Matcher Reference 里提供的matchers,配合clang-query 快速检验正确性,将使我们PaserAST的效率将会成倍提升。
作者:Yaso
链接:https://www.jianshu.com/p/e2453d404b0c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。