Коллеги, подскажите удобное средство для кодогенерации совместимое с 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();
}
}
Здравствуйте, LWhisper, Вы писали:
LW>Коллеги, подскажите удобное средство для кодогенерации совместимое с Visual Studio 2013. LW>В моём распоряжении последний ReSharper, сама студия, любое бесплатное ПО и прямые руки. LW>T4 не предлагать.
LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих. LW>Хочется иметь полный контроль над формированием текста.
Напишите просто консольную утилитку. Совместима будет с чем угодно.
Здравствуйте, vmpire, Вы писали:
LW>>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих. LW>>Хочется иметь полный контроль над формированием текста. V>Напишите просто консольную утилитку. Совместима будет с чем угодно.
Чем вызывать консольную утилиту из студии?
Как передавать зависимости (хотя бы текущую строчку)?
Здравствуйте, LWhisper, Вы писали:
LW>>>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих. LW>>>Хочется иметь полный контроль над формированием текста. V>>Напишите просто консольную утилитку. Совместима будет с чем угодно.
LW>Чем вызывать консольную утилиту из студии?
Зачем непременно из студии? Если именно из студии — добавьте в external tools
LW>Как передавать зависимости (хотя бы текущую строчку)?
Текущую строчку чего? Если окна редактора — то $(CurLine) или $(CurText), смотря что именно надо.
Кстати, полное условие задачи не ясно: "добавить в проект файл с новым типом и модифицировать 6 существующих."
6 существующих проектов? файлов? типов? С точки зрения русского языка можно понять всеми тремя способами.
Здравствуйте, LWhisper, Вы писали:
LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих. LW>Хочется иметь полный контроль над формированием текста.
И как часто и как именно это надо делать?
Если хочется вызывать из студии руками, то таки можно написать плагин к ReSharper-у.
Консольная утилита точно будет работать, но там придется руками модифицировать .csproj, что в нетривиальных случаях может быть непросто и приведет к перезагрузке проекта в студии, если он в этот момент открыт.
Но если это надо для билда, то можно написать build step, который новый файл в компиляцию добавит. Или можно использовать wildcard-ы, чтобы проектный файл не модифицировать.
Здравствуйте, LWhisper, Вы писали:
LW>T4 не предлагать.
Не осилил или есть какие-то объективные причины не юзать инструмент, прямо предназначенный для генерации??
Ну вот Perl есть — совместим с любой студией.
Здравствуйте, LWhisper, Вы писали:
LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих. LW>Хочется иметь полный контроль над формированием текста.
Это ты нам рассказал о гипотетической реализации некоторой задачи. А теперь расскажи нам о самой задаче. Какую проблему ты решаешься решить? И зачем тебе, при этом, генерация кода?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, LWhisper, Вы писали:
LW>Добрый день.
LW>Коллеги, подскажите удобное средство для кодогенерации совместимое с Visual Studio 2013. LW>В моём распоряжении последний ReSharper, сама студия, любое бесплатное ПО и прямые руки.
LW>T4 не предлагать.
LW>Необходимо прочитать текущую строчку, добавить в проект файл с новым типом и модифицировать 6 существующих. LW>Хочется иметь полный контроль над формированием текста.
Здравствуйте, VladD2, Вы писали:
VD>Это ты нам рассказал о гипотетической реализации некоторой задачи. А теперь расскажи нам о самой задаче. Какую проблему ты решаешься решить? И зачем тебе, при этом, генерация кода?
А смысл?
Альтернативные решения есть, я о них знаю, мне они нравятся, но применить их я не могу.
Я бы с удовольствием решил задачу иначе, но, увы, это невозможно.
Поэтому отталкиваться придётся всё-таки от гипотетической реализации некоторой задачи средствами кодогенерации.
Здравствуйте, Kolesiki, Вы писали:
K>Не осилил или есть какие-то объективные причины не юзать инструмент, прямо предназначенный для генерации?? K>Ну вот Perl есть — совместим с любой студией.
Ну, если выбирать между Perl и T4, то выбор, безусловно, в сторону последнего.
На T4 я могу изобразить простейшие вещи, опираясь на примеры. Сложные — нет. Возможно ли реализовать то, что я хочу на T4 — не знаю, скорее всего нет.
Но я совершенно точно знаю, что не хочу учить два десятка человек саппортить этот страшненький и устаревший в момент рождения инструмент. >_>
Если его не использует даже MS, то ну его нафиг.
Здравствуйте, qxWork, Вы писали:
W>И как часто и как именно это надо делать?
По мере написания кода. В идеале, из менюшки по Alt+Enter, к сожалению, функционала live-template не хватает. ((
W>Если хочется вызывать из студии руками, то таки можно написать плагин к ReSharper-у.
Думаю в этом направлении, но чёрт возьми, мне не нравится способ паблишенга плагинов к R#, не говоря уже о том, что настройка окружения — это какой-то кромешный ад, а темплейты они до сих пор не запилили (или что-то изменилось?).
W>Консольная утилита точно будет работать, но там придется руками модифицировать .csproj, что в нетривиальных случаях может быть непросто и приведет к перезагрузке проекта в студии, если он в этот момент открыт.
Перезагрузка проектов не устраивает. Плюс придётся вручную добавлять интеграцию с CVS (хотя бы на уровне автоматического чекаута файлов).
Здравствуйте, vmpire, Вы писали:
V>Зачем непременно из студии? Если именно из студии — добавьте в external tools
Потому что хочется иметь под рукой быстрое действие, которой можно выполнить, нажатием хоткея.
V>Текущую строчку чего? Если окна редактора — то $(CurLine) или $(CurText), смотря что именно надо.
Хм. Интересно, нужно попробовать. Спасибо! Если других вариантов не будет, так и поступлю. Но разбирать синтаксическое дерево по второму разу не хочется... Но все равно лучше, чем ничего!
V>Кстати, полное условие задачи не ясно: "добавить в проект файл с новым типом и модифицировать 6 существующих." V>6 существующих проектов? файлов? типов? С точки зрения русского языка можно понять всеми тремя способами.
С точки зрения задачи, абсолютно не имеет значения, разве нет? )
Но речь о существующих типах, которые в первом приближении можно принять за файлы, даже с константными путями, хотя от этого, конечно, хочется уйти.
Здравствуйте, LWhisper, Вы писали:
LW>T4 не предлагать.
Стандартный выбор — T4, Fody (если il rewrite не смущает), pre-build script, в который можно прикрутить что угодно вплоть до рослина.
Всё остальное будет сильно хуже по удобству/наличию неприятных сюрпризов.
Здравствуйте, LWhisper, Вы писали:
V>>Зачем непременно из студии? Если именно из студии — добавьте в external tools LW>Потому что хочется иметь под рукой быстрое действие, которой можно выполнить, нажатием хоткея.
На всякий случай: на external tools тоже можно вешать хоткеи
Здравствуйте, LWhisper, Вы писали:
LW>На T4 я могу изобразить простейшие вещи, опираясь на примеры. Сложные — нет. Возможно ли реализовать то, что я хочу на T4 — не знаю, скорее всего нет.
Здравствуйте, 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 выглядит очень грязно. Это отталкивает. Как убедить несколько десятков разработчиков поддерживать эту дрянь, если тебя самого бросает от неё в дрожь?
Здравствуйте, 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. Или расширения какого. Решарпер из коробки могёт.
Здравствуйте, LWhisper, Вы писали:
VD>>Это ты нам рассказал о гипотетической реализации некоторой задачи. А теперь расскажи нам о самой задаче. Какую проблему ты решаешься решить? И зачем тебе, при этом, генерация кода?
LW>А смысл?
Люди смогут ответить тебе более осмысленно. Часто такие вопросы возникают из-за неверного выбранного подхода или не верной оценки задачи.
LW>Я бы с удовольствием решил задачу иначе, но, увы, это невозможно.
Почему?
LW>Поэтому отталкиваться придётся всё-таки от гипотетической реализации некоторой задачи средствами кодогенерации.
Кодогенерация тоже разная бывает. Так что ты все же опиши саму задачу. Может мы тебе что-то более дельное подскажем.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.