ReSharper C++の新機能

ReSharper C++ 2020.2 では製品全体にわたる機能の拡張と強化に加えて、多くのパフォーマンスの改善とバグ修正が行われています。 主な改善点は、C++/CLI サポートの更新、ナビゲーションと検索の強化、新しいクイックフィックス付きのコードインスペクション一式の追加です。 Unreal Engine プロジェクトモデルをサポートすることで Unreal Engine 開発の機能を強化し、include ディレクティブに対してより高度な自動インポートを提案し、より高精度な補完リストを提供するようにしました。また、ソリューション構成を切り替える際の応答性が向上しました。

ダウンロード

無料30日間体験版

Unreal Engine

Unreal Engine

自動インポートとコード補完の精度を向上させるため、ReSharper C++ 2020.2 から Unreal Engine プロジェクトモデルのサポートを開始しました。 これにより、ReSharper C++ が Visual Studio によって生成される中間プロジェクトファイルを使用しなくても .uproject ファイルから直接プロジェクトの情報を読み込めるようになりました。 新しいプロジェクトモデルは、プラグインとモジュールの参照に応じてより適切な補完項目のリストを提供します。 また、ReSharper C++ はソリューション構成を切り替える際に自身の動作を調整します。

ReSharper C++ はプロジェクトファイルが最新ではない場合に Unreal Editor 内の Visual Studio プロジェクトを更新するよう促します。

Unreal Engine

ナビゲーションを容易にするため、エンジンソースのシンボルがライブラリシンボルとして処理されるようになりました。また、ユーザーコード内に一致するシンボルがある場合はデフォルトで検索結果に表示されなくなります。

Unreal Engine

Unreal Engine コーディング標準に合わせるため、ReSharper C++ 2020.2 ではインスペクションの重大度、コード生成アクション、include ディレクティブの自動インポートに複数の更新を行っています。

また、virtual 指定子をオーバーライド関数に追加するための新しいクイックフィックス付きのインスペクションを使用できます。

C++/CLI

ReSharper C++ 2020.2 では多数のバグ修正が行われ、C++/CLI と C# の相互運用性が改善されました。 C++/CLI コードで派生シンボルを検索する際、ReSharper C++ は C++/CLI のシンボルに加えて C# コード内のシンボルも検索します。 基本シンボルと派生シンボルへの移動は、インポートされた CLR エンティティにも機能します。

新しいクイックフィックス付きのインスペクションは gcnew / sealed / safe_cast の使用箇所で使用できます。

ナビゲーションと検索

ナビゲーション

次の機能は、その範囲と適用範囲が拡張されています。

  • Go to declaration は不具合が発生した箇所を把握できるように未解決の識別子に機能します。
  • Find usages は return ステートメントなど、より多くのケースで波括弧に囲まれた初期化リストからコンストラクタの使用箇所を検索します。 Find usages は複数の修正によってパフォーマンスも向上しています。
  • Go to Base SymbolsGo to Derived Symbols がインポートされた CLR エンティティに機能するようになりました。
ナビゲーションと検索

ReSharper C++ でコードを読み進める際、キャレットの下にある要素の使用箇所を自動的にハイライトできるようになりました。

File Structure ウィンドウでは、サイズの大きなファイルの中を移動しやすくするためにプリプロセッサディレクティブがデフォルトで非表示になりました。

コード解析

コード解析

新しいインスペクションは、次のようなケースで役に立つ対応するクイックフィックスと共に使用できます。

  • 構造化バインディングをコードの最新化に使用できる。
  • オーバーライド関数に virtual 指定子がない。
  • gcnew をネイティブ型に使用できず、new をマネージ型で使用できない。
  • final 指定子をマネージクラスに使用できない。
コード解析

ReSharper C++ がプリプロセッサディレクティブのスペルミスもハイライトするようになりました。

Clang-Tidy クイックフィックスの簡易プレビューにより、必要な修正オプションを選択しやすくなりました。

コード解析

評価エンジンが更新されて constexpr 関数内の値の変更に対応し、クラス型の値を処理できるようになりました。

