Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.05.20 12:06
Оценка: 147 (8)
https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/
Как то новость прошла без энтузиазма

Очень интересен пример AutoNotifyGenerator https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/SourceGeneratorSamples/AutoNotifyGenerator.cs
Пример использования атрибутов
https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/GeneratedDemo/UseAutoNotifyGenerator.cs
Раньше использовались Fody Refit которые Il код редактировали.
Ну и T4, правда бы еще и синтаксис типа разора

Так же собираются добавить partial методы отличных от void, ref параметры, private
https://github.com/jaredpar/csharplang/blob/partial/proposals/extending-partial-methods.md

partial on all members
Given that we're expanding partial to be more friendly to source generators should we also expand it to work on all class members? For example should we be able to declare partial constructors, operators, etc ...
Resolution The idea is sound but at this point in the C# 9 schedule we're trying to avoid unnecessary feature creep. Want to solve the immediate problem of expanding the feature to work with modern source generators.
Extending partial to support other members will be considered for the C# 10 release. Seems likely that we will consider this extension.



Еще
New C# Source Generator Samples
и солнце б утром не вставало, когда бы не было меня
Отредактировано 26.08.2020 9:03 Serginio1 . Предыдущая версия . Еще …
Отредактировано 26.05.2020 12:01 Serginio1 . Предыдущая версия .
Отредактировано 01.05.2020 13:36 Serginio1 . Предыдущая версия .
Re: Introducing C# Source Generators
От: Слава  
Дата: 01.05.20 14:24
Оценка: 3 (1) +3 :)))
Здравствуйте, Serginio1, Вы писали:

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


<<<комментарий про Nemerle>>>
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: Introducing C# Source Generators
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.05.20 14:05
Оценка: 39 (3)
Здравствуйте, Serginio1, Вы писали:

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

S>Как то новость прошла без энтузиазма
Крутая штука. Надо покрутить.
S> Очень интересен пример AutoNotifyGenerator https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/SourceGeneratorSamples/AutoNotifyGenerator.cs
Cходу не понял, нафига они инжектят код атрибута. Такие-то штуки можно просто через Dependency принести, обычным атрибутом как у всех.
Или они хотели избежать необходимости давать ссылку на второй пакет?

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

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

У меня пока есть идея улучшить рефлексию. При работе с ExpressionTrees и ILGenerator адский объём кода уходит на все эти typeof(MemoryMarshal).GetRuntimeMethods().Where(x => x.Name.Equals("Cast")).Select(m => new { Method = m, Parameters = m.GetParameters() }).FirstOrDefault(p =>p.Parameters.Length == 1 && p.Parameters[0].ParameterType.IsGenericType && p.Parameters[0].ParameterType.GetGenericTypeDefinition() == typeof(Span<>)).
Не дожидаясь infoof() (ах, где же ты теперь, блог Липперта...), люди воротят полурешения.
Половинные они потому, что внезапно есть целая куча ограничений — например, метод, возвращающий банальный Span<int>, таким образом не получишь (CS8640). А ещё есть CS8153 и много его друзей.
А так мы можем для интересного нам кода генерировать type class, который для каждого мембера будет иметь одноимённую проперть или метод — типа
public class MemoryMarshalType
{ 
   public static MethodInfo Cast_SpanT<T, R>() 
   public static MethodInfo Cast_ReadonlySpanT<T,R>()
}

public class SpanType<T>
{
   public static PropertyInfo Item{get;}
   public static PropertyInfo Empty { get;} 
   public static PropertyInfo Length { get;}
}

В итоге, вместо
il1.Emit(OpCodes.Call, typeof(Console).GetMethod("Write", new Type[] { typeof(string) }));

пишем
il1.Emit(OpCodes.Call, ConsoleType.Write_String);

(Пока ещё не уверен, что это лучший способ).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Отредактировано 05.05.2020 14:02 Sinclair . Предыдущая версия .
Re: Introducing C# Source Generators
От: Goldy  
Дата: 04.06.20 06:37
Оценка: 32 (3)
Всем привет!

Хочу поделиться своим опытом работы с генераторами.
Несколько лет назад игрался с аналогичной библиотекой для генерации кода
CodeGenerator.Roslyn

