Re[3]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 02.05.20 12:38
Оценка:
МР>- получает на вход текущий контекст компиляции
...
МР>А весь Roslyn-овский контекст (готовая модель) у вас при этом будет.
Так контекст у всех желающих есть со времён compiler-as-a-service. MSBuildWorkspace.Create(), грузится солюшн и готово.
То есть именно эту задачу люди которым такое было нужно — решили стандартным, документированным способом, годы тому назад. В 2020-м от создателей компилятора хочется чего-то, что существующими способами сделать невозможно, или хотябы чего-то что задачу серьёзно упрощает.

МР>P.S. Я, кстати, плохо представляю, как Razor использовать для генерации C# кода.

МР>Вы пробовали? Как впечатления? Можете поделиться?
По сравнению с квазицитированием в Nemerle — все шаблонизаторы отстой. Но по сравнению с другими способами генерировать C# код — получается хотя-бы раскрашено достаточно чтобы код не был write-only. Также работает автокомплит по моделям — это полезно из-за развесистых рослиновских иерархий которые передаются из шаблона в шаблон. Удобно что у разора всё очень хорошо с иерархическими шаблонами — один шаблон идёт по файлам, другой по методам, и т.д.

Выглядит хреновато, но однозначно не write-only. Этот код писали и дописывали разные люди. И что особенно приятно — отладчик шаблоны подхватывает, когда сталкиваешься с неожиданными приколами рослина, можно поставить брякпойнт и разобраться по месту. Кстати — на скриншоте Type.ToDisplayString() — это самый что ни на есть контекст, код полученный рослином из сорцов.
Отредактировано 02.05.2020 12:45 hi_octane . Предыдущая версия . Еще …
Отредактировано 02.05.2020 12:41 hi_octane . Предыдущая версия .
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.05.20 12:40
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

МР>Здравствуйте, Serginio1, Вы писали:


S>>Раньше использовались Fody Refit которые Il код редактировали.

S>>Ну и T4, правда бы еще и синтаксис типа разора

МР>Всё-таки, мне кажется, не вполне правильным сравнивать данный механизм c Fody или другими code rewriters.


МР>Это именно генератор. Точнее даже так — это механизм для создания генераторов.

МР>Что он дает:
МР>- доступ к результатам анализа существующего кода (кстати, отдельно оговаривается, что туда не попадают результаты работы других генераторов)
МР>- возможность на ходу добавить сгенерированный каким-либо способом код к исходному, используя чисто возможности компилятора.

МР>Т.е. это в большей степени механизм, который позволяет отказаться для кодогенераторов в compile-time от костылей на базе msbuild
Автор: Михаил Романов
Дата: 06.07.18
.


МР>А уж как вы будете реализовывать вашу кодогенерацию — решать вам. А там ведь куча вариантов:

МР>- что брать за основу (модель) для генератора: ничего (т.е. вы тупо добавляете один и тот же код — не знаю зачем, но вдруг), исходный код, разобранный Roslyn (как в примере с атрибутом), или какой-то сторонний DSL (на базе JSON, XAML, ...)
МР>- как получать фрагменты кода для добавления: на базе шаблонов (T4, Razor, Liquid, ...), через CodeDOM, склейкой строк, через модель Roslyn, ...

МР>При этом (как минимум в теории, но надеюсь и на практике всё получится) — у вас всё сразу должно подхватываться в IDE.


МР>P.S. Ну и как видите в таком варианте (замена для MSBuild generator) это не что-то особо новое и прекрасное. Просто упрощение для одной из задач. Не самой распространенной.

МР>Поэтому, возможно, и нет особого хайпа.

Да спасибо. Почитав комментарии понял, что они не хотят изменять существующий код, только через дополнительный код.
У Fody есть для меня 2
1.INotifyPropertyChanged https://github.com/Fody/PropertyChanging https://github.com/Fody/PropertyChanged
2.ConfigureAwait https://github.com/Fody/ConfigureAwait

Для метода кстати есть partial void https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/partial-method

Сигнатуры в обеих частях разделяемого типа должны совпадать.
Метод должен возвращать значение void.
Модификаторы доступа не допускаются. Разделяемые методы являются неявно частными.

Соответсвенно для свойств нет partial. То есть пока решение только через наследников.

