Extension de l’éditeur Visual Studio avec un nouveau CodeLens
Il existe différents types de CodeLenses qui peuvent être créés. Chaque type offre son propre ensemble unique de fonctionnalités. La section suivante explique comment fournir chacun de ces types de CodeLenses.
Affichage texte CodeLens
L’affichage texte CodeLens fournit des informations textuelles aux segments de code. Il s’agit des formes les plus simples de CodeLens. Les concepts suivants illustrent comment créer un affichage texte CodeLens :
ICodeLensProvider
interface est l’interface principale à implémenter. Votre implémentation de cette interface définit quand votre CodeLens sera activé et quels segments de code votre CodeLens s’appliqueront et comment ils seront affichés.- Dans votre implémentation de
ICodeLensProvider
, vous devez définir quand CodeLens doit être activé en implémentantCodeLensProviderConfiguration
. - Vous devez également implémenter la méthode
TryCreateCodeLensAsync
. Cette méthode est appelée lorsque votre CodeLens est activé. Dans cette méthode, vous pouvez définir la façon dont vous souhaitez que votre CodeLens soit affiché et quand il doit être affiché. Cette méthode retourne une instance deCodeLens
. - Vous devez créer votre propre sous-classe de
CodeLens
, où vous devez définir la façon dont vous souhaitez que votre texte d’affichage apparaisse via la méthodeGetLabelAsync
. Cette méthode retourne une instance deCodeLensLabel
, que vous pouvez utiliser pour configurer le texte, l’info-bulle et une icône facultative.
CodeLens pouvant être appelé
L’appel de CodeLens invokable permet aux extensions d’effectuer une action (par exemple, exécuter un test unitaire) lorsque l’utilisateur clique sur CodeLens. Les extensions peuvent contribuer à rendre CodeLens invocable en implémentant InvokableCodeLens
, qui dérive de CodeLens
.
CodeLens visuel
Visual CodeLens permet aux extensions de fournir une interface utilisateur personnalisée, comme une liste de références à une méthode, d’être affichées dans une fenêtre contextuelle au-dessus de CodeLens lorsque l’utilisateur clique sur CodeLens. Les extensions peuvent contribuer au codeLens visuel en implémentant VisualCodeLens
, qui dérive de CodeLens
. Comme pour les marges d’affichage de texte, étant donné que les extensions dans VisualStudio.Extensibility peuvent être hors processus à partir de Visual Studio, visual CodeLenses fournit une interface utilisateur en créant un RemoteUserControl
et le modèle de données correspondant pour ce contrôle. Bien qu’il existe quelques exemples simples ci-dessous, nous vous recommandons de lire la documentation de l’UI distante lors de la création du contenu visuel de l’interface utilisateur de CodeLens.
L’exemple de code ci-dessous montre comment créer un affichage texte CodeLens et un CodeLens invoqueable :
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",
});
}
}
Outre la configuration du nom d'affichage du fournisseur CodeLens, les fournisseurs CodeLens peuvent également configurer la priorité de leur CodeLens. La valeur de priorité est utilisée pour déterminer l’ordre relatif de vos CodeLens par rapport à d'autres CodeLens. Cette opération s’effectue via la propriété Priority
dans l’objet CodeLensProviderConfiguration
.
CodeLenses visualise généralement certaines données liées à la vue de texte. Par exemple, ils peuvent souhaiter afficher le nombre de références à une méthode. Pour ce faire, votre fournisseur CodeLens doit également écouter les événements d’affichage de texte et réagir à l’ouverture, à la fermeture des vues de texte et à la saisie par l’utilisateur.
Visual Studio crée une seule instance de votre fournisseur CodeLens, quel que soit le nombre d’affichages de texte applicables qu’un utilisateur ouvre. Cela signifie que si votre CodeLens doit maintenir l’état, vous devez vous assurer que votre fournisseur CodeLens a un moyen de conserver l’état des vues de texte actuellement ouvertes.
Pour plus d’informations, consultez l'exemple CodeLens .
La contribution de CodeLenses à de nouveaux types de documents (ou à des types de documents existants ne prenant pas en charge CodeLens) n’est pas encore prise en charge.