Java Kotlin Releases

Qodana 2022.1 已正式推出

Read this post in other languages:
English, Français, 한국어

我们在持续添加新功能并改进我们的代码质量平台 Qodana。 为了让您了解最新变化,伴随着 Qodana 2022.1 主要版本的发布,我们将启动一个定期博文系列。

许可证审核此前一直是必须与主要 linter 分开配置的额外 linter。 它现在随 Qodana 开箱即用。 我们还为 PHP 和 JVM linter 添加了许多新的实用检查。 现在就来了解一下吧!

开始使用 QODANA

许可证审核

如果代码中的许可证无效或使用不当,可能会导致非常昂贵的法律与合规处罚。 使用 Qodana,您可以扫描代码仓库中的依赖项,查找其许可证并查看是否存在潜在问题。

Qodana License Audit in action

在此版本中,您可以轻松地将许可证审核引入项目并使之融入 CI/CD 管道。 新的许可证审核功能适用于所有 linter,包括 Python、Java、Kotlin、PHP 和 JavaScript。


要启用许可证审核,应将以下行添加到项目根目录下的 qodana.yaml 文件中:

include:
  - name: CheckDependencyLicenses

如果您需要忽略项目中的特定依赖项,请添加以下行:

dependencyIgnores:
- name: "dependency/name"

我们的文档提供了有关许可证审核自定义配置的更多信息,这篇博文介绍了它将如何简化开发者、经理和法务团队的日常工作。

PHP 检查

此版本的 Qodana 提供了 PhpStorm 2022.1 中的所有新检查,并通过我们的 PHP linter 将它们添加到您的管道中。 PhpStorm 与 Qodana 捆绑,因此当 Qodana 提示代码问题时,您可以直接在 IDE 中将其打开进行进一步调查。

重复的数组键

在 PHP 中,array_merge() 的行为不同于 + 运算符合并。 如果键重复,后者不会覆盖值。 这可能导致混乱和错误,因此 Qodana for PHP 现在会高亮显示此类情况。

count($array) 的数组索引用法

将条目附加到数组时,无需显式指定索引。 Qodana for PHP 将针对冗余的 count() 调用向您发出警告。

将 pow() 调用替换为 **

PHP 从 5.6 版开始提供 ** 幂运算符。 Qodana for PHP 将建议在 PhpStorm 中进行快速修复 (Alt+Enter),使用 ** 运算符替换旧的 pow() 调用。

只读属性

可以使用 readonly 标志声明在类中具有只读访问权限的 private 属性。 Qodana for PHP 将建议更新属性声明。

final 类常量

从 PHP 8.1 开始,可以将常量声明为 final。 这就是为什么 Qodana for PHP 会针对未继承的常量向您发出警告并建议向其添加 final 修饰符。 通过 PhpStorm 集成,您可以快速跳转到 IDE 来修正问题。

反向顺序的 rand 函数实参

此检查会高亮显示来自 rand 系列的函数调用,其中 max 实参可能小于 min。 例如,调用 rand(10, 1) 与调用 rand(1, 10) 相同,但 mt_rand() 对其实参顺序的要求非常严格。

PHPUnit 的无效模拟目标

尝试访问模拟对象上的 private 或 final 方法时,Qodana for PHP 会向您发出警告。

冗余修饰符

此新检查将报告在正则表达式模式中使用但不影响匹配的修饰符:

  • 不包含字母的模式中的 /i (不区分大小写)。
  • 不包含美元符号或包含 \m (PCRE_MULTILINE) 修饰符的模式中的 /D (PCRE_DOLLAR_ENDONLY)。
  • 不包含点的模式中的 /s (点匹配换行符)。

不支持的修饰符

此检查将报告 /e 修饰符(在 PHP 7.0 及更高版本中被弃用)的用法。

Java 和 Kotlin 检查

此版本还将 IntelliJ IDEA 2022.1 中的新检查添加到 Qodana for JVM。 借助我们的 IntelliJ IDEA 集成,发现问题后可以直接在 IDE 中打开错误代码进行快速修复。

以下是最值得注意的检查。

可疑的反向引用

Qodana for JVM 将找到在运行时无法解析的引用。这意味着反向引用永远不会匹配任何内容。 如果组是在反向引用之后定义的,或者组是在交替的不同分支中定义的,则反向引用将无法解析。

可以使用 ‘Files’ 方法构建 ‘InputStream’ 和 ‘OutputStream’

当 FileInputStream 和 FileOutputStream 构造函数可以分别被替换为 Files.newInputStream() 和 Files.newOutputStream() 时,此检查会报告。 使用 Files 方法创建的流通常比使用流构造函数创建的流更有效。

可以使用批量 ‘Files.readAttributes’ 调用替换多个文件特性调用

此检查会查找连续使用多个 java.io.File 特性检查(例如 isDirectoryisFilelastModified 或 length)的位置。 这些调用可被替换为批量 Files.readAttributes 调用。 批量方法通常比多个特性检查更高效。     

循环可以替换为 ‘List.replaceAll()’

此检查报告可以折叠成单个 List.replaceAll() 调用的循环。

占位符数量与日志记录调用中的实参数量不匹配

Qodana for JVM 将报告 SLF4J 或 Log4j 2 日志记录调用,例如 logger.info(\"{}: {}\", key),其中记录器消息中的 {} 占位符数量与日志记录调用中的其他实参数量不匹配。

正则表达式可以简化

此检查将检测可以简化的正则表达式。

要从分析中排除特定检查,您可以自定义默认检查配置文件或创建一个全新的配置文件。 您可能还希望执行对您的编码准则或最佳做法很重要的检查。 查看我们的 Qodana 文档获取更多信息。

以上就是 Qodana 2022.1 的所有最新变化。 我们希望这些博文对您有所帮助。 如果您对未来的博客主题有建议,或者想详细了解 Qodana 可以如何帮助您和您的业务,请在此处发表评论,在 Twitter 上提及我们,或发送电子邮件至 qodana-support@jetbrains.com 与我们联系。

您的 Qodana 团队

本博文英文原作者:

Sue

Anastasia Khramushina