Utöka Visual Studio-redigeraren med en ny CodeLens
Det finns olika typer av codelenses som kan skapas. Varje typ erbjuder sin egen unika uppsättning funktioner. I följande avsnitt beskrivs hur du tillhandahåller var och en av dessa typer av codelenses.
Textvisning CodeLens
Textvisning CodeLens ger textbaserad information till kodsegment. Det här är de enklaste formerna av CodeLens. Följande begrepp visar hur du skapar en textvy med CodeLens:
-
ICodeLensProvider
gränssnitt är huvudgränssnittet som ska implementeras. Implementeringen av det här gränssnittet definierar när dina CodeLens ska aktiveras och vilka kodsegment som codeLens ska gälla för och hur de ska visas. - I implementeringen av
ICodeLensProvider
måste du definiera när CodeLens ska aktiveras genom att implementeraCodeLensProviderConfiguration
. - Du måste också implementera metoden
TryCreateCodeLensAsync
. Den här metoden anropas när CodeLens aktiveras. I den här metoden kan du definiera hur du vill att CodeLens ska visas och när den ska visas. Den här metoden returnerar en instans avCodeLens
. - Du måste skapa en egen underklass av
CodeLens
, där du får definiera hur du vill att visningstexten ska visas via metodenGetLabelAsync
. Den här metoden returnerar en instans avCodeLensLabel
, som du kan använda för att konfigurera text, knappbeskrivning och en valfri ikon.
Anropsbara CodeLens
Med anropande CodeLens kan tillägg utföra vissa åtgärder (t.ex. köra ett enhetstest) när användaren klickar på CodeLens. Tillägg kan bidra med anropbar CodeLens genom att implementera InvokableCodeLens
, som härleds från CodeLens
.
Visual CodeLens
Med Visual CodeLens kan tillägg tillhandahålla anpassat användargränssnitt, till exempel en lista med referenser till en metod, som ska visas i ett popup-fönster ovanför CodeLens när användaren klickar på CodeLens. Tillägg kan bidra med visuella CodeLens genom att implementera VisualCodeLens
, som härleds från CodeLens
. Precis som textvyernas marginaler, eftersom tillägg i VisualStudio.Extensibility kan vara utanför Visual Studio-processen, ger visuella CodeLenses användargränssnitt genom att skapa en RemoteUserControl
och motsvarande datamall för den kontrollen. Även om det finns några enkla exempel nedan rekommenderar vi att du läser dokumentationen om remote UI när du skapar det visuella CodeLens-användargränssnittet.
Exempelkoden nedan demonstrerar hur du skapar en TextView CodeLens och en anropbar CodeLens:
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",
});
}
}
Förutom att konfigurera CodeLens-providerns visningsnamn kan CodeLens-leverantörer också konfigurera prioriteten för sina CodeLens. Prioritetsvärdet används för att fastställa den relativa ordningen för dina CodeLens jämfört med andra CodeLenses. Detta görs via egenskapen Priority
i objektet CodeLensProviderConfiguration
.
CodeLenses visualiserar vanligtvis vissa data som är relaterade till textvyn. De kanske till exempel vill visa antalet referenser till en metod. För att göra det bör CodeLens-providern också lyssna på textvisningshändelser för att reagera på öppning och stängning av textvyer samt användarskrivning.
Visual Studio skapar bara en instans av CodeLens-providern oavsett hur många tillämpliga textvyer en användare öppnar. Det innebär att om dina CodeLens behöver behålla tillståndet måste du se till att CodeLens-providern har ett sätt att behålla tillståndet för för närvarande öppna textvyer.
Mer information finns i CodeLens Sample.
Att bidra med kodlinser till nya dokumenttyper (eller befintliga dokumenttyper som inte stöder CodeLens) stöds ännu inte.