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: Кодогенерация в 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[12]: Кодогенерация в Visual Studio 2013
От: LWhisper  
Дата: 29.09.17 10:18
Оценка:
Здравствуйте, qxWork, Вы писали:

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

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