我一直在做一些使用他们的 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 命令后,您需要
前往命令行并稍微更改命令。这是什么
你需要做的:
-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风格输出对比
-dump-ast 的更详细、经典的可解析 AST 输出。output.ast 到你想要的任何文件。你需要 2>&1 因为
AST 被转储到 stderr 而不是 stdout。顺序也很重要
在这里。另请注意,Xcode 的构建日志会转义空格而不是其他字符
那炮弹可能不喜欢。例如,如果您的任何一个中都有 &
文件夹/目录路径,你必须手动转义。
如果所有这些听起来工作量太大,我拼凑了一个脚本来 为你做这个处理,你可以在 Xcode 中设置它。你可以找到 它on GitHub .
关于xcode - 是否可以在构建 Xcode 项目时转储 AST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37847271/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="