Большой недостающий элемент подключается к конвейеру, иначе вы не намного продвинетесь вперед, чем предусмотрено .Emit
. Не поймите неправильно, Roslyn приносит много замечательных вещей, но для тех из нас, кто хочет реализовать препроцессоры и метапрограммирование, кажется, что на данный момент этого не было. Вы можете реализовать «предложения кода» или то, что они называют «проблемами» / «действиями» в качестве расширения, но это в основном одноразовое преобразование кода, которое действует как предлагаемая встроенная замена и не как бы вы реализовали новую языковую функцию. Это то, что вы всегда можете сделать с расширениями, но Roslyn значительно упрощает анализ / преобразование кода:
Судя по тому, что я читал о комментариях разработчиков Roslyn на форумах codeplex, предоставление хуков в конвейер не было первоначальной целью. Все новые функции языка C #, которые они предоставили в предварительной версии C # 6, включают изменение самого Roslyn. Таким образом, вам, по сути, нужно форкнуть Roslyn. У них есть документация о том, как собрать Roslyn и протестировать его с помощью Visual Studio. Это был бы тяжелый способ форкнуть Roslyn и использовать его в Visual Studio. Я говорю неуклюже, потому что теперь любой, кто хочет использовать ваши новые языковые функции, должен заменить компилятор по умолчанию на ваш. Вы могли видеть, где это начнет запутываться.
Сборка Roslyn и замена компилятора Visual Studio 2015 Preview собственной сборкой
Другой подход - создать компилятор, который действует как прокси для Roslyn. Существуют стандартные API-интерфейсы для создания компиляторов, которые VS может использовать. Однако это нетривиальная задача. Вы читаете файлы кода, вызываете API Roslyn для преобразования синтаксических деревьев и выдачи результатов.
Другая проблема с прокси-подходом - заставить intellisense хорошо взаимодействовать с любыми новыми языковыми функциями, которые вы реализуете. Вам, вероятно, придется иметь свой «новый» вариант C #, использовать другое расширение файла и реализовать все API, которые требуются Visual Studio для работы intellisense.
Наконец, рассмотрим экосистему C # и значение расширяемого компилятора. Допустим, Roslyn действительно поддерживал эти хуки, и это было так же просто, как предоставить пакет Nuget или расширение VS для поддержки новой языковой функции. Весь ваш C #, использующий новую функцию Do-until, по сути является недопустимым C # и не будет компилироваться без использования вашего настраиваемого расширения. Если вы пойдете достаточно далеко по этому пути и достаточно людей, внедряющих новые функции, очень быстро вы обнаружите несовместимые языковые функции. Возможно, кто-то реализует синтаксис макроса препроцессора, но его нельзя использовать вместе с новым синтаксисом другого человека, потому что они использовали аналогичный синтаксис для определения начала макроса. Если вы задействуете множество проектов с открытым исходным кодом и обнаружите, что копаетесь в их коде, вы столкнетесь со множеством странного синтаксиса, который потребует от вас побочного пути и исследования конкретных языковых расширений, которые использует проект. Это могло быть безумием. Я не хочу показаться скептиком, поскольку у меня есть много идей относительно языковых функций, и я очень заинтересован в этом, но нужно учитывать последствия этого и то, насколько это будет ремонтопригодным. Представьте, что вас наняли где-то на работу, и они внедрили все виды нового синтаксиса, который вам нужно было изучить, и если бы эти функции не были проверены так же, как функции C #, вы можете поспорить, что некоторые из них не будут хорошо спроектированы / реализованы .
person
AaronLS
schedule
22.12.2014