Но во всяком случае MS могла бы сама ввести кучу аттрибутов для генерации кода тех же INotifyPropertyChanged и ConfigureAwait
или
roslyn-linq-rewrite https://github.com/antiufo/roslyn-linq-rewrite
и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: Kolesiki  
Дата: 02.05.20 16:53
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Как то новость прошла без энтузиазма


А смысл это говно обсуждать?? Ты внимательно читал возможности? Дошёл до строчки "Мы НЕ МОЖЕМ модифицировать оригинальный исходник"? Ну так какой смысл во всей этой детской "генерации", если невозможно самое главное?? Взгляни на Немерле, теперь на свой Source Generators и заплачь.

S>Ну и T4, правда бы еще и синтаксис типа разора


Что Т4?
Re[4]: Introducing C# Source Generators
От: Kolesiki  
Дата: 02.05.20 17:15
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, hi_octane, Вы писали:


_>>Получается пока хуже чем генерировать сорец через T4 или Razor.

S> Это же только проба пера

ээ... какая же это проба пера, если они прямо "obviate T4"? Чтобы заменить Т4, нужно быть МИНИМУМ как Т4 и уметь нечто бóльшее! А судя по результатам, это какой-то пук в лужу — много шума из ничего. Что-то мне подсказывает, что MS наводнила какая-то студота, которой попросту нечем заняться — на серьёзный код у них нет мозгов, зато заниматься перделками и велосипедами — это пожалуйста! И главное — кричать в каждом анонсе, как у них всё "стало ещё лучше". А что у них было, чтобы стать ещё лучше?? Это не говоря о том, что слово "Немерле" там точно слышали и точно знают, как ДОЛЖЕН выглядеть компилятор 21 века. А весь ржач в том, что они неспособны даже по ГОТОВЫМ сорсам и документации Немерла понять, что им нужно делать в собственном Рослине. Пойду пинать Влада, может очухается от своей Нитры и продолжит улучшать Немерле.
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.05.20 17:55
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Здравствуйте, Serginio1, Вы писали:


S>>Как то новость прошла без энтузиазма


K>А смысл это говно обсуждать?? Ты внимательно читал возможности? Дошёл до строчки "Мы НЕ МОЖЕМ модифицировать оригинальный исходник"? Ну так какой смысл во всей этой детской "генерации", если невозможно самое главное?? Взгляни на Немерле, теперь на свой Source Generators и заплачь.

Но при этом можно генерить наследников Не беда.
Что толку смотреть на Nemerle, если невозможно его применить?

S>>Ну и T4, правда бы еще и синтаксис типа разора


K>Что Т4?

Ты мне уже минус поставил за

We expect that Source Generators will obviate T4, which unfortunately does depend on the MSBuild trickery mentioned in the post. The current requirement to use strings is just the first preview. Although it is the most flexible approach, it’s also the most rudimentary. We’ll likely explore some additional approaches, such as using the SyntaxFactory APIs.


Для генерации текста удобен синтаксис разора или Т4. Сейчас пока генерация кода вручную
Придумают, что то по ходу
и солнце б утром не вставало, когда бы не было меня
Re[5]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.05.20 10:19
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Здравствуйте, Serginio1, Вы писали:


S>>Здравствуйте, hi_octane, Вы писали:


_>>>Получается пока хуже чем генерировать сорец через T4 или Razor.

S>> Это же только проба пера

K>ээ... какая же это проба пера, если они прямо "obviate T4"? Чтобы заменить Т4, нужно быть МИНИМУМ как Т4 и уметь нечто бóльшее! А судя по результатам, это какой-то пук в лужу — много шума из ничего. Что-то мне подсказывает, что MS наводнила какая-то студота, которой попросту нечем заняться — на серьёзный код у них нет мозгов, зато заниматься перделками и велосипедами — это пожалуйста! И главное — кричать в каждом анонсе, как у них всё "стало ещё лучше". А что у них было, чтобы стать ещё лучше?? Это не говоря о том, что слово "Немерле" там точно слышали и точно знают, как ДОЛЖЕН выглядеть компилятор 21 века. А весь ржач в том, что они неспособны даже по ГОТОВЫМ сорсам и документации Немерла понять, что им нужно делать в собственном Рослине. Пойду пинать Влада, может очухается от своей Нитры и продолжит улучшать Немерле.

Много эмоций. По твоему должны быть ТОЛЬКО макросы Немерле, остальное не должно присутствовать как факт?
Такой юношеский максимализм? По мне тка лучше синица в руках
и солнце б утром не вставало, когда бы не было меня
Re[2]: Introducing C# Source Generators
От: VladCore  
Дата: 03.05.20 11:09
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Cходу не понял, нафига они инжектят код атрибута. Такие-то штуки можно просто через Dependency принести, обычным атрибутом как у всех.

