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[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
От: 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[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[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: 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
От: 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[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 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.