iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
自我挑戰組

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

實作 Assign Visitor

  • 分享至 

  • xImage
  •  

說明一大段 capture 的實作

最後來講講 assign 的實作部分


AssignClosureVisitor

function call

檢查參數:

  • 所在位置是 escape closure
  • 是特定語法
    • MemberAccessExprSyntax: a.b.c -> c
    • IdentifierExprSyntax: a -> a
  • 該參數 refFunctionMethodInstanceinstance function
public final class AssignClosureVisitor: SyntaxVisitor {
    private(set) var results: [AssignClosureVisitorResult] = []
    public let client: SKClient

    public init(client: SKClient) {
        self.client = client
        super.init(viewMode: .sourceAccurate)
    }

    /// self.def(self.abc)
    ///
    /// calledExpression self.def/def
    ///     MemberAccessExpr/IdentifierExpr
    /// argumentList
    ///     TupleExprElementSyntax expression
    ///     TupleExprElementSyntax
    override public final func visit(_ node: FunctionCallExprSyntax) -> SyntaxVisitorContinueKind {
        find(node)
        return .visitChildren
    }

    @inline(__always)
    private final func find(_ node: FunctionCallExprSyntax) {
        let info = client.functionInfo(node)
        for param in node.argumentList {
            guard let identifier: TokenSyntax = param.expression.tokenSyntax else { continue }
            if let name = param.label?.text, let info {
                if info.isEscape(name) {
                    add(identifier,
                        "Assign Instance Function To Escaping Closure Argument")
                }
            } else {
                add(identifier, "Assign Instance Function To Argument")
            }
        }
    }

    private func add(_ token: TokenSyntax, _ reason: String) {
        guard let isRIF = try? client(token).isRefInstanceFunction, isRIF else {
            return
        }

        results.append(AssignClosureVisitorResult(
            location: client(location: token),
            reason: reason))
    }
}

上一篇
番外: swift demangle
下一篇
番外: IndexStore DB
系列文
自己的 Leak, 自己抓(swift)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言