Удаление custom аттрибутов из макроса
От: KRT Украина  
Дата: 06.01.12 11:50
Оценка:
Привет.

Решил изучать потихоньку 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
Re: Удаление custom аттрибутов из макроса
От: CodingUnit Россия  
Дата: 06.01.12 14:38
Оценка: 2 (1)
Здравствуйте, 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

Это учтем спасибо!
Re[2]: Удаление custom аттрибутов из макроса
От: KRT Украина  
Дата: 06.01.12 15:10
Оценка:
Здравствуйте, CodingUnit, Вы писали:

Спасибо, все заработало
Re: Удаление custom аттрибутов из макроса
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.01.12 08:28
Оценка:
Хотя это и возможно, но очень советую стараться не удалять части АСТ созданные программистом.

Вместо того чтобы удалять атрибуты лучше создать макро-атрибут. Он выполнится во время компиляции и будут удален компилятором автоматически.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.