Partilhar via


Estendendo o editor do Visual Studio com um novo CodeLens

Existem diferentes tipos de CodeLenses que podem ser criados. Cada tipo oferece o seu próprio conjunto único de funcionalidades. A seção a seguir detalha como fornecer cada um desses tipos de CodeLenses.

Visualização de texto CodeLens

Visualizações de texto do CodeLens fornecem informações textuais para segmentos de código e são as formas mais simples de CodeLens. Os conceitos a seguir ilustram como criar um CodeLens de exibição de texto:

  • ICodeLensProvider interface é a interface principal a implementar. Sua implementação dessa interface define quando o CodeLens será ativado, a quais segmentos de código o CodeLens se aplica e como ele será exibido.
  • Dentro da sua implementação de ICodeLensProvider, você precisa definir quando o CodeLens deve ser ativado, implementando CodeLensProviderConfiguration.
  • Você também precisa implementar o método TryCreateCodeLensAsync. Este método será executado quando o seu CodeLens for ativado. Nesse método, você pode definir como deseja que seu CodeLens seja exibido e quando ele deve ser exibido. Esse método retorna uma instância de CodeLens.
  • Você precisa criar sua própria subclasse de CodeLens, onde você pode definir como deseja que seu texto de exibição apareça através do método GetLabelAsync. Este método retorna uma instância de CodeLensLabel, que pode ser usada para configurar o texto, o tooltip e um ícone opcional.

CodeLens invocável

Invokable CodeLens permite que as extensões executem alguma ação (por exemplo, executar um teste de unidade) quando o usuário clica no CodeLens. As extensões podem contribuir com CodeLens invocável implementando InvokableCodeLens, que deriva de CodeLens.

Visual CodeLens (Ferramenta de Visualização de Código)

O Visual CodeLens permite que as extensões forneçam uma interface do usuário personalizada, como uma lista de referências a um método, para ser exibida em um pop-up acima do CodeLens quando o usuário clica no CodeLens. As extensões podem contribuir com o CodeLens visual implementando VisualCodeLens, que deriva de CodeLens. Semelhante às margens de exibição de texto, porque as extensões no VisualStudio.Extensibility podem estar fora do processo do Visual Studio, o Visual CodeLenses fornece interface do usuário criando um RemoteUserControl e o modelo de dados correspondente para esse controle. Embora existam alguns exemplos simples nas seções a seguir, recomendamos a leitura da documentação da UI Remota ao criar conteúdo visual da UI do CodeLens.

O código de exemplo a seguir demonstra como criar um CodeLens de exibição de texto e um CodeLens invocável:

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

Além de configurar o nome de exibição do provedor do CodeLens, os provedores do CodeLens também podem configurar a prioridade de seu CodeLens. O valor de prioridade é usado para determinar a ordem relativa do seu CodeLens em relação a outros CodeLenses, que pode ser definida através da propriedade Priority no objeto CodeLensProviderConfiguration.

CodeLenses normalmente visualizam alguns dados relacionados à exibição de texto. Por exemplo, eles podem querer exibir o número de referências a um método. Para fazer isso, o seu provedor de CodeLens também deve ouvir eventos de vistas de texto para reagir à abertura, ao fechamento de vistas de texto e à digitação do utilizador.

O Visual Studio cria apenas uma instância do seu provedor CodeLens, independentemente de quantas exibições de texto aplicáveis um usuário abre. Isso significa que, se o CodeLens precisar manter o estado, você precisará garantir que seu provedor do CodeLens tenha uma maneira de manter o estado das exibições de texto abertas no momento.

Para obter mais informações, consulte CodeLens Sample.

Se um provedor do Code Lens tiver que fazer referência a elementos de código que ainda não estão sendo marcados por um recurso existente do Visual Studio, poderá criar um novo tagger implementando ITextViewTaggerProvider<CodeLensTag>.