Re: Кодогенерация в Visual Studio 2013
От: Shargorodsky  
Дата: 29.09.17 08:51
Оценка: 40 (4)
Здравствуйте, LWhisper, Вы писали:

LW>T4 не предлагать.


LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих.

LW>Хочется иметь полный контроль над формированием текста.

В свое решал похожую задачу для крупной системы и пришел к следующей связке, которая сильно упростила жизнь:
1. Пишем свой extension к студии
2. Внутри используем runtime T4
3. Вызываем генератор там, где нужно, анализируя код Розлином
4. Создание файлов, модификация проекта и прочее доступно через EnvDTE

Преимущества по сравнению с дизайн-тайм Т4:
1. Вся кодогенерация пишется в *.cs файле, как обычный код
2. Можно написать простейшие тесты, которые будут как минимум выводить сгенеренный код на экран
3. Можно пойти дальше и написать реальные тесты, которые будут компилировать код и будут пытаться его выполнить
Re[4]: Кодогенерация в Visual Studio 2013
От: D.Lans Россия  
Дата: 27.09.17 12:48
Оценка: 27 (3)
Здравствуйте, Sinix, Вы писали:

LW>>Народ вроде что-то на Razor ваял от безысходности.


Я из этого народа. Пишу на Razor шаблоны для генерации модели + контроллера + пачки CRUD-вьюшек для ASP.NET сайта по информации из набиваемого руками XML файла.

В солюшне имею отдельный консольный проект генератора.
Добавляю в него новый XML файл модели, набиваю руками список полей
Из консоли вызываю CodeGen.exe Model <имя XML>

Razor компилирует шаблоны, кладёт файлы в нужные папки, добавляет эти файлы в проекты студии через
var targetProject = new Microsoft.Build.Evaluation.Project("targetProj.csproj");
if (!targetProject.Items.Any(i => i.ItemType == "Compile" && i.UnevaluatedInclude == relPath))
                    targetProject.AddItem("Compile", relPath);
// relPath - относительный путь к файлу от корня проекта


Альтабаюсь обратно в студию, она предлагает перезагрузить изменившийся csproj, соглашаюсь.
Получаю новые файлы. Это что касается генерации новых файлов, вопрос редактирования имеющихся пока открытый.

По ощущениям: не нравится.
Хотел получить такое же удобства с Intellisense как при редактировании ASP.NET шаблонов,
на деле Razor'ские шаблоны испещрены руганью на старую версию .NET и отсутствие ссылок на неймспейсы.
(со включённым решарпером ругани ещё больше)
  Скрытый текст

Причём большая часть ошибок лживые — тот же вывод типов через var прекрасно работает, но часть настоящие, например не работает $-интерполяция строк. Всё это раздражает, но настроить пока не удаётся. Народ также мучается.
Re[5]: Кодогенерация в Visual Studio 2013
От: Sinix  
Дата: 26.09.17 14:29
Оценка: 8 (2)
Здравствуйте, LWhisper, Вы писали:

LW>Я хочу только объявить метод в интерфейсе и получить кучу готового кода.


С этого и надо было начинать, задача несколько сложнее, чем тупой codegen. Для рослина можно поискать ключевые слова отсюда
https://stackoverflow.com/questions/44091647/roslyn-2-x-codefix-that-implements-a-missing-interface-delegated-to-a-member-v

Для решарпера лучше на местном форуме JB поспрошать.
Re[3]: Кодогенерация в Visual Studio 2013
От: Sinix  
Дата: 25.09.17 14:16
Оценка: 4 (1)
Здравствуйте, LWhisper, Вы писали:

LW>IL не смущает, но нужны именно файлы исходников, генерируемые по хоткею, а не автогенерация кода/сборок. Иначе всё было бы намного проще.

Тогда или рослин, или t4, или экзотика. Народ вроде что-то на Razor ваял от безысходности.


LW>А у рослина появилось адекватное API для построения деревьев? С полгода назад я пытался изобразить на нём что-то элементарное, вроде класса с конструктором, аргументы которого записываются в свойства с приватным сеттером, и уже на этом месте встрял в отсутствие примеров или интуитивно понятного API. Кажется, как раз не смог изменить модификатор сеттера.

Нет конечно Обычно всё сводится к парсингу заготовки (куска кода в виде строки) и допиливанию визитором.


S>>А чем T4 плох?

LW>Во-первых, MS в том же рослине его не использует, и пишет код просто через TextWriter, что настораживает.
Ну так сценарии вообще-вообще разные. Логично вроде)


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

Да нет в нём ничего сложного. Банальный сахар для text writer, не более того. Для быстро сгенерить другую версию из готового кода или получить красивый код по модельке — самое оно.
Единственно, T4 не годится для "получить AST и что-то с ним сделать", всё на уровне регексов.
В CodeJam примеров полно, поищи .tt -файлы.

