在深入研究 SyntaxVisitor 之前,讓我們先介紹一個重要的工具。
由katsumi大 所提供的 Swift AST Explorer
SyntaxVisitor 的所有 function 會以 visit(node: XXXSyntax) -> SyntaxVisitorContinueKind 形式重複出現
舉例來說,如果我們想要訪問 IdentifierExprSyntax,只需將 XXXSyntax 替換為 IdentifierExprSyntax,如下所示:
final class MyVisitor: SyntaxVisitor {
override final func visit(
_ node: IdentifierExprSyntax
) -> SyntaxVisitorContinueKind {
return .visitChildren
}
}
在我們訪問特定節點後,我們需要決定下一步該怎麼做。
visitChildren: 繼續訪問子節點skipChildren: 跳過子節點讓我們以第四天的例子來說明:
.varDecl(
letKeyword: .let,
varName: .id("test"),
equal: .equal,
content: .functionCall(
functionName: .id("process"),
leftParent: "(",
args: [.id("x")],
rightParent: ")",
)
)
這個 visitor 可以訪問到以下 id:
final class MyVisitor: SyntaxVisitor {
override final func visit(
_ node: Expr.id
) -> SyntaxVisitorContinueKind {
return .visitChildren
}
}
這個 visitor 就只能訪問到 id
final class MyVisitor: SyntaxVisitor {
override final func visit(
_ node: Expr.id
) -> SyntaxVisitorContinueKind {
return .visitChildren
}
override final func visit(
_ node: Expr.functionCall
) -> SyntaxVisitorContinueKind {
return .skipChildren
}
}

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