+2007-01-17 Bill Holmes <bill.holmes@ansys.com>
+ Raja R Harinath <rharinath@novell.com>
+
+ * cs-parser.jay (accessor_declarations): Use it instead of 'Pair'.
+ Note the order in which accessors are declared in the source.
+
2007-01-16 Sergey P. Kondratyev <se@unicom.tomica.ru>
* generic.cs (TypeParameter.FindMembers): Use the generic
break;
Property prop;
- Pair pair = (Pair) $8;
- Accessor get_block = (Accessor) pair.First;
- Accessor set_block = (Accessor) pair.Second;
+ Accessors accessors = (Accessors) $8;
+ Accessor get_block = accessors.get_or_add;
+ Accessor set_block = accessors.set_or_remove;
MemberName name = (MemberName) $4;
syntax_error (lexer.Location, "a property can't have type arguments");
prop = new Property (current_class, (Expression) $3, (int) $2, false,
- name, (Attributes) $1, get_block, set_block);
+ name, (Attributes) $1, get_block, set_block, accessors.declared_in_reverse);
current_container.AddProperty (prop);
implicit_value_parameter_type = null;
accessor_declarations
: get_accessor_declaration
{
- $$ = new Pair ($1, null);
+ $$ = new Accessors ((Accessor) $1, null);
}
| get_accessor_declaration accessor_declarations
{
- Pair pair = (Pair) $2;
- pair.First = $1;
- $$ = pair;
+ Accessors accessors = (Accessors) $2;
+ accessors.get_or_add = (Accessor) $1;
+ $$ = accessors;
}
| set_accessor_declaration
{
- $$ = new Pair (null, $1);
+ $$ = new Accessors (null, (Accessor) $1);
}
| set_accessor_declaration accessor_declarations
{
- Pair pair = (Pair) $2;
- pair.Second = $1;
- $$ = pair;
+ Accessors accessors = (Accessors) $2;
+ accessors.set_or_remove = (Accessor) $1;
+ accessors.declared_in_reverse = true;
+ $$ = accessors;
}
| error
{
if ($7 == null) {
p = new Property (current_class, (Expression) $3, (int) $2, true,
name, (Attributes) $1,
- null, null);
+ null, null, false);
Report.Error (548, p.Location, "`{0}': property or indexer must have at least one accessor", p.GetSignatureForError ());
break;
}
- Pair pair = (Pair) $7;
+ Accessors accessor = (Accessors) $7;
p = new Property (current_class, (Expression) $3, (int) $2, true,
name, (Attributes) $1,
- (Accessor)pair.First, (Accessor)pair.Second);
+ accessor.get_or_add, accessor.set_or_remove, accessor.declared_in_reverse);
- if (pair.First != null && ((Accessor)(pair.First)).Block != null) {
+ if (accessor.get_or_add != null && accessor.get_or_add.Block != null) {
Report.Error (531, p.Location, "`{0}.get': interface members cannot have a definition", p.GetSignatureForError ());
$$ = null;
break;
}
- if (pair.Second != null && ((Accessor)(pair.Second)).Block != null) {
+ if (accessor.set_or_remove != null && accessor.set_or_remove.Block != null) {
Report.Error (531, p.Location, "`{0}.set': interface members cannot have a definition", p.GetSignatureForError ());
$$ = null;
break;
i = new Indexer (current_class, (Expression) $3,
new MemberName (TypeContainer.DefaultIndexerName, (Location) $4),
(int) $2, true, (Parameters) $6, (Attributes) $1,
- null, null);
+ null, null, false);
Report.Error (548, i.Location, "`{0}': property or indexer must have at least one accessor", i.GetSignatureForError ());
break;
}
- Pair pair = (Pair) $10;
+ Accessors accessors = (Accessors) $10;
i = new Indexer (current_class, (Expression) $3,
new MemberName (TypeContainer.DefaultIndexerName, (Location) $4),
(int) $2, true, (Parameters) $6, (Attributes) $1,
- (Accessor)pair.First, (Accessor)pair.Second);
+ accessors.get_or_add, accessors.set_or_remove, accessors.declared_in_reverse);
- if (pair.First != null && ((Accessor)(pair.First)).Block != null) {
+ if (accessors.get_or_add != null && accessors.get_or_add.Block != null) {
Report.Error (531, i.Location, "`{0}.get': interface members cannot have a definition", i.GetSignatureForError ());
$$ = null;
break;
}
- if (pair.Second != null && ((Accessor)(pair.Second)).Block != null) {
+ if (accessors.set_or_remove != null && accessors.set_or_remove.Block != null) {
Report.Error (531, i.Location, "`{0}.set': interface members cannot have a definition", i.GetSignatureForError ());
$$ = null;
break;
current_container.Name, name.ToString ());
$$ = null;
} else {
- Pair pair = (Pair) $8;
+ Accessors accessors = (Accessors) $8;
if (name.TypeArguments != null)
syntax_error (lexer.Location, "an event can't have type arguments");
- if (pair.First == null || pair.Second == null)
+ if (accessors.get_or_add == null || accessors.set_or_remove == null)
// CS0073 is already reported, so no CS0065 here.
$$ = null;
else {
Event e = new EventProperty (
current_class, (Expression) $4, (int) $2, false, name,
- (Attributes) $1, (Accessor) pair.First, (Accessor) pair.Second);
+ (Attributes) $1, accessors.get_or_add, accessors.set_or_remove);
if (RootContext.Documentation != null) {
e.DocComment = Lexer.consume_doc_comment ();
Lexer.doc_state = XmlCommentState.Allowed;
event_accessor_declarations
: add_accessor_declaration remove_accessor_declaration
{
- $$ = new Pair ($1, $2);
+ $$ = new Accessors ((Accessor) $1, (Accessor) $2);
}
| remove_accessor_declaration add_accessor_declaration
{
- $$ = new Pair ($2, $1);
+ Accessors accessors = new Accessors ((Accessor) $2, (Accessor) $1);
+ accessors.declared_in_reverse = true;
+ $$ = accessors;
}
| add_accessor_declaration { $$ = null; }
| remove_accessor_declaration { $$ = null; }
// at section 3.6 on the spec
Indexer indexer;
IndexerDeclaration decl = (IndexerDeclaration) $3;
- Pair pair = (Pair) $6;
- Accessor get_block = (Accessor) pair.First;
- Accessor set_block = (Accessor) pair.Second;
+ Accessors accessors = (Accessors) $6;
+ Accessor get_block = accessors.get_or_add;
+ Accessor set_block = accessors.set_or_remove;
MemberName name;
if (decl.interface_type != null)
indexer = new Indexer (current_class, decl.type, name,
(int) $2, false, decl.param_list, (Attributes) $1,
- get_block, set_block);
+ get_block, set_block, accessors.declared_in_reverse);
if (RootContext.Documentation != null)
indexer.DocComment = ConsumeStoredComment ();
+2007-01-17 Bill Holmes <bill.holmes@ansys.com>
+ Raja R Harinath <rharinath@novell.com>
+
+ Fix emit order of 'get' vs. 'set'.
+ * support.cs (Accessors): New.
+ * cs-parser.jay (accessor_declarations): Use it instead of 'Pair'.
+ Note the order in which accessors are declared in the source.
+ * class.cs (PropertyBase.DefineGet, PropertyBase.DefineSet): New.
+ Refactored from Property.Define and Indexer.Define.
+ (PropertyBase.DefineAccessors): New helper that calls the above in
+ appropriate order as noted by the parser.
+ (Property.Define, Indexer.Define): Update to changes.
+ (PropertyBase.SetMethod.PropertyInfo): Don't return a null.
+
2007-01-17 Raja R Harinath <rharinath@novell.com>
Fix cs0029-6.cs and gcs0029-2.cs (regression)
public override Parameters ParameterInfo {
get {
+ if (parameters == null)
+ DefineParameters ();
return parameters;
}
}
public override MethodBuilder Define (DeclSpace parent)
{
- DefineParameters ();
if (IsDummy)
return null;
public PropertyBuilder PropertyBuilder;
public MethodBuilder GetBuilder, SetBuilder;
+ protected bool define_set_first = false;
+
public PropertyBase (DeclSpace parent, Expression type, int mod_flags,
int allowed_mod, bool is_iface, MemberName name,
- Attributes attrs)
+ Attributes attrs, bool define_set_first)
: base (parent, null, type, mod_flags, allowed_mod, is_iface, name, attrs)
{
+ this.define_set_first = define_set_first;
}
public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb)
return true;
}
+ bool DefineGet ()
+ {
+ if (Get.IsDummy)
+ return true;
+
+ GetBuilder = Get.Define (Parent);
+ return GetBuilder != null;
+ }
+
+ bool DefineSet (bool define)
+ {
+ if (!define || Set.IsDummy)
+ return true;
+
+ SetBuilder = Set.Define (Parent);
+ return SetBuilder != null;
+ }
+
+ protected bool DefineAccessors ()
+ {
+ return DefineSet (define_set_first) &&
+ DefineGet () &&
+ DefineSet (!define_set_first);
+ }
+
protected abstract PropertyInfo ResolveBaseProperty ();
// TODO: rename to Resolve......
public Property (DeclSpace parent, Expression type, int mod, bool is_iface,
MemberName name, Attributes attrs, Accessor get_block,
- Accessor set_block)
+ Accessor set_block, bool define_set_first)
: base (parent, type, mod,
is_iface ? AllowedInterfaceModifiers : AllowedModifiers,
- is_iface, name, attrs)
+ is_iface, name, attrs, define_set_first)
{
if (get_block == null)
Get = new GetMethod (this);
flags |= MethodAttributes.HideBySig | MethodAttributes.SpecialName;
- if (!Get.IsDummy) {
- GetBuilder = Get.Define (Parent);
- if (GetBuilder == null)
- return false;
- }
-
- SetBuilder = Set.Define (Parent);
- if (!Set.IsDummy) {
- if (SetBuilder == null)
- return false;
- }
+ if (!DefineAccessors ())
+ return false;
// FIXME - PropertyAttributes.HasDefault ?
public Indexer (DeclSpace parent, Expression type, MemberName name, int mod,
bool is_iface, Parameters parameters, Attributes attrs,
- Accessor get_block, Accessor set_block)
+ Accessor get_block, Accessor set_block, bool define_set_first)
: base (parent, type, mod,
is_iface ? AllowedInterfaceModifiers : AllowedModifiers,
- is_iface, name, attrs)
+ is_iface, name, attrs, define_set_first)
{
this.parameters = parameters;
return false;
flags |= MethodAttributes.HideBySig | MethodAttributes.SpecialName;
- if (!Get.IsDummy){
- GetBuilder = Get.Define (Parent);
- if (GetBuilder == null)
- return false;
+
+ if (!DefineAccessors ())
+ return false;
- //
+ if (!Get.IsDummy) {
// Setup iterator if we are one
- //
if ((ModFlags & Modifiers.METHOD_YIELDS) != 0){
Iterator iterator = Iterator.CreateIterator (Get, Parent, null, ModFlags);
if (iterator == null)
return false;
}
}
-
- SetBuilder = Set.Define (Parent);
- if (!Set.IsDummy){
- if (SetBuilder == null)
- return false;
- }
//
// Now name the parameters
break;
Property prop;
- Pair pair = (Pair) $8;
- Accessor get_block = (Accessor) pair.First;
- Accessor set_block = (Accessor) pair.Second;
+ Accessors accessors = (Accessors) $8;
+ Accessor get_block = accessors.get_or_add;
+ Accessor set_block = accessors.set_or_remove;
MemberName name = (MemberName) $4;
prop = new Property (current_class, (Expression) $3, (int) $2,
- false, name, (Attributes) $1, get_block, set_block);
+ false, name, (Attributes) $1, get_block, set_block, accessors.declared_in_reverse);
current_container.AddProperty (prop);
implicit_value_parameter_type = null;
accessor_declarations
: get_accessor_declaration
{
- $$ = new Pair ($1, null);
+ $$ = new Accessors ((Accessor) $1, null);
}
| get_accessor_declaration accessor_declarations
{
- Pair pair = (Pair) $2;
- pair.First = $1;
- $$ = pair;
+ Accessors accessors = (Accessors) $2;
+ accessors.get_or_add = (Accessor) $1;
+ $$ = accessors;
}
| set_accessor_declaration
{
- $$ = new Pair (null, $1);
+ $$ = new Accessors (null, (Accessor) $1);
}
| set_accessor_declaration accessor_declarations
{
- Pair pair = (Pair) $2;
- pair.Second = $1;
- $$ = pair;
+ Accessors accessors = (Accessors) $2;
+ accessors.set_or_remove = (Accessor) $1;
+ accessors.declared_in_reverse = true;
+ $$ = accessors;
}
| error
{
if ($7 == null) {
p = new Property (current_class, (Expression) $3, (int) $2, true,
name, (Attributes) $1,
- null, null);
+ null, null, false);
Report.Error (548, p.Location, "`{0}': property or indexer must have at least one accessor", p.GetSignatureForError ());
break;
}
- Pair pair = (Pair) $7;
+ Accessors accessor = (Accessors) $7;
p = new Property (current_class, (Expression) $3, (int) $2, true,
name, (Attributes) $1,
- (Accessor)pair.First, (Accessor)pair.Second);
+ accessor.get_or_add, accessor.set_or_remove, accessor.declared_in_reverse);
- if (pair.First != null && ((Accessor)(pair.First)).Block != null) {
+ if (accessor.get_or_add != null && accessor.get_or_add.Block != null) {
Report.Error (531, p.Location, "`{0}.get': interface members cannot have a definition", p.GetSignatureForError ());
$$ = null;
break;
}
- if (pair.Second != null && ((Accessor)(pair.Second)).Block != null) {
+ if (accessor.set_or_remove != null && accessor.set_or_remove.Block != null) {
Report.Error (531, p.Location, "`{0}.set': interface members cannot have a definition", p.GetSignatureForError ());
$$ = null;
break;
i = new Indexer (current_class, (Expression) $3,
new MemberName (TypeContainer.DefaultIndexerName, (Location) $4),
(int) $2, true, (Parameters) $6, (Attributes) $1,
- null, null);
+ null, null, false);
Report.Error (548, i.Location, "`{0}': property or indexer must have at least one accessor", i.GetSignatureForError ());
break;
}
- Pair pair = (Pair) $10;
+ Accessors accessors = (Accessors) $10;
i = new Indexer (current_class, (Expression) $3,
new MemberName (TypeContainer.DefaultIndexerName, (Location) $4),
(int) $2, true, (Parameters) $6, (Attributes) $1,
- (Accessor)pair.First, (Accessor)pair.Second);
+ accessors.get_or_add, accessors.set_or_remove, accessors.declared_in_reverse);
- if (pair.First != null && ((Accessor)(pair.First)).Block != null) {
+ if (accessors.get_or_add != null && accessors.get_or_add.Block != null) {
Report.Error (531, i.Location, "`{0}.get': interface members cannot have a definition", i.GetSignatureForError ());
$$ = null;
break;
}
- if (pair.Second != null && ((Accessor)(pair.Second)).Block != null) {
+ if (accessors.set_or_remove != null && accessors.set_or_remove.Block != null) {
Report.Error (531, i.Location, "`{0}.set': interface members cannot have a definition", i.GetSignatureForError ());
$$ = null;
break;
current_container.Name, name.ToString ());
$$ = null;
} else {
- Pair pair = (Pair) $8;
- if (pair.First == null || pair.Second == null)
+ Accessors accessors = (Accessors) $8;
+ if (accessors.get_or_add == null || accessors.set_or_remove == null)
// CS0073 is already reported, so no CS0065 here.
$$ = null;
else {
Event e = new EventProperty (
current_class, (Expression) $4, (int) $2, false, name,
- (Attributes) $1, (Accessor) pair.First, (Accessor) pair.Second);
+ (Attributes) $1, accessors.get_or_add, accessors.set_or_remove);
if (RootContext.Documentation != null) {
e.DocComment = Lexer.consume_doc_comment ();
Lexer.doc_state = XmlCommentState.Allowed;
event_accessor_declarations
: add_accessor_declaration remove_accessor_declaration
{
- $$ = new Pair ($1, $2);
+ $$ = new Accessors ((Accessor) $1, (Accessor) $2);
}
| remove_accessor_declaration add_accessor_declaration
{
- $$ = new Pair ($2, $1);
+ Accessors accessors = new Accessors ((Accessor) $2, (Accessor) $1);
+ accessors.declared_in_reverse = true;
+ $$ = accessors;
}
| add_accessor_declaration { $$ = null; }
| remove_accessor_declaration { $$ = null; }
Indexer indexer;
IndexerDeclaration decl = (IndexerDeclaration) $3;
Location loc = decl.location;
- Pair pair = (Pair) $6;
- Accessor get_block = (Accessor) pair.First;
- Accessor set_block = (Accessor) pair.Second;
+ Accessors accessors = (Accessors) $6;
+ Accessor get_block = accessors.get_or_add;
+ Accessor set_block = accessors.set_or_remove;
MemberName name;
if (decl.interface_type != null)
indexer = new Indexer (current_class, decl.type, name,
(int) $2, false, decl.param_list, (Attributes) $1,
- get_block, set_block);
+ get_block, set_block, accessors.declared_in_reverse);
if (RootContext.Documentation != null)
indexer.DocComment = ConsumeStoredComment ();
Accessor getter = new Accessor (get_block, 0, null, Location);
Property current = new Property (
- this, type, 0, false, name, null, getter, null);
+ this, type, 0, false, name, null, getter, null, false);
AddProperty (current);
}
}
}
+ public class Accessors {
+ public Accessor get_or_add;
+ public Accessor set_or_remove;
+
+ // was 'set' declared before 'get'? was 'remove' declared before 'add'?
+ public bool declared_in_reverse;
+
+ public Accessors (Accessor get_or_add, Accessor set_or_remove)
+ {
+ this.get_or_add = get_or_add;
+ this.set_or_remove = set_or_remove;
+ }
+ }
+
/// <summary>
/// This is a wrapper around StreamReader which is seekable backwards
/// within a window of around 2048 chars.