Как написать расширение, которое отображает текст, отличный от основного файла? (например, имена параметров)

Я хочу написать расширение для Visual Studio, которое заменяет ключевое слово "var" на явный тип, но только визуально, а не в самом коде.

После некоторых исследований MSDN и Интернета я попытался использовать VisualBuffer (проекционный буфер) ITextViewModel, но он также изменил код в файле.

Вот, например, я попробовал наоборот, заменив "int" на "var"

[Export(typeof(ITextViewCreationListener))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal class TestViewCreationListener : ITextViewCreationListener
{
    private ITextBuffer _buffer;

    public void TextViewCreated(ITextView textView)
    {
        ITextViewModel textVM = textView.TextViewModel;
        _buffer = textVM.VisualBuffer;

        string text = _buffer.CurrentSnapshot.GetText();
        int index = text.IndexOf("int ");
        while (index > 0)
        {
            _buffer.Replace(new Span(index, 3), "var");
            index = text.IndexOf("int ", index + 4);
        }
    }
}

Заранее спасибо :)


person GeluX    schedule 30.08.2019    source источник
comment
but it also changes code in the file, поэтому вы не хотите менять var на int или что-то еще, вы имеете в виду краткую информацию, например эта проблема?   -  person LoLance    schedule 02.09.2019
comment
верно, я работаю в команде и не хочу менять код ребят, которые любят вар. Но я ненавижу это и хочу видеть явный тип без использования всплывающей подсказки мыши.   -  person GeluX    schedule 03.09.2019
comment
Я понимаю, что вы хотите получить явный тип, но какой способ вам нравится, если вам не нужен формат быстрой информации? Поскольку вы не меняете var в файле кода, я не уверен, каким образом вы хотите получить явный тип, навести на него курсор и получить тип?   -  person LoLance    schedule 04.09.2019
comment
Нет, я думал о преобразователе в WPF или около того, который заменяет то, что вы видите, но не модель, стоящую за ним. Но, возможно, это невозможно. Я знаю, что есть еще проекционные буферы, но насколько я понял, они используются для отображения текста в другом месте (например, окно с контуром)   -  person GeluX    schedule 04.09.2019


Ответы (1)


О, я нашел решение сам. Использование IntraTextAdornmentTagger сделало это :)

person GeluX    schedule 05.09.2019
comment
Привет, GeluX, спасибо, что поделились, и, пожалуйста, отметьте свой ответ как ответ, и это поможет другим членам сообщества легче искать эту полезную информацию, это просто напоминание :) - person LoLance; 06.09.2019