roslyn language services что это
Roslyn Analyzers. Как писать код быстро и безошибочно
Анализаторы Roslyn также могут отображать автоматическое исправление кода с помощью иконки лампочки Visual Studio, которая позволяет немедленно исправить код.
Но что, если бы вы могли отловить еще больше ошибок?
Позвольте представить вам пакеты анализатора Roslyn. Эти коллекции анализаторов предоставляют более подробный анализ, но не поставляются с дефолтными инструментами Visual Studio. Чтобы узнать больше о наших любимых анализаторах Roslyn, посетите репозиторий Roslyn analyzers на GitHub. Этот репозиторий включает в себя правила FxCop, которые по-прежнему применимы к современной разработке программного обеспечения, но теперь таргетированы для нашей современной платформы анализа кода, базирующейся на Roslyn. Давайте продолжим и установим этот пакет, чтобы увеличить продуктивность и скорость написания отличного кода!
Установка анализаторов FxCop:
После установки пакета вы можете просто настроить диагностику анализатора в Solution Explorer. Узел анализатора появится под узлом References или Dependencies в Solution Explorer. Если сначала развернуть анализаторы, а затем одну из сборок анализатора, можно будет просмотреть все доступные диагностики в сборке.
Вы можете просмотреть свойства диагностики, включая такие пункты, как Description и Default severity, в окне Properties. Чтобы просмотреть свойства, кликните правой кнопкой мыши правило и выберите Properties или же выберите правило, а затем нажмите Alt+Enter.
Иконки рядом с каждым типом диагностики в Solution Explorer соответствуют иконкам, которые отображаются в наборе правил при его открытии в редакторе:
Затем вы можете задать параметры серьезности в Solution Explorer. Первым делом, для этого необходимо развернуть Dependencies > Analyzers в Solution Explorer, после чего развернуть сборку, содержащую правило, для которого вы хотите задать параметры серьезности. После этого следует кликнуть правой кнопкой мыши на правило, выбрать Set Rule Set Severity и во всплывшем меню выбрать один из параметров серьезности.
Если вы зададите Warning, то будете получать предупреждения в своем коде для этого конкретного набора правил.
Теперь, когда вы понимаете, как работают анализаторы, вы можете повысить производительность и быстрее писать отличный код!
В: В чем разница между унаследованным FxCop и анализаторами FxCop?
О: Анализаторы FxCop анализируют исходный код в режиме реального времени и во время компиляции, тогда как унаследованный FxCop представляет собой статический анализ кода и анализирует двоичные файлы после завершения сборки. Дополнительные сведения см. в Roslyn analyzers vs. static code analysis и FxCop analyzers FAQ.
В: Я могу написать собственные анализаторы?
О: Конечно! Документация по написанию анализаторов находится здесь.
В: Работают ли анализаторы в сборках непрерывной интеграции (CI)?
О: Да, анализаторы, установленные как пакеты NuGet, могут быть применены в сборках CI.
В: Где я могу запросить больше анализаторов или сообщить об ошибках?
О: Вы можете запросить больше анализаторов и сообщить об ошибках в репозитории Roslyn на GitHub.
Компилятор Roslyn
Введение
Roslyn – это компилятор с открытым исходным кодом для C# и Visual Basic. Roslyn представляет из себя библиотеку (API), интегрируемую в проект. Данный компилятор не имеет ничего общего с CLR. Таким образом, он может скомпилировать код с преобразованием в Intermediate Language для последующей передачи в CLR.
Установка компилятора
Дважды щелкните на Roslyn.sln для загрузки проекта. После этого настройте solution в VS и перейдите в Roslyn/Binaries/Debug:
Использование компилятора
Каждый, кто использует C#, наверняка знаком с csc.exe. Посмотрев на дату создания файла, Вы увидите, что одновременно с открытием проекта Roslyn скомпилировался csc.exe. Как мы этим будем пользоваться?
Запустив файл csc из командной строки, Вы увидите ошибку:
C : \Users\Michael\Documents\Visual Studio 2015 \Projects\roslyn\Binaries\Debug > csc
Microsoft ( R ) Visual C # Compiler version 1.0.0.0
error CS1562 : Outputs without source must have the / out option specified
C : \Users\Michael\Documents\Visual Studio 2015 \Projects\roslyn\Binaries\Debug >
Тема связана со специальностями:
Тут нечему удивляться, поскольку Вы не указали исходный файл для компиляции. Теперь можно посмотреть ошибки и предупреждения в нашем исходном коде.
Разбираем пример
Скачайте и установите:
После установки откройте Visual Studio 2015 Preview и выберите шаблон “Compiler Platform Console Application”:
Добавьте следующий код в Main:
public static void Main ( string [] args )
static void Main ( string [] args )
Видео курсы по схожей тематике:
UX/UI Design Стартовый
UX/UI Design мобильных приложений
Создаем игру типа “Pokémon Go“
Запустите приложение и перейдите в верхнюю часть документа. Нажмите на объявленный SyntaxTree, и он перенаправит Вас на часть кода, в котором содержится большая часть информации. В нашем примере мы рассматриваем Leading и Trailing WhiteSpace.
Теперь мы увидели процесс компиляции с помощью Roslyn.
Выводы
Бесплатные вебинары по схожей тематике:
Создание дизайна лендинга с Figma
UX дизайн на практике. Прототипирование и вангирование
Дивный новый Roslyn: Кому нужны собственные анализаторы кода и скриптинг на C#?
Чтобы исправить это, мы взяли интервью у Filip W, Microsoft MVP, контрибьютора Roslyn и просто одного из наиболее популярных в мире ASP.NET блоггеров. Почему Filip считает, что изменения в новом С# могут пройти незамеченными, зачем писать собственные анализаторы кода, а также почему скриптинг на C# лучше, чем любом скриптовом языке?
JUG.ru Group: Филип, давайте начнем с разогрева. ASP.NET Core сейчас сильно меняется. Как вы относитесь к происходящим переменам как разработчик, работающего с платформой?
Если же говорить в целом, совершенно точно изменения происходят к лучшему. Просто подумайте, несколько лет назад ASP.NET работал только под Windows и только под IIS. К тому же он основывался на System.Web.dll, который к каждому HTTP-запросу добавлял нелепый оверхед (29Kb в среднем). Сегодня же, ASP.NET Core, если верить бенчмаркам, входит в тройку-пятерку лучших по производительности веб-фреймворков на Linux. С этой точки зрения платформа бесспорно прошла невероятную трансформацию.
Filip W: Да, многие мои новые проекты сейчас крутятся в Docker на Debian-based системах. Я столкнулся с некоторыми проблемами с платформозависимым кодом, таким как криптография, или со странными дедлоками, возникающими тут и там, но в целом все меня устраивает. Ну и конечно, преимущества возможности управления всей платформой через Docker Swarm впечатляют.
JUG.ru Group: Что насчет C#? В версии 7.0 у нас будут кортежи, pattern matching и много других фич. Будут ли эти нововведения полезны для тебя, как для разработчика?
Filip W: Вообще, как и в случае с C# 6.0, изменения незначительны, так что вполне вероятно, что многие разработчики в своей повседневной работе не заметят перехода на новую версию. Лично для меня точно полезными окажутся кортежи, поскольку в текущем виде они реализованы из рук вон плохо. Надеюсь, это поможет резко сократить количество вспомогательных классов, с которым мы сталкиваемся сейчас, когда для десериализации или чтения одного-двух полей из БД разработчик вынужден создавать новый класс.
Меня немного расстраивает, что синтаксис паттерн-матчинга не будет основан на expression-ах. Вместо этого будет акцент на is и switch, впрочем, я понимаю рациональность того, что нововведения приходят шаг за шагом. К тому же, более экспрессивные элементы помогают писать лаконичный код, а C#, как мы знаем, может быть очень «многословным», так что подобные изменения тоже к лучшему.
C# vs Powershell — 1:0
В Москве в дискуссионной зоне мы почти два часа обсуждали сложности и способы применения C# скриптов: для безопасности, управления памятью, расширения приложений (системы плагинов, основанные на скриптах) и даже удаленный REPL для управления исполняемыми процессами. Это было круто!
Разработка собственных инспекций кода под Roslyn
JUG.ru Group: Кроме скриптинга, ты занимаешься еще и статическим анализом кода. Расскажи, кому может понадобиться разработка собственного анализатора, учитывая, что на рынке есть VS и Resharper?
Filip W: Собственный анализатор обычно нужен тимлидам, которые занимаются code review и вообще отвечают за качество кода в команде. Здесь важно понимать, что в процессе разработки мы сталкивается с какими-то своими проблемами и шероховатостями, актуальными только в контексте нашего проекта. И Решарпер, и VS являются универсальными инструментами, рассчитанными на широкую аудиторию, но что делать, если вам надо обеспечить применение какого-либо конкретного паттерна или соответствие кода вашим корпоративным гайдлайнам? Например, установить правила именования классов/переменных, убедиться в том, что ваш внутренний API используется только так, как это задумывалось, что код документируется в соответствии с вашими стандартами, или что HTTP endpoints разрабатываются в соответствии с установленным стандартом. Иногда встречаются и странные вещи, – я как-то работал в проекте, где на уровне компилятора запрещалось использование табов и #region-директив.
Впрочем, даже если забыть о написании собственного анализатора, важно понимать, как они работают «под капотом». Как и в других областях программирования, даже если у вас руки не дойдут до написания своего анализатора, очень полезно понимать те принципы, которые лежать в их основе, а также как работает API компилятора, обеспечивая работу анализатора кода.
JUG.ru Group: Говоря о компиляторе, какие Roslyn Compiler API облегчили вашу жизнь по сравнению с предыдущим?
Filip W: Это вопрос с подвохом? По факту, старый компилятор не позволял делать ничего, кроме как скармливать ему код, а на выходе получать DLL/EXE файлы. Так что для меня наиболее важным в Roslyn стало то, что это настоящий Сompiler-as-a-Service, где каждый шаг пайплайна имеет внешний API, который можно использовать по-своему. Также удивительно то, что до Roslyn не было официальной C# AST библиотеки (можно было найти только сторонние варианты).
JUG.ru Group: Кстати, а что с обратной совместимостью? Какова вероятность, что мой самописный анализатор развалится при следующем релизе Roslyn?
Filip W: Ну, то, что команда Roslyn уделяет огромное внимание обратной совместимости, я знаю наверняка! Если копаться в коде компилятора, можно найти невероятные примеры этому. Например, если поискть в исходном коде компилятора, можно обнаружить строки «DELIBERATE SPEC VIOLATION». Что это? Выясняется, что код старого компилятора CSC, из-за багов или каких-то недопониманий, в некоторых местах нарушает спецификации C#. В то же время, команда Roslyn не планировала делать никаких изменений, способных что-то поломать, и таким образом мы получили новый компилятор, в некоторых местах которого разработчики сознательно нарушали спеку C# и документировали это как deliberate spec violation 🙂 Ссылка.
Я понимаю, что обратная совместимость компилятора и его API это разные темы, однако мой пример хорошо показывает менталитет команды. Я и сам контрибьютил кое-что в Roslyn и могу сказать, что один из наиболее утомительных аспектов code review – это то количество внимания, которое уделяется разбору каждого «публичного» API – именно потому, что оно будет поддерживаться в Roslyn в течение длительного времени. Так что, если честно, я не переживал бы насчет обратной совместимости.
JUG.ru Group: Как ты вообще пришел к тому, что начал исследовать Roslyn API? Какие именно проблемы ты хотел решить изначально?
JUG.ru Group: Скажи, что будет со статическим анализом кода в ближайшем будущем? Чего стоит ждать ближайшие 1-3-5 лет?
Filip W: Думаю, что мы увидим много «живых» диагностик. Josh Varty, один из моих друзей, построил крутейший аддон к Visual Studio под названием (сюрпиз!) Alive, который выполняет блоки вашего исходного кода и моментально сообщает вам, как будет работать ваш метода или ваш цикл, а также предупреждает об ошибках, которые могут произойти в рантайме. Это все находится за гранью статического или семантического анализа кода, все построено на базе Roslyn.
Так что в общем, на мой взгляд, мы столкнемся со все более продвинутыми аналитиками, такими как поиск ссылок на null через символьные вычисления. На данный момент сообщество пока еще просто разбирается с теми возможностями, которые дает Roslyn. Кроме того, я надеюсь увидеть более плотную интеграцию анализаторов Roslyn в сторонних инструментах, таких как OmniSharp или Resharper. Подобные анализаторы уже существуют для Visual Studio Code, но их работа пока далека от идеальной.
JUG.ru Group: Спасибо, Филип, до встречи на DotNext!
Введение в Microsoft “Roslyn” CTP
Почему Roslyn?
В прошлом наши компиляторы работали как черные ящики — вы подаёте на вход исходный текст программы, а на выходе получаете сборку. Все знания и информация, которую формирует компилятор выбрасывается и недоступны для чьего-либо использования.
Как пишет Soma в своём блоге, часть Visual Studio language team работает на проектом, который называется Roslyn. Его главная цель — переписать компиляторы C# и VB и создать языкове сервисы в управляемом коде. С чистым, современным и управляемым кодом наша команда сможет быть более продуктивной, внедрять инновации быстрее и выдавать больше возможностей скорее и с лучшим качеством.
Более того, мы открываем компиляторы C# и VB со всей их внутренней информацией, делая доступным для вас анализ кода. Мы предоставляем публичное API и обеспечиваем точки расширения в языковых сервисах C# и VB.
Это открывает новые возможности для расширений VisualStudio — написание мощных инструментов рефакторинга и утилит языкового анализа, а так же позволит любому использовать наши парсеры, семантические движки, генераторы кода и сценариев в своих проложениях.
Скачивание October 2011 CTP
CTP и вспомогательные материалы можно скачать по адресу: http://msdn.com/roslyn.
Главная цель ранней предварительной сборки — сбор отзывов о конструкции API и введение интерактивного C#-окна (так же известного, как REPL, Read-Eval-Print-Loop).
Этот первый CTP предназначен только для предварительного просмотра, не следует использовать его для разработки нормальных приложений.
CTP устанавливается на Visual Studio 2010 SP1. Так же необходимо Visual Studio 2010 SP1 SDK.
Первые шаги
Для начала работы документ “Roslyn Project Overview” позволит обзорно взглянуть на предоставляемое API — как работать с синтаксисом и семантикой в вашей программе. Прилагается несколько руководств, которые обеспечат глубокое погружение в различные аспекты Roslyn API.
CTP поставляется с некоторым количеством примеров для Visual Studio Extensions, компиляторами API, инструментами рефакторинга и т.д. Большинство примеров предназначено для C# и Visual Basic. Вы можете открыть исходный код примеров с Getting Started page.
Мы также добавили несколько новых шаблонов проектов, доступных в диалогом окне New Project:
Эти шаблоны помогут вам начать создавать новые расширения для Visual Studio, используя Roslyn.
Reference Assemblies
Сборки Roslyn также инсталлируются в GAC. Переключение к Full Profile (вместо Client Profile) делает возможным так же ссылки на Servies assemblies (которые содержат поддержку IDE).
C# Interactive window
В настоящее время интерактивное окно доступно только для C#. Мы прилагаем усилия к созданию интерактивного окна для VB в ближайшем будущем.
Поддержка C# Script File (.csx)
Вы можете также копировать куски кода из скриптового файла и отправлять их в интерактивное окно (используя контекстное меню или горячие клавиши).
Быстрые примеры использования Roslyn API
using Roslyn.Compilers ;
using Roslyn.Compilers.CSharp ;
Assembly compiledAssembly ;
using ( var stream = new MemoryStream ( ) )
<
EmitResult compileResult = compilation. Emit ( stream ) ;
compiledAssembly = Assembly. Load ( stream. GetBuffer ( ) ) ;
>
Примечание: на данном этапе только часть возможностей языка была реализована в текущем CTP. Мы движемся вперёд в быстром темпе, но такие функции, как LINQ-запросы, атрибуты, события, dynamic, async ещё не реализованы. Для просмотра полного списка не реализованных вещей вы можете посетить Roslyn forums.
Хотя не все возможности языка поддерживаются, форма публичного API в большей степени заполнена. Поэтому мы советуем вам писать расширения и утилиты, использующих Syntax, Symbols, and Flow and Region Analysis APIs.
Мы очень рады предложить вам ранний предварительный просмотр этой технологии и будем рады отзывам, идеям и предложениям. Используйте форумы, чтобы задать вопросы и обеспечить обратную связь, Microsoft Connect для регистрации ошибок и предложений. Вы так же можете использовать хештег #RoslynCTP на твиттере.
Анализаторы Roslyn и библиотека с поддержкой кода для Иммутаблеаррайс
.NET Compiler Platform («Roslyn») помогает создавать библиотеки с поддержкой кода. Библиотека с поддержкой кода предоставляет функциональные возможности, которые можно использовать и средства (Roslyn Analyzer), которые помогут вам использовать библиотеку наиболее эффективно или избежать ошибок. в этом разделе показано, как создать реальный Roslyn анализатор для перехвата распространенных ошибок при использовании пакета System. collections. NuGet. В примере также показано, как предоставить исправление кода для проблемы с кодом, обнаруженной анализатором. пользователи видят исправления кода в пользовательском интерфейсе Visual Studio лампочки и могут автоматически применять исправление для кода.
Начало работы
Для сборки этого примера необходимо следующее:
В чем проблема?
Пользователи знакомы с написанием кода следующим образом:
Создание пустых массивов для заполнения последующими строками кода и использование синтаксиса инициализатора коллекции знакомо разработчикам на C#. Однако при написании того же кода для ImmutableArray сбой во время выполнения:
Поиск соответствующих типов узлов синтаксиса для активации анализатора
Чтобы начать сборку анализатора, сначала выясните, какой тип SyntaxNode необходимо найти. запустите Syntax Visualizer из представления меню > другие Windows > Roslyn Syntax Visualizer.
Создание проекта анализатора
Инициализация анализатора
Прокрутите вниз немного в DiagnosticAnalyzer классе, чтобы увидеть Initialize метод. Компилятор вызывает этот метод при активации анализатора. Метод принимает AnalysisContext объект, позволяющий анализатору получать сведения о контексте и регистрировать обратные вызовы для событий для типов кода, которые необходимо проанализировать.
Откройте новую строку в этом методе и введите «Context». для просмотра списка завершения IntelliSense. В списке завершения можно увидеть множество Register. методов для управления событиями различных типов. Например, первый из них RegisterCodeBlockAction выполняет обратный вызов к коду для блока, который обычно является кодом между фигурными скобками. Регистрация для блока также выполняет обратный вызов к коду для инициализатора поля, значения, заданного для атрибута, или значения необязательного параметра.
В качестве другого примера, RegisterCompilationStartAction метод вызывает обратную передачу кода в начале компиляции, что полезно, когда необходимо получить состояние во многих местах. Можно создать структуру данных, например, чтобы собираются все используемые символы, и при каждом вызове анализатора для некоторого синтаксиса или символа можно сохранить сведения о каждом расположении в структуре данных. При вызове обратно из-за завершения компиляции можно проанализировать все сохраненные расположения, например, чтобы сообщить, какие символы использует код из каждой using инструкции.
С помощью Syntax Visualizer вы узнали, что вы хотите вызывать, когда компилятор обрабатывает обжекткреатионекспрессион. Этот код используется для настройки обратного вызова:
Задание свойств для пользователей анализатора
чтобы анализатор был правильно отображен в пользовательском интерфейсе Visual Studio, найдите и измените следующую строку кода, чтобы определить анализатор:
Затем найдите и откройте в проекте файл Resources. resx с помощью Обозреватель решений. Можно добавить описание для анализатора, заголовка и т. д. Можно изменить значение для всех этих элементов на «Don’t use ImmutableArray constructor» Now. Можно указать аргументы форматирования строки в строке (, и <0> <1>т. д.), а позднее при вызове Diagnostic.Create() можно предоставить params Массив передаваемых аргументов.
Анализ выражения создания объекта
Получите узел, который можно предположить, — это тип, для которого отфильтровано действие узла синтаксиса:
запуск Visual Studio с анализатором в первый раз
запустите Visual Studio, создав и выполнив анализатор (нажмите клавишу F5). поскольку запускаемый проект в обозреватель решений является проектом VSIX, при выполнении кода выполняется сборка кода и VSIX, а затем запускается Visual Studio с установленным расширением vsix. при запуске Visual Studio таким образом, он запускается с отдельным кустом реестра, чтобы при создании анализаторов не повлияло на использование Visual Studio тестовыми экземплярами. при первом запуске такого способа Visual Studio выполняет несколько инициализаций, аналогичных при первом запуске Visual Studio после установки.
Создайте консольный проект, а затем введите код массива в метод Main для консольных приложений:
строки кода ImmutableArray содержат волнистые линии, так как необходимо получить неизменяемый пакет NuGet и добавить в using код инструкцию. нажмите правую кнопку указателя в узле проекта в обозреватель решений и выберите управление пакетами NuGet. в диспетчере NuGet введите «неизменяемый» в поле поиска и выберите элемент System. collections. unmutable (не выбирайте Microsoft. Bcl. unmutable) на левой панели и нажмите кнопку установить в правой области. При установке пакета добавляется ссылка на ссылки проекта.
сохраните все и закройте второй экземпляр Visual Studio, чтобы перейти в режим очистки, чтобы продолжить.
Завершение работы с анализатором с помощью команды «изменить и продолжить»
в первом экземпляре Visual Studio установите точку останова в начале AnalyzeObjectCreation метода, нажав клавишу F9 с курсором в первой строке.
запустите анализатор снова с помощью F5, а во втором экземпляре Visual Studio снова откройте консольное приложение, созданное в последний раз.
вы вернетесь к первому экземпляру Visual Studio в точке останова, так как компилятор Roslyn обнаружил выражение создания объекта и вызываемое в анализатор.
Вы назначаете универсальные типы в метаданных с обратными импульсами (‘) и числом универсальных параметров. Именно поэтому вы не видите «. ImmutableArray «в имени метаданных.
Семантическая модель имеет много полезных вещей, которые позволяют задавать вопросы о символах, потоке данных, времени жизни переменных и т. д. Roslyn отделяет синтаксические узлы от семантической модели для различных инженерных целей (производительность, моделирование ошибочного кода и т. д.). Необходимо, чтобы модель компиляции выполняла поиск информации, содержащейся в ссылках, для точного сравнения.
Возвращает тип выражения создания объекта. «Тип» используется несколькими способами в этой статье, но это означает, что при наличии выражения «New foo» необходимо получить модель foo. Необходимо получить тип выражения создания объекта, чтобы определить, является ли он типом ImmutableArray. Используйте семантическую модель еще раз, чтобы получить символьную информацию для символа типа (ImmutableArray) в выражении создания объекта. В конце функции введите следующую строку кода:
Сообщите о диагностике. Создание отчетов о диагностике довольно просто. Созданное вами правило используется в шаблоне проекта, который определен перед методом Initialize. Поскольку такая ситуация в коде является ошибкой, можно изменить строку, для которой инициализировано правило, заменить DiagnosticSeverity.Warning (Зеленая волнистая) на DiagnosticSeverity.Error (красная волнистая линия). Оставшаяся часть правила инициализируется из ресурсов, измененных в начале этого пошагового руководства. Также необходимо сообщить расположение волнистой линии, которая является расположением спецификации типа выражения создания объекта. Введите этот код в if блоке:
Функция должна выглядеть следующим образом (возможно, отформатированным по-другому):
Добавление «исправления кода» для проблемы с кодом
прежде чем начать, закройте второй экземпляр Visual Studio и завершите отладку в первом экземпляре Visual Studio (где разрабатывается анализатор).
Заглушка для производных членов. Теперь поместите курсор редактора в идентификатор CodeFixProvider и нажмите клавишу CTRL + . (точка) для создания заглушки реализации для этого абстрактного базового класса. При этом создается свойство и метод.
Реализуйте свойство. Заполните FixableDiagnosticIds текст свойства get следующим кодом:
Roslyn объединяет диагностику и исправления, сопоставляя эти идентификаторы, которые являются просто строками. Шаблон проекта создал идентификатор диагностики, и вы можете изменить его. Код в свойстве просто возвращает идентификатор из класса Analyzer.
Метод Регистеркодефиксасинк принимает контекст. Контекст важен, поскольку исправление кода может применяться к нескольким диагностическим сведениям, или в одной строке кода может быть несколько проблем. Если ввести «Context». в теле метода в списке завершения IntelliSense будут показаны некоторые полезные члены. Существует элемент CancellationToken, который позволяет проверить, нужно ли отменить исправление. Существует элемент документа, который имеет множество полезных элементов и позволяет перейти к объектам модели проекта и решения. Существует элемент span, который является началом и концом расположения кода, указанного при обнаружении диагностики.
Найдите узел с проблемой. Вы передаете диапазон контекста, но искомый узел может не быть кодом, который необходимо изменить. Сообщаемая диагностическая диагностика предоставляла только диапазон для идентификатора типа (где наступило бесконечную волнистую линию), но необходимо заменить все выражение создания объекта, включая new ключевое слово в начале и круглые скобки в конце. Добавьте в метод следующий код (и используйте клавишу CTRL + . Добавление using оператора для ObjectCreationExpressionSyntax ):
Зарегистрируйте исправление кода для пользовательского интерфейса лампочки. при регистрации исправления кода Roslyn автоматически подключается к интерфейсу Visual Studio лампочки. Конечные пользователи увидят, что они смогут использовать сочетание клавиш CTRL + . (период), когда анализатор волнистым линиями неверно ImmutableArray использует конструктор. Поскольку поставщик исправления кода выполняется только при возникновении проблемы, можно предположить, что у вас есть искомое выражение для создания объектов. В параметре context можно зарегистрировать новое исправление кода, добавив в конец метода следующий код RegisterCodeFixAsync :
Необходимо поместить курсор редактора в идентификатор, CodeAction а затем нажать клавишу CTRL + . (точка), чтобы добавить соответствующий using оператор для этого типа.
Затем поместите курсор редактора в ChangeToImmutableArrayEmpty идентификатор и используйте клавишу CTRL + . Опять же, для создания этой заглушки метода.
Заполните текст следующим кодом, чтобы метод выглядел примерно следующим образом:
Необходимо вставить курсор редактора в SyntaxGenerator идентификатор и нажать клавишу CTRL + . (точка), чтобы добавить соответствующий using оператор для этого типа.
Попробуйте исправить код
Pro совет. если вы запускаете второй экземпляр Visual Studio и вы не видите лампочку с исправлением кода, может потребоваться очистить кэш компонента Visual Studio. очистка кэша заставляет Visual Studio повторно исследовать компоненты, поэтому Visual Studio должен выбрать последний компонент. Сначала завершите работу второго экземпляра Visual Studio. затем в обозревателе Windows перейдите по адресу %LOCALAPPDATA%\Microsoft\VisualStudio\16.0Roslyn \. (Значение «16,0» меняется с версии на Visual Studio.) Удалите подкаталог компонентмоделкаче.
Проект кода для видео и завершения проекта
Вы можете увидеть, что этот пример был разработан и обсуждается далее в этом разговоре. В этом разговоре демонстрируется работающий анализатор и пошаговое руководство по его созданию.
Весь готовый код можно просмотреть здесь. вложенные папки донотусеиммутаблеаррайколлектионинитиализер и донотусеиммутаблеаррайктор имеют файл c# для поиска проблем и файл c#, который реализует исправления кода, которые отображаются в пользовательском интерфейсе Visual Studio лампочки. Обратите внимание, что завершенный код имеет немного более абстракцию, чтобы избежать повторной выборки объекта типа ImmutableArray. Он использует вложенные зарегистрированные действия для сохранения объекта типа в контексте, который доступен при выполнении вложенных действий (анализ создания объекта и анализ инициализации коллекции).