ReSharper 2020.3 の新機能

ReSharper 2020.3 では、C# 9 機能との互換性、新しいインレイヒント、Avalonia サポート、Dynamic Program Analysis の統合、および日常的な開発業務を支援する様々な更新が追加されました。

ダウンロード

無料30日間体験版

C# サポート

ソースジェネレーターはほぼ間違いなく C# コンパイラーの機能の中でも最も話題性の高いものです。 それも頷けます。なぜなら、コンパイル処理中に新しいコードを作成して即座に使用できる機能は非常に魅力的ですし、さまざまなシチュエーションで役に立つ可能性があるからです。

では、ReSharper はどのような機能を提供するのでしょうか? Rider はリファクタリング実行中に可能な限り生成されたファイルを考慮し、コードエディター機能と生成されたコードへの移動を支援する機能を提供します。

部分メソッドに out パラメーター、void でない戻り値の型、あらゆるタイプのアクセシビリティを含め、それらをソースジェネレーターで処理しやすくすることができます。 ソースジェネレーターは部分メソッドの定義宣言を使用し、生成されたコードの動作をカスタマイズできます。

また、素晴らしいことに init-only プロパティが追加されました。 このプロパティは、オブジェクトの初期化中にのみセットできます。 その結果、プロパティを可変プロパティとして公開することなくオブジェクト初期化子を使用できるようになりました。

ReSharper は init-only プロパティを認識し、コード補完、生成補完の実行、任意の場所でのプロパティ変更の解析、気が変わった場合にそのプロパティを変更可能にするクイックフィックスの提供を行う際にそのプロパティを考慮します。

init を適用するのに最適なのは、新しい record 型です。 この不変性を実現するのに役立つ値セマンティクスを持つ参照型ですが、今回はオブジェクト全体が対象です。 繰り返しますが、ReSharper は優先する宣言スタイルを選択するためのクイックフィックスから基本的な補完に至るまで、この言語の最新機能に対応しています。

位置指定レコードには、コンパイラーが生成した Deconstruct() メソッドが含まれています。 ReSharper はこのようなオブジェクトですべての分解機能をサポートしています。 変数を導入する際には、単一の変数か分解宣言のいずれかを選択できるポップアップが表示されます。 関数が record オブジェクトのプロパティにアクセスする際にも同じ選択肢が表示されます。

重要事項から説明しますが、ローカル関数に属性(およびローカル関数のパラメーターと型パラメーター)を付けられるようになりました。 この新機能は、ReSharper のクイックフィックスでサポートされています。例えば、メソッドに [NotNull] または [CanBeNull] のアノテーションをそれぞれ ! または ? を押して付けられる便利な機能があります。

C#9 には最上位レベルのプログラムを記述できる便利な機能もあります。 もうプログラムのクラスと格闘する必要はありません。エントリポイントのコードを using ディレクティブの直後に配置できます。 最上位レベルステートメントの処理を支援する機能もあります。 最上位レベルステートメントには 2 つのルールがあります。1 つは型または名前空間の前に配置すること、もう 1 つはプロジェクト内の 1 つのファイルのみに最上位レベルコードを記述できるということです。 どちらのルールも、コードの再配置やコピーペーストを行う際には破られがちです。 ReSharper は、最上位レベルのコードを最上位または別のファイルに移動してこの問題に対処するクイックフィックスを提供しています。

最上位レベルのコードもコードであるため、対応するリファクタリング機能もあります。具体的には、Extract local variable(ローカル変数の抽出)と Extract method(メソッドの抽出)です。

C# 9 のターゲット型の new 式を使用すると、型を文脈から判断できる場合に new キーワードの後の型を省略できます。 ReSharper はこの機能を完全にサポートしています。例えば、コンストラクターの使用箇所を検索する機能や優先する構文スタイルを構成する機能があります。 後者は、作成した型が明らかな場合は new() 構文を使用し、その他の場合には明示的な型指定を要求できる機能です。

なお、コード内のすべての new() が制御不可能になった場合は ReSharper の新しい型名のヒントが役に立ちます。

共変の戻り値を使用すると、基本クラスのメソッドの場合と同様にオーバーライドメンバーで同じ型を返す必要はなくなります。 より具体的な型を返すのに回避策を実装する必要はありません。

