Кодогенерация в 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[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[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
От: 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
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.09.17 14:40
Оценка:
Здравствуйте, LWhisper, Вы писали:

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


LW>А смысл?


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

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


Почему?

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


Кодогенерация тоже разная бывает. Так что ты все же опиши саму задачу. Может мы тебе что-то более дельное подскажем.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.