Прочитать на английском

Поделиться через


Расширение редактора Visual Studio с помощью нового CodeLens

Существуют различные типы CodeLenses, которые можно создать. Каждый тип предлагает собственный уникальный набор функциональных возможностей. В следующем разделе описано, как предоставить каждый из этих типов CodeLenses.

CodeLens в текстовом режиме

** CodeLens в текстовом представлении предоставляет текстовые сведения сегментам кода и является самой простой формой CodeLens. В следующих понятиях показано, как создать текстовое представление CodeLens:

  • ICodeLensProvider интерфейс является основным интерфейсом для реализации. Реализация этого интерфейса определяет, когда будет активирован CodeLens, и к каким сегментам кода применяется CodeLens, и как он будет отображаться.
  • В рамках реализации ICodeLensProviderнеобходимо определить, когда необходимо активировать CodeLens, реализуя CodeLensProviderConfiguration.
  • Кроме того, необходимо реализовать метод TryCreateCodeLensAsync. Этот метод будет выполняться при активации CodeLens. В этом методе вы можете определить, как и когда должен отображаться CodeLens. Этот метод возвращает экземпляр CodeLens.
  • Необходимо создать собственный подкласс CodeLens, где можно определить способ отображения текста с помощью метода GetLabelAsync. Этот метод возвращает экземпляр CodeLensLabel, который можно использовать для настройки текста, подсказки и дополнительного значка.

Вызываемый CodeLens

Вызываемый CodeLens позволяет расширениям выполнять некоторые действия (например, запустить модульный тест), когда пользователь щелкает CodeLens. Расширения могут способствовать вызову функций CodeLens, реализовав InvokableCodeLens, который является производным от CodeLens.

Visual CodeLens

Visual CodeLens позволяет расширениям предоставлять пользовательский интерфейс, такой как список ссылок на метод, который отображается во всплывающем окне над CodeLens, когда пользователь щелкает по CodeLens. Расширения могут вносить свой вклад в visual CodeLens, реализуя VisualCodeLens, которая является производным от CodeLens. Аналогично полям представления текста, поскольку расширения в VisualStudio.Extensibility могут работать вне процесса Visual Studio, визуальные CodeLenses предоставляют пользовательский интерфейс, создавая элемент типа RemoteUserControl и соответствующий шаблон данных для этого элемента управления. Хотя в следующих разделах приведены некоторые простые примеры, мы рекомендуем ознакомиться с документацией по удаленному пользовательскому интерфейсу при создании содержимого пользовательского интерфейса Visual CodeLens.

В следующем примере кода показано, как создать текстовое представление CodeLens и вызываемый элемент CodeLens.

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

Помимо настройки отображаемого имени поставщика CodeLens, поставщики CodeLens также могут настроить приоритет своих CodeLens. Значение приоритета используется для определения относительного упорядочения CodeLens, соответствующего другим CodeLenses, которое можно задать с помощью свойства Priority в объекте CodeLensProviderConfiguration.

CodeLenses обычно визуализирует некоторые данные, связанные с текстовым представлением. Например, может потребоваться отобразить количество ссылок на метод. Для этого поставщик CodeLens также должен отслеживать события текстового представления, реагировать на открытие, закрытие текстовых представлений и ввод текста пользователями.

Visual Studio создаёт только один экземпляр поставщика CodeLens вне зависимости от того, сколько соответствующих текстовых представлений открывает пользователь. Это означает, что если вашему CodeLens необходимо поддерживать состояние, убедитесь, что его поставщик имеет способ сохранить состояние открытых текстовых представлений.

Дополнительные сведения см. в примере CodeLens.

Если поставщик Code Lens должен ссылаться на элементы кода, которые еще не помечены существующей функцией Visual Studio, можно создать новый теггер , реализующий ITextViewTaggerProvider<CodeLensTag>, с помощью.