Rozszerzanie edytora programu Visual Studio za pomocą nowej funkcji CodeLens
Istnieją różne typy CodeLenses, które można utworzyć. Każdy typ oferuje własny unikatowy zestaw funkcji. W poniższej sekcji opisano, jak dostarczyć każdy z tych typów CodeLenses.
CodeLens w widoku tekstu
Widok tekstowy CodeLens udostępnia informacje tekstowe segmentom kodu i są najprostszymi formami funkcji CodeLens. Poniższe pojęcia ilustrują sposób tworzenia widoku tekstu CodeLens:
-
ICodeLensProvider
interfejs jest głównym interfejsem do zaimplementowania. Implementacja tego interfejsu określa, kiedy funkcja CodeLens zostanie aktywowana, oraz do których segmentów kodu ma zastosowanie funkcja CodeLens i jak będzie ona wyświetlana. - W ramach implementacji
ICodeLensProvider
należy zdefiniować, kiedy należy aktywować funkcję CodeLens, implementującCodeLensProviderConfiguration
. - Należy również zaimplementować metodę
TryCreateCodeLensAsync
. Ta metoda zostanie wykonana po aktywowaniu funkcji CodeLens. W tej metodzie można zdefiniować sposób wyświetlania funkcji CodeLens oraz określić, kiedy powinna być wyświetlana. Ta metoda zwraca instancjęCodeLens
. - Musisz utworzyć własną podklasę
CodeLens
, w której można zdefiniować, jak ma być wyświetlany tekst za pomocą metodyGetLabelAsync
. Ta metoda zwraca wystąpienieCodeLensLabel
, którego można użyć do skonfigurowania tekstu, etykietki narzędzia i opcjonalnej ikony.
Wywoływanie funkcji CodeLens
Funkcja CodeLens z możliwością wywołania umożliwia rozszerzeń wykonywanie niektórych akcji (na przykład uruchomienie testu jednostkowego) po kliknięciu przez użytkownika funkcji CodeLens. Rozszerzenia mogą dodawać wywołania CodeLens, implementując InvokableCodeLens
, który wywodzi się z CodeLens
.
Visual CodeLens
Funkcja Visual CodeLens umożliwia rozszerzeniam udostępnianie niestandardowego interfejsu użytkownika, na przykład listę odwołań do metody, które mają być wyświetlane w wyskakującym okienku powyżej funkcji CodeLens po kliknięciu przez użytkownika funkcji CodeLens. Rozszerzenia mogą współtworzyć wizualizację CodeLens, implementując VisualCodeLens
, która pochodzi z CodeLens
. Podobnie jak w przypadku marginesów widoku tekstu, ponieważ rozszerzenia w VisualStudio.Extensibility mogą działać jako procesy niezależne od Visual Studio, visual CodeLenses zapewniają interfejs użytkownika przez utworzenie komponentu RemoteUserControl
i odpowiedniego szablonu danych dla tej kontrolki. Chociaż w poniższych sekcjach przedstawiono kilka prostych przykładów, zalecamy przeczytanie dokumentacji zdalny interfejs użytkownika podczas tworzenia wizualnej zawartości interfejsu użytkownika CodeLens.
Poniższy przykładowy kod pokazuje, jak utworzyć widok tekstowy CodeLens i wywoływany kod 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",
});
}
}
Oprócz konfigurowania nazwy wyświetlanej dostawcy CodeLens dostawcy funkcji CodeLens mogą również skonfigurować priorytet funkcji CodeLens. Wartość priorytetu jest używana do określenia względnego ułożenia twoich CodeLens w stosunku do innych CodeLens, co można ustawić poprzez właściwość Priority
w obiekcie CodeLensProviderConfiguration
.
CodeLenses zwykle wizualizuje niektóre dane związane z widokiem tekstowym. Na przykład mogą chcieć wyświetlić liczbę odwołań do metody. Aby to zrobić, dostawca CodeLens powinien również nasłuchiwać zdarzeń widoku tekstowego, aby reagować na otwieranie i zamykanie widoków tekstowych oraz na wpisywanie przez użytkownika.
Program Visual Studio tworzy tylko jedno wystąpienie dostawcy codeLens niezależnie od liczby dostępnych widoków tekstu otwieranych przez użytkownika. Oznacza to, że jeśli aplikacja CodeLens musi zachować stan, musisz upewnić się, że dostawca codeLens ma sposób na zachowanie stanu aktualnie otwartych widoków tekstowych.
Aby uzyskać więcej informacji, zobacz CodeLens Sample.
Jeśli dostawca aplikacji Code Lens musi odwoływać się do elementów kodu, które nie są jeszcze oznakowane przez istniejącą funkcję programu Visual Studio, możesz utworzyć nowy moduł tagger implementując ITextViewTaggerProvider<CodeLensTag>
.