Condividi tramite


Estensione dell'editor di Visual Studio con un nuovo CodeLens

È possibile creare diversi tipi di CodeLenses. Ogni tipo offre un proprio set univoco di funzionalità. La sezione seguente illustra in dettaglio come specificare ognuno di questi tipi di CodeLenses.

Visualizzazione testo CodeLens

Le visualizzazioni di testo di CodeLens forniscono informazioni basate su testo ai segmenti di codice e sono le forme più semplici di CodeLens. I concetti seguenti illustrano come creare una visualizzazione di testo CodeLens:

  • ICodeLensProvider è l'interfaccia principale da implementare. L'implementazione di questa interfaccia definisce quando CodeLens si attiverà e a quali segmenti di codice si applica CodeLens e a come verrà visualizzato.
  • All'interno dell'implementazione di ICodeLensProviderè necessario definire quando codeLens deve essere attivato implementando CodeLensProviderConfiguration.
  • È anche necessario implementare il metodo TryCreateCodeLensAsync. Questo metodo verrà eseguito quando CodeLens viene attivato. In questo metodo è possibile definire come visualizzare CodeLens e quando deve essere visualizzato. Questo metodo restituisce un'istanza di CodeLens.
  • Devi creare una tua sottoclasse di CodeLens, dove puoi definire come desideri che appaia il tuo testo tramite il metodo GetLabelAsync. Questo metodo restituisce un'istanza di CodeLensLabel, che si può usare per configurare il testo, il tooltip e un'icona opzionale.

CodeLens richiamabile

CodeLens richiamabile consente alle estensioni di eseguire alcune azioni(ad esempio, eseguire uno unit test) quando l'utente fa clic su CodeLens. Le estensioni possono contribuire a creare un CodeLens invocabile implementando InvokableCodeLens, che deriva da CodeLens.

Visual CodeLens

Visual CodeLens consente alle estensioni di fornire un'interfaccia utente personalizzata, ad esempio un elenco di riferimenti a un metodo, da visualizzare in un popup sopra CodeLens quando l'utente fa clic su CodeLens. Le estensioni possono contribuire a visual CodeLens implementando VisualCodeLens, che deriva da CodeLens. Analogamente ai margini della visualizzazione del testo, siccome le estensioni in VisualStudio.Extensibility potrebbero operare fuori processo rispetto a Visual Studio, i codici visivi CodeLenses forniscono l'interfaccia utente creando un controllo RemoteUserControl e il relativo modello di dati per tale controllo. Anche se esistono alcuni semplici esempi nelle sezioni seguenti, è consigliabile leggere la documentazione dell'interfaccia utente remota durante la creazione del contenuto dell'interfaccia utente di Visual CodeLens.

Il codice di esempio seguente illustra come creare una visualizzazione di testo CodeLens e un codeLens richiamabile:

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",
        });
    }
}

Oltre a configurare il nome visualizzato del provider CodeLens, i provider CodeLens possono anche configurare la priorità del proprio CodeLens. Il valore di priorità viene usato per determinare l'ordinamento relativo dell'oggetto CodeLens rispettivamente ad altri CodeLenses, che possono essere impostati tramite la proprietà Priority nell'oggetto CodeLensProviderConfiguration.

CodeLenses visualizza in genere alcuni dati correlati alla visualizzazione testo. Ad esempio, potrebbero voler visualizzare il numero di riferimenti a un metodo. A tale scopo, il provider CodeLens deve anche ascoltare gli eventi delle visualizzazioni del testo per reagire all'apertura e alla chiusura delle visualizzazioni di testo e alla digitazione dell'utente.

Visual Studio crea solo un'istanza del provider CodeLens indipendentemente dal numero di visualizzazioni di testo applicabili che un utente apre. Ciò significa che se CodeLens deve mantenere lo stato, è necessario assicurarsi che il provider CodeLens abbia un modo per mantenere lo stato delle visualizzazioni di testo attualmente aperte.

Per ulteriori informazioni, vedere Codice di esempio CodeLens.

Se un provider Code Lens deve fare riferimento a elementi di codice che non sono già contrassegnati da una funzionalità di Visual Studio esistente, è possibile creare un nuovo tagger implementando ITextViewTaggerProvider<CodeLensTag>.