Ярлык для фильтрации «Найти все ссылки» только для гарантированных назначений? - PullRequest
0 голосов
/ 12 декабря 2018

Обзор

При работе в проекте C # Visual Studio 15 имеет ярлык на Find All References, который отображает все ссылки на переменную, используемую в решении в панели '...' references.

Можно ли просмотреть только подмножество результата Find All References, где присваивается переменная?

Пример

С учетом этого надуманного Foo.cs:

public class Bar
{
    private int val;
    public Bar(int val) { this.val = val; }
    public SetValue(int val) { this.val = val; }
}

public class Foo
{
    public Bar bar = new Bar(111);

    public Foo()
    {
        bar = new Bar(222);
        bar.SetValue(333);
        Modify(ref bar, 444);
        Set(out bar, 555);
    }

    public void Modify(ref Bar toModify, int val)
    {
        toModify.SetValue(val);
    }

    public void Set(out Bar toSet, int val)
    {
        toSet = new Bar(val);
    }
}

Если я наведу курсор на объявление Foo.bar и нажму Shift+F12 для Find All References(или щелкните правой кнопкой мыши и выберите ту же опцию) Я получаю следующие 4 строки:

enter image description here

Я хотел бы удобным способом просто получить подмножество ссылоккоторые конкретно состоят из гарантированных назначений для bar.

В идеале я хотел бы иметь ярлык, похожий на Shift+F12, который выполняет такое действие, например Ctrl+Shift+F12.

В частности, когдавыполнено, я хотел бы, чтобы окно результатов Find All References:

  • включало назначений, таких как bar = new Bar(222) (игнорируя первоначальное определение)
  • Включите , передавая его как параметр out, который гарантированно присваивает ему значение.
  • Игнорирует , передавая ref, так как это не гарантирует выполнение назначения,Ради этого вопроса я только заинтересован в заданиях, которые гарантированы .
  • Игнорируют любые другие ссылки на bar.

В этом примере я хочу видеть только строки со значениями 222 и 555, поскольку это единственные гарантированные назначения:

enter image description here

Панель поиска

Мне известно, что в правом верхнем углу окна результатов Find All References есть строка поиска, и я могу использовать ее для фильтрации существующего набора ссылок, возвращаемыхShift+F12, и поэтому может фильтровать для = (который должен быть экранирован с помощью \) и out:

enter image description here enter image description here

Однако это не идеально.

  • Похоже, он не поддерживает регулярное выражение, поэтому поиск = и out должен выполняться отдельно.
  • Что еще более важно, он не поддерживает синтаксис.Это просто совпадения строк, которые могут легко привести к ложным срабатываниям и ложным отрицаниям:
    // False positive, 'bar' not assigned but line contains '='
    var derp = bar.GetValue();
    if(bar == null) {...}
    bar.SetString("===");

    // False negative,'bar' assigned but line does not contain '='
    Bar
        = new Bar(666);

Желаемое решение

Повторно: можно ли выполнить базовый синтаксический анализ способом, аналогичным Find All References, но возвращать ссылки только тогда, когда гарантированное присвоение переменной выполняется ввопрос?

Цель состоит в том, чтобы использовать это в больших проектах, где есть тысячи ссылок на данную переменную, но только несколько назначений, и иметь возможность иметь некоторый механизм для быстрого просмотра этих конкретных строк кода вВзгляд.

Если есть способ добавить сочетание клавиш, чтобы просто выполнить Find All References и автоматическое заполнение \= в строке поиска, это было бы приемлемо , но не идеальноиз-за ложных срабатываний / негативов, как указано выше.Поскольку ложный отрицательный результат маловероятен, по крайней мере, это приведет к сужению ссылок до меньшего подмножества.

Идеальным решением было бы использовать знания Visual Studio о коде, чтобы найти все экземпляры, где данная переменная присваивается синтаксически.

1 Ответ

0 голосов
/ 12 декабря 2018

Эта функция была запрошена на Страница UserVoice VisualStudio

При копировании в DotNet / Roslyn Github repo существует проблема, в которой обсуждается точная функцияЯ ищу: https://github.com/dotnet/roslyn/issues/22545

В частности, возможность фильтрации результатов Find All References по какому типу ссылок, включая «Запись», что я и искал: enter image description here

На данный момент он помечен как включенный в еще не выпущенный вехой выпуск 16.0.P2 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...