我想自动查找我的 kotlin 应用程序中使用已弃用代码的所有情况(主要是注释为已弃用的方法)
我说的不是 kotlin 规范中已弃用的 kotlin 代码,我指的是调用已弃用函数/方法的 kotlin 代码。
已弃用函数所在的源可能是 kotlin 或 java 库。
我发现了非常好的工具,可以通过 intellij idea 在 java 代码中查找类似问题,例如:
但我没有找到任何类似的 kotlin 搜索选项的方法。
我尝试自己构建一个“已弃用的 api 使用结构搜索”模板,但 kotlin 似乎不支持归档此模板的基本功能。
唯一有效的非手动功能是我当前所在文件的本地代码分析(右上角的这个小后面,您可以在其中看到问题的数量(并且可以单击它们将它们放入列表中) ))
这可行,但如果我对洞文件夹进行代码分析,则不推荐使用的用法不存在。
我需要一个扫描漏洞代码库的解决方案,而不是手动从一个文件单击到另一个文件。
编辑: 请注意,现在已经为 jetbrains 创建了一张票证:https://youtrack.jetbrains.com/issue/IDEA-311206
因为目前似乎没有解决方案或解决方法。
@Deprecated 警告是编译器警告,目前还无法通过 IDE 检查搜索找到它。请关注问题 — https://youtrack.jetbrains.com/issue/KTIJ-12494/Analyze-Inspect-code-Inspection-results-show-compiler-warnings
我现在从 jetbrains 上针对该主题的(第二张)票证中得到了答案和可行的解决方案(一张票用于检查代码分析,一张票用于结构搜索): https://youtrack.jetbrains.com/issue/KTIJ-24477
事实证明,我在
Reference
变量上使用的结构搜索模板 $MethodCall$
属性“已弃用的方法”(与现有模板“方法调用弃用方法”中的 java 的方式相同)不支持Kotlin 模板。
事实上,这个
Reference
属性的工作方式与我想象的不同,但它也更通用和强大。您可以选择任何结构搜索模板作为“预处理”搜索,这会限制当前模板的输入(至少目前这是我的概念模型)
这适合我从 jetbrains 获得的解决方案,这意味着我正在执行以下操作:
首先创建一个新模板来查找标记为已弃用的 kotlin 方法:
@Deprecated($Parameters$)
fun $MethodCall$($Parameter$)
然后用类似
deprecated kotlin methods
的名称保存它。
然后创建一个新模板来查找调用此类已弃用方法的代码。模板看起来像:
$MethodCall$.($Parameters$)
参数设置范围为
0 - *
之间。
现在将 Reference
属性设置为预先编写的自定义模板(在本示例中,其名称为 deprecated kotlin methods
。
现在找到了这些对已弃用的 kotlin 方法的调用!
如果您想找到您的 kotlin 代码库调用的已弃用的 java 代码(例如,位于库内部),那么您可以执行相同的方法。但这次您为
Reference
属性创建一个自定义模板,该模板基于 Java 并使用 Java Deprecated 注释。将其组合到 kotlin 模板中似乎可行。
虽然 Intellij 不支持开箱即用,但我解决问题的方法是:
./gradlew :classes :testClasses | grep ' is deprecated' > deprecated.txt
deprecated.txt
的内容,以便轻松导航到使用已弃用的 API 的代码行。