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


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

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

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

Text view 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.

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.

Добавление CodeLenses в новые типы документов (или в существующие типы документов, которые не поддерживают CodeLens) пока не поддерживается.