swift-weak-self-check

一个通过 swift-syntax 检测 [weak self] 的 CLI 工具

Github issues Github forks Github stars Github top language

用法

CLI

OVERVIEW: Check whether `self` is captured by weak reference in Closure.

USAGE: weak-self-check [<path>] [--report-type <report-type>] [--quick] [--silent] [--config <config>] [--index-store-path <index-store-path>]

ARGUMENTS:
  <path>                  Path

OPTIONS:
  --report-type <report-type>
                          Detected as `error` or `warning` (default: error)
  --quick                 Check more quicklys. (Not accurate as indexPath is
                          not used)
  --silent                Do not output logs
  --config <config>       Config (default: .swift-weak-self-check.yml)
  --index-store-path <index-store-path>
                          Path for IndexStore
  -h, --help              Show help information.

SPM 插件

配置

可以通过放置一个名为 .swift-weak-self-check.yml 的文件来自定义配置。

示例文件可在此处找到:swift-weak-self-check.yml

启发式算法

在以下条件下执行检测,并报告警告/错误。

  1. 类中调用的所有函数都将进行遍历。

    • 如果在扩展中,则根据 index-store 信息判断它是否为类。
    • 在快速模式下,将检查扩展中的所有函数,无论它们是否为类。
  2. 检查作为函数参数存在的任何闭包。

    • 如果闭包类型使用类型别名定义的类型指定,则会错过检查。
  3. 如果该函数包含在配置文件的白名单中,则会跳过。

  4. 检查 self 是否在闭包中使用,而没有使用 [weak self][unowned self]

  5. 检查是否将 @escaping 属性附加到正在调用的函数的闭包类型。

    • 使用来自 index-store 的信息。(因此,在快速模式下不进行检查)。
    • 不对 c 和 objc 函数进行检查。
    • 如果函数参数中存在多个没有标签的闭包,则不执行此检查。
  6. 如果闭包类型为 Optional 类型,即使未附加 @escaping 属性,也适用警告。

    • 对于可选的闭包类型,即使未附加 @escaping,也可能产生循环引用。
  7. 报告警告/错误

许可证

swift-weak-self-check 在 MIT 许可证下发布。 请参阅 LICENSE