コード補完

コード補完

std::function パラメーターが必要な場合、新しい補完項目を使って自動生成されたラムダ引数を挿入できるようになりました。

コード補完

あるクラスが現在ファイルに含まれていない場合、import 文の補完機能は対応するヘッダーファイルではなく事前宣言を追加する新しいオプションを提案します。

コードスタイルとフォーマット機能

コードスタイルとフォーマット機能

さらに柔軟な構成を行えるようにするため、ReSharper C++ 2020.2 では次の 3 つの設定が新たに追加されています。

  • Indent aligned ?: operator(位置揃えした ?: 演算子のインデント)は、複数行の三項式に使えるフォーマットオプションです。
  • Insert // on Enter in multi-line // comments(複数行の // コメントに Enter で // を挿入)は、複数行コメントが単一行スタイルで自動展開されないようにするエディターのオプションです。
  • Consider only quoted includes as potential main headers(引用符付きの include のみをメインヘッダー候補とみなす)は、include ディレクティブを並べ替えてメインヘッダーの検出を改善するオプションです。
コード補完

#include 順序設定が独立したオプションページに移動され、見つけやすくなりました。Code Editing | C++ オプショングループ配下の Order of #includes をクリックするだけです。

最後に付け加えますが、大量のマクロ呼び出しを含むソースファイルでのフォーマットエンジンの動作速度が大幅に向上しています。

その他、ReSharper 自体の更新も行われています。 例えば、コードのクリーンアップを保存時に自動起動したり、最近変更されたファイルの変更部分のみに適用したりできるようになりました。 これらの改善点に関する詳細については、こちらをご覧ください。

ダウンロード

無料30日間体験版

ReSharper C++ 2020.1

C++20

C++20 の標準はほぼサインオフされており、ReSharper C++ では、もう 1 つの機能セットのサポートを導入することにしました。

using enum

using enum

ReSharper C++ 2020.1 では using enum 宣言がサポートされており、特定の列挙子をスコープ付きの列挙からローカルのスコープに移動することができます。 既存のコードに using enum 宣言を追加するには、新しい Introduce Using Enum リファクタリングを使います。

コンセプト

C++20 のコンセプト

C++20 のコンセプトに対応するため、ReSharper C++ では、制約を受ける型のプレースホルダーと短縮化された関数テンプレートに使用する新しい構文がサポートされています。 満たされていない制約に関するエラーメッセージが改善されたため、テンプレートの置き換え中に何がエラーになったのかを理解しやすくなります。

using enum

ラムダのテンプレート構文

ReSharper C++ は、エラーの回避に有益な場合やラムダと関数の使用を統一できるようにする場合に、ラムダのテンプレート構文を使うためのクイックフィックスも提案します。

Unreal Engine

Unreal Engine

ReSharper C++ 2020.1 では、Unreal Engine プロジェクトにおける Rename リファクタリングが改善され、 対応する *.generated.h include ディレクティブと AFETS、および U で始まる関連ファイル が更新されるようになりました。

ReSharper C++ が Unreal Engine プロジェクトを検出すると、Unreal Engine ガイドラインとの整合性を高めるためにデフォルトの設定を調整し、Use auto を提案しないようにします。 また、ReSharper C++ 2020.1 では、コンソール変数とログカテゴリの命名規則が更新され、 Search Everywhere/Go to から、Unreal Engine 4 スタイルの列挙を含む名前空間にナビゲートできるようになりました。

最後に、ReSharper C++ では、仮想ファイルパスを使った USF ファイルと SpatialOS GDK もサポートされています。 詳細はこちら。

HLSL 実験的サポート

HLSL

ReSharper C++ 2020.1 は、HLSL(ハイレベルシェーディングランゲージ)の初期サポートを提供しています。 ReSharper C++ は、デフォルトのカラースキームに従って HLSL コードをハイライトし、コード要素、型情報、およびドキュメントに関するインレイヒントとツールチップを表示します。 また、ソリューション全体、参照ファイル、および標準ライブラリの構造体、関数、またはパラメータを検索して素早く移動することもできます。 さらに、HLSL のエクスペリエンスを完全化するために、ReSharper C++ は、スマートコード補完、対応区切り文字の自動挿入などを提供しています。

コード解析

コード解析

以下の問題に対応するため、新しいインスペクションがいくつか利用できるようになりました。解決に使用できるクイックフィックスも用意されています。

  • 未使用のラムダキャプチャ。
  • ラムダが明示的なテンプレートパラメータを使用するように書き直されることがある。
  • C++ キャストの代わりに関数形式キャストが使われる。
  • void* にキャストする際に、static_cast の代わりに reinterpret_cast が使用される。
コード解析

C++17 の maybe_unused 属性を使いやすくするために以下の 2 つの機能が追加されました。

  • 未使用のパラメータまたは変数に [[maybe_unused]] を追加するクリックフィックス。
  • UNREFERENCED_PARAMETERQ_UNUSED アノテーションを [[maybe_unused]] に置換するコンテキストアクション。

バンドルされている Clang-Tidy バイナリーは Clang 10 に更新され、最新の LLVM リリースに含まれる 70 個を超える新しいチェックとコンパイラ診断が追加されています。

コード補完

補完リストに、ラベル名、標準 C++ 属性、新しい std::forward ポストフィックステンプレート、および基本関数への呼び出しに対する引数が提案されるようになりました。 そのほか、ReSharper C++ はマクロの本文でもコード補完を行えるようになりました。

コーディング支援

コーディング支援

ReSharper for .NET では良く知られている 2 つの機能が、ついに ReSharper C++ にも追加されました。

  • Rearrange Code を使って、コード要素の移動や現在の範囲の拡張や縮小といった操作を素早く行えます。
  • Complete Statement を使って、現在のステートメントを終了するために必要な構文要素を挿入し、正しい場所にキャレットを配置できます。

入力支援が改善されたことで、任意のコードを選択して括弧、波括弧、角括弧、または引用符を入力すると、選択内容を対応する文字で囲めるようになりました。 パラメータ名のヒントと入力ヒントを示すコード可読性ヘルパーが従属コードで使用できるようになりました。

新しいDocumentアクション(デフォルトで Ctrl+/ にバインド済み)では、コンテキストアクションを使用する代わりに、周辺のコード要素に対してドキュメントコメントを素早く生成できます。

Enum リファクタリング

Enum リファクタリング

ReSharper C++ 2020.1 では、列挙の使用法をアップグレードするための新しいリファクタリングが 2 つ導入されました。

  • Convert to Scoped Enum は、C 形式の列挙宣言を C++11 のスコープ付き列挙に変換します。
  • Introduce Using Enum は、コードの可読性を高めるために、C++20 の using enum 宣言を追加し、列挙子の参照を短縮します。

ナビゲーション

コードナビゲーション機能が拡張され、より便利になりました。

  • コメント内の識別子に対し、Go to Declaration を使用できるようになりました。
  • Search Everywhere/Go to には、concepts と namespaces という 2 つの新しいフィルタカテゴリが含まれました。 検索ボックスで「/」を入力すると、利用できるすべてのフィルタが表示されます。
  • ミドルクリック(マウスのスクロールボタンをクリック)で Go to Declaration を実行できるようになりました。

File Structure ウィンドウのアイコンには、クラスメンバーのアクセシビリティ、継承、および仮想/静的/純粋の指定子のインジケータ―が追加されました。

include ディレクティブの並べ替え

include ディレクティブの並べ替え

ReSharper C++ 2019.3 では、既存のグループを調整して #include ディレクティブを並べ替え、空の行で区切られた新しいディレクティブを作成することができました。 ReSharper C++ 2020.1 では、このアクションの構成をさらに調整できるように、2 つの新しい設定が追加されています。

  • 大文字と小文字を区別して並べ替える設定。
  • ディレクトリ別にヘッダーをグループ化する設定。

また、ReSharper | Options | Code Editing | General Formatter Settings ページの Read code style form .clang-format style チェックボックスがオンである場合、.clang-format ファイルの並べ替え設定をインポートできるようになりました。

その他の変更

ReSharper C++ 2020.1 には、そのほかにも注目すべき変更点がいくつかあります。

  • Generate ダイアログに、生成された getter と コンストラクタを C++17 の [[nodiscard]] 属性でマークするオプションが追加されました。
  • Generate mock functions は、GTest 1.10 に導入された MOCK_METHOD マクロをサポートしています。
  • 新しい Use named pipes to communicate with child processes 設定を使うと、セキュリティソフトウェアが原因で正しく動作していないユニットテストを修正できるようになりました。

さらに、ReSharper 自体の変更もあります。 たとえば、ユニットテストのセッションをエクスポート、インポートできるようになっています。

ReSharper C++ 2019.3

C++20のサポート

C++20のサポート

C++20はすべての機能が実装完了しており、C++開発者に待ち望まれている多数の機能を提供するために来年にも公式に承認される見込みです。 ReSharper C++ 2019.3ではすでにこれら多くの機能に対応しており、追加の解析と洞察による機能強化が行われています。

まず、ReSharper C++は集約を括弧で囲まれた値のリストから初期化できること、および関数テンプレートを使用する一部のケースで追加のADLを実行する必要があることを認識するようになりました。

ConceptはReSharper C++のパーサーでサポートされているだけでなく、RenameリファクタリングとFind Usagesも利用できます。 さらに良いことにはコード解析機能により、Concept関連のエラーについてより詳細な情報を取得することができます。 例えば、Conceptの要件が満たされていないためにオーバーロードの解決に失敗した場合、ツールチップに詳細な情報がすべて表示されます。 また、ReSharper 2019.3ではオーバーロードの解決失敗に関する情報を表示するツールチップに色を追加しました。

当社は新しい言語の機能とそのReSharper C++への採用について学ぶためにご利用いただけるC++20とReSharper C++に関するブログ投稿シリーズを開始しました。

コード解析とクイックフィックス

コード解析とクイックフィックス

Clangの警告が邪魔な場合、インスペクションメニューから警告を無効化できるようになりました。 また、Disable in file with commentを使用するだけで、ファイル内の同じようなすべての問題に対応するインスペクションをすべてのコードチェックで抑制できるようになりました。Disable all inspections in file with commentを使用すれば、ファイル内のすべてのインスペクションを抑制することもできます。

ラムダ式の本文を入力する際は、新しいクイックフィックスがラムダ式のキャプチャリストに変数を追加するのに役立ちます。 変数の追加は手動で行う必要はありません。ラムダ式の本文にある変数にキャレットを置き、Alt+Enterを押すだけです。 ReSharper C++は複数のキャプチャリストの更新方法を提案します。

Clang-Tidy

Clang-Tidy

このバージョンでは組み込みのClang-TidyバイナリをClang 9にアップグレードし、多数の新しいコードチェックとそれに伴う修正を提供しています。 重要なお知らせになりますが、バンドルされているバイナリはソースファイルの変更を妨げなくなりました。 また、Clang-Tidyは他のすべてのReSharper C++の解析が完了するのを待たないため、より高速に起動します。

Clang-Tidyの設定を複数の点で改善しました。

  • ReSharper C++で使用するClang-Tidy実行可能ファイルを3つのオプションから選択できるようになりました。 バンドルされているバイナリと設定で入力可能なカスタムバイナリのほか、%PATH%にあるものを選択できるようになりました(ReSharper C++%PATH%環境変数に記載されたフォルダを検索し、適切なものが見つかれば通知します)。
  • 以前使用されていたYAML/JSON形式の文字列の代わりに、指定のClang-Tidy構成ファイルをReSharper C++に参照させることができるようになりました。

型ヒント

