diff options
Diffstat (limited to 'mcs/ilasm/codegen/PropertyDef.cs')
-rw-r--r-- | mcs/ilasm/codegen/PropertyDef.cs | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/mcs/ilasm/codegen/PropertyDef.cs b/mcs/ilasm/codegen/PropertyDef.cs new file mode 100644 index 00000000000..ef35adcae30 --- /dev/null +++ b/mcs/ilasm/codegen/PropertyDef.cs @@ -0,0 +1,136 @@ +// +// Mono.ILASM.PropertyDef +// +// Author(s): +// Jackson Harper (Jackson@LatitudeGeo.com) +// +// (C) 2003 Jackson Harper, All right reserved +// + + +using System; +using System.Collections; + +namespace Mono.ILASM { + + public class PropertyDef : ICustomAttrTarget { + + private FeatureAttr attr; + private string name; + private BaseTypeRef type; + private ArrayList arg_list; + private PEAPI.Property prop_def; + private bool is_resolved; + private ArrayList customattr_list; + + private MethodRef _get; + private MethodRef _set; + private MethodRef other; + private PEAPI.Constant init_value; + + public PropertyDef (FeatureAttr attr, BaseTypeRef type, string name, ArrayList arg_list) + { + this.attr = attr; + this.name = name; + this.type = type; + this.arg_list = arg_list; + is_resolved = false; + } + + public void AddCustomAttribute (CustomAttr customattr) + { + if (customattr_list == null) + customattr_list = new ArrayList (); + + customattr_list.Add (customattr); + } + + public PEAPI.Property Resolve (CodeGen code_gen, PEAPI.ClassDef classdef) + { + if (is_resolved) + return prop_def; + + PEAPI.Type[] type_list = new PEAPI.Type[arg_list.Count]; + + for (int i=0; i<type_list.Length; i++) { + BaseTypeRef arg_type = (BaseTypeRef) arg_list[i]; + arg_type.Resolve (code_gen); + type_list[i] = arg_type.PeapiType; + } + + type.Resolve (code_gen); + prop_def = classdef.AddProperty (name, type.PeapiType, type_list); + + if ((attr & FeatureAttr.Rtspecialname) != 0) + prop_def.SetRTSpecialName (); + + if ((attr & FeatureAttr.Specialname) != 0) + prop_def.SetSpecialName (); + + prop_def.SetInstance ((attr & FeatureAttr.Instance) != 0); + + if (customattr_list != null) + foreach (CustomAttr customattr in customattr_list) + customattr.AddTo (code_gen, prop_def); + + + is_resolved = true; + + return prop_def; + } + + private PEAPI.MethodDef AsMethodDef (PEAPI.Method method, string type) + { + PEAPI.MethodDef methoddef = method as PEAPI.MethodDef; + if (methoddef == null) + Report.Error (type + " method of property " + name + " not found"); + return methoddef; + } + + public void Define (CodeGen code_gen, PEAPI.ClassDef classdef) + { + if (!is_resolved) + Resolve (code_gen, classdef); + + if (_get != null) { + _get.Resolve (code_gen); + prop_def.AddGetter (AsMethodDef (_get.PeapiMethod, "get")); + } + + if (_set != null) { + _set.Resolve (code_gen); + prop_def.AddSetter (AsMethodDef (_set.PeapiMethod, "set")); + } + + if (other != null) { + other.Resolve (code_gen); + prop_def.AddOther (AsMethodDef (other.PeapiMethod, "other")); + } + + if (init_value != null) + prop_def.AddInitValue (init_value); + } + + public void AddGet (MethodRef _get) + { + this._get = _get; + } + + public void AddSet (MethodRef _set) + { + this._set = _set; + } + + public void AddOther (MethodRef other) + { + this.other = other; + } + + public void AddInitValue (PEAPI.Constant init_value) + { + this.init_value = init_value; + } + } + +} + |