Qodana
The code quality platform for teams
Qodana 2022.3 EAP がリリースされました: .NET と Go 用の Qodana と 100 以上の新しいインスペクション
Qodana 2022.3 EAP がリリースされました。 このバージョンのプラットフォームには、.NET と Go のサポートが導入されています。 また、すでにサポートされている言語に 100 以上の新しいインスペクションが追加されています。 ただし、Qodana 2022.3 EAP はまだ初期段階にあるため、Qodana 2022.2 のイメージの方が安定しています。
以下で詳細を読み、EAP に参加して刺激的な新機能をお試しください!

最新のリンターによって Rider と GoLand のスマートな機能がすべて導入され、異常なコードや潜在的なバグの検出、デッドコードの排除、全体的なコード構造の改善、およびすべての .NET および Go プロジェクト全体に対する横断的なコーディングベストプラクティスの適用が可能になりました!
Qodana for .NET
Qodana は Rider が提供するほぼすべての .NET インスペクションをサポートしています。 インスペクションの数は非常に多いため、すべてのインスペクションを知るには Rider のドキュメントを確認してください。 以下では、Qodana が実行できる .NET インスペクションの一部を例として紹介します。
一貫性のない lock の順序
lock を使用してスレッドセーフを実現する際の主な課題の 1 つに、デッドロック(複数のスレッドが同時にブロックし合うことで実行を継続できなくなり、処理が進行しなくなる状況)の回避があります。 この新しいインスペクションを使用すると、Qodana が実行時にデッドロックが発生する可能性のあるサイクルをハイライトします。

変更されているキャプチャされた変数へのアクセス
Qodana for .NET は、外部で変更されているキャプチャされた変数に匿名メソッドからアクセスされていることを検出します。

デリゲート型が ‘void’ を返す場合は ‘async’ ラムダの使用を回避
このインスペクションは、‘async’ ラムダ式の使用を検出します。ラムダが処理しない例外は呼び出し元スレッドには影響を与えず、catch 節でもキャッチされません。

型チェックとキャストはマージ可能
従来の形式 (Expression is Type)
にある型テストの is
演算子は、Expression
のランタイム型が Type
と互換性があり、Expression
の結果が null
でない場合にのみ、true
を返します。
以下の例のように、キャストする前に is
を使って互換性をチェックすると少なくとも 2 つの問題に遭遇します。
- 理由もなく型チェックを 2 回実行するため、ループ内で実行する場合はパフォーマンスに影響を及ぼす可能性があります。
obj
がnull
の場合、このコードを読んだ人にはプログラムの処理がif
ステートメントの中に入らないということがすぐにはわかりません。
Qodana はこの問題を検出し、Rider で修正するように提案します。

ラムダ式/匿名メソッドには含んでいるコンテキストのキャプチャを記述してはいけない
‘[RequireStaticDelegate]’ 属性でアノテーションが付けられたパラメーターに渡されるラムダ式/匿名メソッドには、ヒープの割り当てを回避するため、含んでいるコンテキスト(ローカル変数、ローカル関数、‘this’ 参照)のキャプチャを記述できません。

.NET のリンターを構成して解析を実行するには、Qodana のドキュメントをご覧ください。
Qodana for Go
Qodana 2022.3 は、GoLand が提供するすべてのインスペクションをサポートするように設計されています。 全リストを確認するには、GoLand のドキュメントをご覧ください。 以下では、Qodana が現在サポートしている Go インスペクションの一部を例として紹介します。
プレースホルダー引数 ‘d.DeletedCount’ に誤った型 ‘int64’ (%s) がある
このインスペクションは、fmt.Printf
、fmt.Println
、および類似する書式設定関数と出力関数の使用箇所を報告します。
書式設定文字列では、書式設定関数は %s
、%d
、%v
などの書式動詞を使用します。
書式動詞の使用方法が誤っている場合、書式設定関数の結果には間違いが発生します。

