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, implementandoCodeLensProviderConfiguration
. - 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 deCodeLens
. - 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étodoGetLabelAsync
. Este método retorna uma instância deCodeLensLabel
, 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>
.