次の方法で共有


新しい CodeLens を使用して Visual Studio エディターを拡張する

さまざまな 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>を作成できます。