C# のソーステンプレート
従来、テンプレートまたはスニペットはソースコードの外部で保存および管理されていました。通常、テンプレートは汎用的な定型コードを迅速に生成するのに役立つため、これは理にかなっています。
ただし、現在のプロジェクトまたはソリューションにのみ関連する反復可能なコードを作成したい場合もあります。JetBrains Fleet を使用すると、ソーステンプレートを使用してこのようなタスクを効率化できます。
使い方
従来のテンプレートとは対照的に、ソーステンプレートは、拡張メソッドとしてプロジェクトのコードのどこにでも作成できます。プロジェクトの特定のタイプまたは標準タイプに対して定義できます。object
の拡張メソッドとして作成することにより、すべてのタイプでソーステンプレートを使用できるようにすることもできます。
テンプレートが定義されるとすぐに、対応する型とその継承のオブジェクトのコード補完リストで使用できるようになります。リストからテンプレートを選択すると、JetBrains Fleet はテンプレートメソッドの本体からコードをコードに挿入します。
以下は、ソーステンプレートの最も単純なアプリケーションを示す例です。テンプレート forEach
は、すべての汎用コレクションで使用できます。これはパラメーター this IEnumerable<T> x
によって定義されます。メソッド本体で指定されているように、コレクションを反復するコードを挿入します。プロジェクト内の任意の静的クラスでテンプレートを定義できます。JetBrains Fleet は、[SourceTemplate]
属性によってそれをテンプレートとして識別します。
このテンプレートをデプロイするために、任意のコレクションオブジェクトに対して自動補完を使用できるようになりました。

テンプレート項目を選択すると、オブジェクトはテンプレートテキストに置き換えられます。
テンプレート定義内の //$ $END$
コメントは、テンプレートの適用後のキャレット位置を定義する事前定義されたテンプレートパラメーターにほかならないことに注意してください。テンプレート内で他のパラメーターを使用すると、テンプレートをより柔軟にすることができます。
ソーステンプレートを使用する理由
上記のように、ソーステンプレートは、現在のプロジェクトまたはソリューションで再利用するコードブロックに最も役立ちます。従来のテンプレートに比べて、ソーステンプレートの利点を示すいくつかの点があります。
ソーステンプレートを操作するために、どこかに切り替える必要はありません。すべてがエディターにあります。
テンプレートは厳密に型指定されているため、関連するオブジェクトに対してのみ呼び出すことができます。
テンプレート定義がコンパイルされている限り、テンプレートコードにエラーがないことを確認できます。
ソーステンプレートの作成および編集中に、コードインスペクション、ナビゲーション機能、コード補完など、お気に入りの JetBrains Fleet 機能を自由に使用できます。
ソーステンプレートを作成する
ソーステンプレートの定義については、新しいクラスを作成するか、拡張メソッドを保持する既存の静的クラスを使用できます。
テンプレートメソッドとその本体
ソーステンプレートはパブリック拡張メソッドであり、[SourceTemplate]
属性を持っている必要があります。この属性は、[NotNull]
、[CanBeNull]
、その他のコードアノテーション属性とともに、JetBrains.Annotations
名前空間で定義されます。ソーステンプレートメソッドを定義するには、プロジェクトでコードアノテーションを有効にする必要があります。
テンプレート本体では、好きなことをするコードを書くことができます。通常は、呼び出し元オブジェクトで何かを行いますが、必ずしもそうする必要はありません。
また、テンプレートメソッドでコンパイルされないコードを使用する必要があります。例: ローカル変数の名前を生成するために呼び出し側オブジェクト名を使用することができます。この場合、このコードを '$' 記号で始まる行またはブロックコメントの中に配置します。
ターゲット式
ソーステンプレートが複雑な式を展開すると、デフォルトでは最新の部分のみがキャプチャーされます。式全体をキャプチャーする必要がある場合は、Target
プロパティと SourceTemplateTargetExpression.Outer
値を使用してこれを明示的に指定する必要があります。以下の例では、Sqrt
テンプレートが x+y
式全体に展開され、var sqrt = Math.Sqrt(x+y)
になります。

