MethodInfo [] mi;
Type t = missing.Type;
+ if (!t.IsInterface)
+ continue;
+
if (t is TypeBuilder){
TypeContainer iface;
//
// Completely broken. So we do it ourselves!
//
- TypeExpr [] impl = TypeManager.GetExplicitInterfaces (type_builder);
+ Type [] impl = TypeManager.GetExplicitInterfaces (type_builder);
if (impl == null || impl.Length == 0)
return EmptyMissingInterfacesInfo;
MissingInterfacesInfo [] ret = new MissingInterfacesInfo [impl.Length];
for (int i = 0; i < impl.Length; i++)
- ret [i] = new MissingInterfacesInfo (impl [i].Type);
+ ret [i] = new MissingInterfacesInfo (impl [i]);
// we really should not get here because Object doesnt implement any
// interfaces. But it could implement something internal, so we have
if (type_builder.BaseType == null)
return ret;
- TypeExpr [] parent_impls = TypeManager.GetInterfaces (type_builder.BaseType);
+ Type [] parent_impls = TypeManager.GetInterfaces (type_builder.BaseType);
- foreach (TypeExpr te in parent_impls) {
- Type t = te.Type;
-
+ foreach (Type t in parent_impls) {
for (int i = 0; i < ret.Length; i ++) {
if (t == ret [i].Type) {
ret [i].Optional = true;
if (m == null)
continue;
+ string mname = TypeManager.GetMethodName (m);
+
//
// `need_proxy' is not null when we're implementing an
// interface indexer and this is Clear(One/All) operation.
// for an interface indexer).
//
if (name == null){
- if (m.Name != tm.get_indexer_name && m.Name != tm.set_indexer_name)
+ if (mname != tm.get_indexer_name && mname != tm.set_indexer_name)
continue;
- } else if ((need_proxy == null) && (name != m.Name))
+ } else if ((need_proxy == null) && (name != mname))
continue;
if (!TypeManager.IsEqual (ret_type, m.ReturnType)){
int j, top = args.Length;
bool fail = false;
-
+
for (j = 0; j < top; j++){
if (!TypeManager.IsEqual (tm.args [i][j], args[j])){
fail = true;
// a proxy if the implementation's IndexerName doesn't
// match the IndexerName in the interface.
bool name_matches = false;
- if (name == m.Name || m.Name == tm.get_indexer_name || m.Name == tm.set_indexer_name)
+ if (name == mname || mname == tm.get_indexer_name || mname == tm.set_indexer_name)
name_matches = true;
if ((t == null) && (need_proxy != null) && !name_matches)
CallingConventions.Standard | CallingConventions.HasThis,
parent_method.ReturnType, args);
+ ParameterData pd = Invocation.GetParameterData (iface_method);
+ proxy.DefineParameter (0, ParameterAttributes.None, "");
+ for (int i = 0; i < pd.Count; i++) {
+ string name = pd.ParameterName (i);
+ ParameterAttributes attr = Parameter.GetParameterAttributes (pd.ParameterModifier (i));
+ ParameterBuilder pb = proxy.DefineParameter (i + 1, attr, name);
+ }
+
int top = args.Length;
ILGenerator ig = proxy.GetILGenerator ();
for (i = 0; i < top; i++){
Type type = pending_implementations [i].type;
int j = 0;
-
+
foreach (MethodInfo mi in pending_implementations [i].methods){
if (mi == null)
continue;
if (pending_implementations [i].found [j]) {
string[] methodLabel = TypeManager.CSharpSignature (mi).Split ('.');
- Report.Error (536, container.Location, "'{0}' does not implement interface member '{1}'. '{2}.{3}' is either static, not public, or has the wrong return type",
- container.Name, TypeManager.CSharpSignature (mi), container.Name, methodLabel[methodLabel.Length - 1]);
+ Report.Error (536, container.Location,
+ "'{0}' does not implement interface member '{1}'. '{2}.{3}' " +
+ "is either static, not public, or has the wrong return type",
+ container.Name, TypeManager.CSharpSignature (mi),
+ container.Name, methodLabel[methodLabel.Length - 1]);
}
else {
Report.Error (535, container.Location, "'{0}' does not implement interface member '{1}'",