Ради эксперимента потратил пару дней чтобы попробовать сделать не только генерацию а возможность модификации исходного кода.
Вот что получилось в итоге.
Пример:

    [TryCatchOrdered(ExecutionOrder = 1)]
    [DuplicateWithSuffixByNameOrdered("t", ExecutionOrder = 2)]    
    [RemoveOrdered(ExecutionOrder = 3)]
    public partial class Foo
    {
        [DuplicateWithSuffixByNameOrdered("t", ExecutionOrder = 1)]
        public object `Prop1;

        [DuplicateWithSuffixByNameOrdered("k", ExecutionOrder = 1)]
        public int? Prop2;

        public void Test()
        {
            var aa = 1;
            var dd = 3;
            var bb = 0;
            var cc = aa / bb;
        }
    }



После трансформации код заменяется на:
    [TryCatchOrdered(ExecutionOrder = 1)]
    [DuplicateWithSuffixByNameOrdered("t", ExecutionOrder = 2)]
    [RemoveOrdered(ExecutionOrder = 3)]
    public partial class Foot
    {
        [DuplicateWithSuffixByNameOrdered("t", ExecutionOrder = 1)]
        public object Prop1;
        [DuplicateWithSuffixByNameOrdered("t", ExecutionOrder = 1)]
        public object Prop1t;
        [DuplicateWithSuffixByNameOrdered("k", ExecutionOrder = 1)]
        public int? Prop2;
        [DuplicateWithSuffixByNameOrdered("k", ExecutionOrder = 1)]
        public int? Prop2k;
        public void Test()
        {
            try
            {
                var aa = 1;
                var dd = 3;
                var bb = 0;
                var cc = aa / bb;
            }
            catch (Exception ex)
            {
            }
        }
    }


Что происходит в результате трансформации:
1) Вначале применяются все атрибуты для нижнего уровня свойства методы и т.д.
В данном случае атрибут DuplicateWithSuffixByNameOrdered служит для дублирования объявления свойства или класса с другим именем — к имени добавляется суффикс
2) Потом применяются все атрибуты для классов:
Атрибут TryCatchOrdered — модифицирует все методы класса оборачивая содержимое в try {} catch {} (чисто для примера)
Атрибут DuplicateWithSuffixByNameOrdered — для дублирования класса с другим именем
Атрибут RemoveOrdered — для удаления исходного класса с именем Foo (если его убрать то будет 2 класса Foo и Foot)

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

P.S. На исходном форуме мое сообщение особого интереса не вызвало и проект я забросил.

Кому интересно можно поиграться с проектом в репе:
https://github.com/GoldyD/CodeGeneration.Roslyn
Re[3]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.05.20 09:19
Оценка: +2 -1
Здравствуйте, hi_octane, Вы писали:

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

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

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[3]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 01.05.20 20:12
Оценка: 114 (1) +1
S> Про синтаксис понятно. Здесь генерация с помощью Рослина за счет доступа к контексту.
Так и в моих проектах генерация при помощи Рослина с полным доступом к сорцам, референсам, и т.д. Как вишенка на торте — после генерации разором отрабатывает ещё и форматтер который сгенерированные файлы причёсывает в полном соответствии с нашим кодинг-стандартом. Вряд ли об этом подумали в source generators, кстати

Но в моём решении есть и минус — проход таска "генерация" занимает столько же времени сколько и компиляция (грузится весь солюшн, проход по всем проектам и файлам в них), поэтому его на каждый чих запускать напряжно. У source generators этой проблемы не будет.
Re: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 01.05.20 17:23
Оценка: +2
S>Ну и T4, правда бы еще и синтаксис типа разора
В текущем виде это фича "на от№*бись". Явно у менджеров на собрании было: "в Go есть генераторы — нам тоже надо". Любая связка Razor + Roslyn может больше (например менять существующие файлы с кодом), при этом синтаксис разор гораздо читабельнее, чем конкатенация строк.
Re[2]: Introducing C# Source Generators
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 02.05.20 08:20
Оценка: +2
Здравствуйте, hi_octane, Вы писали:

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

_>В текущем виде это фича "на от№*бись". Явно у менджеров на собрании было: "в Go есть генераторы — нам тоже надо".

Ну... Я бы тут поспорил.
Ребята предложили базовый механизм, который:
— получает на вход текущий контекст компиляции
— каким-то (они нигде не ограничивают каким именно) образом генерируют добавочный код, который встраивается в общий объем компилируемого кода

_>Любая связка Razor + Roslyn может больше (например менять существующие файлы с кодом), при этом синтаксис разор гораздо читабельнее, чем конкатенация строк.

Ну про то, что rewriting не доступен это да, но они ведь и везде подчеркивают этот момент — это куда более простой механизм именно для генерации кода.
А если вам нравится именно Razor-овский синтаксис, так вы спокойно можете его использовать — просто из генератора будете вызывать привычный вам шаблонизатор: Razor, T4, Liquid, .... Или вообще не шаблонизатор, а какой-нибудь CodeDOM-генератор...
А весь Roslyn-овский контекст (готовая модель) у вас при этом будет.

P.S. Я, кстати, плохо представляю, как Razor использовать для генерации C# кода.
Вы пробовали? Как впечатления? Можете поделиться?
Re[4]: Introducing C# Source Generators
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 02.05.20 08:31
Оценка: +2
Здравствуйте, Sinclair, Вы писали:

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

S>>https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/GeneratedDemo/UseAutoNotifyGenerator.cs
S>> Ну они генерят отдельный файл во время компиляции, при этом можно использовать внутри кода

S>Вот я и спрашиваю, что помешало им этот атрибут объявить в какой-то сборке, на которую будет депендиться пользовательский проект.

Подозреваю, что 2 вещи:
— как вы сказали выше, нет необходимости отдельно подключать еще одну сборку. Вроде как NuGet позволяет это упростить (т.е. одну сборку подключить в рантайм, а вторую — как tools для компилятора), поэтому не так чтобы сильно напрягало, но как минимум нужен еще 1 инструмент (NuGet) — а тут достаточно 1 сборки.
— дополнительная защита от ошибок. Т.е. сборка с атрибутом подключилась, а генератор почему-то не отработал (забыли указать в настройках, например) — и вы об этом никак не узнаете. А здесь у вас сразу отвалится объявление атрибута и компилятор упадет с ошибкой.
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.20 12:17
Оценка: +2
Здравствуйте, Pzz, Вы писали:

Pzz>Ой, надо же. Они это из Go содрали. Даже название не удосужились изменить.


Pzz>https://habr.com/ru/post/269887/


Угу

Каждый раз, когда мы меняем определение Pill или констант, всё что мы должны сделать, это запустить
$ go generate

чтобы обновить String метод. И конечно, если у нас есть несколько типов в одном пакете, которые нужно обновить, go generate обновит их всех.


C# Source Generators встроен в компилятор. Сейчас ты даже не видишь сгенеренный код.
А то о чем ты говоришь и раньше хватало. Тот же T4 https://docs.microsoft.com/ru-ru/visualstudio/modeling/design-time-code-generation-by-using-t4-text-templates?view=vs-2019
и изменять код https://github.com/dotnet/roslyn/wiki/Getting-Started-C%23-Syntax-Transformation
и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: Silver_S Ниоткуда  
Дата: 26.05.20 11:46
Оценка: 27 (1)
Здравствуйте, Serginio1, Вы писали:

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

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

Язык тоже немного подправили, сняли ограничения на partial методы: Extending Partial Methods
Чтобы генераторы могли заменять такие методы:
[RegexGenerated("(dog|cat|fish)")]
partial bool IsPetMatch(string input);
Re: Introducing C# Source Generators
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 02.05.20 11:25
Оценка: 18 (1)
Здравствуйте, 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) это не что-то особо новое и прекрасное. Просто упрощение для одной из задач. Не самой распространенной.
Поэтому, возможно, и нет особого хайпа.
Re[2]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 01.05.20 20:18
Оценка: 4 (1)
O>Оно в овеществлённом виде появляется? (Файлом в проекте). Туда пошаговый отладчик заходит?
Из FAQ:

Can I debug or navigate to generated source in Visual Studio?
Eventually, we’ll support navigation and debugging of generated source in Visual Studio. It is not yet supported in this early preview stage.


Получается пока хуже чем генерировать сорец через T4 или Razor.
Отредактировано 01.05.2020 20:18 hi_octane . Предыдущая версия .
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.05.20 14:30
Оценка: -1
Здравствуйте, Слава, Вы писали:

С><<<комментарий про Nemerle>>>


Угу
и солнце б утром не вставало, когда бы не было меня
Отредактировано 01.05.2020 14:31 Serginio1 . Предыдущая версия .
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: А что будет, если ....
От: VladCore  
Дата: 03.05.20 15:16
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

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


Интересно, а что будет если ISourceGenerator нагенерит другой ISourceGenerator
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
Re[9]: Шейпы убрали из C#9
От: hi_octane Беларусь  
Дата: 05.05.20 11:07
Оценка: :)
S>Еще раз readonly относится к полю. Видно, что бы не ломать решили добавить initonly. При этом ты возмущался двумя switch.
S>Ну не проблема это мелочи какието. Вот шейпов не добавили в С#9 вот это огорчение. https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/

Думаю шейпы отменились, потому что их надо начинать с нуля из-за C++. У C++ вышел очень интересный взгляд на контракты: concepts/requires. После него любые другие способы выглядят убогими и ограниченными. Если бы это появилось у какого-то языка типа Scala/Nemerle и т.д. — создателям C# можно было бы эту находку "не заметить". Но на C++ в самой MS очень много пишут, так что придётся выдумывать что-то подобное для C#.
Re[10]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 05.05.20 12:07
Оценка: :)
AA>Это правда будет в C#? и можно будет типы определять после имени? УРА!!!
Просто скопировали из Nemerle-кода, и не поправили форматирование На рослине писать прототипы новых фич сложно и долго.
Re[9]: Introducing C# Source Generators
От: Ночной Смотрящий Россия  
Дата: 07.05.20 16:52
Оценка: +1
Здравствуйте, hi_octane, Вы писали:

_>Я не против source generators, я последовательный противник подхода "лепить мелкие фичи по одной в год". Сейчас в роадмапе C#9 идёт обсуждение разных видов record types, и каждое обсуждение застревает в десятках деталей: "а как будут объявляться init-only поля", "а как мы будем говорить что какое-то поле исключить из GetHashCode / Equals", и т.д.


Точно. А надо херак-херак и в продакшен. И пофик что язык мгновенно превратиться в непригодное для применения говно, зато ты наиграешься.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[10]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 11.05.20 12:16
Оценка: +1
_>>Я не против source generators, я последовательный противник подхода "лепить мелкие фичи по одной в год". Сейчас в роадмапе C#9 идёт обсуждение разных видов record types, и каждое обсуждение застревает в десятках деталей: "а как будут объявляться init-only поля", "а как мы будем говорить что какое-то поле исключить из GetHashCode / Equals", и т.д.
НС>Точно. А надо херак-херак и в продакшен. И пофик что язык мгновенно превратиться в непригодное для применения говно, зато ты наиграешься.
Ну что за детские манипуляции. Сам приписал мне какое-то мнение, сам обсмеял, и типа "вся в белом стою красивая"? Ну нет, надо херак-херак тебе — и наиграешься тоже ты

Они же нам так обстоятельно в блогах объясняли: фичу создавать долго и дорого, надо очень много всего учесть. Даже ты вот поверил, что херак-херак нельзя. Но это на словах, а по факту же результат у них как будто делали херак-херак. Уже в четвёртый раз обдуманно (ой ли?) решают проблему удобного создания типов-однострочников.
И в итоге мы получим очередное решение проблемы которая почему-то не решилась первые три раза ведь у нас есть:
— анонимные типы, которые почти рекорды но их оказалось недостаточно;
— туплы-значения, которые должны были решить какие-то проблемы, но почему-то не смогли;
— туплы-классы, которые не решили ни одной проблемы.

И сейчас вот решается вопрос с рекордами. А кто-то даст гарантию что в этот раз точно получится? Никто не думает что проблема не там, и заплаткой её не решить?
Кто-то на собрании кричал "буллшит, давайте зрить в корень, в нашей консерватории что-то не так"? Увы, вместо этого обсуждают init-only свойства, лол.
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.05.20 14:14
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


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

S>>Как то новость прошла без энтузиазма
S>Крутая штука. Надо покрутить.
S>> Очень интересен пример AutoNotifyGenerator https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/SourceGeneratorSamples/AutoNotifyGenerator.cs
S>Cходу не понял, нафига они инжектят код атрибута. Такие-то штуки можно просто через Dependency принести, обычным атрибутом как у всех.
S>Или они хотели избежать необходимости давать ссылку на второй пакет?
https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/GeneratedDemo/UseAutoNotifyGenerator.cs
Ну они генерят отдельный файл во время компиляции, при этом можно использовать внутри кода
 public partial class ExampleViewModel

    {

        [AutoNotify]

        private string _text = "private field text";



        [AutoNotify(PropertyName = "Count")]

        private int _amount = 5;

    }



    public static class UseAutoNotifyGenerator

    {

        public static void Run()

        {

            ExampleViewModel vm = new ExampleViewModel();



            // we didn't explicitly create the 'Text' property, it was generated for us 

            string text = vm.Text;

            Console.WriteLine($"Text = {text}");



            // Properties can have differnt names generated based on the PropertyName argument of the attribute

            int count = vm.Count;

            Console.WriteLine($"Count = {count}");



            // the viewmodel will automatically implement INotifyPropertyChanged

            vm.PropertyChanged += (o, e) => Console.WriteLine($"Property {e.PropertyName} was changed");

            vm.Text = "abc";

            vm.Count = 123;



            // Try adding fields to the ExampleViewModel class above and tagging them with the [AutoNotify] attribute

            // You'll see the matching generated properties visibile in IntelliSense in realtime

        }
и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: Osaka  
Дата: 01.05.20 15:50
Оценка:
S>https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/
S>новость прошла без энтузиазма

Generate C# source files that can be added to a Compilation object during the course of compilation. In other words, you can provide additional source code as input to a compilation while the code is being compiled

Оно в овеществлённом виде появляется? (Файлом в проекте). Туда пошаговый отладчик заходит?
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.05.20 17:36
Оценка:
Здравствуйте, Osaka, Вы писали:


O>Оно в овеществлённом виде появляется? (Файлом в проекте). Туда пошаговый отладчик заходит?

Пока не смотрел.
https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/SourceGeneratorSamples/AutoNotifyGenerator.cs

По коду

 // group the fields by class, and generate the source

            foreach (IGrouping<INamedTypeSymbol, IFieldSymbol> group in fieldSymbols.GroupBy(f => f.ContainingType))

            {

                string classSource = ProcessClass(group.Key, group.ToList(), attributeSymbol, notifySymbol, context);

               context.AddSource($"{group.Key.Name}_autoNotify.cs", SourceText.From(classSource, Encoding.UTF8));

            }


Должны создаваться файлы
и солнце б утром не вставало, когда бы не было меня
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.05.20 17:38
Оценка:
Здравствуйте, hi_octane, Вы писали:

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

_>В текущем виде это фича "на от№*бись". Явно у менджеров на собрании было: "в Go есть генераторы — нам тоже надо". Любая связка Razor + Roslyn может больше (например менять существующие файлы с кодом), при этом синтаксис разор гораздо читабельнее, чем конкатенация строк.

Про синтаксис понятно. Здесь генерация с помощью Рослина за счет доступа к контексту.
и солнце б утром не вставало, когда бы не было меня
Re[2]: Introducing C# Source Generators
От: _NN_ www.nemerleweb.com
Дата: 01.05.20 19:07
Оценка:
Здравствуйте, hi_octane, Вы писали:

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

_>В текущем виде это фича "на от№*бись". Явно у менджеров на собрании было: "в Go есть генераторы — нам тоже надо". Любая связка Razor + Roslyn может больше (например менять существующие файлы с кодом), при этом синтаксис разор гораздо читабельнее, чем конкатенация строк.

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

Правильней было бы оформить API компилятора ну это мы и так знаем
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Introducing C# Source Generators
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.05.20 03:00
Оценка:
Здравствуйте, Serginio1, Вы писали:
S>https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/GeneratedDemo/UseAutoNotifyGenerator.cs
S> Ну они генерят отдельный файл во время компиляции, при этом можно использовать внутри кода

Вот я и спрашиваю, что помешало им этот атрибут объявить в какой-то сборке, на которую будет депендиться пользовательский проект.
Генераторы необходимы для динамической генерации кода — т.е. когда что-то зависит от того кода, который ужо есть в проекте. А статику-то зачем порождать?
Может, в качестве иллюстрации только...
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Introducing C# Source Generators
От: _NN_ www.nemerleweb.com
Дата: 02.05.20 06:19
Оценка:
Здравствуйте, hi_octane, Вы писали:

Пользуясь случаем хочу передать привет бабушке каким форматотером пользуетесь для C# ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.05.20 08:05
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

S>>https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/GeneratedDemo/UseAutoNotifyGenerator.cs
S>> Ну они генерят отдельный файл во время компиляции, при этом можно использовать внутри кода

S>Вот я и спрашиваю, что помешало им этот атрибут объявить в какой-то сборке, на которую будет депендиться пользовательский проект.

S>Генераторы необходимы для динамической генерации кода — т.е. когда что-то зависит от того кода, который ужо есть в проекте. А статику-то зачем порождать?
S>Может, в качестве иллюстрации только...

Ну это для примера. То, что можно и атрибуты генерить и их использовать. Круто!


  [Generator]
    public class AutoNotifyGenerator : ISourceGenerator
    {
        private const string attributeText = @"
using System;
namespace AutoNotify
{
    [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
    sealed class AutoNotifyAttribute : Attribute
    {
        public AutoNotifyAttribute()
        {
        }
        public string PropertyName { get; set; }
    }
}
";

        public void Initialize(InitializationContext context)
        {
            // Register a syntax receiver that will be created for each generation pass
            context.RegisterForSyntaxNotifications(() => new SyntaxReceiver());
        }

        public void Execute(SourceGeneratorContext context)
        {
            // add the attribute text
            context.AddSource("AutoNotifyAttribute", SourceText.From(attributeText, Encoding.UTF8));
и солнце б утром не вставало, когда бы не было меня
Re[5]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 02.05.20 12:09
Оценка:
_NN>Пользуясь случаем хочу передать привет бабушке каким форматотером пользуетесь для C# ?
Рослином и пользуюсь. Чистая копипаста из примеров использования:

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.MSBuild;
using Microsoft.CodeAnalysis.Formatting;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.CSharp.Formatting;
using System.Text;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.CSharp;

    private static AdhocWorkspace _formatWorkspace;
        private static OptionSet _formatOptions;


    _formatWorkspace = new AdhocWorkspace();
        _formatOptions = _formatWorkspace.Options;
        _formatOptions = _formatOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInMethods, true);
        _formatOptions = _formatOptions.WithChangedOption(CSharpFormattingOptions.NewLinesForBracesInProperties, true);
        _formatOptions = _formatOptions.WithChangedOption(CSharpFormattingOptions.SpaceAfterControlFlowStatementKeyword, false);
        _formatOptions = _formatOptions.WithChangedOption(CSharpFormattingOptions.NewLineForCatch, false);
        _formatOptions = _formatOptions.WithChangedOption(CSharpFormattingOptions.NewLineForFinally, false);

    static string FormatFile(string content)
        {
            var syntaxNode = SyntaxFactory.ParseCompilationUnit(content);
            var formattedNode = Formatter.Format(syntaxNode, _formatWorkspace, _formatOptions);
            var sb = new StringBuilder();
            using(var writer = new StringWriter(sb))
            {
                formattedNode.WriteTo(writer);
            }
            return sb.ToString();
        }
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[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[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[8]: Introducing C# Source Generators
От: hi_octane Беларусь  
Дата: 03.05.20 21:54
Оценка:
S> То есть ты против C# Source Generators как факт. Ты за макросы в C# которых скоро точно не будет? Лучше журавль, но в небе.
S>Если бы да бы …
Я не против source generators, я последовательный противник подхода "лепить мелкие фичи по одной в год". Сейчас в роадмапе C#9 идёт обсуждение разных видов record types, и каждое обсуждение застревает в десятках деталей: "а как будут объявляться init-only поля", "а как мы будем говорить что какое-то поле исключить из GetHashCode / Equals", и т.д.

S> Можно говорить, что феррари лучше чем жигули, только от того, что говоришь жигули не станут Феррари.

S>В итоге нужно ходить пешком?
Что делает водитель когда рулит ведром с гайками, и при этом точно знает что тот же завод, за те же деньги, мог выпустить Феррари? Едет и матерится
Re[7]: Introducing C# Source Generators
От: varenikAA  
Дата: 04.05.20 04:28
Оценка:
Здравствуйте, _NN_, Вы писали:

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


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


_NN>Кто это вам сказал ?

_NN>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

_
_NN> Directions.Left => Orientation.West,

А если return вместо => ?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[8]: Introducing C# Source Generators
От: _NN_ www.nemerleweb.com
Дата: 04.05.20 04:33
Оценка:
Здравствуйте, varenikAA, Вы писали:

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


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


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


_NN>>Кто это вам сказал ?

_NN>>https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

AA>_

_NN>> Directions.Left => Orientation.West,

AA>А если return вместо => ?


Нет проблем

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

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

    public static Orientation a()
    {
        var direction = Directions.Right;
     
        return direction switch
        {
            Directions.Up => Orientation.North,
            Directions.Right => Orientation.East,
            Directions.Down => Orientation.South,
            Directions.Left => Orientation.West,
        };
    }
}


https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0ATEBqAPgAQGYACfARiVICZiBlAdwEsAXMACwFEEBDAWwAcANjACwAKADe44jNIkYAOwCuvYgBFGsMM0YQFAZ2mypY2WeIBVfmiPn1Eegpum7xAEqMA5m2bPXxABkYADNmW2IAX3FwomJFFWIAeShGRWZuHT1wk38AOWhmNj9XWgglQuK7Dm59X3CzAHUYWvCosRiSckpk1IV0zIVibgAKAEps+tkAN24oYgxNGG1dQYBedUXlvX0AOg9vZgBuesmZfAB2YmGFrQHifSZWNlPiHP9ZDVuV3atiVYA+JIpNIZFY7fJQCovMyfJYDXb7Hx/QE9EEDHbVWqVd6wrYGHZqBxrFHAvqgvQ7UrlIrQj6beE7IKhZFA3r9MFNLEvCKjY4uGRtCJAA=
http://rsdn.nemerleweb.com
http://nemerleweb.com
Отредактировано 04.05.2020 4:34 _NN_ . Предыдущая версия .
Re[7]: Introducing C# Source Generators
От: varenikAA  
Дата: 04.05.20 04:34
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>initonly это для обязательной инициализации. readonly только в полю, а initonly к свойству


На минутку, св-ва это сахар к методам как они могут быть инитонли?
вся эта инитонли сводится к объявлению конструктора с инициализацией readonly. Что творится на свете!
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[9]: Introducing C# Source Generators
От: varenikAA  
Дата: 04.05.20 04:47
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0ATEBqAPgAQGYACfARiVICZiBlAdwEsAXMACwFEEBDAWwAcANjACwAKADe44jNIkYAOwCuvYgBFGsMM0YQFAZ2mypY2WeIBVfmiPn1Eegpum7xAEqMA5m2bPXxABkYADNmW2IAX3FwomJFFWIAeShGRWZuHT1wk38AOWhmNj9XWgglQuK7Dm59X3CzAHUYWvCosRiSckpk1IV0zIVibgAKAEps+tkAN24oYgxNGG1dQYBedUXlvX0AOg9vZgBuesmZfAB2YmGFrQHifSZWNlPiHP9ZDVuV3atiVYA+JIpNIZFY7fJQCovMyfJYDXb7Hx/QE9EEDHbVWqVd6wrYGHZqBxrFHAvqgvQ7UrlIrQj6beE7IKhZFA3r9MFNLEvCKjY4uGRtCJAA=


Я о другом

Выражение switch предоставляет в контексте выражения семантику, аналогичную switch. Оно предоставляет краткий синтаксис, когда ветви switch возвращают значение. В следующем примере показана структура выражения switch.


В документации утверждается, что оба выражения switch идентичны, но это не так.
//инструкция
        switch(direction)
        {
            case Directions.Down:
                return Orientation.East;
            default:
                return Orientation.North;
                
        };
//выражение        
        var x = direction switch
        {
            Directions.Up => Orientation.North,
            Directions.Right => Orientation.East
        };


Отличий море как синтаксических, так и семантических.
Уж лучше бы match .. with ввели. Башню сносит от такой каши.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: Introducing C# Source Generators
От: _NN_ www.nemerleweb.com
Дата: 04.05.20 05:22
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Я о другом

AA>

AA>Выражение switch предоставляет в контексте выражения семантику, аналогичную switch. Оно предоставляет краткий синтаксис, когда ветви switch возвращают значение. В следующем примере показана структура выражения switch.


AA>В документации утверждается, что оба выражения switch идентичны, но это не так.


The switch expression provides for switch-like semantics in an expression context. It provides a concise syntax when the switch arms produce a value.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/switch-expression

Тут не утверждается, что семантика и синтаксис идентичные, "-like" т.е. похожие.

Конечно лучше было иметь "всё есть выражение" и сразу предоставить сопоставление с образцом, но в 2000-ом это было не модно, да и люди из Java не смогли бы легко переходить.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: А что будет, если ....
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.05.20 07:45
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

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

МР>

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

Ну то есть их включили в отдельную фазу компиляции, и одним махом зарубили как потенциальные проблемы из-за различий семантики при разном порядке прогона генераторов, так и потенциальные бенефиты от многопроходной генерации.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: А что будет, если ....
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 04.05.20 08:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ну то есть их включили в отдельную фазу компиляции, и одним махом зарубили как потенциальные проблемы из-за различий семантики при разном порядке прогона генераторов, так и потенциальные бенефиты от многопроходной генерации.

Похоже на то.
При этом (если я понял всё правильно — увы, руки пока не дошли попробовать), результаты анализа того, что порождает Source Generator будут добавляться в общую синтаксическую и семантическую модель.
Ну т.е. на сгенерированные классы можно будет сослаться из остального кода в Design-Time (как, например, с кодом порождаемым в WPF из XAML), а это, имхо, уже немало.
Re[9]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 04.05.20 09:48
Оценка:
Здравствуйте, hi_octane, Вы писали:

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

S>>Если бы да бы …
_>Я не против source generators, я последовательный противник подхода "лепить мелкие фичи по одной в год". Сейчас в роадмапе C#9 идёт обсуждение разных видов record types, и каждое обсуждение застревает в десятках деталей: "а как будут объявляться init-only поля", "а как мы будем говорить что какое-то поле исключить из GetHashCode / Equals", и т.д.
Ну всетаки развивается. Мне например больше интересны шейпы https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/
А их уже и не обсуждают.
S>> Можно говорить, что феррари лучше чем жигули, только от того, что говоришь жигули не станут Феррари.
S>>В итоге нужно ходить пешком?
_>Что делает водитель когда рулит ведром с гайками, и при этом точно знает что тот же завод, за те же деньги, мог выпустить Феррари? Едет и матерится
Но все же едет
и солнце б утром не вставало, когда бы не было меня
Re[8]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 04.05.20 09:52
Оценка:
Здравствуйте, varenikAA, Вы писали:

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


S>>initonly это для обязательной инициализации. readonly только в полю, а initonly к свойству


AA>На минутку, св-ва это сахар к методам как они могут быть инитонли?

AA>вся эта инитонли сводится к объявлению конструктора с инициализацией readonly. Что творится на свете!

Еще раз readonly относится к полю. Видно, что бы не ломать решили добавить initonly. При этом ты возмущался двумя switch.
Ну не проблема это мелочи какието. Вот шейпов не добавили в С#9 вот это огорчение. https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/
и солнце б утром не вставало, когда бы не было меня
Re[2]: Introducing C# Source Generators
От: Mihas  
Дата: 05.05.20 08:07
Оценка:
Здравствуйте, Михаил Романов, Вы писали:

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

Я поковырял пример. 2019-я студия не видит типы и нэймспейсы "из будущего". Может, потом допилят.
Re[3]: Introducing C# Source Generators
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 05.05.20 09:55
Оценка:
Здравствуйте, Mihas, Вы писали:

M>Я поковырял пример. 2019-я студия не видит типы и нэймспейсы "из будущего". Может, потом допилят.

В исходной статье говорят про VS Preview https://visualstudio.microsoft.com/vs/preview/ — возможно, поддержка есть там.

Ну и еще нашел в статье:

Why do I not get IntelliSense for generated code? Why does Visual Studio say there’s an error even though it builds?
You will need to restart Visual Studio after building the source generator to make errors go away and IntelliSense appear for generated source code. After you do that, things will work. Currently, Visual Studio integration is very early on. This current behavior will change in the future so that you don’t need to restart Visual Studio


Не знаю только, это относится тоже к VS Preview или подхватится в 2019...
Re[10]: Шейпы убрали из C#9
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.05.20 11:26
Оценка:
Здравствуйте, hi_octane, Вы писали:

S>>Еще раз readonly относится к полю. Видно, что бы не ломать решили добавить initonly. При этом ты возмущался двумя switch.

S>>Ну не проблема это мелочи какието. Вот шейпов не добавили в С#9 вот это огорчение. https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/

_>Думаю шейпы отменились, потому что их надо начинать с нуля из-за C++. У C++ вышел очень интересный взгляд на контракты: concepts/requires. После него любые другие способы выглядят убогими и ограниченными. Если бы это появилось у какого-то языка типа Scala/Nemerle и т.д. — создателям C# можно было бы эту находку "не заметить". Но на C++ в самой MS очень много пишут, так что придётся выдумывать что-то подобное для C#.


Зачем с нуля? Что кодогенерацию отменили? Мы как раз в этой теме и сидим. Мы вместо явного интерфейса используем op методы, которые мы можем и явно подменить.
Смысла особого нет для тех же числовых типов использовать op_XXX

public shape SGroup<T>      
{      
 static T operator +(T t1, T t2);      
 static T Zero {get;}       
}


Если нужно переопределить для типа
public extension IntGroup of int: SGroup<int>    
{    
 public static int Zero => 0;    
}


Например сравнивая с дженериками то для value типов генерится отдельный класс. Это ничем не отличается от шейпов

public static AddAll<T>(T[] ts) where T: SGroup<T> // shape used as constraint    
{    
 var result = T.Zero; // Making use of the shape's Zero property    
 foreach (var t in ts) { result += t; } // Making use of the shape's + operator    
 return result;    
}
и солнце б утром не вставало, когда бы не было меня
Re[11]: Шейпы убрали из C#9
От: hi_octane Беларусь  
Дата: 05.05.20 11:54
Оценка:
S>Зачем с нуля? Что кодогенерацию отменили? Мы как раз в этой теме и сидим. Мы вместо явного интерфейса используем op методы, которые мы можем и явно подменить.
S>Смысла особого нет для тех же числовых типов использовать op_XXX
С арифметикой можно было бы вырулить сравнительно малой кровью. Но есть задачки посложнее. Причиной появления шейпов было то что в существующих дженериках хрен запишешь ограничение "тип T имеет статический метод Create(int, string)" или "имеет экземплярный или экстеншен метод GetAwaiter()", при том что в обсуждении развития языка всё больший упор делается на развитие возможностей extension методов (например поддержку GetEnumerator() расширений), и т.д. C++ показал как это сделать относительно красиво и читабельно. Имея возможность такой записи, нужно думать — может можно шейпы вообще не вводить, и все сценарии закрываются дженериками, а значит не требуют и серьёзных изменений рантайма.
Отредактировано 05.05.2020 12:02 hi_octane . Предыдущая версия .
Re[9]: Introducing C# Source Generators
От: varenikAA  
Дата: 05.05.20 11:59
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Ну не проблема это мелочи какието. Вот шейпов не добавили в С#9 вот это огорчение. https://www.c-sharpcorner.com/article/candidate-features-for-c-sharp-9/



When this feature is done, then we can reduce the C# code to,



public class Greeter(name: string)     
    {    
     public void Greet()     
     {    
     Console.WriteLine($ "Hello, {_name}");    
     }    
    }


Бросилось в глаза
name: string


Это правда будет в C#? и можно будет типы определять после имени? УРА!!!
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[12]: Шейпы убрали из C#9
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.05.20 12:34
Оценка:
Здравствуйте, hi_octane, Вы писали:

S>>Зачем с нуля? Что кодогенерацию отменили? Мы как раз в этой теме и сидим. Мы вместо явного интерфейса используем op методы, которые мы можем и явно подменить.

S>>Смысла особого нет для тех же числовых типов использовать op_XXX
_>С арифметикой можно было бы вырулить сравнительно малой кровью. Но есть задачки посложнее. Причиной появления шейпов было то что в существующих дженериках хрен запишешь ограничение "тип T имеет статический метод Create(int, string)" или "имеет экземплярный или экстеншен метод GetAwaiter()", при том что в обсуждении развития языка всё больший упор делается на развитие возможностей extension методов (например поддержку GetEnumerator() расширений), и т.д. C++ показал как это сделать относительно красиво и читабельно. Имея возможность такой записи, нужно думать — может можно шейпы вообще не вводить, и все сценарии закрываются дженериками, а значит не требуют и серьёзных изменений рантайма.

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

Но есть вполне можно написать

public shape SGroup<T>      
{      
 static T operator +(T t1, T t2);      
 static T Zero {get;} 
 static T  Create(int i, string s);     
}


Если он есть , то используем если нет или нужно переопределить то
public extension IntGroup of int: SGroup<int>    
{    
 static T  Create(int i, string s)
{
….
}   
}
и солнце б утром не вставало, когда бы не было меня
Re[10]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.05.20 12:46
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Это правда будет в C#? и можно будет типы определять после имени? УРА!!!

неа это делфи,емерле,котлин,тайпскрипт

https://www.c-sharpcorner.com/article/deev-dive-into-c-sharp-9/

data class Point3D(int X, int Y, int Z);
и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: varenikAA  
Дата: 05.05.20 13:17
Оценка:
Здравствуйте, Serginio1, Вы писали:

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

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

S> Очень интересен пример AutoNotifyGenerator https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/SourceGeneratorSamples/AutoNotifyGenerator.cs

S>Пример использования атрибутов
S>https://github.com/dotnet/roslyn-sdk/blob/master/samples/CSharp/SourceGenerators/GeneratedDemo/UseAutoNotifyGenerator.cs
S> Раньше использовались Fody Refit которые Il код редактировали.
S>Ну и T4, правда бы еще и синтаксис типа разора

Что насчет этого? github.com/pamidur/aspect-injector

PS пробовал для логирования. Неплохая штука. Но похоже это предел для C#. Все же выше головы не прыгнешь(без квази-цитирования и/или макросов).
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.05.20 13:27
Оценка:
Здравствуйте, varenikAA, Вы писали:


AA>Что насчет этого? github.com/pamidur/aspect-injector


AA>PS пробовал для логирования. Неплохая штука. Но похоже это предел для C#. Все же выше головы не прыгнешь(без квази-цитирования и/или макросов).


Кроме фоди есть постшарп https://www.postsharp.net/documentation
Да и без квазицитирования можно обойтись. Можно генерить наследников. Доступ к содержимому контекса есть.
Было бы что кодогенерировать
и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: Ночной Смотрящий Россия  
Дата: 05.05.20 16:58
Оценка:
Здравствуйте, Serginio1, Вы писали:

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

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

Потому что это давно уже не новость, просто сейчас их решили документировать и стабилизировать API.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 05.05.20 17:58
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

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


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

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

НС>Потому что это давно уже не новость, просто сейчас их решили документировать и стабилизировать API.


Ну я и в обсуждениях не видел. Странно. А примеры работают ив 16.5.4
и солнце б утром не вставало, когда бы не было меня
Re[2]: Introducing C# Source Generators
От: Silver_S Ниоткуда  
Дата: 12.05.20 06:00
Оценка:
Здравствуйте, Kolesiki, Вы писали:

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


Немерле — это пока только прототип языка. Для массового промышленного применения пока не годится.

Главное что они начали хоть что-то. Даже пока это не доделали. Эти Source Generators, обсуждали еще 3 года назад. https://rsdn.org/forum/dotnet/6737695.1
Автор: ifle
Дата: 27.03.17

Тогда еще был более продвинутый вариант с переписыванием кода, а не только с добавлением. Пришли к выводу что все это слишком сложно. Я думал — полностью отказались от этой затеи.
Хорошо хоть начали с чего-то простого. Когда это обкатают, может у сообщества появятся новые идеи — что делать дальше.

Если бы у тебя или у кого-то были хорошие идеи, как внедрить в C# более продвинутые макросы. То они бы прислушались.
Re[3]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.20 09:14
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>Если бы у тебя или у кого-то были хорошие идеи, как внедрить в C# более продвинутые макросы. То они бы прислушались.

Для начала нужно, что бы отображались сгенерированные методы и свойства и помечались, как сгенерированные
и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: Pzz Россия https://github.com/alexpevzner
Дата: 12.05.20 09:57
Оценка:
Здравствуйте, Serginio1, Вы писали:

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

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

Ой, надо же. Они это из Go содрали. Даже название не удосужились изменить.

https://habr.com/ru/post/269887/
Re[11]: Introducing C# Source Generators
От: Ночной Смотрящий Россия  
Дата: 12.05.20 12:37
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Ну что за детские манипуляции. Сам приписал мне какое-то мнение, сам обсмеял, и типа "вся в белом стою красивая"? Ну нет, надо херак-херак тебе — и наиграешься тоже ты


Никаких манипуляций. Ты прямо и недвусмысленно возмущаешься что в промышленном языке долго изменения обсуждают.
А касаемо наиграешься — вы много лет со своим Немерле игрались. У вас все там круто и правильно. Только как не был он пригоден для промышленного применения, так и остался таковым.

_>Они же нам так обстоятельно в блогах объясняли: фичу создавать долго и дорого, надо очень много всего учесть. Даже ты вот поверил, что херак-херак нельзя. Но это на словах, а по факту же результат у них как будто делали херак-херак.


Только вот херак-херак один из самых популярных языков в мире, а Немерле как был маргинальщиной, так и остался. Видать, народ не тот, не понимает своего щастя.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Introducing C# Source Generators
От: Ночной Смотрящий Россия  
Дата: 12.05.20 12:39
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Ой, надо же. Они это из Go содрали. Даже название не удосужились изменить.


Эта история, включая название, уже довольно давно тянется. Так что еще неизвестно кто у кого содрал.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Introducing C# Source Generators
От: Silver_S Ниоткуда  
Дата: 01.07.20 19:26
Оценка:
Здравствуйте, Goldy, Вы писали:

G>Ради эксперимента потратил пару дней чтобы попробовать сделать не только генерацию а возможность модификации исходного кода.

G>В принципе метод рабочий, чтобы заставить работать пришлось сильно пободаться с иммутабельностью в Roslyn

А если бы в C# добавили ключевое слово, которое бы сообщало компилятору, что member или class надо отбросить(проигнорировать, не генерировать код) после того, как отработают все генераторы ? Типа комментариев, но с проверкой синтаксиса. А генераторы бы имели доступ. Это бы сильно упростило такое переписывание? Им ведь не сложно такое добавить. Слово, например : "gernerator","meta","$".

meta public class С
{
  ...
}
Re[3]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.07.20 20:24
Оценка:
Здравствуйте, Silver_S, Вы писали:

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


G>>Ради эксперимента потратил пару дней чтобы попробовать сделать не только генерацию а возможность модификации исходного кода.

G>>В принципе метод рабочий, чтобы заставить работать пришлось сильно пободаться с иммутабельностью в Roslyn

S_S>А если бы в C# добавили ключевое слово, которое бы сообщало компилятору, что member или class надо отбросить(проигнорировать, не генерировать код) после того, как отработают все генераторы ? Типа комментариев, но с проверкой синтаксиса. А генераторы бы имели доступ. Это бы сильно упростило такое переписывание? Им ведь не сложно такое добавить. Слово, например : "gernerator","meta","$".


http://rsdn.org/forum/dotnet/7739320.1
Автор: Silver_S
Дата: 26.05.20
и солнце б утром не вставало, когда бы не было меня
Re[4]: Introducing C# Source Generators
От: Silver_S Ниоткуда  
Дата: 02.07.20 08:38
Оценка:
Здравствуйте, Serginio1, Вы писали:

G>>>Ради эксперимента потратил пару дней чтобы попробовать сделать не только генерацию а возможность модификации исходного кода.


S_S>>А если бы в C# добавили ключевое слово, которое бы сообщало компилятору, что member или class надо отбросить(проигнорировать, не генерировать код) после того, как отработают все генераторы ? Типа комментариев, но с проверкой синтаксиса. А генераторы бы имели доступ. Это бы сильно упростило такое переписывание? Им ведь не сложно такое добавить. Слово, например : "gernerator","meta","$".


S>http://rsdn.org/forum/dotnet/7739320.1
Автор: Silver_S
Дата: 26.05.20


А если с телами методов надо что-то сделать, старые методы останутся, их бы выкинуть из кода.

Или такой пример у них. Здесь backing fields остаются. Только property добавляются.
// The view model we'd like to augment
    public partial class ExampleViewModel
    {
        [AutoNotify]
        private string _text = "private field text";

        [AutoNotify(PropertyName = "Count")]
        private int _amount = 5;
    }


Неплохо было бы так. В зависимости от атрибутов. Все это превращается либо в readonly поля(инициализация через конструктор), либо в AutoNotiyProperty, либо в Record(data class), ... либо еще во что-то.
Сам этот шаблон уже будет не нужен в коде. Можно ему дать хитрое имя с подчеркиваниями, но лучше удалить.

[...]
$public class ExampleViewModel
{
    public string Text= "private field text";
    public int Amount = 5;
}


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

Вроде они сначала планировали слово replace, для замены кода не помеченного на удаление.
Они испугались вот этого. Что код заменит один generator, потом его заменит другой generator.

To support scenarios where multiple generators may replace the same method, it will be necessary to determine an order for the chain of replacements....

И выбрали другую крайность — ничего не удалять совсем.
Хотя если сразу помечать код на удаление(а генераторы только добавляют) подобных проблем не будет совсем.
Отредактировано 02.07.2020 8:59 Silver_S . Предыдущая версия . Еще …
Отредактировано 02.07.2020 8:41 Silver_S . Предыдущая версия .
Отредактировано 02.07.2020 8:39 Silver_S . Предыдущая версия .
Re[5]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.07.20 09:03
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>Очевидно, если будут generators, то захочется им передавать какой-то код, который нужен только им, потом его отбрасывать.


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

Второй самый простой способ на данном этапе это наследование и переопределение виртуальных методов и свойств
и солнце б утром не вставало, когда бы не было меня
Re[6]: Introducing C# Source Generators
От: Silver_S Ниоткуда  
Дата: 02.07.20 09:46
Оценка:
Здравствуйте, Serginio1, Вы писали:

S_S>>Очевидно, если будут generators, то захочется им передавать какой-то код, который нужен только им, потом его отбрасывать.


S> Передавать можно хоть откуда. Проблема в том, что ты не можешь менять существующий код.

S> На этапе программирования тебе нужно знать методы, свойства для интеллисенсе.
S>Поэтому нужны partial методы и свойства.
S> Второй самый простой способ на данном этапе это наследование и переопределение виртуальных методов и свойств

Т.е. пока в этом плане возможности более ограниченные чем T4 — если студия/интелисенс не видит код от generators? Но это проблема, наверное, решаемая (в будущем).
Хотя бы вручную запускать нужные генераторы, при изменении кода, и в студии кешировать текущий код от генераторов.
Но возможно привязать к атрибутам инфо — какие генераторы их используют. И при изменении хода с этими атрибутами — помечать код как требующий ручной перегенерации, либо автоматически.
Re[7]: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.07.20 10:01
Оценка:
Здравствуйте, Silver_S, Вы писали:



S_S>Т.е. пока в этом плане возможности более ограниченные чем T4 — если студия/интелисенс не видит код от generators? Но это проблема, наверное, решаемая (в будущем).


Ну ты можешь еще и не дописать всех атрибутов для генерации кода. Но интеллисенс ты можешь использовать полностью.
Тут даже интересен не столько partial method а как ты написал.
Помечать метод или свойство который будет использоваться для интеллисенсе и генерации кода в реальном методе.
При этом при компиляции отбрасываться.
Посмотрим, что в дальнейшем придумают
и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 26.08.20 09:05
Оценка:
New C# Source Generator Samples

И пример с использованием шаблонов
https://github.com/rexm/Handlebars.Net
и солнце б утром не вставало, когда бы не было меня
Отредактировано 26.08.2020 9:08 Serginio1 . Предыдущая версия .
Re: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 16.09.20 16:28
Оценка:
Здравствуйте, Serginio1, Вы писали:

https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9

Two final features support C# code generators. C# code generators are a component you can write that is similar to a roslyn analyzer or code fix. The difference is that code generators analyze code and write new source code files as part of the compilation process. A typical code generator searches code for attributes or other conventions.

A code generator read attributes or other code elements using the Roslyn analysis APIs. From that information, it adds new code to the compilation. Source generators can only add code; they aren't allowed to modify any existing code in the compilation.

The two features added for code generators are extensions to partial method syntax, and module initializers. First, the changes to partial methods. Before C# 9.0, partial methods are private but can't specify an access modifier, have a void return, and can't have out parameters. These restrictions meant that if no method implementation is provided, the compiler removes all calls to the partial method. C# 9.0 removes these restrictions, but requires that partial method declarations have an implementation. Code generators can provide that implementation. To avoid introducing a breaking change, the compiler considers any partial method without an access modifier to follow the old rules. If the partial method includes the private access modifier, the new rules govern that partial method.

The second new feature for code generators is module initializers. Module initializers are methods that have the ModuleInitializerAttribute attribute attached to them. These methods will be called by the runtime when the assembly loads. A module initializer method:

Must be static
Must be parameterless
Must return void
Must not be a generic method
Must not be contained in a generic class
Must be accessible from the containing module

и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.01.21 07:42
Оценка:
Visual Studio 2019 v16.9 Preview 3 is Available Today

Visual Studio 2019 v16.9 Preview 3 можно видеть нагенеренный код
и солнце б утром не вставало, когда бы не было меня
Re: Introducing C# Source Generators
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 28.01.21 07:46
Оценка:
Using C# Source Generators to create an external DSL
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.