我一直在做一些使用AST分析Swift项目的工作,我想知道在使用Xcode构建Swift项目时是否有可能以某种方式生成它。
现在,我可以在为单个文件和简单项目运行swiftc -dump-ast
命令时在终端上打印AST。但是,将其用于更复杂的项目时变得更加困难。
出于这个原因,我想使用xcode。我已经尝试将-dump-ast
标志传递给Build Settings>中的编译器。 Swift编译器 - 自定义标志>其他Swift标志。该标志确实传递给了编译器(输出确实报告在构建时使用-dump-ast标志调用swiftc)。我尝试使用xcode和下面的xcodebuild
命令构建项目,但都没有抛弃ast。
xcodebuild -target 'CompilingTest.xcodeproj' -scheme 'CompilingTest' -
configuration "Debug" -sdk iphoneos -arch "armv7"
CONFIGURATION_BUILD_DIR="TestBuild" ONLY_ACTIVE_ARCH=NO
现在,我推断Xcode的构建过程会将swiftc的输出重定向到某个文件,或者它以某种方式使其静音。有什么想法吗?
非常感谢任何帮助。
答案 0 :(得分:18)
只能通过更改来转发应用的AST
Xcode构建设置。主要原因是Xcode正在制作一个
很多关于编译器标志的决定都要传递给swiftc
并不是所有兼容转储AST,你无法阻止Xcode
这样做。
但 可以在Xcode之外用Xcode的帮助(或在
Xcode使用我下面提到的脚本)。要做到这一点,你需要
捕获Xcode为您的项目运行的swiftc
命令,然后
改变它以转储AST。
首先,构建您的项目,然后转到Xcode中的Report Navigator(
左侧导航器窗格中的最后一个选项卡。从这里保存您的
整个构建日志,顶部有保存按钮,或者复制
来自Xcode的swiftc
命令。你正在寻找这个命令
称为“编译Swift源”为您的应用程序目标(注意:这只是
如果你想要AST,则包含一个目标的编译命令
多个目标,您需要多次执行这些步骤)。如果
你找不到这一步,你可能需要清理你的项目并进行编译
再次(或查看较旧的构建日志)。
从Xcode复制完整的swiftc
命令后,您将需要
转到命令行并稍微更改命令。这是什么
你需要这样做:
-emit-dependencies
-emit-module -emit-module-path FILEPATH
-emit-objc-header -emit-objc-header-path FILEPATH
-c
(在-jN
之前和文件列表中)-parseable-output
-dump-ast
> output.ast 2>&1
附加到您的shell命令为什么这些?
-c
是-emit-object
的别名。swiftc
输出有关此内容的其他信息
命令。如果您打算解析此AST命令的输出
另一个程序,而不是重定向shell中的输出
可能想要保留此选项(最终获得JSON)。-print-ast
打印更多
class-dump
样式输出vs
-dump-ast
的更详细,经典的可解析AST输出。output.ast
到你想要的任何文件。你需要2>&1
,因为
AST被转储到stderr而不是stdout。订单也很重要
这里。另请注意,Xcode的构建日志会转义空格,但不会转义其他字符
贝壳可能不喜欢。例如,如果您有任何&
文件夹/目录路径,您必须手动转义。
如果所有这些听起来像是太多的工作,我就把一个剧本拼凑起来 为您执行此处理,您可以在Xcode中进行设置。你可以找到 它on GitHub。