さまざまな CodeLens 型を作成できます。 各型には、独自の一意の機能セットが用意されています。 次のセクションでは、これらの CodeLens の各種類を指定する方法について説明します。
テキスト ビュー CodeLens
テキスト ビュー CodeLens は、コードのセグメントにテキスト ベースの情報を提供し、最も単純な形式の CodeLens です。 次の概念は、テキスト ビュー CodeLens を作成する方法を示しています。
-
ICodeLensProvider
インターフェイスは、実装するメイン インターフェイスです。 このインターフェイスの実装では、CodeLens がアクティブ化されるタイミング、CodeLens が適用されるコードのセグメント、および表示方法を定義します。 -
ICodeLensProvider
の実装内で、CodeLensProviderConfiguration
を実装して CodeLens をアクティブ化するタイミングを定義する必要があります。 - また、
TryCreateCodeLensAsync
メソッドを実装する必要があります。 このメソッドは、CodeLens がアクティブになったときに実行されます。 このメソッドでは、CodeLens を表示する方法とタイミングを定義できます。 このメソッドは、CodeLens
のインスタンスを返します。 -
CodeLens
の独自のサブクラスを作成する必要があります。ここでは、GetLabelAsync
メソッドを使用して表示テキストを表示する方法を定義します。 このメソッドはCodeLensLabel
のインスタンスを返します。このインスタンスを使用して、テキスト、ヒント、およびオプションのアイコンを構成できます。
呼び出し可能な CodeLens
呼び出し可能な CodeLens を使用すると、ユーザーが CodeLens を選択したときに、拡張機能で何らかのアクション (単体テストの実行など) を実行できます。 拡張機能は、InvokableCodeLens
から派生するCodeLens
を実装することで、呼び出し可能な CodeLens を提供できます。
Visual CodeLens (ビジュアル コードレンズ)
Visual CodeLens を使用すると、ユーザーが CodeLens を選択したときに CodeLens の上のポップアップに表示されるカスタム UI (メソッドへの参照の一覧など) を拡張機能で提供できます。 拡張機能は、VisualCodeLens
から派生したCodeLens
を実装することで、視覚的な CodeLens を提供できます。
テキスト ビューの余白と同様に、 VisualStudio.Extensibility
の拡張機能が Visual Studio から処理されなくなるため、Visual CodeLens は、そのコントロールの RemoteUserControl
と対応するデータ テンプレートを作成することによって UI を提供します。 次のセクションでは、いくつかの簡単な例を示します。 Visual CodeLens UI コンテンツを作成するときは、 リモート UI のドキュメント を参照することをお勧めします。
次のサンプル コードは、テキスト ビュー CodeLens と呼び出し可能な CodeLens を作成する方法を示しています。
public TextViewExtensionConfiguration TextViewExtensionConfiguration => new()
{
AppliesTo = new[]
{
DocumentFilter.FromDocumentType(DocumentType.KnownValues.Code),
},
};
public CodeLensProviderConfiguration CodeLensProviderConfiguration =>
new("CodeLens Sample Provider") {};
public Task<CodeLens?> TryCreateCodeLensAsync(CodeElement codeElement, CodeElementContext codeElementContext, CancellationToken token)
{
if (codeElement.Kind == CodeElementKind.KnownValues.Method)
{
return Task.FromResult<CodeLens?>(new ClickableCodeLens(codeElement, this.Extensibility));
}
return Task.FromResult<CodeLens?>(new WordCountCodeLens(codeElement, codeElementContext, this.Extensibility, this));
}
...
public class ClickableCodeLens : InvokableCodeLens
{
public override Task ExecuteAsync(CodeElementContext codeElementContext, IClientContext clientContext, CancellationToken cancelToken)
{
this.clickCount++;
this.Invalidate();
return Task.CompletedTask;
}
public override Task<CodeLensLabel> GetLabelAsync(CodeElementContext codeElementContext, CancellationToken token)
{
return Task.FromResult(new CodeLensLabel()
{
Text = this.clickCount == 0 ? "Click me" : $"Clicked {this.clickCount} times",
Tooltip = "Invokable CodeLens Sample Tooltip",
});
}
}
public class WordCountCodeLens : VisualCodeLens
{
public override Task<IRemoteUserControl> GetVisualizationAsync(CodeElementContext codeElementContext, IClientContext clientContext, CancellationToken token)
{
return Task.FromResult<IRemoteUserControl>(new WordCountCodeLensVisual(this.wordCountData));
}
public override Task<CodeLensLabel> GetLabelAsync(CodeElementContext codeElementContext, CancellationToken token)
{
this.wordCountData.WordCount = CountWords(codeElementContext.Range);
return Task.FromResult(new CodeLensLabel()
{
Text = $"Words: {this.wordCountData.WordCount}",
Tooltip = "Number of words in this code element",
});
}
}
CodeLens プロバイダーの表示名を構成するだけでなく、CodeLens プロバイダーは CodeLens の優先順位を構成することもできます。 あなたの CodeLens と他の CodeLens の相対的な順序を決定するために、優先度の値が使用されます。 順序は、Priority
オブジェクトの CodeLensProviderConfiguration
プロパティを使用して設定できます。
CodeLens は通常、テキスト ビューに関連するいくつかのデータを視覚化します。 たとえば、メソッドへの参照の数を表示できます。 これを行うには、CodeLens プロバイダーも テキスト ビュー イベントをリッスンして、テキスト ビュー とユーザー入力の開始と終了に対応する必要があります。
Visual Studio では、ユーザーが開く適用可能なテキスト ビューの数に関係なく、CodeLens プロバイダーのインスタンスが 1 つだけ作成されます。 そのため、CodeLens が状態を維持する必要がある場合は、CodeLens プロバイダーが現在開いているテキスト ビューの状態を維持する方法があることを確認する必要があります。
詳細については、 CodeLens サンプルを参照してください。
CodeLens プロバイダーが、既存の Visual Studio 機能にまだタグ付けされていないコード要素を参照する必要がある場合は、を実装することで新しいITextViewTaggerProvider<CodeLensTag>
を作成できます。