iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0
自我挑戰組

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

除非,我們今天將 `[a]` 改寫成 `[a = a]`

  • 分享至 

  • xImage
  •  

除非,我們今天將 [a] 改寫成 [a = a]


除了前面介紹的 visitor 以外

我們可以透過實作 SyntaxRewriter

去更改特定語法


ClosureCaptureItemSyntax

我們可以透過 AST Explorer 得知

[weak a = a]ClosureCaptureItemSyntax 語法

以及得知其語法架構

/// ClosureCaptureItemSyntax
/// specifier name assignToken expression
/// weak      a    =           a          [weak a = a]
/// weak                       a          [weak     a]

CaptureListRewriter

於是我們就可以開始偷偷改 code

  • 先檢查確實沒有 = a
  • 在檢查 aID
    • node.expression.as(IdentifierExprSyntax.self)
  • 最後用 withXXX 將特定語法替換掉
    • 新版會是 with(KeyPath)
import Foundation
import SwiftSyntax

final public class CaptureListRewriter: SyntaxRewriter {
    public override func visit(_ node: ClosureCaptureItemSyntax) -> ClosureCaptureItemSyntax {
        guard node.name == nil, node.assignToken == nil else {
            return node
        }

        guard let name = node.expression.as(IdentifierExprSyntax.self)?.identifier else {
            return node
        }

        return node
            .withName(name.withoutTrivia())
            .withAssignToken(TokenSyntax.equalToken(leadingTrivia: .space, trailingTrivia: .space))
    }
}

最終

let newSource = rewriter.visit(source)

上一篇
Ref 變數的來源(key.offset)
下一篇
改造 SourceKitten 參數
系列文
自己的 Leak, 自己抓(swift)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言