StringTemplate
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.04.07 13:24
Оценка:
Возникли проекные пробелмы. Поробую обрисовать их...

Вот как выглядит простой вариант группы шаблонов String Template:
...
[Record]
class Index
{
  Name    : string;
  Entries : list[string];
}

[StringTemplateGroup()]
public class MyTemplateGroup
{
  CreateIndex(index : Index) : string {<#
  CREATE INDEX $(index.Name)
  (
    ..$(index.Entries; "\n")
  )
  #>}
}


Общая идея работы проста проста. Срабатывает мета-атрибут уровня класса (StringTemplateGroup), на него мы пробегаемся по методам класса, находим среди них методы, которые возвращают строку и содержат в своем теле только один строковый литерал.
namespace MacroLibrary2
{
  using MacroLibrary2.Helper;
  
  [MacroUsage(MacroPhase.WithTypedMembers, MacroTargets.Class, Inherited = true)]
  macro StringTemplateGroup(tb : TypeBuilder)
  {
    Helper2.MakeTemplateGroup(tb, Nemerle.Macros.ImplicitCTX());
  }

  internal module Helper2
  {
    internal MakeTemplateGroup(tb : TypeBuilder, ctx : Typer) : void
    {
            foreach (m is MethodBuilder in tb.GetMethods(BF.DeclaredOnly | BF.Instance | BF.Public | BF.NonPublic))
            {
                when (IsRetirnTypeString(m) && m.Body is PExpr.Sequence([PExpr.Literal(Literal.String(val))]))
                {
                    // Проводим разбор строки и генерируем код...
                }
            }
    }
  }


Далее парсим эти тела и преобразовываем в эффективный код генерации строк на базе StringBuilder-а.
Проблема только в том, что Интеграция теперь откладывает парсинг методов до момента, когда пользователь попытается к ним обратиться. Это приводит к тому, что вместо тел методов мы имеем пустышки.
В результате в Интеграции мы получаем предупреждения о том, что параметры методов не используются, что неприятно.
Возникла идея не добавить ли событие вызываемое когда появляется отпарсенное тело метода?
К нему можно было бы подключаться и делать необходимую обработку (переписывать код метода) невзирая на то работаем ли мы под управлением Интеграции или нет.
Есть ли какие-нить мысли по этому поводу?
Может есть другие предложения?
Не будет ли это перебором?
Если делать события, то как их лучше организовать? Ведь болезным могут быть и глобальные "хуки" и подключение к конкретным методам. Как и какие события лучше оформить?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.