Delen via


Visual Studio-editor uitbreiden met een nieuwe CodeLens

Er zijn verschillende typen CodeLenses die kunnen worden gemaakt. Elk type biedt een eigen unieke set functionaliteiten. In de volgende sectie wordt beschreven hoe u elk van deze typen CodeLenses opgeeft.

CodeLens voor tekstweergave

CodeLens voor tekstweergave biedt op tekst gebaseerde informatie aan codesegmenten. Dit zijn de eenvoudigste vormen van CodeLens. De volgende concepten laten zien hoe u een codelens voor tekstweergave maakt:

  • ICodeLensProvider interface is de belangrijkste interface die moet worden geïmplementeerd. Uw implementatie van deze interface bepaalt wanneer uw CodeLens wordt geactiveerd en op welke codesegmenten uw CodeLens van toepassing is en hoe deze wordt weergegeven.
  • Binnen uw implementatie van ICodeLensProvidermoet u definiëren wanneer de CodeLens moet worden geactiveerd door CodeLensProviderConfigurationte implementeren.
  • U moet ook de TryCreateCodeLensAsync-methode implementeren. Deze methode wordt aangeroepen wanneer uw CodeLens is geactiveerd. In deze methode kunt u definiëren hoe uw CodeLens moet worden weergegeven en wanneer deze moet worden weergegeven. Met deze methode wordt een exemplaar van CodeLensgeretourneerd.
  • U moet uw eigen subklasse van CodeLensmaken, waar u kunt definiëren hoe de weergavetekst moet worden weergegeven via de methode GetLabelAsync. Deze methode retourneert een exemplaar van CodeLensLabel, waarmee u de tekst, knopinfo en een optioneel pictogram kunt configureren.

Invokable CodeLens

Met Invokable CodeLens kunnen extensies bepaalde acties uitvoeren (bijvoorbeeld een eenheidstest uitvoeren) wanneer de gebruiker op de CodeLens klikt. Extensies kunnen bijdragen aan aanroepbare CodeLens door InvokableCodeLenste implementeren, die is afgeleid van CodeLens.

Visual CodeLens

Met Visual CodeLens kunnen extensies een aangepaste gebruikersinterface, zoals een lijst met verwijzingen naar een methode, weergeven in een pop-up boven de CodeLens wanneer de gebruiker op de CodeLens klikt. Extensies kunnen visuele CodeLens bijdragen door VisualCodeLenste implementeren, die is afgeleid van CodeLens. Net als bij marges bij tekstweergaven bieden Visual CodeLenses een gebruikersinterface door een RemoteUserControl en de bijbehorende gegevenssjabloon voor dat besturingselement te maken, omdat extensies in VisualStudio.Extensibility mogelijk buiten het Visual Studio-proces vallen. Hoewel er hieronder enkele eenvoudige voorbeelden zijn, raden we u aan de documentatie van de Remote UI te lezen bij het maken van de UI-inhoud van Visual CodeLens.

In de onderstaande voorbeeldcode ziet u hoe u een tekstweergave CodeLens en een aanroepbare CodeLens maakt:

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

Naast het configureren van de weergavenaam van de CodeLens-provider kunnen CodeLens-providers ook de prioriteit van hun CodeLens configureren. De prioriteitswaarde wordt gebruikt om de relatieve volgorde van uw CodeLens te bepalen die overeenkomt met andere CodeLenses. Dit wordt gedaan via de eigenschap Priority in het CodeLensProviderConfiguration-object.

CodeLenses visualiseren doorgaans enkele gegevens met betrekking tot de tekstweergave. Ze willen bijvoorbeeld het aantal verwijzingen naar een methode weergeven. Hiervoor moet uw CodeLens-provider ook luisteren naar gebeurtenissen voor tekstweergaven om te reageren op het openen, sluiten van tekstweergaven en typen door gebruikers.

Visual Studio maakt slechts één exemplaar van uw CodeLens-provider, ongeacht het aantal toepasselijke tekstweergaven dat een gebruiker opent. Dit betekent dat als uw CodeLens de status moet behouden, u ervoor moet zorgen dat uw CodeLens-provider een manier heeft om de status van momenteel geopende tekstweergaven te behouden.

Zie CodeLens-voorbeeldvoor meer informatie.

CodeLenses bijdragen aan nieuwe documenttypen (of bestaande documenttypen die CodeLens niet ondersteunen) wordt nog niet ondersteund.