private void GetSuperTypeMembers(){ SuperTypeMembersSorter sorter = new SuperTypeMembersSorter(); IReflect ir = this.superIR; //Add members on superclasses while (ir != null){ sorter.Add(ir.GetMembers(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.Static|BindingFlags.DeclaredOnly)); if (ir is Type){ ir = ((Type)ir).BaseType; }else{ ir = ((ClassScope)ir).GetSuperType(); } } //Add any implicit interfaces to the end of the explicit list of interfaces ArrayList implicitInterfaces = new ArrayList(); int n = this.interfaces.Length; IReflect[] explicitInterfaces = new IReflect[n]; for (int i = 0; i < n; i++){ IReflect iface = explicitInterfaces[i] = this.interfaces[i].ToIReflect(); Type t = iface as Type; bool isInterface; if (t != null) isInterface = t.IsInterface; else{ ClassScope csc = (ClassScope)iface; isInterface = csc.owner.isInterface; } if (!isInterface) this.interfaces[i].context.HandleError(JSError.NeedInterface); } foreach (IReflect iface in explicitInterfaces) this.AddImplicitInterfaces(iface, explicitInterfaces, implicitInterfaces); for (int i = 0; i < implicitInterfaces.Count; i++){ IReflect iface = (IReflect)implicitInterfaces[i]; this.AddImplicitInterfaces(iface, explicitInterfaces, implicitInterfaces); } int m = implicitInterfaces.Count; if (m > 0){ TypeExpression[] newInterfaces = new TypeExpression[n + m]; for (int i = 0; i < n; i++) newInterfaces[i] = this.interfaces[i]; for (int i = 0; i < m; i++) newInterfaces[i+n] = new TypeExpression(new ConstantWrapper(implicitInterfaces[i], null)); this.interfaces = newInterfaces; } //Add members on interfaces implemented by the class. Also check for circular definition; foreach (TypeExpression ifaceExpr in this.interfaces){ ClassScope ifcsc = ifaceExpr.ToIReflect() as ClassScope; if (ifcsc != null && ifcsc.owner.ImplementsInterface(this.classob)){ this.context.HandleError(JSError.CircularDefinition); this.interfaces = new TypeExpression[0]; break; } sorter.Add(ifaceExpr.ToIReflect().GetMembers(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance)); } //Add unimplemented members on interfaces implemented by abstract superclasses ir = this.superIR; while (ir != null){ Type type = ir as Type; if (type != null){ if (!type.IsAbstract) break; Class.GetUnimplementedInferfaceMembersFor(type, sorter); ir = type.BaseType; }else{ ClassScope csc = (ClassScope)ir; if (!csc.owner.isAbstract) break; csc.owner.GetUnimplementedInferfaceMembers(sorter); ir = null; } } this.superMembers = sorter.GetMembers(); }