新しい言語バージョンでは、パターンマッチングが引き続き進化しています。 マッチ式で関係式(<> など)と論理パターン(notorand)を使用できるようになったため、冗長な従来の switch 構文の多くを削除できます。 ReSharper はパターンを解析し、希望するスタイルに書き換えるのを支援します。

さらに、ラムダの破棄パラメーターが導入された時には対応するクイックフィックスを追加するのが望ましいと考えました。

以上が主な言語のハイライトです。 ReSharper 2020.3 では、同言語に対する小さな改善も追加されおり、 ターゲットにより型指定された条件式、静的なラムダ、foreach、関数ポインター型、ネイティブ整数型の拡張 GetEnumerator メソッドなどが挙げられます。

インレイヒント

私たちはインレイヒントが有用であると考えていますが、作業環境は可能な限りスッキリと操作しやすくすべきだということも理解しています。 これらを両立させるため、どちらのメリットも維持できるようにインレイヒントに対応した新しい "Push-to-Hint"(押下でヒント)の仕組みを考案しました。

Push-to-Hint 表示モードの場合、ヒントはデフォルトでは表示されず、 Ctrl を押すと表示され(離すと非表示になります)、 Ctrl を 2 回押した場合は、もう一度 Ctrl が 2 回押されるまで表示されたままになります。

非常に細かい設定調整を行えるようにしています。常に表示すべきヒント、押下時に表示すべきヒント、重要度の低いヒントを ReSharper に指示することができます。 それぞれのヒントの種類に ‘Visibility’ 設定を使用してください。

さらに、暗黙的な型キャストのヒントも調整しました。 この種のキャストはデータの損失やパフォーマンスの低下を引き起こす可能性があります。ReSharper は暗黙的なキャストが発生している場所を指摘します。

型変換ヒントを Ctrl+クリック すると、その暗黙的変換の実装にいどうします。

XAML のインレイヒントは前のバージョンですでに提供されていましたが、外観を設定できる通常のコンテキストメニューが追加されました。

フォーマッター

フォーマットエンジンには継続的に詳細な設定を追加しています。 このリリースでは、以下の設定を追加しました。

プロパティパターンの配置設定グループを使用すると、単純なパターンを 1 行に配置し、長いパターンの折り返し方法も ReSharper に指示することができます。 また、プロパティパターンの位置揃え設定もあります。

空行をプロパティまたはイベントアクセサーの前後に追加できるようになりました。

Visual Basic の場合は +/- 単項演算子の後にスペースを追加するオプションがあります。

.editorconfig のサポートにも若干の更新があります。 ReSharper は、Roslyn プロパティ(file_header_templatesdotnet_sort_system_directives_firstdotnet_separate_import_directive_groups)に対応しました。

また、.editorconfig へのエクスポートに新しい “Spaces around ‘=’”(‘=’ 前後のスペース)パラメーターも追加されています。 これは既存ファイルの場合は自動検出され、新規ファイルの場合は手動で設定できます。 デフォルトでは ‘true’ に設定されます。

Dynamic Program Analysis

コード解析とより優れたコードの作成を支援するため、ReSharper に Dynamic Program Analysis(DPA)を追加しました。メモリの Large および Smalle Object Heap のクロージャと割り当てを検出します。

最大の魅力は、コーディング、実行、デバッグという通常の作業以外に何も行う必要がない点です。 DPA はバックグランドで実行し続け、プロジェクトをローンチするたびにレポートを準備してくれます。 右下のアイコンに注意してください。

DPA の詳細については、こちらのブログ記事をご覧ください。

Structural Remove(構造的除去)

構造ナビゲーション機能については、おそらくご存知のことでしょう。これは、構造、キーワード、ブロック、メソッドなどに従って、コードの一部を選択できる機能です。

Extend または Shrink Selection アクションを使用している場合、カンマ、ドット、または角括弧を選択するステップが必要となりますが、選択し忘れがちです。 ブロックを削除した場合、コードエラーが発生してしまいます。 ReSharper はこういった場合のちょっとした清掃作業を行います。構造的に何かが選択されている場合に Backspace または Delete キーを押すと、ReSharper は構造的にそれを削除しようとします。

コマンドラインツール

