-//\r
-// interface.cs: Interface handler\r
-//\r
-// Author: Miguel de Icaza (miguel@gnu.org)\r
-//\r
-// Licensed under the terms of the GNU GPL\r
-//\r
-// (C) 2001 Ximian, Inc (http://www.ximian.com)\r
-//\r
-\r
-using System.Collections;\r
-using System;\r
-using System.IO;\r
-using System.Reflection;\r
-using System.Reflection.Emit;\r
-\r
-namespace Mono.CSharp {\r
-\r
- /// <summary>\r
- /// Interfaces\r
- /// </summary>\r
- public class Interface : DeclSpace {\r
- const MethodAttributes interface_method_attributes =\r
- MethodAttributes.Public |\r
- MethodAttributes.Abstract |\r
- MethodAttributes.HideBySig |\r
- MethodAttributes.NewSlot |\r
- MethodAttributes.Virtual;\r
-\r
- const MethodAttributes property_attributes =\r
- MethodAttributes.Public |\r
- MethodAttributes.Abstract |\r
- MethodAttributes.HideBySig |\r
- MethodAttributes.NewSlot |\r
- MethodAttributes.SpecialName |\r
- MethodAttributes.Virtual;\r
- \r
- ArrayList bases;\r
- \r
- ArrayList defined_method;\r
- ArrayList defined_indexer;\r
- ArrayList defined_events;\r
- ArrayList defined_properties;\r
-\r
- ArrayList method_builders;\r
- ArrayList property_builders;\r
- \r
- Attributes OptAttributes;\r
-\r
- // These will happen after the semantic analysis\r
- \r
- // Hashtable defined_indexers;\r
- // Hashtable defined_methods;\r
- \r
- /// <summary>\r
- /// Modifiers allowed in a class declaration\r
- /// </summary>\r
- public const int AllowedModifiers =\r
- Modifiers.NEW |\r
- Modifiers.PUBLIC |\r
- Modifiers.PROTECTED |\r
- Modifiers.INTERNAL |\r
- Modifiers.UNSAFE |\r
- Modifiers.PRIVATE;\r
-\r
- public Interface (TypeContainer parent, string name, int mod, Attributes attrs, Location l)\r
- : base (parent, name, l)\r
- {\r
- ModFlags = Modifiers.Check (AllowedModifiers, mod, Modifiers.PRIVATE, l);\r
- OptAttributes = attrs;\r
- \r
- method_builders = new ArrayList ();\r
- property_builders = new ArrayList ();\r
- }\r
-\r
- public AdditionResult AddMethod (InterfaceMethod imethod)\r
- {\r
- string name = imethod.Name;\r
- Object value = defined_names [name];\r
-\r
- if (value != null){\r
- if (!(value is InterfaceMethod))\r
- return AdditionResult.NameExists;\r
- } \r
-\r
- if (defined_method == null)\r
- defined_method = new ArrayList ();\r
-\r
- defined_method.Add (imethod);\r
- if (value == null)\r
- DefineName (name, imethod);\r
- \r
- return AdditionResult.Success;\r
- }\r
-\r
- public AdditionResult AddProperty (InterfaceProperty iprop)\r
- {\r
- AdditionResult res;\r
- string name = iprop.Name;\r
-\r
- if ((res = IsValid (name)) != AdditionResult.Success)\r
- return res;\r
-\r
- DefineName (name, iprop);\r
-\r
- if (defined_properties == null)\r
- defined_properties = new ArrayList ();\r
-\r
- defined_properties.Add (iprop);\r
- return AdditionResult.Success;\r
- }\r
-\r
- public AdditionResult AddEvent (InterfaceEvent ievent)\r
- {\r
- string name = ievent.Name;\r
- AdditionResult res;\r
- \r
- if ((res = IsValid (name)) != AdditionResult.Success)\r
- return res;\r
-\r
- DefineName (name, ievent);\r
-\r
- if (defined_events == null)\r
- defined_events = new ArrayList ();\r
-\r
- defined_events.Add (ievent);\r
- return AdditionResult.Success;\r
- }\r
-\r
- public bool AddIndexer (InterfaceIndexer iindexer)\r
- {\r
- if (defined_indexer == null)\r
- defined_indexer = new ArrayList ();\r
- \r
- defined_indexer.Add (iindexer);\r
- return true;\r
- }\r
- \r
- public ArrayList InterfaceMethods {\r
- get {\r
- return defined_method;\r
- }\r
- }\r
-\r
- public ArrayList InterfaceProperties {\r
- get {\r
- return defined_properties;\r
- }\r
- }\r
-\r
- public ArrayList InterfaceEvents {\r
- get {\r
- return defined_events;\r
- }\r
- }\r
-\r
- public ArrayList InterfaceIndexers {\r
- get {\r
- return defined_indexer;\r
- }\r
- }\r
-\r
- public ArrayList Bases {\r
- get {\r
- return bases;\r
- }\r
-\r
- set {\r
- bases = value;\r
- }\r
- }\r
-\r
- public bool IsTopLevel {\r
- get {\r
- if (Parent != null){\r
- if (Parent.Parent == null)\r
- return true;\r
- }\r
- return false;\r
- }\r
- }\r
-\r
- public virtual TypeAttributes InterfaceAttr {\r
- get {\r
- TypeAttributes x = TypeAttributes.Interface | TypeAttributes.Abstract;\r
-\r
- if (IsTopLevel == false) {\r
- \r
- if ((ModFlags & Modifiers.PROTECTED) != 0\r
- && (ModFlags & Modifiers.INTERNAL) != 0)\r
- x |= TypeAttributes.NestedFamORAssem;\r
- else if ((ModFlags & Modifiers.PROTECTED) != 0)\r
- x |= TypeAttributes.NestedFamily;\r
- else if ((ModFlags & Modifiers.INTERNAL) != 0)\r
- x |= TypeAttributes.NestedAssembly;\r
- else if ((ModFlags & Modifiers.PUBLIC) != 0)\r
- x |= TypeAttributes.NestedPublic;\r
- else\r
- x |= TypeAttributes.NestedPrivate;\r
- } else {\r
- if ((ModFlags & Modifiers.PUBLIC) != 0)\r
- x |= TypeAttributes.Public;\r
- else if ((ModFlags & Modifiers.PRIVATE) != 0)\r
- x |= TypeAttributes.NotPublic;\r
- }\r
- \r
- if ((ModFlags & Modifiers.ABSTRACT) != 0)\r
- x |= TypeAttributes.Abstract;\r
- \r
- if ((ModFlags & Modifiers.SEALED) != 0)\r
- x |= TypeAttributes.Sealed;\r
-\r
- return x;\r
- }\r
- }\r
- \r
- void Error111 (InterfaceMemberBase ib)\r
- {\r
- Report.Error (\r
- 111,\r
- "Interface `" + Name + "' already contains a definition with the " +\r
- "same return value and parameter types for member `" + ib.Name + "'");\r
- }\r
-\r
- bool RegisterMethod (MethodBase mb, InternalParameters ip, Type [] types)\r
- {\r
- if (!TypeManager.RegisterMethod (mb, ip, types))\r
- return false;\r
-\r
- method_builders.Add (mb);\r
- return true;\r
- }\r
-\r
- public MethodInfo [] GetMethods ()\r
- {\r
- int n = method_builders.Count;\r
- MethodInfo [] mi = new MethodInfo [n];\r
- \r
- method_builders.CopyTo (mi, 0);\r
-\r
- return mi;\r
- }\r
-\r
- // Hack around System.Reflection as found everywhere else\r
- public MemberInfo [] FindMembers (MemberTypes mt, BindingFlags bf, MemberFilter filter, object criteria)\r
- {\r
- ArrayList members = new ArrayList ();\r
-\r
- if ((mt & MemberTypes.Method) != 0) {\r
- foreach (MethodBuilder mb in method_builders)\r
- if (filter (mb, criteria))\r
- members.Add (mb);\r
- }\r
-\r
- if ((mt & MemberTypes.Property) != 0) {\r
- foreach (PropertyBuilder pb in property_builders)\r
- if (filter (pb, criteria))\r
- members.Add (pb);\r
- }\r
-\r
- if ((bf & BindingFlags.DeclaredOnly) == 0){\r
- MemberInfo [] parent_mi;\r
- \r
- parent_mi = TypeContainer.FindMembers (\r
- TypeBuilder.BaseType, mt, bf, filter, criteria);\r
-\r
- if (parent_mi != null)\r
- members.AddRange (parent_mi);\r
- }\r
- \r
- // The rest of the cases, if any, are unhandled at present.\r
-\r
- int count = members.Count;\r
-\r
- if (count > 0) {\r
- MemberInfo [] mi = new MemberInfo [count];\r
- members.CopyTo (mi, 0);\r
- return mi;\r
- }\r
-\r
- return null;\r
- }\r
-\r
- //\r
- // Populates the methods in the interface\r
- //\r
- void PopulateMethod (InterfaceMethod im)\r
- {\r
- Type return_type = RootContext.LookupType (this, im.ReturnType, false, im.Location);\r
- Type [] arg_types = im.ParameterTypes (this);\r
- MethodBuilder mb;\r
- Parameter [] p;\r
- int i;\r
-\r
- if (return_type == null)\r
- return;\r
-\r
- if (return_type.IsPointer && !UnsafeOK (this))\r
- return;\r
-\r
- foreach (Type t in arg_types){\r
-\r
- if (t == null)\r
- return;\r
- \r
- if (t.IsPointer && !UnsafeOK (this))\r
- return;\r
- }\r
- \r
- //\r
- // Create the method\r
- //\r
- mb = TypeBuilder.DefineMethod (\r
- im.Name, interface_method_attributes,\r
- return_type, arg_types);\r
-\r
- InternalParameters ip = new InternalParameters (arg_types, im.Parameters);\r
- \r
- if (!RegisterMethod (mb, ip, arg_types)) {\r
- Error111 (im);\r
- return;\r
- }\r
-\r
- //\r
- // Define each type attribute (in/out/ref) and\r
- // the argument names.\r
- //\r
- p = im.Parameters.FixedParameters;\r
- if (p != null){\r
- for (i = 0; i < p.Length; i++)\r
- mb.DefineParameter (i + 1, p [i].Attributes, p [i].Name);\r
-\r
- if (i != arg_types.Length)\r
- Console.WriteLine ("Implement the type definition for params");\r
- }\r
- }\r
-\r
- //\r
- // Populates the properties in the interface\r
- //\r
- void PopulateProperty (InterfaceProperty ip)\r
- {\r
- PropertyBuilder pb;\r
- MethodBuilder get = null, set = null;\r
- Type prop_type = RootContext.LookupType (this, ip.Type, false, ip.Location);\r
- Type [] setter_args = new Type [1];\r
-\r
- if (prop_type == null)\r
- return;\r
-\r
- if (prop_type.IsPointer && !UnsafeOK (this))\r
- return;\r
- \r
- setter_args [0] = prop_type;\r
-\r
- //\r
- // FIXME: properties are missing the following\r
- // flags: hidebysig newslot specialname\r
- //\r
- pb = TypeBuilder.DefineProperty (\r
- ip.Name, PropertyAttributes.None,\r
- prop_type, null);\r
-\r
- if (ip.HasGet){\r
- get = TypeBuilder.DefineMethod (\r
- "get_" + ip.Name, property_attributes ,\r
- prop_type, null);\r
-\r
- //\r
- // HACK because System.Reflection.Emit is lame\r
- //\r
- Type [] null_types = null;\r
- InternalParameters inp = new InternalParameters\r
- (null_types, Parameters.GetEmptyReadOnlyParameters ());\r
- \r
- if (!RegisterMethod (get, inp, null)) {\r
- Error111 (ip);\r
- return;\r
- }\r
- \r
- pb.SetGetMethod (get);\r
- }\r
-\r
- if (ip.HasSet){\r
- setter_args [0] = prop_type;\r
-\r
- set = TypeBuilder.DefineMethod (\r
- "set_" + ip.Name, property_attributes,\r
- TypeManager.void_type, setter_args);\r
-\r
- set.DefineParameter (1, ParameterAttributes.None, "value");\r
- pb.SetSetMethod (set);\r
-\r
- //\r
- // HACK because System.Reflection.Emit is lame\r
- //\r
- Parameter [] parms = new Parameter [1];\r
- parms [0] = new Parameter (ip.Type, "value", Parameter.Modifier.NONE, null);\r
- InternalParameters ipp = new InternalParameters (\r
- Parent, new Parameters (parms, null, Location.Null));\r
- \r
- if (!RegisterMethod (set, ipp, setter_args)) {\r
- Error111 (ip);\r
- return;\r
- }\r
- }\r
-\r
- TypeManager.RegisterProperty (pb, get, set);\r
- property_builders.Add (pb);\r
- }\r
-\r
- //\r
- // Populates the events in the interface\r
- //\r
- void PopulateEvent (InterfaceEvent ie)\r
- {\r
- //\r
- // FIXME: We need to do this after delegates have been\r
- // declared or we declare them recursively.\r
- //\r
- }\r
-\r
- //\r
- // Populates the indexers in the interface\r
- //\r
- void PopulateIndexer (InterfaceIndexer ii)\r
- {\r
- PropertyBuilder pb;\r
- Type prop_type = RootContext.LookupType (this, ii.Type, false, ii.Location);\r
- Type [] arg_types = ii.ParameterTypes (this);\r
- Type [] value_arg_types;\r
-\r
- if (prop_type == null)\r
- return;\r
-\r
- if (prop_type.IsPointer && !UnsafeOK (this))\r
- return;\r
- \r
- //\r
- // Sets up the extra invisible `value' argument for setters.\r
- // \r
- if (arg_types != null){\r
- int count = arg_types.Length;\r
- value_arg_types = new Type [count + 1];\r
-\r
- arg_types.CopyTo (value_arg_types, 0);\r
- value_arg_types [count] = prop_type;\r
-\r
- foreach (Type t in arg_types){\r
- if (t.IsPointer && !UnsafeOK (this))\r
- return;\r
- }\r
- } else {\r
- value_arg_types = new Type [1];\r
-\r
- value_arg_types [1] = prop_type;\r
- }\r
-\r
- pb = TypeBuilder.DefineProperty (\r
- "Item", PropertyAttributes.None,\r
- prop_type, arg_types);\r
-\r
- if (ii.HasGet){\r
- MethodBuilder get_item;\r
- Parameter [] p = ii.Parameters.FixedParameters;\r
- \r
- get_item = TypeBuilder.DefineMethod (\r
- "get_Item", property_attributes, prop_type, arg_types);\r
- pb.SetGetMethod (get_item);\r
- //\r
- // HACK because System.Reflection.Emit is lame\r
- //\r
- InternalParameters ip = new InternalParameters (\r
- arg_types, ii.Parameters);\r
- \r
- if (!RegisterMethod (get_item, ip, arg_types)) {\r
- Error111 (ii);\r
- return;\r
- }\r
-\r
- if (p != null){\r
- for (int i = 0; i < p.Length; i++)\r
- get_item.DefineParameter (\r
- i + 1,\r
- p [i].Attributes, p [i].Name);\r
- }\r
- }\r
-\r
- if (ii.HasSet){\r
- Parameter [] p = ii.Parameters.FixedParameters;\r
- MethodBuilder set_item;\r
- int i = 0;\r
- \r
- set_item = TypeBuilder.DefineMethod (\r
- "set_Item", property_attributes,\r
- TypeManager.void_type, value_arg_types);\r
- pb.SetSetMethod (set_item);\r
- //\r
- // HACK because System.Reflection.Emit is lame\r
- //\r
- InternalParameters ip = new InternalParameters (\r
- value_arg_types, ii.Parameters);\r
- if (!RegisterMethod (set_item, ip, value_arg_types)) {\r
- Error111 (ii);\r
- return;\r
- }\r
-\r
- if (p != null){\r
- for (; i < p.Length; i++)\r
- set_item.DefineParameter (\r
- i + 1,\r
- p [i].Attributes, p [i].Name);\r
- }\r
- \r
- set_item.DefineParameter (i + 1, ParameterAttributes.None, "value");\r
- }\r
- }\r
-\r
- /// <summary>\r
- /// Performs the semantic analysis for all the interface members\r
- /// that were declared\r
- /// </summary>\r
- bool SemanticAnalysis ()\r
- {\r
- Hashtable methods = new Hashtable ();\r
-\r
- \r
- if (defined_method != null){\r
- foreach (InterfaceMethod im in defined_method){\r
- string sig = im.GetSignature (this);\r
- \r
- //\r
- // If there was an undefined Type on the signatures\r
- // \r
- if (sig == null)\r
- continue;\r
- \r
- if (methods [sig] != null){\r
- Error111 (im);\r
- return false;\r
- }\r
- }\r
- }\r
-\r
- //\r
- // FIXME: Here I should check i\r
- // \r
- return true;\r
- }\r
-\r
- //\r
- // Returns the Type that represents the interface whose name\r
- // is `name'.\r
- //\r
- \r
- Type GetInterfaceTypeByName (object builder, string name)\r
- {\r
- Interface parent;\r
- Type t = RootContext.LookupType (this, name, false, Location);\r
- \r
- if (t != null) {\r
- if (t.IsInterface)\r
- return t;\r
- \r
- string cause;\r
- \r
- if (t.IsValueType)\r
- cause = "is a struct";\r
- else if (t.IsClass) \r
- cause = "is a class";\r
- else\r
- cause = "Should not happen.";\r
-\r
- Report.Error (527, Location, "`"+name+"' " + cause +\r
- ", need an interface instead");\r
- \r
- return null;\r
- }\r
-\r
- Tree tree = RootContext.Tree;\r
- parent = (Interface) tree.Interfaces [name];\r
- if (parent == null){\r
- string cause = null;\r
- Hashtable container;\r
- \r
- container = tree.Classes;\r
- if (container != null && container [name] != null)\r
- cause = "is a class";\r
- else {\r
- container = tree.Structs;\r
- \r
- if (container != null && container [name] != null)\r
- cause = "is a struct";\r
- }\r
-\r
- if (cause == null){\r
- Report.Error (246, Location, "Can not find type `"+name+"'");\r
- } else {\r
- Report.Error (527, Location, "`"+name+"' " + cause +\r
- ", need an interface instead");\r
- }\r
- return null;\r
- }\r
- \r
- t = parent.DefineInterface (builder);\r
- if (t == null){\r
- Report.Error (529,\r
- "Inherited interface `"+name+"' is circular");\r
- return null;\r
- }\r
-\r
- return t;\r
- }\r
- \r
- //\r
- // Returns the list of interfaces that this interface implements\r
- // Or null if it does not implement any interface.\r
- //\r
- // Sets the error boolean accoringly.\r
- //\r
- Type [] GetInterfaceBases (object builder, out bool error)\r
- {\r
- Type [] tbases;\r
- int i;\r
-\r
- error = false;\r
- if (Bases == null)\r
- return null;\r
- \r
- tbases = new Type [Bases.Count];\r
- i = 0;\r
-\r
- foreach (string name in Bases){\r
- Type t;\r
- \r
- t = GetInterfaceTypeByName (builder, name);\r
- if (t == null){\r
- error = true;\r
- return null;\r
- }\r
- \r
- tbases [i++] = t;\r
- }\r
- \r
- return tbases;\r
- }\r
- \r
- //\r
- // <summary>\r
- // Defines the Interface in the appropriate ModuleBuilder or TypeBuilder\r
- // </summary>\r
- // TODO:\r
- // Rework the way we recurse, because for recursive\r
- // definitions of interfaces (A:B and B:A) we report the\r
- // error twice, rather than once. \r
- \r
- public TypeBuilder DefineInterface (object parent_builder)\r
- {\r
- Type [] ifaces;\r
- bool error;\r
-\r
- if (InTransit)\r
- return null;\r
- \r
- InTransit = true;\r
- \r
- ifaces = GetInterfaceBases (parent_builder, out error);\r
-\r
- if (error)\r
- return null;\r
-\r
- if (parent_builder is ModuleBuilder) {\r
- ModuleBuilder builder = (ModuleBuilder) parent_builder;\r
- \r
- TypeBuilder = builder.DefineType (\r
- Name,\r
- InterfaceAttr,\r
- (Type)null, // Parent Type\r
- ifaces);\r
- RootContext.RegisterOrder (this);\r
- } else {\r
- TypeBuilder builder = (System.Reflection.Emit.TypeBuilder) parent_builder;\r
-\r
- TypeBuilder = builder.DefineNestedType (\r
- Basename,\r
- InterfaceAttr,\r
- (Type) null, //parent type\r
- ifaces);\r
-\r
- TypeContainer tc = TypeManager.LookupTypeContainer (builder);\r
- tc.RegisterOrder (this);\r
- }\r
- \r
- RootContext.TypeManager.AddUserInterface (Name, TypeBuilder, this);\r
- InTransit = false;\r
- \r
- return TypeBuilder;\r
- }\r
- \r
- /// <summary>\r
- /// Performs semantic analysis, and then generates the IL interfaces\r
- /// </summary>\r
- public override bool Define (TypeContainer parent)\r
- {\r
- if (!SemanticAnalysis ())\r
- return false;\r
-\r
- if (defined_method != null){\r
- foreach (InterfaceMethod im in defined_method)\r
- PopulateMethod (im);\r
- }\r
-\r
- if (defined_properties != null){\r
- foreach (InterfaceProperty ip in defined_properties)\r
- PopulateProperty (ip);\r
- }\r
-\r
- if (defined_events != null)\r
- foreach (InterfaceEvent ie in defined_events)\r
- PopulateEvent (ie);\r
-\r
- if (defined_indexer != null) {\r
- foreach (InterfaceIndexer ii in defined_indexer)\r
- PopulateIndexer (ii);\r
-\r
- CustomAttributeBuilder cb = EmitDefaultMemberAttr (parent, ModFlags, Location);\r
- TypeBuilder.SetCustomAttribute (cb);\r
- }\r
- \r
- return true;\r
- }\r
-\r
- public static CustomAttributeBuilder EmitDefaultMemberAttr (TypeContainer parent, int flags,\r
- Location loc)\r
- {\r
- EmitContext ec = new EmitContext (parent, loc, null, null, flags);\r
-\r
- Expression ml = Expression.MemberLookup (ec, TypeManager.default_member_type,\r
- ".ctor", MemberTypes.Constructor,\r
- BindingFlags.Public | BindingFlags.Instance,\r
- Location.Null);\r
- \r
- if (!(ml is MethodGroupExpr)) {\r
- Console.WriteLine ("Internal error !!!!");\r
- return null;\r
- }\r
- \r
- MethodGroupExpr mg = (MethodGroupExpr) ml;\r
-\r
- MethodBase constructor = mg.Methods [0];\r
-\r
- string [] vals = { "Item" };\r
-\r
- CustomAttributeBuilder cb = new CustomAttributeBuilder ((ConstructorInfo) constructor, vals);\r
-\r
- return cb;\r
- }\r
-\r
- }\r
-\r
- public class InterfaceMemberBase {\r
- public readonly string Name;\r
- public readonly bool IsNew;\r
- public Attributes OptAttributes;\r
- \r
- public InterfaceMemberBase (string name, bool is_new, Attributes attrs)\r
- {\r
- Name = name;\r
- IsNew = is_new;\r
- OptAttributes = attrs;\r
- }\r
- }\r
- \r
- public class InterfaceProperty : InterfaceMemberBase {\r
- public readonly bool HasSet;\r
- public readonly bool HasGet;\r
- public readonly string Type;\r
- public readonly string type;\r
- public readonly Location Location;\r
- \r
- public InterfaceProperty (string type, string name,\r
- bool is_new, bool has_get, bool has_set,\r
- Attributes attrs, Location loc)\r
- : base (name, is_new, attrs)\r
- {\r
- Type = type;\r
- HasGet = has_get;\r
- HasSet = has_set;\r
- Location = loc;\r
- }\r
- }\r
-\r
- public class InterfaceEvent : InterfaceMemberBase {\r
- public readonly string Type;\r
- \r
- public InterfaceEvent (string type, string name, bool is_new, Attributes attrs)\r
- : base (name, is_new, attrs)\r
- {\r
- Type = type;\r
- }\r
- }\r
- \r
- public class InterfaceMethod : InterfaceMemberBase {\r
- public readonly string ReturnType;\r
- public readonly Parameters Parameters;\r
- public readonly Location Location;\r
- \r
- public InterfaceMethod (string return_type, string name, bool is_new, Parameters args,\r
- Attributes attrs, Location l)\r
- : base (name, is_new, attrs)\r
- {\r
- this.ReturnType = return_type;\r
- this.Parameters = args;\r
- Location = l;\r
- }\r
-\r
- /// <summary>\r
- /// Returns the signature for this interface method\r
- /// </summary>\r
- public string GetSignature (DeclSpace ds)\r
- {\r
- Type ret = RootContext.LookupType (ds, ReturnType, false, Location);\r
- string args = Parameters.GetSignature (ds);\r
-\r
- if ((ret == null) || (args == null))\r
- return null;\r
- \r
- return (IsNew ? "new-" : "") + ret.FullName + "(" + args + ")";\r
- }\r
-\r
- public Type [] ParameterTypes (DeclSpace ds)\r
- {\r
- return Parameters.GetParameterInfo (ds);\r
- }\r
- }\r
-\r
- public class InterfaceIndexer : InterfaceMemberBase {\r
- public readonly bool HasGet, HasSet;\r
- public readonly Parameters Parameters;\r
- public readonly string Type;\r
- public readonly Location Location;\r
- \r
- public InterfaceIndexer (string type, Parameters args, bool do_get, bool do_set,\r
- bool is_new, Attributes attrs, Location loc)\r
- : base ("", is_new, attrs)\r
- {\r
- Type = type;\r
- Parameters = args;\r
- HasGet = do_get;\r
- HasSet = do_set;\r
- Location = loc;\r
- }\r
-\r
- public Type [] ParameterTypes (DeclSpace ds)\r
- {\r
- return Parameters.GetParameterInfo (ds);\r
- }\r
- }\r
-}\r
+//
+// interface.cs: Interface handler
+//
+// Author: Miguel de Icaza (miguel@gnu.org)
+// Anirban Bhattacharjee (banirban@novell.com)
+//
+// Licensed under the terms of the GNU GPL
+//
+// (C) 2001 Ximian, Inc (http://www.ximian.com)
+//
+
+#define CACHE
+
+/*This file will go off shortly
+ * after copying the interface class
+ * in class.cs file
+ */
+
+using System.Collections;
+using System;
+using System.IO;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace Mono.MonoBASIC {
+
+ /// <summary>
+ /// Interfaces
+ /// </summary>
+
+
+ /// <summary>
+ /// Interfaces
+ /// </summary>
+ public class Interface : Mono.MonoBASIC.Class /*TypeContainer , IMemberContainer */
+ {
+ /// <summary>
+ /// Modifiers allowed in a class declaration
+ /// </summary>
+ public new const int AllowedModifiers =
+ Modifiers.NEW |
+ Modifiers.PUBLIC |
+ Modifiers.PROTECTED |
+ Modifiers.INTERNAL |
+ Modifiers.PRIVATE;
+
+ public Interface (TypeContainer parent, string name, int mod,
+ Attributes attrs, Location l)
+ : base (parent, name, 0, attrs, l)
+ {
+ int accmods;
+
+ if (parent.Parent == null)
+ accmods = Modifiers.INTERNAL;
+ else
+ accmods = Modifiers.PUBLIC;
+
+ this.ModFlags = Modifiers.Check (AllowedModifiers, mod, accmods, l);
+ this.ModFlags |= Modifiers.ABSTRACT;
+ }
+
+ public override AttributeTargets AttributeTargets {
+ get {
+ return AttributeTargets.Interface;
+ }
+ }
+
+ public override TypeAttributes TypeAttr
+ {
+ get
+ {
+ return base.TypeAttr |
+ TypeAttributes.AutoLayout |
+ TypeAttributes.Abstract |
+ TypeAttributes.Interface;
+ }
+ }
+ }
+
+/*
+ public class InterfaceMemberBase {
+ public readonly string Name;
+ public readonly bool IsNew;
+ public Attributes OptAttributes;
+
+ public InterfaceMemberBase (string name, bool is_new, Attributes attrs)
+ {
+ Name = name;
+ IsNew = is_new;
+ OptAttributes = attrs;
+ }
+ }
+
+ public class InterfaceProperty : InterfaceMemberBase {
+ public readonly bool HasSet;
+ public readonly bool HasGet;
+ public readonly Location Location;
+ public Expression Type;
+
+ public InterfaceProperty (Expression type, string name,
+ bool is_new, bool has_get, bool has_set,
+ Attributes attrs, Location loc)
+ : base (name, is_new, attrs)
+ {
+ Type = type;
+ HasGet = has_get;
+ HasSet = has_set;
+ Location = loc;
+ }
+ }
+*/
+/* public class InterfaceEvent : InterfaceMemberBase {
+ public readonly Location Location;
+ public Expression Type;
+
+ public InterfaceEvent (Expression type, string name, bool is_new, Attributes attrs,
+ Location loc)
+ : base (name, is_new, attrs)
+ {
+ Type = type;
+ Location = loc;
+ }
+ }
+/*
+ public class InterfaceMethod : InterfaceMemberBase {
+ public readonly Expression ReturnType;
+ public readonly Parameters Parameters;
+ public readonly Location Location;
+
+ public InterfaceMethod (Expression return_type, string name, bool is_new, Parameters args,
+ Attributes attrs, Location l)
+ : base (name, is_new, attrs)
+ {
+ this.ReturnType = return_type;
+ this.Parameters = args;
+ Location = l;
+ }
+
+ /// <summary>
+ /// Returns the signature for this interface method
+ /// </summary>
+ public string GetSignature (DeclSpace ds)
+ {
+ Type ret = ds.ResolveType (ReturnType, false, Location);
+ string args = Parameters.GetSignature (ds);
+
+ if ((ret == null) || (args == null))
+ return null;
+
+ return (IsNew ? "new-" : "") + ret.FullName + "(" + args + ")";
+ }
+
+ public Type [] ParameterTypes (DeclSpace ds)
+ {
+ return Parameters.GetParameterInfo (ds);
+ }
+ }
+
+ public class InterfaceIndexer : InterfaceMemberBase {
+ public readonly bool HasGet, HasSet;
+ public readonly Parameters Parameters;
+ public readonly Location Location;
+ public Expression Type;
+
+ public InterfaceIndexer (Expression type, Parameters args, bool do_get, bool do_set,
+ bool is_new, Attributes attrs, Location loc)
+ : base ("", is_new, attrs)
+ {
+ Type = type;
+ Parameters = args;
+ HasGet = do_get;
+ HasSet = do_set;
+ Location = loc;
+ }
+
+ public Type [] ParameterTypes (DeclSpace ds)
+ {
+ return Parameters.GetParameterInfo (ds);
+ }
+ }*/
+}