パラメーターとマクロ
ソーステンプレートでは、パラメーターとマクロを使用できます。パラメーターに使用するマクロに応じて、パラメーターを指定および使用するいくつかの方法から選択できます。
新しいパラメーターをテンプレートメソッドに追加することで、テンプレートパラメーターを作成できます。デフォルトでは、編集可能なパラメーターとして動作します。つまり、テンプレートを適用するときにホットスポットセッション中にフォーカスを受け取ります。このパラメーターのマクロを定義する場合は、以下の例に示すように
[Macro]
属性を追加する必要があります。属性の
Expression
プロパティは、使用するマクロを定義します。使用可能なテンプレートマクロの 1 つを指定できます。Editable
プロパティは、テンプレートが適用されたときにユーザーがパラメーターを編集できるかどうかをオプションで指定します。デフォルトでは、すべてのユーザー定義パラメーターは編集可能です。値-1
は、パラメーターを編集不可にします。テンプレートで同じパラメーターが複数回使用されている場合、テンプレートが適用されたときに編集できるのは 1 回だけです。他の出現箇所は同期的に変更されます。必要に応じて、「編集可能」プロパティでゼロベースのインデックスを指定することにより、編集可能になる出現箇所を定義できます。
[SourceTemplate] public static void newGuid(this object obj, [Macro(Expression = "guid()", Editable = -1)] string newguid) { Console.WriteLine(newguid); }テンプレートメソッドのローカル変数をテンプレートパラメーターに変換できます。これを行うには、
[Macro]
属性をテンプレートメソッド定義に追加し、Target
プロパティで変数名を指定する必要があります。例:[SourceTemplate] [Macro(Target = "item", Expression = "suggestVariableName()")] public static void forEach<T>(this IEnumerable<T> collection) { foreach (var item in collection) { //$ $END$ } }他の JetBrains Fleet テンプレートと同じように、事前定義パラメーターとすべてのユーザー定義パラメーターを使用し、パラメーター識別子を 2 つの
$
記号$param_name$
でラップします。文字列リテラル内にユーザ定義のテンプレートパラメーターを使用することができます(例:
Console.WriteLine("A random GUID: $newguid$");文字列リテラルの外部でテンプレートパラメーターを使用するには、
$
記号で始まる特別なテンプレートコメントに配置する必要があります://$ $param_name$
または/*$ $param_name$ */
例:[SourceTemplate] [Macro(Target = "newguid", Expression = "guid()", Editable = -1)] public static void newGuid(this object obj) { //$ var guid = "$newguid$"; Console.WriteLine("A random GUID: $newguid$"); }呼び出し元オブジェクト、およびメソッドパラメーターとローカル変数として作成されたテンプレートパラメーターは、特別なテンプレートコメント内の
$
記号の有無にかかわらず使用できます。
ソーステンプレートを適用する
ソーステンプレートを適用するには、まずテンプレートがスコープ内にあることを確認してください。つまり、同じ名前空間にいるか、テンプレートの名前空間が明示的にインポートされています。
ソーステンプレートからコードフラグメントを作成する
テンプレートをデプロイする場所にキャレットを置きます。
テンプレートをデプロイするオブジェクトを入力し、ドットを入力して、テンプレートの名前またはそのキャメルハンプ省略形の入力を開始します。
補完リストでテンプレートを選択してクリックするか、Enter を押します。
呼び出し元オブジェクト、ドット、入力したテンプレート名の一部は、テンプレート本体に置き換えられます。
テンプレートに編集可能なパラメーターがある (つまり、ユーザー入力が必要な) 場合、JetBrains Fleet はエディターにホットスポットセッションをデプロイし、最初のパラメーターに入力位置を設定します。次に下記のことができます。
JetBrains Fleet が現在のパラメーターの値を提案する場合は、Up および Down 矢印キーを使用して、提案される値のリスト内を移動するか、目的の値を入力します。
Tab または Enter を押して値を受け入れ、次のパラメーターの入力位置に移動します。これが最後のパラメーターである場合、ホットスポットセッションは完了し、キャレットはセッション用に定義された終了位置に移動します。
Shift+Tab を押すと、入力フォーカスが前のパラメーターの入力位置に移動します。
Esc を押してホットスポットセッションを終了します。この場合、すべてのセッションパラメーターはデフォルト値で初期化されます。
関連ページ:

スマートモード
Fleet は、軽量テキストエディターとしても、インテリジェントコードエディターとしても機能します。システムリソースを最適化するために、リソースを大量に消費する機能は必要な場合にのみ有効になります。スマートモードを有効にすると、個々のファイルまたは複数のファイルを含むフォルダーをシームレスに操作できます。スマートモードを有効にする右上隅にあるスマートモードのステータスアイコンをクリックします。表示されるポップアップで、「有効にする」をクリックします。準備作業が完了するまで待つ必要がある場合があり...

アノテーションを使用して C# のコードインスペクションを改善する
コード検査およびその他の多くの JetBrains Fleet 機能は、問題を検出し、改善の可能性を提案し、他の方法で役立つように、言語構造の動作を知ることに主に依存しています。ただし、この種の分析ではすべてを検出できるわけではありません。例: メソッドがフォーマットメソッドとして設計されている場合、メソッドの呼び出しに必要な引数が含まれていない場合、構造解析では潜在的な問題は見つかりません。このような場合や他の多くの場合、JetBrains Fleet のが非常に役立ちます。このフレームワーク...