Привет.
Решил изучать потихоньку Nemerle. Возникло желание объявлять авто-свойства в виде
public property MyProperty : string;
Написал простенький макрос, вроде бы работает, но возникла проблема, когда нужно повесить аттрибут на свойство.
[NotMapped]
public property MyProperty : string;
естественно не работает, т.к. аттрибуту нужно свойство.
Можно ли удалить навешеные на поле аттрибуты и повесить их на сгенеренное мною свойство? Еще хотелось бы избавится от указания public (у меня все такие свойства публичные с публичными геттером и сеттером). Если можно — подскажите пожалуйста куда копать?
Привожу код макроса. Подозреваю что подход неверный, но уж как получилось
[MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Field, Inherited = false)]
macro property(typeBuilder : TypeBuilder, field : ClassMember.Field)
syntax ("property")
{
AutoPropertyMacroImpl.DoTransform(Macros.ImplicitCTX(), typeBuilder, field)
}
module AutoPropertyMacroImpl
{
public DoTransform(typer : Typer, typeBuilder : TypeBuilder, field : ClassMember.Field) : void
{
Macros.DefineCTX(typer);
def newFieldName = Macros.NewSymbol(field.ParsedName);
field.Attributes = NemerleModifiers.Private | NemerleModifiers.CompilerMutable | NemerleModifiers.Mutable;
field.name = Splicable.Name(newFieldName);
_ = typeBuilder.Define(<[ decl:
public $(field.ParsedName : usesite) : $(field.ParsedType)
{
[System.Runtime.CompilerServices.CompilerGenerated]
get { $(newFieldName.Id : usesite) };
[System.Runtime.CompilerServices.CompilerGenerated]
set { $(newFieldName.Id : usesite) = value };
}
]>);
}
}
P.S. При создании макроса с помощью визарда в VS2010 генерится неверный тип аргумента — ClassMembe.Field
Здравствуйте, KRT, Вы писали:
KRT>Привет.
KRT>Решил изучать потихоньку Nemerle. Возникло желание объявлять авто-свойства в виде
KRT>Написал простенький макрос, вроде бы работает, но возникла проблема, когда нужно повесить аттрибут на свойство.
KRT>KRT>[NotMapped]
KRT>public property MyProperty : string;
KRT>
KRT>естественно не работает, т.к. аттрибуту нужно свойство.
а если помечать поля а не свойства? вообще в любом случае при работе с аттрибутами и модификаторами есть достаточная свобода, можно как удалить так и добавить новые.
Это можно сделать в поле modifiers вашего ClassMember.Field, там есть свойств CustomAttributes которое доступно для чтения и записи, туда можно добавить аттрибут в виде квазицитаты <[ NotMapped ]>, тип там list[PExpr] у аттрибутов.
KRT>Можно ли удалить навешеные на поле аттрибуты и повесить их на сгенеренное мною свойство? Еще хотелось бы избавится от указания public (у меня все такие свойства публичные с публичными геттером и сеттером). Если можно — подскажите пожалуйста куда копать?
Там же в объекте modifiers есть поле mods типа NemerleModifiers оно доступно для записи, и можете изменить видимость ваших свойств.
KRT>Привожу код макроса. Подозреваю что подход неверный, но уж как получилось
ну раз работает значит подход верный, макросы дают полную свободу в выборе пути, можете пробовать и смотреть на результаты, может быть создадите что то новое, что никто не создавал...
KRT>P.S. При создании макроса с помощью визарда в VS2010 генерится неверный тип аргумента — ClassMembe.Field
Это учтем спасибо!
Здравствуйте, CodingUnit, Вы писали:
Спасибо, все заработало
Хотя это и возможно, но очень советую стараться не удалять части АСТ созданные программистом.
Вместо того чтобы удалять атрибуты лучше создать макро-атрибут. Он выполнится во время компиляции и будут удален компилятором автоматически.