大規模なコードベースで作業している場合、ソリューション全体に渡る演算の実行には長時間かかってしまいます。 ファイルを数個変更した後、ソリューション全体のリフォーマットが完了するまでに長時間待ったことはありませんか? これを解消するために、ソリューションファイルをポイントせずに、CleanupCode コンソールツールを実行できるようになりました。一連のファイルまたはフォルダを指定するだけで、実行できます。 コマンドラインは次のように記述します。cleanupcode.exe [フォルダへのパス] [ファイルへのパス] [別のファイルへのパス]

ツールはコードのフォーマットしか行いません。このモードではクリーンアップは行われません。

コンソールツールにしばらく不足していたものの 1 つに、プラグインのサポートがありましたが、 これが戻ってきました! 現時点では Windows のみに提供されますが、 利用するには、プラグインの ID が必要です。 JetBrains Marketplaceにアクセスし、プラグインのページを開いて Versions タブに移動します。プラグイン ID は、いずれかのバージョンをクリックすると表示されます。 InspectCode または CleanupCode を起動する際に、-x=[ID] にそのプラグイン ID を指定すると、コンソールツールによって自動的にプラグインがダウンロードされ、有効化されます。cleanupcode.exe -x=[ID] [ソリューションファイルへのパス]

プラグインはツールバージョンと互換性のあるものである必要があることに注意してください。 また、.NET Core グローバルツールメカニズムを使って ReSharPer のコマンドラインツールをインストールする場合には、プラグインはサポートされていません。

ナビゲーション

テキストの検索に苦労したことはありませんか? コード内やコメント内の文字列を検索した場合に困ったことはありませんか? それとも、テキストにあるタイポのせいで、何も見つからなかったことはありませんか?

Find Text では、正確な一致検索のほかに、潜在的なタイポや欠落している語を考慮するファジー検索を実施できるようになりました。 この結果は、通常の部分文字列検索結果の下にある Fuzzy セクションに表示されます。 ヒント: コード内の特定の書式設定が適用された文字列ビルドを検索する場合に、非常に役立ちます。

Avalonia のサポート

コード解析

WPF に類するあらゆるフレームワークでは一般的な事ですが、コード解析では C# コードビハインドファイルと .axaml ファイルの両方に適した “Possible ‘System.NullReferenceException’”(‘System.NullReferenceException’ の可能性)および “Class/Property {...} is obsolete: Use {...}”(クラス/プロパティ {...} は使用すべきではありません: {...} を使用してください)などのクイックフィックスを備えた一般的なコードインスペクションを豊富に提供しています。

一般的な WPF のインスペクションに加えて、“Path to resource is case-sensitive”(リソースへのパスでは大文字小文字が区別されます)や “ColumnDefinitions tag can be converted to attribute”(ColumnDefinitions タグは属性に変換できます)といったクイックフィックス付きのインスペクションなど、Avalonia 固有のインスペクションも豊富にあります。 後者の場合は ColumnDefinitions="*,Auto,*" 属性に対するコンテキストアクションがあり、それを使用して <Grid.ColumnDefinitions> タグに逆変換できます。

Avalonia のバインディングの “$self" / “$parent” / “^” / “#” 構文を適切にサポートし、$parent[] 配列のインデックスを適切に検証するようにしました。

CompiledBinding および x:CompileBindings 拡張のサポートが拡張されました。 ReSharper は DataType が必要であることを認識しており、コード内のバインディングに指定するように促します。

“Create from usage”(使用箇所から作成)クイックフィックスをすべての Avalonia プロパティに使用できるようになりました。

Avalonia XAML のサポートには、CSS ライクなスタイルシステムの認識も含まれています。

インレイヒントは参照中のコードをより深く理解するのに役立ちます。

コード補完

コード補完とパラメーター情報は、すべての XAML キーワード、あらゆる種類のマークアップ拡張、x:NameStyle プロパティ、StyleIncludeSource プロパティその他に対応しています。

ナビゲーション

コンパイル済みバインディングのデータ型、バインドプロパティ、Avalonia コントロールの型、x:Name の宣言に簡単に移動できます。 ReSharper では XAML からスタイルの setter プロパティを含むデコンパイル済み外部コードや、参照されている xmlns 名前空間に直接移動することもできます。

Find Usages(使用箇所の検索)

Find Usages は、メソッドのバインディング、x:Name 属性、Style クラスと setter、およびあらゆる種類のプロパティの使用箇所をすべて検索するのに役立ちます。