未処理のエラー
このインスペクションは、error
型の呼び出し結果を処理しない関数とメソッドへの呼び出しを報告します。
このような関数の API は、関数を実行すると失敗してエラーが返ってくることを意味します。 エラー結果を処理しない呼び出しがある場合、API が誤って使用されている可能性があります。

未使用の依存関係
このインスペクションは、プロジェクトにある未使用の依存関係を報告します。 プロジェクトのライブラリのサイズを縮小して保守しやすくするため、未使用の依存関係を定期的にスキャンすることをお勧めします。

Qodana の実際の動作を確認したり、新しいインスペクションを試したりするには、ドキュメントに記載されている Go 用にリンターを構成する方法をご覧ください。
新しいインスペクション
.NET と Go 用に新しいリンターを追加したほか、Godana 2022.3 には既存のリンターに対応する 100 以上の新しいインスペクションが導入されています。 Java、Kotlin、および Python のインスペクションの主な例を見てみましょう。
Java と Kotlin のインスペクション
Qodana for JVM Community と Qodana for JVM に 40 以上の新しいインスペクションを追加しました。
DataFlowIssue
このインスペクションはデータフロー解析に基づき、null 許容性コントラクトを必ず違反するコードコンストラクト、例外を投げる可能性のあるコードコンストラクト、または冗長なコードコンストラクトをレポートします。
EscapedSpace
Java 15 ではテキストブロック末尾の空白を可視化する文字列エスケープシーケンス \s が導入されました。 正規表現などの他のほとんどのコンテキストでは、このエスケープシーケンスを空白を意味する正規表現の \s
と混同しがちです。 Java 文字列リテラルでは、代わりに "\\s"
と書く必要があります。
MismatchedJavadocCode
このインスペクションは、メソッドが文字列を返すにも関わらずコメントには「true を返す」と書かれている場合など、メソッドの Javadoc がメソッドシグネチャーと明らかに矛盾している状況を報告します。
Destructure
このインスペクションは、分解可能な Kotlin の宣言を報告します。
UnresolvedRestParam
Qodana は REST サービスにある一貫性のないメソッド宣言を検出します(@Get
アノテーションのプレスホルダーに一致しない @PathParam
パラメーターなど)。このようなメソッド宣言は実行時に例外を引き起こすためです。
ReactiveStreamsThrowInOperator
この新しいインスペクションは、指定されたエラー値を返す代わりに Reactor/RxJava 演算子コードの throw
ステートメントを検出し、後続のエラーが処理されないようにします。 たとえば、エラーを無視するか、フォールバック値に置き換えます。
なお、このバージョンの Qodana にも IntelliJ IDEA 2022.3 と Android Studio – Electric Eel | 2022.1.1 の新しいインスペクションがすべて導入されています。
Python のインスペクション
Google App Engine のいくつかのインスペクションも Qudana for Python に導入しました。これらのインスペクションは、本番環境で障害が発生する前に問題をハイライトします。 たとえば、以下を検出できます。
- Google App Engine サーバーで許可されているクエリの制限に準拠していない GQL クエリ。
- インデックスのない GQL クエリ。
- Google App Engine サンドボックスで制限されている Python 機能の使用箇所。
- CGI ハンドラーでスレッドセーフが有効になっていない場合。
特定のインスペクションを解析から除外するには、デフォルトのインスペクションプロファイルをカスタマイズするか、新しいプロファイルを作成します。 また、ユーザーのコーディングガイドラインに重要なインスペクションを強制することも可能です。 詳細については、Qodana のドキュメントをご覧ください。
Qodana 2022.3 EAP については、以上です! 新しいリリースを気に入っていただければ幸いです。 今後のブログトピックについて提案がある場合、または Qodana がユーザーとビジネスにどのように役立つかを詳細に知りたい場合は、こちらにコメントを残すか、Twitter で弊社をタグ付けしてください。または、qodana-support@jetbrains.com でもご連絡いただけます。
読みやすいコードを書きながら、開発をお楽しみください!
Qodana チーム一同
オリジナル(英語)ブログ投稿の作者: