ReSharper C++の新機能

ReSharper C++ 2020.1 には新機能が導入され、既存の一部の機能が更新されています。 主な改善点は、C++20 サポートの更新、コード補完の改善、および新しいコードインスペクションとクイックフィックスの追加です。 Reaarange Code や Complete Statement といった新しいコーディング支援機能を使うと、効率的にコードの記述と変更を行えます。 また、ReSharper C++ はゲーム開発者向けに HLSL の初期サポートを導入し、Unreal Engine ガイドラインとのより高い整合性を図っています。

ダウンロード

無料30日間体験版

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 自体の変更もあります。 たとえば、ユニットテストのセッションをエクスポート、インポートできるようになっています。

ダウンロード

無料30日間体験版

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ではその他の変更も行われています。 詳細はこちらをご覧ください。

ReSharper C++ 2019.2

起動時間の高速化

当社はこのリリースで、過去数回のリリースサイクルで続けてきた作業を完了させました。その結果、ReSharper C++内で新しいプリプロセッサ実装が使われるようになったことを正式にお知らせできるようになりました。 実際には2種類の実装があり、新しい実装はインデックス生成処理に、古い実装はその他すべてに使用されています。 この新しい実装により、LLVMおよびUnreal Engineのような一般的なソリューションでインデックス構築速度が15%~20%向上しました。

補完の概要ツールチップ

コード補完

コード補完の際、ReSharper C++は補完リスト内の各項目に対して概要のツールチップを表示します(ReSharperのオプション内にあるEnvironment | IntelliSense | Completion AppearanceページのShow summaryチェックボックスで設定できます)。 選択した補完項目の説明がカラー化され、対応する項目のドキュメントが表示されるようになりました。

コードヒント

コードヒント

コードの可読性を向上させるため、エディタに追加のコードヒントが実装されました。 プリプロセッサディレクティブの後および非定数の参照により渡される関数の引数に新しいヒントを導入しました。また、集約初期化式のヒントで初期化された基底クラスの名前が表示されるようになりました。

C++20のサポートを拡充

まもなくC++標準化委員会でC++20標準が承認される見込みです。 また、当社は当然ながら同標準に完全に準拠できるよう努めています。 ReSharper C++ 2019.2では新たに次の項目をサポートしています。

  • 条件付きexplicit
  • 新しいchar8_t
  • ラムダ式の初期化キャプチャでのパック展開
  • ステートレスなラムダ式をデフォルトで構築可能、代入可能とする
  • C++20の初期化ルール
  • constevalおよびconstinit指定子
  • C++20の構造化バインディング宣言に関する改善
入力支援

入力支援

複数行コメントでの入力支援が改良されました。 まず第一に、単一行形式の構文を使った複数行コメントが自動的に拡張されるようになりました。 第二に、複数行コメントを拡張する際に仮想行が有効であれば正しくインデントが挿入されるようになりました。

コードブロックを波括弧で囲むのが非常に簡単になりました。コードブロックや式を選択して、開き波括弧を入力するだけです。 あとは、ReSharper C++にお任せください。

フォーマッタ

フォーマッタ

ReSharper C++ 2019.2には、以下のような多数の新しいフォーマッタオプションが搭載されています。

  • 関数宣言と呼び出しの括弧で連続した行インデントを使用する。
  • 宣言の ")" の前で折り返す。
  • 呼び出しの ")" の前で折り返す。
  • 初期化子リストで連続した行インデントを使用する。
  • 初期化子リストの引数を揃える。
  • 初期化子リストの "{" の後で折り返す。
  • 初期化子リストの "{" の前で折り返す。

コード解析

さらに多くのコードの臭いを捕捉できるよう、次のような新しいインスペクションを実装しました。

  • 一致しないプリプロセッサディレクティブ。
  • 明示的にデフォルト化された特殊メンバー関数が暗黙的に削除されている。
  • 最終クラスに冗長なfinal関数指定子がある。

C-style cast used(Cスタイルのキャストを使用)インスペクション用のUse static_castフィックスは、一括で、またはコードクリーンアップの一部として実行できます。

ナビゲーション

ナビゲーション

コード内の移動アクションがより正確になりました。

  • Go to declarationを使用すると、オブジェクトが変数宣言や新しい式でデフォルト初期化されたときに呼び出されるデフォルトのコンストラクタに移動できます。
  • Find usagesはデフォルト初期化の際に、デフォルトコンストラクタの使用箇所を見つけます。
  • Go to symbolで修飾名を持つシンボル(クラス外の関数定義など)が非表示になりました。

また、Go to File memberダイアログで直接ファイルを検索することもできます。 結果リストには一致したすべてのメンバー名と、ファイル内での検索文字列の出現箇所がすべて表示されます。

Unreal Engine

当社は過去のリリースで、UE4固有のリモートプロシージャコールの対応強化に向けて作業を開始していました。 今回、RenameリファクタリングとChange Signatureリファクタリングを更新し、RPC関数に正しく適用できるようにしました。 UE4ベースのコードに対応した新しいコード解析チェックもいくつか追加しました。これらは特に、見つからない、または正しく設定されていないUE4のリフレクションマクロを対象としています。

バージョン2019.1で追加したリフレクション指定子のコード補完に続き、今回はそれらリフレクション指定子の組み込みドキュメントを追加しました。 このドキュメントは、キャレットが指定子の上にある場合にQuick Documentationポップアップ(Ctrl+Q)に表示されます。

その他の変更

ReSharper C++ 2019.2は、Visual Studio 2019で導入された「Per-Monitor DPI Awareness」モードの初期サポートを提供しています。 また、ReSharper | Options | Environment | Performance Guideページを更新し、Windows Defenderセクションのほか、パフォーマンスに関するあらゆるヒントの説明を追加しました。これにより、候補を適用した後の動作を正確に説明しています。

さらに、プラグイン作成者の皆様にも朗報があります。ReSharper C++のC++アセンブリがReSharper SDKに含まれるようになりました!