S>Или они хотели избежать необходимости давать ссылку на второй пакет?

интересное наблюдение. я и не заметил сразу.

это, думаю, для иллюстрации того, что компилятор как то скомпилирует и выполнит реализацию ISourceGenerator, несмотря на то что классов не хватает, и потом продолжит компилировать дальше.
Отредактировано 03.05.2020 11:24 VladCore . Предыдущая версия .
Re: Introducing C# Source Generators
От: varenikAA  
Дата: 03.05.20 11:27
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/

S>Как то новость прошла без энтузиазма

Нормальное метапрограммирование как в лиспах не осилили?
Почему бы не ввести квази-цитаты для сырцов вместо этого кошмара с исходниками в стрингах?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Introducing C# Source Generators
От: varenikAA  
Дата: 03.05.20 11:30
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Что толку смотреть на Nemerle, если невозможно его применить?


Неправда, применял, отлично работает. Не путайте применимость и востребованность на рынке.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.05.20 11:40
Оценка: +1
Здравствуйте, varenikAA, Вы писали:

AA>Здравствуйте, Serginio1, Вы писали:


S>>https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/

S>>Как то новость прошла без энтузиазма

AA>Нормальное метапрограммирование как в лиспах не осилили?

AA>Почему бы не ввести квази-цитаты для сырцов вместо этого кошмара с исходниками в стрингах?

Я тут давал

We expect that Source Generators will obviate T4, which unfortunately does depend on the MSBuild trickery mentioned in the post. The current requirement to use strings is just the first preview. Although it is the most flexible approach, it’s also the most rudimentary. We’ll likely explore some additional approaches, such as using the SyntaxFactory APIs.


Это пока просто проба пера. Но это все таки лучше чем ничего.
и солнце б утром не вставало, когда бы не было меня
Re[4]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.05.20 12:00
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Здравствуйте, Serginio1, Вы писали:


S>>Что толку смотреть на Nemerle, если невозможно его применить?


AA>Неправда, применял, отлично работает. Не путайте применимость и востребованность на рынке.

Так что толку писать в стол?
У Немерля проблема была в том, что он не поспевает за новыми платформами и новыми конструкциями.
А они намного важнее чем макросы.
А основная проблема всех языков в .Net это поддерживает ли их MS.
и солнце б утром не вставало, когда бы не было меня
Re[6]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 03.05.20 12:53
Оценка:
S> Много эмоций. По твоему должны быть ТОЛЬКО макросы Немерле, остальное не должно присутствовать как факт?
S>Такой юношеский максимализм? По мне тка лучше синица в руках
Ну по факту он прав. Все фичи в языке это макросы разных уровней. Сделали бы в C# нормальное понятие "макрос" и самые интересные языковые фичи ты бы ставил пакетами с Nuget-а. Собственно Nitra именно про это. В первоначальных доках по Nitra макросы разворачивались в макросы, и так до полного превращения исходного языка в IL.
Re[7]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.05.20 13:26
Оценка:
Здравствуйте, hi_octane, Вы писали:

S>> Много эмоций. По твоему должны быть ТОЛЬКО макросы Немерле, остальное не должно присутствовать как факт?

S>>Такой юношеский максимализм? По мне так лучше синица в руках
_>Ну по факту он прав. Все фичи в языке это макросы разных уровней. Сделали бы в C# нормальное понятие "макрос" и самые интересные языковые фичи ты бы ставил пакетами с Nuget-а. Собственно Nitra именно про это. В первоначальных доках по Nitra макросы разворачивались в макросы, и так до полного превращения исходного языка в IL.

То есть ты против C# Source Generators как факт. Ты за макросы в C# которых скоро точно не будет? Лучше журавль, но в небе.
Если бы да бы …

Можно говорить, что феррари лучше чем жигули, только от того, что говоришь жигули не станут Феррари.
В итоге нужно ходить пешком?
и солнце б утром не вставало, когда бы не было меня
Re[5]: Introducing C# Source Generators
От: varenikAA  
Дата: 03.05.20 14:36
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, varenikAA, Вы писали:


AA>>Здравствуйте, Serginio1, Вы писали:


S>>>Что толку смотреть на Nemerle, если невозможно его применить?