リファクタリング

Rename および Safe Delete リファクタリングが Avalonia XAML コード内のあらゆる使用箇所を認識し、それらを更新できるようになりました。

階層とコード構造

Avalonia XAML コードの階層と構造を監視できます。

デコンパイラーの更新

ReSharper に統合されたデコンパイラーにも、ほかの C# 機能へのサポートが追加されています。 また、IL Viewer とソースコード間の同期メカニズムも改善されています。

最上位のステートメントについては特に、Assembly Explorer に <Top-level Entry Point><Top-level Entry Point><Top-level Entry Point> ノードを追加しました。 このノードをダブルクリックするか、コンテキストメニューナビゲーションを使用して、逆コンパイルされたコードの実際の最上位ステートメントに移動することができます。

プライベートソースリンクがサポートされました。 プライベートソースサーバーへの接続が必要な外部ソースに移動すると、ReSharper にログイン情報を入力する通知が表示されます。Visual Studio の設定で指定済みの場合は、その情報が自動的に適用されるため、表示されません(GitHub と BitBucket の場合)。

Blazor

私たちは Blazor のサポートを継続的に強化しています。 今回はジェネリック型パラメーターと使用箇所の型推論のサポートを強化し、ソリューションを開く際のパフォーマンス低下を解消しました。 修正された問題の全リストは、公開バグトラッカーをご覧ください。

完璧な Unreal Engine コンパニオン

Unreal Engine

ReSharper C++ 2020.3 では、UnrealHeaderTool とのシームレスな統合により、通常はコンパイル時にのみ発見される課題を見つけやすくしました。 ReSharper C++ はバックグラウンドで UnrealHeaderTool を実行し、解析結果をエディター内にリアルタイムで表示します。

HLSL サポートを改善するために、ReSharper C++ ではシェーダーファイルでフロー制御解析インスペクションを実行できるようになりました。 ビルド構成ファイルへの変更をライブ追跡するため、ReSharper は常に最新のプロジェクトモデルを使用することができます。

詳細情報

さらに改善された C++20 サポート

C++20

ReSharper C++ 2020.3 では、比較ルールに C++20 の変更を実装しました。 インスペクションとエラーメッセージが豊富に備わっているため、ReSharper C++ を頼ってコードの動作を正確に理解することができます。新しいクイックフィックスを使えば、比較演算子を簡単に操作することができます。

さらに、ReSharper C++ 2020.3 には、C++20 の ranges ライブラリを採用しやすくするための新しいインスペクションが追加されました。また、Visual Studio 16.8 で導入された標準モードの C++20 コルーチンもサポートされています。

詳細情報

タイムラインインスペクション dotUltimate

タイムラインのインスペクション

dotMemory はタイムラインデータを使用することで、直接 Timeline グラフで自動的にインスペクションを実行できます。

現在のところ、3 つのインスペクションを利用できます。

  • 高圧のガーベッジコレクション
  • Gen0 のピン留めされたオブジェクト
  • 急速な Large Objects Heap 上昇率

詳細情報

継続的テストの改善 dotUltimate

継続的テストの改善

継続的テストのセッションがトリガーされた際にビルドすべきプロジェクトを絞り込めるようになりました。 これにより、継続的テストのセッションが高速化されます。 この機能は、Visual Studio と Rider で機能します。

詳細情報

その他の更新

  • 制約のないジェネリック型での null 許容のアノテーションのサポート(デフォルト制約を含む)。
  • TypeScript サポートにも控えめな更新を実装し、ReSharper は null 合体演算子とオプショナルチェーンをサポートしました。
  • シーケンシャルパターンチェックを複合パターン一致チェックに変換しやすくするクイックフィックスを新たに追加しました。
  • Change Signature リファクタリングでは、追加しているパラメーターのデフォルト値を設定するために使用するツールを設計し直しました。‘Resolve with call tree’ を選択する際に開いているツールです。 コードへのナビゲーションは、ノードをダブルクリックして行います。 また、Create default parameter という新しいオプションが追加されており、値を指定するコードに直接移動できます。 最後に、ツリーで選択されるフィックスが色分けされるようになりました。 これらの更新により、より簡単に解決できるようになれば幸いです!
ダウンロード

無料30日間体験版