概述
SwiftSyntax是一个Swift库的集合,它允许你解析、检查、生成和调整Swift源代码。它最初是由苹果公司开发的,目前由许多贡献者作为开源库进行维护。你可以在swiftpackageindex.com上找到文档,也可以在GitHub自述中找到许多文章。SwiftSyntax库是构建Swift解析器、Swift -format和Swift宏等工具的基础。
在使用宏时,您可能使用过SwiftDiagnostics
和SwiftSyntaxMacros
这样的包。如果您不熟悉宏,Swift宏:使用新类型的表达式扩展Swift
,因为这篇文章对于编写和理解自定义宏非常有价值。
SwiftSyntax的发布
SwiftSyntax版本使用匹配的标签名与Swift和Xcode版本保持一致。例如,508.0.0标签版本与Swift 5.8保持一致,而Swift 5.8与Xcode 14.3一起发布。
你可以通过Swift包管理器添加SwiftSyntax作为依赖项:
以宏为为例,下面Package.swift
文件
import PackageDescription
let package = Package(
name: "WWDC",
platforms: [.macOS(.v10_15), .iOS(.v13), .tvOS(.v13), .watchOS(.v6), .macCatalyst(.v13)],
dependencies: [
.package(url: "https://github.com/apple/swift-syntax.git", from: "509.0.0"),
],
targets: [
.macro(
name: "WWDCMacros",
dependencies: [
.product(name: "SwiftSyntaxMacros", package: "swift-syntax"),
.product(name: "SwiftCompilerPlugin", package: "swift-syntax")
]
),
]
)
探索Swift源代码的抽象语法树(AST)
SwiftSyntax创建了一个Swift源代码的抽象语法树(AST),它允许你与一个高级、安全、高效的API进行交互。熟悉这种树的一个好方法是使用@kishikawakatsumi开发的swift-ast-explorer.com。
以下面为例:
- 源码
enum EasySlope {
case beginnersParadise
case practiceRun
}
- 抽象语法树
├─attributes: AttributeListSyntax
│ ╰─[0]: AttributeSyntax
│ ├─atSign: atSign
│ ╰─attributeName: IdentifierTypeSyntax
│ ├─name: identifier("EnumSubset")
│ ╰─genericArgumentClause: GenericArgumentClauseSyntax
│ ├─leftAngle: leftAngle
│ ├─arguments: GenericArgumentListSyntax
│ │ ╰─[0]: GenericArgumentSyntax
│ │ ╰─argument: IdentifierTypeSyntax
│ │ ╰─name: identifier("Slope")
│ ╰─rightAngle: rightAngle
├─modifiers: DeclModifierListSyntax
├─enumKeyword: keyword(SwiftSyntax.Keyword.enum)
├─name: identifier("EasySlope")
╰─memberBlock: MemberBlockSyntax
├─leftBrace: leftBrace
├─members: MemberBlockItemListSyntax
│ ├─[0]: MemberBlockItemSyntax
│ │ ╰─decl: EnumCaseDeclSyntax
│ │ ├─attributes: AttributeListSyntax
│ │ ├─modifiers: DeclModifierListSyntax
│ │ ├─caseKeyword: keyword(SwiftSyntax.Keyword.case)
│ │ ╰─elements: EnumCaseElementListSyntax
│ │ ╰─[0]: EnumCaseElementSyntax
│ │ ╰─name: identifier("beginnersParadise")
│ ╰─[1]: MemberBlockItemSyntax
│ ╰─decl: EnumCaseDeclSyntax
│ ├─attributes: AttributeListSyntax
│ ├─modifiers: DeclModifierListSyntax
│ ├─caseKeyword: keyword(SwiftSyntax.Keyword.case)
│ ╰─elements: EnumCaseElementListSyntax
│ ╰─[0]: EnumCaseElementSyntax
│ ╰─name: identifier("practiceRun")
╰─rightBrace: rightBrace
结论
SwiftSyntax允许你解析和生成Swift源代码,在编写自定义宏时特别有用。使用AST资源管理器,您将能够了解如何将源代码转换为抽象语法树。建议使用末尾闭包和结果构建器,而不是编写复杂的语法节点组合。
网友评论