AA>>Неправда, применял, отлично работает. Не путайте применимость и востребованность на рынке.

S> Так что толку писать в стол?

Тут все дело в том, что если вы ориентируетесь на требования работодателя, то да C#(java и т.п.).
Но если вас не ограничивают, то очевидно, многие вещи можно делать проще, надежней, быстрей.
Другое дело, что для этого нужно освоить еще один инструмент, а это накладно.
Но C#(не удержусь), движется по скользому пути — добавляет в компилятор кучу фичей имеющих неоднозначный смысл: например, два вида switch — один конструкция(старое), другой выражениие(новое), причем ограниченное функциями возврата, т.е. только return из функции, но не var x = switch.
Получаем кастрированный Nemerle. Там def x = match (аналог switch) работает в любом выражении.
Или initonly в следующей версии, зачем если есть readonly?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: А что будет, если ....
От: VladCore  
Дата: 03.05.20 15:16
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S>https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/


Интересно, а что будет если ISourceGenerator нагенерит другой ISourceGenerator
Re[2]: А что будет, если ....
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 03.05.20 15:28
Оценка: 24 (2) +2
Здравствуйте, VladCore, Вы писали:

VC>Здравствуйте, Serginio1, Вы писали:


S>>https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/


VC>Интересно, а что будет если ISourceGenerator нагенерит другой ISourceGenerator


Думаю, что ничего

Run un-ordered, each generator will see the same input compilation, with no access to files created by other source generators.

Re[6]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.05.20 15:50
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Тут все дело в том, что если вы ориентируетесь на требования работодателя, то да C#(java и т.п.).

AA>Но если вас не ограничивают, то очевидно, многие вещи можно делать проще, надежней, быстрей.
AA>Другое дело, что для этого нужно освоить еще один инструмент, а это накладно.
AA>Но C#(не удержусь), движется по скользому пути — добавляет в компилятор кучу фичей имеющих неоднозначный смысл: например, два вида switch — один конструкция(старое), другой выражениие(новое), причем ограниченное функциями возврата, т.е. только return из функции, но не var x = switch.
AA>Получаем кастрированный Nemerle. Там def x = match (аналог switch) работает в любом выражении.
AA>Или initonly в следующей версии, зачем если есть readonly?
Я устал писать в стол. Ну особой разницы между switch и match особой не вижу. Есть инструкция, а есть выражения.
initonly это для обязательной инициализации. readonly только в полю, а initonly к свойству
и солнце б утром не вставало, когда бы не было меня
Re[2]: А что будет, если ....
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.05.20 15:57
Оценка:
Здравствуйте, VladCore, Вы писали:

VC>Здравствуйте, Serginio1, Вы писали:


S>>https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/


VC>Интересно, а что будет если ISourceGenerator нагенерит другой ISourceGenerator

Ну лучше конечно задать вопрос не мне, а к автору статьи.
и солнце б утром не вставало, когда бы не было меня
Re[6]: Introducing C# Source Generators
От: _NN_ www.nemerleweb.com
Дата: 03.05.20 17:54
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Или initonly в следующей версии, зачем если есть readonly?


Чтобы запутать программистов C++/CLI: initonly

И Nemerle
def test(_)
  | [x] with y = 7
  | [x, y] => WriteLine ($ "ok $x $y");
  | _ => WriteLine("error");
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: Introducing C# Source Generators
От: _NN_ www.nemerleweb.com
Дата: 03.05.20 17:56
Оценка: +1
Здравствуйте, varenikAA, Вы писали:

AA>Но C#(не удержусь), движется по скользому пути — добавляет в компилятор кучу фичей имеющих неоднозначный смысл: например, два вида switch — один конструкция(старое), другой выражениие(новое), причем ограниченное функциями возврата, т.е. только return из функции, но не var x = switch.


Кто это вам сказал ?
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

public static class SwitchExample
{
    public enum Directions
    {
        Up,
        Down,
        Right,
        Left
    }

    public enum Orientation
    {
        North,
        South,
        East,
        West
    }

    public static void Main()
    {
        var direction = Directions.Right;
        Console.WriteLine($"Map view direction is {direction}");

        var orientation = direction switch
        {
            Directions.Up => Orientation.North,
            Directions.Right => Orientation.East,
            Directions.Down => Orientation.South,
            Directions.Left => Orientation.West,
        };
        Console.WriteLine($"Cardinal orientation is {orientation}");
    }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.