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

标签 xcode swift

我一直在做一些使用他们的 AST 分析 Swift 项目的工作,我想知道在使用 Xcode 构建 Swift 项目时是否有可能以某种方式生成它。

现在,我可以在为单个文件和简单项目运行 swiftc -dump-ast 命令时在终端上打印 AST。但是,将其用于更复杂的项目时会变得更加困难。

出于这个原因,我想使用 xcode。我已经尝试在 Build Settings > Swift Compiler - Custom Flags > Other Swift Flags 中将 -dump-ast 标志传递给编译器。该标志确实已传递给编译器(输出确实报告在构建时使用 -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 的输出重定向到某个文件,或者它以某种方式将其静音。有什么想法吗?

如有任何帮助,我们将不胜感激。

最佳答案

仅通过更改无法转储应用的 AST Xcode build设置。这样做的主要原因是 Xcode 正在制作一个 关于要传递给 swiftc 的编译器标志的很多决定 并非都与转储 AST 兼容,您无法阻止 Xcode 这样做。

但在 Xcode 的帮助下(或在 Xcode 使用我在下面提到的脚本)。为此,您需要 捕获 Xcode 为您的项目运行的 swiftc 命令,然后 稍微改变一下以转储 AST。

首先,构建您的项目,然后转到 Xcode 中的 Report Navigator( 左侧导航器 Pane 中的最后一个选项卡)。从这里保存你的 整个构建日志,顶部有保存按钮,或者复制 swiftc 命令直接来自 Xcode。您正在寻找命令 为您的应用程序目标调用“编译 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 命令

为什么是这些?

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

另请注意,Xcode 的构建日志会转义空格而不是其他字符 那炮弹可能不喜欢。例如,如果您的任何一个中都有 & 文件夹/目录路径,你必须手动转义。

如果所有这些听起来工作量太大,我拼凑了一个脚本来 为你做这个处理,你可以在 Xcode 中设置它。你可以找到 它on GitHub .

关于xcode - 是否可以在构建 Xcode 项目时转储 AST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37847271/

相关文章:

xcode - 使用绑定(bind)的 NSTextFields 在初始化后不更新

swift - 使用 Mapkit 对聚类注释设置限制

ios - 本地通知和(NSURLConnection后台下载)不起作用

ios - xcode 执行 clean 和删除 DerivedData 的区别?

swift - observerSingleEvent 函数未与 Firebase 一起运行

swift - UIScrollView 中的 UITableview 和 UICollectionView - Swift

ios - 谷歌登录 API

iphone - 如何在Interface Builder中查看UITableViewDelegate?

ios - 地址簿:ABRecordCopyValue(person, kABPersonPhoneProperty) 无法获取一些号码

swift - MusicSequenceFileLoad 在 Playgrounds 中有效,但在 Project 中无效