ReSharper C++はコードの可読性向上に役立つコードに関するヒントを表示します。 バージョン2019.3に追加された次のような新しいコードヒントは、最新のC++コードを閲覧する際に分かりにくい可能性のある型を識別するのに役立ちます。

  • For auto variables(<0>auto変数)
  • In structured bindings(構造化バインディング)
  • For function and lambda return types(関数とラムダ式の戻り値の型)
Live templates(ライブテンプレート)

Live templates(ライブテンプレート)

ReSharper C++ 2019.3では、複数のライブテンプレートが対応する言語のキーワードに合わせて改名されました。 例えば、クラスを生成するにはclass(以前はcls)を入力し、構造の場合はstrの代わりにstructを使用します。共用体、列挙型、名前空間についても同様のロジックを使用します。

ナビゲーションの改善

ナビゲーションの改善

Go to File Member(ファイルメンバーに移動)に以下の2つの改善が行われました。

  • ダイアログがファイルの解析を待つことなく瞬時に表示されるようになりました。
  • 関数の宣言と定義が両方とも同じファイルにある場合、ダイアログはそれらを一度だけリストします。

初期化子リストでは、コードヒントが実際の初期化対象を詳しく把握するのに役立ちます。 また、波括弧で囲まれた初期化子リストの開き波括弧から集約クラスに移動できるようになりました。

コード解析とクイックフィックス

フォーマッタ

ReSharper C++ 2019.3では、フォーマット設定を.clang-formatファイルにエクスポートできるようになりました。 ReSharper | Options | Code Editing | General Formatter Style | Write current style to .clang-formatをご利用ください。

間隔を調整するためのフォーマッタオプションを2種類追加しました。

  • before ptr in abstract declaration(抽象宣言前のptr)
  • before ref in abstract declaration(抽象宣言前のref)

ReSharper C++ 2019.3では、コード内の#includesディレクティブの並び順をチェックできるようになりました。 並び順設定を行うだけで、対応するインスペクションとクイックフィックスが並び順が狂っているかどうかを通知し、すぐに並べ替えるのを支援します。

Unreal Engine 4のサポート

Unreal Engine 4のサポート

ReSharper C++はUnreal Engineプロジェクトが開発されていることを検出すると、UE4固有の機能への対応度を高めるように動作を調整します。

UCLASSesの「新しい」後置テンプレートは、適切なfactory関数呼び出し(作成されたオブジェクトをガベージコレクターに登録する)に対応しています。 USTRUCT/UCLASS/UENUM/UENUMCLASSを素早く生成するのに役立ち、それぞれに対応する名前を持つライブテンプレートをご利用いただけるようになりました。

Unreal Engineのスマートポインタ(TSharedPtr、TSharedRef、TWeakPtr、TUniquePtr)をstd::shared_ptr/std::unique_ptrと同様にReSharper C++で処理できるようになりました。 つまり、Parameter Info(パラメータ情報)、コード解析、Postfix code completion(後置コード補完)などの機能をスマートポインタに使用できます。

さらに、UE4プロジェクトに対して複数のパフォーマンス改善が行われました。 例えば、UE4のエディタで「Refresh Visual Studio Project」を実行した後にハングする問題を修正しました。

Project Properties(プロジェクトプロパティ)

Project Properties(プロジェクトプロパティ)

コンパイラツールチェーンをカスタマイズしている場合やカスタムビルドツールを使用している場合を考慮し、ReSharper C++ 2019.3ではReSharperのProject Properties(プロジェクトプロパティ)を追加しています。 これらのプロパティはReSharperの設定に保存され、以下を指定することができます。

  • Includeディレクトリ
  • プリプロセッサの定義
  • C++言語標準

パフォーマンスの改善

コードハイライトエンジンに複数の改善を行ったため、ハイライトの再表示が高速化されました。 関数の本文が変更されると、本文のみが再解析されます。

Find Usages(使用箇所の検索)がインクルードのグラフに基づいたヒューリスティックを追加することにより高速化されました。 これは、まったく使用されていないファイルを切り離すのに役立ちます。

その他の変更

ReSharperではその他の変更も行われています。 詳細はこちらをご覧ください。