Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Puede crear varios tipos de CodeLens. 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 CodeLens.
Vista de texto CodeLens
Una vista de texto CodeLens proporciona información basada en texto para segmentos de código y es la forma más sencilla de CodeLens. Los conceptos siguientes muestran cómo crear una vista de texto CodeLens:
- La
ICodeLensProvider
interfaz es la interfaz principal que se va a implementar. La implementación de esta interfaz define cuándo se activa CodeLens, a qué segmentos de código se aplica CodeLens y a cómo se muestra. - En su implementación de
ICodeLensProvider
, debe definir cuándo se debe activar el CodeLens mediante la implementación deCodeLensProviderConfiguration
. - También debe implementar el método
TryCreateCodeLensAsync
. Este método se ejecuta cuando se activa CodeLens. En este método, puede definir cómo y cuándo desea que se muestre codeLens. Este método devuelve una instancia deCodeLens
. - Debe crear su propia subclase de
CodeLens
, donde podrá definir cómo desea que el texto para mostrar aparezca a través delGetLabelAsync
método . Este método devuelve una instancia deCodeLensLabel
, que puede usar para configurar el texto, una información sobre herramientas y un icono opcional.
CodeLens invocable
Un CodeLens invocable permite que las extensiones realicen alguna acción (por ejemplo, ejecutar una prueba unitaria) cuando el usuario selecciona CodeLens. Las extensiones pueden contribuir a un CodeLens invocable mediante la implementación de InvokableCodeLens
, que deriva de CodeLens
.
Visual CodeLens
Un CodeLens visual permite que las extensiones proporcionen una interfaz de usuario personalizada, como una lista de referencias a un método, para aparecer en un elemento emergente sobre la CodeLens cuando el usuario selecciona la CodeLens. Las extensiones pueden contribuir con un CodeLens visual mediante la implementación de VisualCodeLens
, que deriva de CodeLens
.
De forma similar a los márgenes de vista de texto, dado que las extensiones en VisualStudio.Extensibility
podrían estar separadas del proceso de Visual Studio, un CodeLens visual proporciona una interfaz de usuario mediante la creación de un RemoteUserControl
y la plantilla de datos correspondiente para ese control. En las secciones siguientes se muestran algunos ejemplos sencillos. Se recomienda leer la documentación de la interfaz de usuario remota al crear contenido visual de la interfaz de usuario de CodeLens.
En el código de ejemplo siguiente se 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 los nombres para mostrar del proveedor de CodeLens, los proveedores de CodeLens también pueden configurar la prioridad de sus CodeLens. El valor de prioridad se usa para determinar el orden relativo de tu CodeLens en relación con cualquier otro CodeLens. Puede establecer el orden a través de la Priority
propiedad en el CodeLensProviderConfiguration
objeto .
Normalmente, CodeLens visualiza algunos datos relacionados con la vista de texto. Por ejemplo, puede que quiera mostrar el número de referencias a un método. Para ello, el proveedor de CodeLens también debe escuchar eventos de vista de texto para reaccionar a la apertura y cierre de vistas de texto y escritura del usuario.
Visual Studio crea solo una instancia del proveedor de CodeLens independientemente del número de vistas de texto aplicables que abre un usuario. Por lo tanto, si CodeLens necesita mantener el estado, debe asegurarse de que el proveedor de CodeLens tiene una manera de mantener el estado de las vistas de texto abiertas actualmente.
Para obtener más información, consulte Ejemplo de CodeLens.
Si un proveedor de CodeLens tiene que hacer referencia a elementos de código que una característica de Visual Studio existente aún no ha etiquetado, puede crear un nuevo tagger mediante la implementación de ITextViewTaggerProvider<CodeLensTag>
.