Возникли проекные пробелмы. Поробую обрисовать их...
Вот как выглядит простой вариант группы шаблонов 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>>