Compartir a través de


Extensión del editor de Visual Studio con un nuevo CodeLens

Hay diferentes tipos de CodeLenses que se pueden crear. Cada tipo ofrece su propio conjunto único de funcionalidades. En la sección siguiente se detalla cómo proporcionar cada uno de estos tipos de CodeLenses.

Vista de texto CodeLens

La vista de texto CodeLens proporciona información basada en texto a segmentos de código. Esta es la forma más sencilla de CodeLens. Los conceptos siguientes muestran cómo crear una vista de texto CodeLens:

  • La interfaz ICodeLensProvider es la interfaz principal a implementar. La implementación de esta interfaz definirá cuándo se activará CodeLens y a qué segmentos de código se aplicará CodeLens y a qué modo se mostrará.
  • Dentro de la implementación de ICodeLensProvider, deberá definir cuándo se debe activar CodeLens mediante la implementación de CodeLensProviderConfiguration.
  • También deberá implementar el método TryCreateCodeLensAsync. Este método se invocará cuando se active CodeLens. En este método, puede definir cómo desea que se muestre su CodeLens y cuándo se debe mostrar. Este método devuelve una instancia de CodeLens.
  • Deberá crear su propia subclase de CodeLens, donde podrá definir cómo desea que aparezca el texto para mostrar a través del método GetLabelAsync. Este método devuelve una instancia de CodeLensLabel, que puede utilizar para configurar el texto, el tooltip y un icono opcional.

CodeLens invocable

CodeLens invocable permite que las extensiones realicen alguna acción (por ejemplo, ejecutar una prueba unitaria) cuando el usuario hace clic en CodeLens. Las extensiones pueden contribuir con CodeLens invocable mediante la implementación de InvokableCodeLens, que deriva de CodeLens.

Visual CodeLens

Visual CodeLens permite a las extensiones proporcionar una interfaz de usuario personalizada, como una lista de referencias a un método, que se mostrará en un elemento emergente encima de CodeLens cuando el usuario hace clic en CodeLens. Las extensiones pueden contribuir al objeto visual CodeLens mediante la implementación de VisualCodeLens, que deriva de CodeLens. De forma similar a los márgenes de la vista de texto, dado que las extensiones de VisualStudio.Extensibility podrían estar fuera del proceso de Visual Studio, visual CodeLenses proporcionan una interfaz de usuario mediante la creación de un RemoteUserControl y la plantilla de datos correspondiente para ese control. Aunque hay algunos ejemplos sencillos a continuación, recomendamos leer la documentación de la interfaz de usuario remota de al crear contenido visual de la interfaz de usuario de CodeLens.

El código de ejemplo siguiente muestra cómo crear una vista de texto CodeLens y codeLens invocable:

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

Además de configurar el nombre para mostrar del proveedor de Code Lens, los proveedores también pueden ajustar la prioridad de su Code Lens. El valor de prioridad se utiliza para determinar el orden relativo de las Code Lenses respecto a otras Code Lenses. Esto se realiza a través de la propiedad Priority en el objeto CodeLensProviderConfiguration.

CodeLens normalmente visualizan algunos datos relacionados con el visor de texto. Por ejemplo, es posible que quieran mostrar el número de referencias a un método. Para ello, el proveedor de Code Lens también debe escuchar eventos de vista de texto para reaccionar a la apertura, el cierre de las vistas de texto y la escritura del usuario.

Visual Studio crea solo una instancia de su proveedor de CodeLens, sin importar cuántas vistas de texto aplicables un usuario abra. Esto significa que si CodeLens necesita mantener el estado, debe asegurarse de que el proveedor de CodeLens dispone de un mecanismo para mantener el estado de las vistas de texto abiertas actualmente.

Para obtener más información, consulte el ejemplo de Code Lens.

No se admite la contribución de CodeLens a nuevos tipos de documentos (o a tipos de documentos existentes que no admiten CodeLens).