LW>Юзер пишет:

IInterface nt = new MyType();
nt.DoSomething(arg1, arg2, arg3);

LW>Нажимает хоткей, генериурется метод с нужной сигнатурой на основе переданных аргументов в IInterface, и его реализации во всех известных наследниках данного интерфейса.
А вот это прям идеальный сценарий для Roslyn analyser-a. Или расширения какого. Решарпер из коробки могёт.
Re[3]: Кодогенерация в Visual Studio 2013
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.09.17 10:35
Оценка: 2 (1)
Здравствуйте, LWhisper, Вы писали:

LW>На T4 я могу изобразить простейшие вещи, опираясь на примеры. Сложные — нет. Возможно ли реализовать то, что я хочу на T4 — не знаю, скорее всего нет.


Возможно не в тему, но есть VisualStudioHelper


https://stackoverflow.com/questions/18653991/automatically-generating-extensions-to-partial-classes-in-visual-studio


https://msdn.microsoft.com/ru-ru/library/envdte.codefunction.aspx

https://github.com/AndersMalmgren/T4TemplateExample/blob/master/MyApp.Web/VisualStudioHelper.ttinclude
и солнце б утром не вставало, когда бы не было меня
Отредактировано 25.09.2017 10:39 Serginio1 . Предыдущая версия .
Re[5]: Кодогенерация в Visual Studio 2013
От: vmpire Россия  
Дата: 27.09.17 13:26
Оценка: 2 (1)
Здравствуйте, D.Lans, Вы писали:

LW>>>Народ вроде что-то на Razor ваял от безысходности.

DL>Я из этого народа. Пишу на Razor шаблоны для генерации модели + контроллера + пачки CRUD-вьюшек для ASP.NET сайта по информации из набиваемого руками XML файла.
Знаком я был с командой, которая примерно так и делала. Только это было задолго до Razor, генератор по XML был просто на C# написан.
И, кстати, они ещё и юнит-тесты генерировали.
По отзывам — очень неудобная система. Экономия времени по сравнению с на написанием этого комплекта руками небольшая, и, к тому же, разовая.
А вот поддержка всего этого превращается в кошмар: всё автогенерённое, поэтому если нужно изменить поведение в какой-то части, то нужно или править генератор (что долго и рискованно и очень неудобно при совместной работе) или делать какие-то ручные шаги после генерации.
Так что там постоянно были какие-то баги из-за того, что что-то не так сгенерировалось или кто-то забыл что-то запустить или исправить.
К сожалению, у них был неуправляемый техлид-энтузиаст и неопытный ПМ, поэтому команда так и мучалась пока худо-бедно не вышли в продакшн, после чего проект прикрыли.
По слухам прикрыли из-за очень большого времени добавления новых фич (ещё бы, попроавить генератор, проверить все места, где что-то генерировалось...)
Возможно это из-за того, что они "не умели готовить" генерацию.
Но отношение у меня к ней с тех пор настороженное. Ну, то есть, сам-то применяю, но просчитывая все последствия.
Re[2]: Кодогенерация в Visual Studio 2013
От: Mr.Delphist  
Дата: 26.09.17 09:34
Оценка: +1
Здравствуйте, Aquilaware, Вы писали:

A>Это вы зря. Надежная штука, работает хорошо и везде. В VS 2017 вообще из коробки идет в конфигурации по-умолчанию.


Уже писал неоднократно: нехорошо она работает, не везде.
http://rsdn.org/forum/dotnet/6752924.1
Автор: Mr.Delphist
Дата: 10.04.17
Re[5]: Кодогенерация в Visual Studio 2013
От: Sinix  
Дата: 28.09.17 06:43
Оценка: +1
Здравствуйте, LWhisper, Вы писали:

LW>Есть удалённая база данных к которой нужно выполнять параметризованные запросы, модифицируя их как на стороне клиента, так и на стороне сервера.

LW>Всё на велосипедах. Сторонние решения, нормальные ORM, LINQ/IQuerable и т.д. не подходят из-за проблем с лицензированием, сертификацией, внутренней политикой или моральными ограничениями. Ну и чем тут поможешь, кроме смены места работы?
Или страдать, или никак. Ещё можно посмотреть генерацию моделей на t4 в linq2db.
https://github.com/linq2db/t4models
Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 18.09.17 16:33
Оценка:
Добрый день.

Коллеги, подскажите удобное средство для кодогенерации совместимое с Visual Studio 2013.
В моём распоряжении последний ReSharper, сама студия, любое бесплатное ПО и прямые руки.

T4 не предлагать.

Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих.
Хочется иметь полный контроль над формированием текста.

Небольшой пример:

Ленивый программист пишет:
String hello = "Hello";
String world = "world";
Int32 count = 1;
String result = client.Do(hello, world, count);


Нажимает Alt+Enter, получает:

[Serializable]
class DoSpec
{
  [Serializable] String Hello {get;}
  [Serializable] String World {get;}
  [Serializable] Int32 Count {get;}

  public DoSpec(String hello, String world, Int32 count)
  {
      Hello = hello;
      World = world;
      Count = count;
  }
}

partial interface IClient
{
    String Do(String hello, String world, Int32 count);
}

partial class Client1 : IClient
{
  public String Do(String hello, String world, Int32 count)
  {
    SendSpec spec = new SendSpec(hello, world, count);
    var result = _connection.Invoke(spec);
    return result.GetString();
  }
}

partial class Client2 : IClient
{
  public String Do(String hello, String world, Int32 count)
  {
    _pipe.WriteString(0, hello);
    _pipe.WriteString(1, world);
    _pipe.WriteInt32(2, count);
    
    return _pipe.ReadString();
  }
}
Отредактировано 28.09.2017 14:00 LWhisper . Предыдущая версия .
Re: Кодогенерация в Visual Studio 2013
От: vmpire Россия  
Дата: 18.09.17 16:42
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Коллеги, подскажите удобное средство для кодогенерации совместимое с Visual Studio 2013.

LW>В моём распоряжении последний ReSharper, сама студия, любое бесплатное ПО и прямые руки.
LW>T4 не предлагать.

LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих.

LW>Хочется иметь полный контроль над формированием текста.
Напишите просто консольную утилитку. Совместима будет с чем угодно.
Re[2]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 18.09.17 17:02
Оценка:
Здравствуйте, vmpire, Вы писали:

LW>>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих.

LW>>Хочется иметь полный контроль над формированием текста.
V>Напишите просто консольную утилитку. Совместима будет с чем угодно.

Чем вызывать консольную утилиту из студии?
Как передавать зависимости (хотя бы текущую строчку)?
Re[3]: Кодогенерация в Visual Studio 2013
От: vmpire Россия  
Дата: 18.09.17 17:46
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>>>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих.

LW>>>Хочется иметь полный контроль над формированием текста.
V>>Напишите просто консольную утилитку. Совместима будет с чем угодно.

LW>Чем вызывать консольную утилиту из студии?

Зачем непременно из студии? Если именно из студии — добавьте в external tools

LW>Как передавать зависимости (хотя бы текущую строчку)?

Текущую строчку чего? Если окна редактора — то $(CurLine) или $(CurText), смотря что именно надо.

Кстати, полное условие задачи не ясно: "добавить в проект файл с новым типом и модифицировать 6 существующих."
6 существующих проектов? файлов? типов? С точки зрения русского языка можно понять всеми тремя способами.
Re: Кодогенерация в Visual Studio 2013
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 19.09.17 11:35
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих.

LW>Хочется иметь полный контроль над формированием текста.
И как часто и как именно это надо делать?
Если хочется вызывать из студии руками, то таки можно написать плагин к ReSharper-у.
Консольная утилита точно будет работать, но там придется руками модифицировать .csproj, что в нетривиальных случаях может быть непросто и приведет к перезагрузке проекта в студии, если он в этот момент открыт.
Но если это надо для билда, то можно написать build step, который новый файл в компиляцию добавит. Или можно использовать wildcard-ы, чтобы проектный файл не модифицировать.
Re: Кодогенерация в Visual Studio 2013
От: Kolesiki  
Дата: 19.09.17 19:53
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>T4 не предлагать.


Не осилил или есть какие-то объективные причины не юзать инструмент, прямо предназначенный для генерации??
Ну вот Perl есть — совместим с любой студией.
Re: Кодогенерация в Visual Studio 2013
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.09.17 08:33
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих.

LW>Хочется иметь полный контроль над формированием текста.

Это ты нам рассказал о гипотетической реализации некоторой задачи. А теперь расскажи нам о самой задаче. Какую проблему ты решаешься решить? И зачем тебе, при этом, генерация кода?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: конфликт сборок
От: Codechanger Россия  
Дата: 20.09.17 10:18
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Добрый день.


LW>Коллеги, подскажите удобное средство для кодогенерации совместимое с Visual Studio 2013.

LW>В моём распоряжении последний ReSharper, сама студия, любое бесплатное ПО и прямые руки.

LW>T4 не предлагать.


LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих.

LW>Хочется иметь полный контроль над формированием текста.

Roslyn вроде умеет
Re[2]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 25.09.17 09:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Это ты нам рассказал о гипотетической реализации некоторой задачи. А теперь расскажи нам о самой задаче. Какую проблему ты решаешься решить? И зачем тебе, при этом, генерация кода?


А смысл?
Альтернативные решения есть, я о них знаю, мне они нравятся, но применить их я не могу.
Я бы с удовольствием решил задачу иначе, но, увы, это невозможно.
Поэтому отталкиваться придётся всё-таки от гипотетической реализации некоторой задачи средствами кодогенерации.
Re[2]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 25.09.17 10:00
Оценка:
Здравствуйте, Kolesiki, Вы писали:

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

K>Ну вот Perl есть — совместим с любой студией.

Ну, если выбирать между Perl и T4, то выбор, безусловно, в сторону последнего.
На T4 я могу изобразить простейшие вещи, опираясь на примеры. Сложные — нет. Возможно ли реализовать то, что я хочу на T4 — не знаю, скорее всего нет.
Но я совершенно точно знаю, что не хочу учить два десятка человек саппортить этот страшненький и устаревший в момент рождения инструмент. >_>
Если его не использует даже MS, то ну его нафиг.
Re[2]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 25.09.17 10:06
Оценка:
Здравствуйте, qxWork, Вы писали:

W>И как часто и как именно это надо делать?

По мере написания кода. В идеале, из менюшки по Alt+Enter, к сожалению, функционала live-template не хватает. ((

W>Если хочется вызывать из студии руками, то таки можно написать плагин к ReSharper-у.

Думаю в этом направлении, но чёрт возьми, мне не нравится способ паблишенга плагинов к R#, не говоря уже о том, что настройка окружения — это какой-то кромешный ад, а темплейты они до сих пор не запилили (или что-то изменилось?).

W>Консольная утилита точно будет работать, но там придется руками модифицировать .csproj, что в нетривиальных случаях может быть непросто и приведет к перезагрузке проекта в студии, если он в этот момент открыт.

Перезагрузка проектов не устраивает. Плюс придётся вручную добавлять интеграцию с CVS (хотя бы на уровне автоматического чекаута файлов).
Re[4]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 25.09.17 10:10
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Зачем непременно из студии? Если именно из студии — добавьте в external tools

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

V>Текущую строчку чего? Если окна редактора — то $(CurLine) или $(CurText), смотря что именно надо.

Хм. Интересно, нужно попробовать. Спасибо! Если других вариантов не будет, так и поступлю. Но разбирать синтаксическое дерево по второму разу не хочется... Но все равно лучше, чем ничего!

V>Кстати, полное условие задачи не ясно: "добавить в проект файл с новым типом и модифицировать 6 существующих."

V>6 существующих проектов? файлов? типов? С точки зрения русского языка можно понять всеми тремя способами.
С точки зрения задачи, абсолютно не имеет значения, разве нет? )
Но речь о существующих типах, которые в первом приближении можно принять за файлы, даже с константными путями, хотя от этого, конечно, хочется уйти.
Re: Кодогенерация в Visual Studio 2013
От: Sinix  
Дата: 25.09.17 10:22
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>T4 не предлагать.

Стандартный выбор — T4, Fody (если il rewrite не смущает), pre-build script, в который можно прикрутить что угодно вплоть до рослина.
Всё остальное будет сильно хуже по удобству/наличию неприятных сюрпризов.

А чем T4 плох?
Re[5]: Кодогенерация в Visual Studio 2013
От: vmpire Россия  
Дата: 25.09.17 10:29
Оценка:
Здравствуйте, LWhisper, Вы писали:

V>>Зачем непременно из студии? Если именно из студии — добавьте в external tools

LW>Потому что хочется иметь под рукой быстрое действие, которой можно выполнить, нажатием хоткея.
На всякий случай: на external tools тоже можно вешать хоткеи
Re[6]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 25.09.17 10:41
Оценка:
Здравствуйте, vmpire, Вы писали:

V>На всякий случай: на external tools тоже можно вешать хоткеи

Ага, я знаю, поэтому и сказал, что это вариант.
Re[2]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 25.09.17 10:54
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Стандартный выбор — T4, Fody (если il rewrite не смущает), pre-build script, в который можно прикрутить что угодно вплоть до рослина.

IL не смущает, но нужны именно файлы исходников, генерируемые по хоткею, а не автогенерация кода/сборок. Иначе всё было бы намного проще.
А у рослина появилось адекватное API для построения деревьев? С полгода назад я пытался изобразить на нём что-то элементарное, вроде класса с конструктором, аргументы которого записываются в свойства с приватным сеттером, и уже на этом месте встрял в отсутствие примеров или интуитивно понятного API. Кажется, как раз не смог изменить модификатор сеттера.

S>А чем T4 плох?

Во-первых, MS в том же рослине его не использует, и пишет код просто через TextWriter, что настораживает.
Во-вторых, я его не знаю, нужно осваивать, собирая все возможные грабли, и не факт, что в итоге получится реализовать задуманное.

Юзер пишет:
IInterface nt = new MyType();
nt.DoSomething(arg1, arg2, arg3);


Нажимает хоткей, генериурется метод с нужной сигнатурой на основе переданных аргументов в IInterface, и его реализации во всех известных наследниках данного интерфейса.

В-третьих, синтаксис T4 выглядит очень грязно. Это отталкивает. Как убедить несколько десятков разработчиков поддерживать эту дрянь, если тебя самого бросает от неё в дрожь?
Re[3]: Кодогенерация в Visual Studio 2013
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 25.09.17 13:09
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Во-первых, MS в том же рослине его не использует, и пишет код просто через TextWriter, что настораживает.

https://www.hanselman.com/blog/T4MVCAndR4MVCRoslynCodeGeneratorsForASPNETCoreTagHelpers.aspx
и солнце б утром не вставало, когда бы не было меня
Re[3]: Кодогенерация в Visual Studio 2013
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.09.17 14:40
Оценка:
Здравствуйте, LWhisper, Вы писали:

VD>>Это ты нам рассказал о гипотетической реализации некоторой задачи. А теперь расскажи нам о самой задаче. Какую проблему ты решаешься решить? И зачем тебе, при этом, генерация кода?


LW>А смысл?


Люди смогут ответить тебе более осмысленно. Часто такие вопросы возникают из-за неверного выбранного подхода или не верной оценки задачи.

LW>Я бы с удовольствием решил задачу иначе, но, увы, это невозможно.


Почему?

LW>Поэтому отталкиваться придётся всё-таки от гипотетической реализации некоторой задачи средствами кодогенерации.


Кодогенерация тоже разная бывает. Так что ты все же опиши саму задачу. Может мы тебе что-то более дельное подскажем.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Кодогенерация в Visual Studio 2013
От: Aquilaware  
Дата: 26.09.17 04:34
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>T4 не предлагать.


Это вы зря. Надежная штука, работает хорошо и везде. В VS 2017 вообще из коробки идет в конфигурации по-умолчанию.
Re[4]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 26.09.17 11:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кодогенерация тоже разная бывает. Так что ты все же опиши саму задачу. Может мы тебе что-то более дельное подскажем.


Есть удалённая база данных к которой нужно выполнять параметризованные запросы, модифицируя их как на стороне клиента, так и на стороне сервера.
Всё на велосипедах. Сторонние решения, нормальные ORM, LINQ/IQuerable и т.д. не подходят из-за проблем с лицензированием, сертификацией, внутренней политикой или моральными ограничениями. Ну и чем тут поможешь, кроме смены места работы?
Re[5]: Кодогенерация в Visual Studio 2013
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.09.17 13:00
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Есть удалённая база данных к которой нужно выполнять параметризованные запросы, модифицируя их как на стороне клиента, так и на стороне сервера.

LW>Всё на велосипедах. Сторонние решения, нормальные ORM, LINQ/IQuerable и т.д. не подходят из-за проблем с лицензированием, сертификацией, внутренней политикой или моральными ограничениями. Ну и чем тут поможешь, кроме смены места работы?

А какие проблемы с лецензированием могут быть у LINQ?

Собственно я бы, в твоем случае, как раз и посоветовал бы использовать LINQ + генерацию кода на базе деревьев выражений (ET). Создаешь сборку через рефлексию (DefineDynamicAssembly/DefineDynamicModule/DefineType/DefineMethod) и используешь метод CompileToMethod у ET. Далее читаешь метаданные БД и генерируешь нужные методы.

Т4 тут тоже подошел бы.

Если не страшно задействовать Nemerle, то это вообще идеальное решение для подобных задач. Вот очень похожий пример.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 26.09.17 13:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Собственно я бы, в твоем случае, как раз и посоветовал бы использовать LINQ + генерацию кода на базе деревьев выражений (ET). Создаешь сборку через рефлексию (DefineDynamicAssembly/DefineDynamicModule/DefineType/DefineMethod) и используешь метод CompileToMethod у ET. Далее читаешь метаданные БД и генерируешь нужные методы.


VD>Т4 тут тоже подошел бы.


VD>Если не страшно задействовать Nemerle, то это вообще идеальное решение для подобных задач. Вот очень похожий пример.


И, как я описал, ничто из этого не подходит.
Я бы тоже взял за основу LINQ. Увы. (
Re[4]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 26.09.17 13:49
Оценка:
Здравствуйте, Sinix, Вы писали:

Что касается T4, ни из примеров, ни из документации, я так и не смог понять — как его можно использовать в ситуациях отличных от "мне нужно 180 методов Sum, для (U)Int8/16/32/64 и их комбинаций". Я хочу только объявить метод в интерфейсе и получить кучу готового кода.

S>А вот это прям идеальный сценарий для Roslyn analyser-a. Или расширения какого. Решарпер из коробки могёт.

Вот в поисках подобных решений я и нахожусь. Решарпер, к сожалению, расширяется только через систему плагинов, которые развёртываются через NuGet-пакеты, а ссылки на SDK вчера были битые. :D
Re[7]: Кодогенерация в Visual Studio 2013
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.09.17 14:40
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>И, как я описал, ничто из этого не подходит.


Дык чем не подходит то? Какие-то странные у тебя там пробемы.

LW>Я бы тоже взял за основу LINQ. Увы. (


А что с ним не так то?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 27.09.17 10:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Дык чем не подходит то? Какие-то странные у тебя там пробемы.


Ну, вот представь, что ты разрабатываешь ядро Linux, и вдруг говоришь — а давайте заюзаем MSSQL!
Чем не подходит? Ну вот, несовместимо с жизнью. Я же сказал, что бессмысленно искать альтернативы. Есть один путь, которым можно пойти сейчас. Другие пока закрыты.
Re[6]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 27.09.17 10:59
Оценка:
Здравствуйте, Sinix, Вы писали:

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

S>https://stackoverflow.com/questions/44091647/roslyn-2-x-codefix-that-implements-a-missing-interface-delegated-to-a-member-v

О, спасибо огромное! Выглядит очень многообещающе!
Re[9]: Кодогенерация в Visual Studio 2013
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.09.17 05:47
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Ну, вот представь, что ты разрабатываешь ядро Linux, и вдруг говоришь — а давайте заюзаем MSSQL!


Ну, а зачем не относящиеся к делу вещи то приплетать? Ты на дотнете пишешь? Раз так то что тебе мешает использовать всего его средства?

LW>Чем не подходит? Ну вот, несовместимо с жизнью.


Чем? Аргументы то есть какие-то? Или "строгли белив"(ц) ?

LW>Я же сказал, что бессмысленно искать альтернативы. Есть один путь, которым можно пойти сейчас. Другие пока закрыты.


По-моему какая-то бессмысленная тема. Ты не определился с критериями и непонятно что хочешь.

Первое правил, если хочешь найти ответ на вопрос — определи четкие критерии. Отвергаешь что-то? Напиши список аргументов против этого чего-то. Потом сравни полученные списки. Список достоинств тоже не помешает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Кодогенерация в Visual Studio 2013
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 28.09.17 06:03
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>По мере написания кода. В идеале, из менюшки по Alt+Enter, к сожалению, функционала live-template не хватает. ((

Чего именно не хватает? Многофайловых?

LW>Думаю в этом направлении, но чёрт возьми, мне не нравится способ паблишенга плагинов к R#, не говоря уже о том, что настройка окружения — это какой-то кромешный ад, а темплейты они до сих пор не запилили (или что-то изменилось?).

А можно подробнее про ад и незапиленные темплейты?

LW>Перезагрузка проектов не устраивает. Плюс придётся вручную добавлять интеграцию с CVS (хотя бы на уровне автоматического чекаута файлов).

Если использовать wildcard-ы, и генерировать файлы в соотвествющие места, то можно обойтись без перегрузки.
Re[4]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 28.09.17 11:01
Оценка:
Здравствуйте, qxWork, Вы писали:

W>Чего именно не хватает? Многофайловых?

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

W>А можно подробнее про ад и незапиленные темплейты?

Конечно. Открываем доки. Радуемся простоте решения.
Проходим по ссылке и выпадаем в осадок, так как приходит осознание того, что нам предлагают решить загадку Эйнштейна. В дальнейшем это подозрение только крепнет. Но хорошо, мы взрослые матёрые программисты, умеем в мануалы и выполнять пошаговые инструкции.

Вводим: PM> Install-Package JetBrains.ReSharper.SDK -Version 2017.2.1
Получаем: Install-Package : Unable to find version '2017.2.1' of package 'JetBrains.ReSharper.SDK'.
Вот это поворот!

Ладно, с кем не бывает. Лезем на сайт за стэндалон версией SDK...
404 Not Found (в настоящий момент исправлено, я везучий)

Стянув пакет локально, пытаемся установить.
Attempting to resolve dependency 'xunit.abstractions (= 2.0.1)'.
The 'xunit.abstractions 2.0.1' package requires NuGet client version '2.12' or above, but the current NuGet version is '2.8.60610.756'.
Да ну растудыж твою тудыж!

Окей, сам виноват, ставим свежие обновления. Повторяем операцию.
Установилось! Ура! Ну, теперь то мы напишем свой первый плагин и заживём!..

Стоп. Что за .nuspec? Я просто хочу нажать F5 и увидеть Hello world в менюшке R#!

Гиперссылок нет. Поиск по документации, естественно, результатов не даёт (это ж поиск!).
Окей, мы матёрые программисты и умеем пользоваться гуглом.

О боже, сколько букв!
И всё о старой версии...

Попытка номер два. Хм. Кажется, это то, что мне нужно. Но стоп, а что я читал до этого? Чм экстеншены отличаются от плагинов? И если это разные штуки, то где описание .nuspec для экстеншенов?! Что происходит?!

И всё это время в голове крутится мысль, что уж лет пять назад были шаблоны проектов, в которые можно воткнуть всё, включая зависимости от NuGet-пакетов, так какого же дьявола приходится делать все это руками?!

Как-то так.
Re[3]: Кодогенерация в Visual Studio 2013
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 28.09.17 11:01
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Юзер пишет:

LW>
LW>IInterface nt = new MyType();
LW>nt.DoSomething(arg1, arg2, arg3);
LW>


LW>Нажимает хоткей, генериурется метод с нужной сигнатурой на основе переданных аргументов в IInterface, и его реализации во всех известных наследниках данного интерфейса.

Alt+Enter создает метод в интерфейсе. Еще один Alt+Enter на созданном методе создаст реализации во всех типах.
Если хочется создать непустую реализацию, можно ее написать в теле интерфейса и оттуда Alt+Enter-ом же размножить по типам.
Re[10]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 28.09.17 11:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Первое правил, если хочешь найти ответ на вопрос — определи четкие критерии. Отвергаешь что-то? Напиши список аргументов против этого чего-то. Потом сравни полученные списки. Список достоинств тоже не помешает.


Влад, ты пытаешься ответить на вопрос "как это сделать правильно", который я не задавал. Я прекрасно знаю, как это сделать по-человечески.
Я же спрашиваю, "как реализовать конкретно вот эту штуку". Я могу навертеть что угодно над и под описанным решением, но это единственный возможный вариант. Аргументов нет и не будет, поскольку все контраргумнты разобьются о железобетонное "но я хочу так". Я надеюсь, что в будущем мне удастся уйти от этого дерьмового решения, но сейчас это не возможно. Разве что "для души", но нужно "для дела".
Re[4]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 28.09.17 11:23
Оценка:
Здравствуйте, qxWork, Вы писали:

W>Если хочется создать непустую реализацию, можно ее написать в теле интерфейса и оттуда Alt+Enter-ом же размножить по типам.


Я думал о подобном подходе, довольно малой кровью даже удастся убрать все зависимости и сделать единый интерфейс доступа, но, к сожалению, это никак не избавит от необходимости создать класс, описывающий аргументы вызываемого метода и возвращаемый результат. Всё необходимое можно вывести из сигнатуры метода и переданных аргументов, но их сперва нужно распарсить, тобишь перехватить обработчик того самого ALt+Enter'а.
Re[5]: Кодогенерация в Visual Studio 2013
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 28.09.17 11:54
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Я думал о подобном подходе, довольно малой кровью даже удастся убрать все зависимости и сделать единый интерфейс доступа, но, к сожалению, это никак не избавит от необходимости создать класс, описывающий аргументы вызываемого метода и возвращаемый результат. Всё необходимое можно вывести из сигнатуры метода и переданных аргументов, но их сперва нужно распарсить, тобишь перехватить обработчик того самого ALt+Enter'а.

Что-то я перестал понимать. Предыдущий кусок кода с вызовом метода и его аргументами откуда взялся?
Re[6]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 28.09.17 13:58
Оценка:
Здравствуйте, qxWork, Вы писали:

W>Что-то я перестал понимать. Предыдущий кусок кода с вызовом метода и его аргументами откуда взялся?


Ленивый программист пишет:
String hello = "Hello";
String world = "world";
Int32 count = 1;
String result = client.Do(hello, world, count);


Нажимает Alt+Enter, получает:

[Serializable]
class DoSpec
{
  [Serializable] String Hello {get;}
  [Serializable] String World {get;}
  [Serializable] Int32 Count {get;}

  public DoSpec(String hello, String world, Int32 count)
  {
      Hello = hello;
      World = world;
      Count = count;
  }
}

partial interface IClient
{
    String Do(String hello, String world, Int32 count);
}

partial class Client1 : IClient
{
  public String Do(String hello, String world, Int32 count)
  {
    SendSpec spec = new SendSpec(hello, world, count);
    var result = _connection.Invoke(spec);
    return result.GetString();
  }
}

partial class Client2 : IClient
{
  public String Do(String hello, String world, Int32 count)
  {
    _pipe.WriteString(0, hello);
    _pipe.WriteString(1, world);
    _pipe.WriteInt32(2, count);
    
    return _pipe.ReadString();
  }
}
Re[7]: Кодогенерация в Visual Studio 2013
От: Sinix  
Дата: 28.09.17 14:09
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Нажимает Alt+Enter, получает:

пишем в T4
models.Add(new Method("Do", {Hello=default(string), World=default(string), Count=1});

Код в T4 получает на входе имя метода + anonymous type с нужными свойствами. Сгенерить из этого методы в partial-types — минутное дело.

UPD Ну вот что за мазохизм — спрашивать вообще не про то, что нужно получить?
http://www.gunsmoker.ru/2008/10/x-y-z.html в чистом виде.
Отредактировано 28.09.2017 14:11 Sinix . Предыдущая версия .
Re[7]: Кодогенерация в Visual Studio 2013
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 28.09.17 14:11
Оценка:
Здравствуйте, LWhisper, Вы писали:

LW>Ленивый программист пишет:

есть рефакторинг Create class from method parameters для этого.
Итого 3 действия:
— Alt+Enter create method from usage
— create class from method parameters
— Alt+Enter implement in derived classes
Re[8]: Кодогенерация в Visual Studio 2013
От: Sinix  
Дата: 28.09.17 14:13
Оценка:
Здравствуйте, qxWork, Вы писали:

W>Итого 3 действия:

W>- Alt+Enter create method from usage
W>- create class from method parameters
W>- Alt+Enter implement in derived classes

Неа, топикстартеру ещё надо тело метода из параметров сгенерить. Что-то типа сериализации. Задача или для emit-а, или для T4.
Re[8]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 28.09.17 14:42
Оценка:
Здравствуйте, Sinix, Вы писали:

S>пишем в T4

S>
S>models.Add(new Method("Do", {Hello=default(string), World=default(string), Count=1});
S>

S>Код в T4 получает на входе имя метода + anonymous type с нужными свойствами. Сгенерить из этого методы в partial-types — минутное дело.
Как ты и написал, это потребует отделить описать модель. Впрочем, я всё ещё рассматриваю этот вариант. Как минимум, он удобнее в плане долгосрочной поддержки.
Re[9]: Кодогенерация в Visual Studio 2013
От: Sinix  
Дата: 28.09.17 14:43
Оценка:
Здравствуйте, LWhisper, Вы писали:

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

Иначе в коде останется 100500 сигнатур, которые больше не нужны.
Re[9]: Кодогенерация в Visual Studio 2013
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 28.09.17 16:51
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Неа, топикстартеру ещё надо тело метода из параметров сгенерить. Что-то типа сериализации. Задача или для emit-а, или для T4.

Ты прав, а экшен implement serializable можно запилить.
Re[10]: Кодогенерация в Visual Studio 2013
От: Sinix  
Дата: 28.09.17 17:05
Оценка:
Здравствуйте, qxWork, Вы писали:

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


S>>Неа, топикстартеру ещё надо тело метода из параметров сгенерить. Что-то типа сериализации. Задача или для emit-а, или для T4.

W>Ты прав, а экшен implement serializable можно запилить.
Подвох ещё в том, что код кастомный, у топикстартера несколько протоколов (если это вообще сериализация). Как минимум что-то похожее на protobuf/asn и вообще непонятно что (библиотека с api в стиле SendSpec() не попадалась).
Re[11]: Кодогенерация в Visual Studio 2013
От: qxWork Голландия http://www.jetbrains.com/company/people/Coox_Sergey.html
Дата: 28.09.17 18:03
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Подвох ещё в том, что код кастомный, у топикстартера несколько протоколов (если это вообще сериализация). Как минимум что-то похожее на protobuf/asn и вообще непонятно что (библиотека с api в стиле SendSpec() не попадалась).

Вообще в его примере класс примитивный — он почти весь сам сгенерится, нужно только будет Serializable развесить.
Но механизм на общий случай сделать сложно.
Re[12]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 29.09.17 10:18
Оценка:
Здравствуйте, qxWork, Вы писали:

S>>Подвох ещё в том, что код кастомный, у топикстартера несколько протоколов (если это вообще сериализация). Как минимум что-то похожее на protobuf/asn и вообще непонятно что (библиотека с api в стиле SendSpec() не попадалась).

W>Вообще в его примере класс примитивный — он почти весь сам сгенерится, нужно только будет Serializable развесить.
W>Но механизм на общий случай сделать сложно.
Верно, поэтому и хочется иметь ручной контроль над генерируемым кодом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.