Swift编译器:使用第三方导入打印Swift文件的AST

5
我正在尝试使用Swift编译器和-print-ast标志,从Swift文件打印抽象语法树(AST)。这是在没有Xcode和xcodebuild的情况下进行的。此处有详细信息。
我卡在了处理通过Carthage构建的第三方框架的导入上。给定以下代码的源文件:
import Foundation
import BrightFutures // 3rd party framework

class MyAsyncService {
    func asyncFunc() -> Future<String, NSError> {
        return Promise<String, NSError>().future
    }
}

编译MacOS的工作正常

通过指定框架搜索路径(-F),使用以下命令:

swiftc -print-ast Source.swift -F Carthage/Build/Mac

产生预期的输出结果:

import Foundation
import BrightFutures

internal class MyAsyncService {
  internal func asyncFunc() -> Future<String, NSError>
  @objc deinit
  internal init()
}

编译 iOS 应用?

我需要为一个仅针对 iOS 平台的项目打印 AST,并且需要包含为 iOS 构建的依赖项。

当我尝试指向为 iOS 构建的框架时:

swiftc -print-ast Source.swift -F Carthage/Build/iOS

命令执行失败:
Source.swift:2:12: error: module file was created for incompatible target x86_64-apple-ios8.0: [...]/Carthage/Build/iOS/BrightFutures.framework/Modules/BrightFutures.swiftmodule/x86_64.swiftmodule
    import BrightFutures // 3rd party framework
           ^
import Foundation
import BrightFutures

internal class MyAsyncService {
  internal func asyncFunc() -> <<error type>>
  @objc deinit
  internal init()
}

我还尝试了添加-sdk标志:

-sdk $(xcrun --sdk iphoneos --show-sdk-path)指定iphoneos SDK,但这会产生一个关于不支持的架构的错误。

如何才能使它成功构建?


1
将-target设置为以下任何一个:x86_64-apple-ios8.0 / i386-apple-ios8.0 / armv7-apple-ios8.0 / arm64-apple-ios8.0。 同时设置-sdk。 如果不提供sdk路径,swiftc将构建本地三元组,即osx [i386 / x86_64]。 您的框架目标应与您提供给swift编译器的-target匹配。 - RK1979
1个回答

5

看起来,使用SourceKit是打印Swift编译器AST的替代方法。

有一个名为SourceKitten的CLI工具,可以将Swift源文件的结构解析为JSON格式,无需处理第三方框架和其他源文件的导入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接