bool AddIfUnique(ProcessedAssembly assembly) { if (assembly_name.Contains(assembly.Name)) { return(false); } if (assembly_safename.Contains(assembly.SafeName)) { return(false); } Assemblies.Add(assembly); assembly_name.Add(assembly.Name); assembly_safename.Add(assembly.SafeName); return(true); }
ProcessedAssembly GetMscorlib(Type t) { var a = t.Assembly; if (a.GetName().Name != "mscorlib") { throw ErrorHelper.CreateError(99, "Internal error: incorrect assembly for `{t}`. Please file a bug report with a test case (https://github.com/mono/Embeddinator-4000/issues)"); } if (mscorlib_assembly == null) { mscorlib_assembly = new ProcessedAssembly(a) { UserCode = false, }; } return(mscorlib_assembly); }
public virtual void Process(IEnumerable <Assembly> input) { foreach (var a in input) { var pa = new ProcessedAssembly(a) { UserCode = true, }; // ignoring/warning one is not an option as they could be different (e.g. different builds/versions) if (!AddIfUnique(pa)) { throw ErrorHelper.CreateError(12, $"The assembly name `{pa.Name}` is not unique"); } assemblyQueue.Enqueue(pa); } while (assemblyQueue.Count > 0) { Process(assemblyQueue.Dequeue()); } processing_ended = true; }
public void Process(ProcessedAssembly a) { if (!a.UserCode) { return; } Logger.Log($"Processing Assembly: {a.Name}"); foreach (var t in GetTypes(a.Assembly)) { var pt = new ProcessedType(t) { Assembly = a, }; Types.Add(pt); foreach (var nt in t.GetNestedTypes()) { var pnt = new ProcessedType(nt) { Assembly = a }; Types.Add(pnt); } } // we can add new types while processing some (e.g. categories) foreach (var type in Types) { typeQueue.Enqueue(type); } Types.Clear(); // reuse while (typeQueue.Count > 0) { Process(typeQueue.Dequeue()); } }
public bool Equals(ProcessedAssembly other) { return(Assembly == other?.Assembly); }
protected abstract void Generate(ProcessedAssembly a);
public override void Process(IEnumerable <Assembly> input) { foreach (var a in input) { var pa = new ProcessedAssembly(a); // ignoring/warning one is not an option as they could be different (e.g. different builds/versions) if (!AddIfUnique(pa)) { throw ErrorHelper.CreateError(12, $"The assembly name `{pa.Name}` is not unique"); } foreach (var t in GetTypes(a)) { if (t.IsEnum) { enums.Add(new ProcessedType(t)); continue; } if (t.IsInterface) { protocols.Add(new ProcessedType(t)); } else { types.Add(new ProcessedType(t)); } extension_type = t.HasCustomAttribute("System.Runtime.CompilerServices", "ExtensionAttribute"); implement_system_icomparable = t.Implements("System", "IComparable"); implement_system_icomparable_t = t.Implements("System", "IComparable`1"); var constructors = GetConstructors(t).OrderBy((arg) => arg.ParameterCount).ToList(); var processedConstructors = PostProcessConstructors(constructors).ToList(); if (processedConstructors.Count > 0) { ctors.Add(t, processedConstructors); } var typeEquals = equals.Where(x => x.Key == t).Select(x => x.Value); var meths = GetMethods(t).OrderBy((arg) => arg.Name).ToList(); var processedMethods = PostProcessMethods(meths, typeEquals).ToList(); if (processedMethods.Count > 0) { methods.Add(t, processedMethods); } var props = new List <PropertyInfo> (); var subscriptProps = new List <PropertyInfo> (); foreach (var pi in GetProperties(t)) { var getter = pi.GetGetMethod(); var setter = pi.GetSetMethod(); // setter only property are valid in .NET and we need to generate a method in ObjC (there's no writeonly properties) if (getter == null) { continue; } // indexers are implemented as methods and object subscripting if ((getter.ParameterCount > 0) || ((setter != null) && setter.ParameterCount > 1)) { subscriptProps.Add(pi); continue; } // we can do better than methods for the more common cases (readonly and readwrite) processedMethods.RemoveAll(x => x.Method == getter); processedMethods.RemoveAll(x => x.Method == setter); props.Add(pi); } props = props.OrderBy((arg) => arg.Name).ToList(); var processedProperties = PostProcessProperties(props).ToList(); if (processedProperties.Count > 0) { properties.Add(t, processedProperties); } if (subscriptProps.Count > 0) { if (subscriptProps.Count > 1) { delayed.Add(ErrorHelper.CreateWarning(1041, $"Indexed properties on {t.Name} is not generated because multiple indexed properties not supported.")); } else { subscriptProperties.Add(t, PostProcessSubscriptProperties(subscriptProps).ToList()); } } // fields will need to be wrapped within properties var f = GetFields(t).OrderBy((arg) => arg.Name).ToList(); var processedFields = PostProcessFields(f).ToList(); if (processedFields.Count > 0) { fields.Add(t, processedFields); } } } types = types.OrderBy((arg) => arg.Type.FullName).OrderBy((arg) => types.Contains(arg.Type.BaseType)).ToList(); Console.WriteLine($"\t{types.Count} types found"); ErrorHelper.Show(delayed); }