Добавил поддержку auto-property (как в C# 3.0).
Теперь для описания свойства которой только пишет и читает перменные можно использовать синтаксис:
public Prop1 : int { get; private set; }
public Prop2 : int { get; set; }
Пример использования:
using System.Console;
public class A
{
public this(i : int) { Prop1 = i; }
public Prop1 : int { get; private set; }
public Prop2 : int { get; set; }
}
module Program
{
Main() : void
{
def a = A(123);
a.Prop2 = 789;
WriteLine($"a.Prop1=$(a.Prop1); a.Prop2=$(a.Prop2);");
_ = ReadLine();
}
}
Особую гордость вызывает объем и чистота кода котрый пришлось добавить для реализации этой возможности.
Вот он весь:
// Support autoproperty (see C# 3.0 specification).
// убеждаемся, что это не абстракное или extern- свойсво, что это не индексер (т.е. нет параметров) и не член интерфейса.
when (!(propertyAst.Attributes %&& (NemerleAttributes.Abstract | NemerleAttributes.Extern))
&& !IsIndexer && !par.IsInterface)
match (propertyAst.get, propertyAst.set)
{
| (Some(PT.ClassMember.Function(_, _, FunBody.Abstract) as getr), // распознаем, что getter и setter абстрактны (не имеют тел)
Some(PT.ClassMember.Function(_, _, FunBody.Abstract) as setr)) => // за одно "выцепляем" ссылки на сами getter и setter.
def field = Macros.NewSymbol("field"); // Генерируем новое имя для поля, которое будет хранить значение свойства
par.Define(<[ decl: mutable $(field : name) : $(propertyAst.ty); ]>); // Добавляем поле это поле
// Формируем тела getter-а и setter-а, так чтобы они использовали добавленное выше поле.
getr.Body = <[ $(field : name) ]>;
setr.Body = <[ $(field : name) = value ]>;
| _ => ()
}
Этот код находится в
http://nemerle.org/svn/nemerle/trunk/ncc/hierarchy/ClassMembers.n
ЗЫ
Казалось бы сколько времени пользуюсь паттерн-матчингом и квази-цитированием, но блин вот от таких вещей порой просто прет (в хоршем смысле этого слова (с)).
... << RSDN@Home 1.2.0 alpha rev. 637>>