在构建Xcode项目时是否可以转储AST?

时间:2016-06-15 23:05:57

标签: xcode swift

我一直在做一些使用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的输出重定向到某个文件,或者它以某种方式使其静音。有什么想法吗?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:18)

只能通过更改来转发应用的AST Xcode构建设置。主要原因是Xcode正在制作一个 很多关于编译器标志的决定都要传递给swiftc 并不是所有兼容转储AST,你无法阻止Xcode 这样做。

可以在Xcode之外用Xcode的帮助(或在 Xcode使用我下面提到的脚本)。要做到这一点,你需要 捕获Xcode为您的项目运行的swiftc命令,然后 改变它以转储AST。

首先,构建您的项目,然后转到Xcode中的Report Navigator( 左侧导航器窗格中的最后一个选项卡。从这里保存您的 整个构建日志,顶部有保存按钮,或者复制 来自Xcode的swiftc命令。你正在寻找这个命令 称为“编译Swift源”为您的应用程序目标(注意:这只是 如果你想要AST,则包含一个目标的编译命令 多个目标,您需要多次执行这些步骤)。如果 你找不到这一步,你可能需要清理你的项目并进行编译 再次(或查看较旧的构建日志)。

从Xcode复制完整的swiftc命令后,您将需要 转到命令行并稍微更改命令。这是什么 你需要这样做:

  1. 删除-emit-dependencies
  2. 删除-emit-module -emit-module-path FILEPATH
  3. 删除-emit-objc-header -emit-objc-header-path FILEPATH
  4. 删除-c(在-jN之前和文件列表中)
  5. 删除-parseable-output
  6. 添加-dump-ast
  7. > output.ast 2>&1附加到您的shell命令
  8. 为什么这些?

    • 必须删除数字1,2,3和4,因为在转储AST时 你也不能发出另一种类型的文件。你可以看到逻辑 围绕开源Swift编译器中的这些错误 here。 由于-c-emit-object的别名。
    • ,因此编号为4
    • Number 5使您更容易重定向AST输出 阻止swiftc输出有关此内容的其他信息 命令。如果您打算解析此AST命令的输出 另一个程序,而不是重定向shell中的输出 可能想要保留此选项(最终获得JSON)。
    • Number 6是导致命令输出AST的原因。根据您想要使用此输出的内容,您可以 还考虑使用-print-ast打印更多 class-dump样式输出vs -dump-ast的更详细,经典的可解析AST输出。
    • Number 7是简单的shell重定向,因此您可以重定向 (可能很大)你的AST输出到一个文件。更改 output.ast到你想要的任何文件。你需要2>&1,因为 AST被转储到stderr而不是stdout。订单也很重要 这里。

    另请注意,Xcode的构建日志会转义空格,但不会转义其他字符 贝壳可能不喜欢。例如,如果您有任何& 文件夹/目录路径,您必须手动转义。

    如果所有这些听起来像是太多的工作,我就把一个剧本拼凑起来 为您执行此处理,您可以在Xcode中进行设置。你可以找到 它on GitHub