public override void VisitAttr(AttrDefinition attr)
{
attr.TypeSpecifier.Accept(this);
Type attrType = attr.TypeSpecifier.RawType;
TypeBuilder typeBuilder = currentClass.TypeBuilder;
MethodAttributes readerAttributes =
MethodAttributes.Virtual | MethodAttributes.HideBySig;
MethodAttributes writerAttributes =
MethodAttributes.Virtual | MethodAttributes.HideBySig;
switch (attr.Modifier) {
case AttrModifier.None:
readerAttributes |= MethodAttributes.Public;
writerAttributes |= MethodAttributes.Public;
break;
case AttrModifier.Private:
readerAttributes |= MethodAttributes.Private;
writerAttributes |= MethodAttributes.Private;
break;
case AttrModifier.Readonly:
readerAttributes |= MethodAttributes.Public;
writerAttributes |= MethodAttributes.Private;
break;
}
attr.FieldBuilder =
typeBuilder.DefineField("_" + attr.Name,
attrType,
FieldAttributes.Private);
try {
attr.Reader = DefineReader(typeBuilder, attr.Name,
readerAttributes,
attr.TypeSpecifier);
attr.Writer = DefineWriter(typeBuilder, attr.Name,
readerAttributes,
attr.TypeSpecifier);
}
catch (MethodConflictionException e) {
report.Error(attr.Location, e.Message);
}
}