SwiftSyntax:解析和生成Swift源代碼

概述

SwiftSyntax是一個(gè)Swift庫的集合,它允許你解析、檢查、生成和調(diào)整Swift源代碼。它最初是由蘋果公司開發(fā)的,目前由許多貢獻(xiàn)者作為開源庫進(jìn)行維護(hù)。你可以在swiftpackageindex.com上找到文檔,也可以在GitHub自述中找到許多文章。SwiftSyntax庫是構(gòu)建Swift解析器、Swift -format和Swift宏等工具的基礎(chǔ)。

在使用宏時(shí),您可能使用過SwiftDiagnosticsSwiftSyntaxMacros這樣的包。如果您不熟悉宏,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)組合。

引自
SwiftSyntax: Parse and Generate Swift source code

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容