概述
SwiftSyntax是一個(gè)Swift庫的集合,它允許你解析、檢查、生成和調(diào)整Swift源代碼。它最初是由蘋果公司開發(fā)的,目前由許多貢獻(xiàn)者作為開源庫進(jìn)行維護(hù)。你可以在swiftpackageindex.com上找到文檔,也可以在GitHub自述中找到許多文章。SwiftSyntax庫是構(gòu)建Swift解析器、Swift -format和Swift宏等工具的基礎(chǔ)。
在使用宏時(shí),您可能使用過SwiftDiagnostics和SwiftSyntaxMacros這樣的包。如果您不熟悉宏,Swift宏:使用新類型的表達(dá)式擴(kuò)展Swift
,因?yàn)檫@篇文章對(duì)于編寫和理解自定義宏非常有價(jià)值。
SwiftSyntax的發(fā)布
SwiftSyntax版本使用匹配的標(biāo)簽名與Swift和Xcode版本保持一致。例如,508.0.0標(biāo)簽版本與Swift 5.8保持一致,而Swift 5.8與Xcode 14.3一起發(fā)布。
你可以通過Swift包管理器添加SwiftSyntax作為依賴項(xiàng):
以宏為為例,下面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創(chuàng)建了一個(gè)Swift源代碼的抽象語法樹(AST),它允許你與一個(gè)高級(jí)、安全、高效的API進(jìn)行交互。熟悉這種樹的一個(gè)好方法是使用@kishikawakatsumi開發(fā)的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
結(jié)論
SwiftSyntax允許你解析和生成Swift源代碼,在編寫自定義宏時(shí)特別有用。使用AST資源管理器,您將能夠了解如何將源代碼轉(zhuǎn)換為抽象語法樹。建議使用末尾閉包和結(jié)果構(gòu)建器,而不是編寫復(fù)雜的語法節(jié)點(diǎn)組合。