iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
自我挑戰組

自己的 Leak, 自己抓(swift)系列 第 7

深入 SyntaxVisitor

  • 分享至 

  • xImage
  •  

深入 SyntaxVisitor

在深入研究 SyntaxVisitor 之前,讓我們先介紹一個重要的工具。

AST Explorer

katsumi大 所提供的 Swift AST Explorer


Visitor

SyntaxVisitor 的所有 function 會以 visit(node: XXXSyntax) -> SyntaxVisitorContinueKind 形式重複出現

舉例來說,如果我們想要訪問 IdentifierExprSyntax,只需將 XXXSyntax 替換為 IdentifierExprSyntax,如下所示:

final class MyVisitor: SyntaxVisitor {
  override final func visit(
    _ node: IdentifierExprSyntax
  ) -> SyntaxVisitorContinueKind {
    return .visitChildren
  }
}

SyntaxVisitorContinueKind

在我們訪問特定節點後,我們需要決定下一步該怎麼做。

  • visitChildren: 繼續訪問子節點
  • skipChildren: 跳過子節點

讓我們以第四天的例子來說明:

.varDecl(
    letKeyword: .let,
    varName: .id("test"),
    equal: .equal,
    content: .functionCall(
        functionName: .id("process"),
        leftParent: "(",
        args: [.id("x")],
        rightParent: ")",
    )
)

範例 1

這個 visitor 可以訪問到以下 id:

  • test
  • process
  • x
final class MyVisitor: SyntaxVisitor {
  override final func visit(
    _ node: Expr.id
  ) -> SyntaxVisitorContinueKind {
    return .visitChildren
  }
}

範例 2

這個 visitor 就只能訪問到 id

  • test
final class MyVisitor: SyntaxVisitor {
  override final func visit(
    _ node: Expr.id
  ) -> SyntaxVisitorContinueKind {
    return .visitChildren
  }

  override final func visit(
    _ node: Expr.functionCall
  ) -> SyntaxVisitorContinueKind {
    return .skipChildren
  }
}

https://ithelp.ithome.com.tw/upload/images/20230920/20158030FDJNtIVeMM.png

這些範例說明了如何使用 SyntaxVisitor 來訪問和處理 AST 中的不同節點。


上一篇
初入 SwiftSyntax
下一篇
第一個工具 ID Visitor
系列文
自己的 Leak, 自己抓(swift)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言