public static void GenerateTypeRegistrations(CodeGenerationOptions opt, GenerationInfo gen_info) { StreamWriter sw = gen_info.Writer = gen_info.OpenStream(opt.GetFileName("Java.Interop.__TypeRegistrations")); Dictionary <string, List <KeyValuePair <string, string> > > mapping = new Dictionary <string, List <KeyValuePair <string, string> > >(); foreach (KeyValuePair <string, string> reg in gen_info.TypeRegistrations) { int ls = reg.Key.LastIndexOf('/'); string package = ls >= 0 ? reg.Key.Substring(0, ls) : ""; if (JavaNativeTypeManager.ToCliType(reg.Key) == reg.Value) { continue; } List <KeyValuePair <string, string> > v; if (!mapping.TryGetValue(package, out v)) { mapping.Add(package, v = new List <KeyValuePair <string, string> >()); } v.Add(new KeyValuePair <string, string>(reg.Key, reg.Value)); } sw.WriteLine("using System;"); sw.WriteLine("using System.Collections.Generic;"); sw.WriteLine("using Android.Runtime;"); sw.WriteLine(); sw.WriteLine("namespace Java.Interop {"); sw.WriteLine(); sw.WriteLine("\tpartial class __TypeRegistrations {"); sw.WriteLine(); sw.WriteLine("\t\tpublic static void RegisterPackages ()"); sw.WriteLine("\t\t{"); sw.WriteLine("#if MONODROID_TIMING"); sw.WriteLine("\t\t\tvar start = DateTime.Now;"); sw.WriteLine("\t\t\tAndroid.Util.Log.Info (\"MonoDroid-Timing\", \"RegisterPackages start: \" + (start - new DateTime (1970, 1, 1)).TotalMilliseconds);"); sw.WriteLine("#endif // def MONODROID_TIMING"); sw.WriteLine("\t\t\tJava.Interop.TypeManager.RegisterPackages ("); sw.WriteLine("\t\t\t\t\tnew string[]{"); foreach (KeyValuePair <string, List <KeyValuePair <string, string> > > e in mapping) { sw.WriteLine("\t\t\t\t\t\t\"{0}\",", e.Key); } sw.WriteLine("\t\t\t\t\t},"); sw.WriteLine("\t\t\t\t\tnew Converter<string, Type>[]{"); foreach (KeyValuePair <string, List <KeyValuePair <string, string> > > e in mapping) { sw.WriteLine("\t\t\t\t\t\tlookup_{0}_package,", e.Key.Replace('/', '_')); } sw.WriteLine("\t\t\t\t\t});"); sw.WriteLine("#if MONODROID_TIMING"); sw.WriteLine("\t\t\tvar end = DateTime.Now;"); sw.WriteLine("\t\t\tAndroid.Util.Log.Info (\"MonoDroid-Timing\", \"RegisterPackages time: \" + (end - new DateTime (1970, 1, 1)).TotalMilliseconds + \" [elapsed: \" + (end - start).TotalMilliseconds + \" ms]\");"); sw.WriteLine("#endif // def MONODROID_TIMING"); sw.WriteLine("\t\t}"); sw.WriteLine(); sw.WriteLine("\t\tstatic Type Lookup (string[] mappings, string javaType)"); sw.WriteLine("\t\t{"); sw.WriteLine("\t\t\tstring managedType = Java.Interop.TypeManager.LookupTypeMapping (mappings, javaType);"); sw.WriteLine("\t\t\tif (managedType == null)"); sw.WriteLine("\t\t\t\treturn null;"); sw.WriteLine("\t\t\treturn Type.GetType (managedType);"); sw.WriteLine("\t\t}"); foreach (KeyValuePair <string, List <KeyValuePair <string, string> > > map in mapping) { sw.WriteLine(); string package = map.Key.Replace('/', '_'); sw.WriteLine("\t\tstatic string[] package_{0}_mappings;", package); sw.WriteLine("\t\tstatic Type lookup_{0}_package (string klass)", package); sw.WriteLine("\t\t{"); sw.WriteLine("\t\t\tif (package_{0}_mappings == null) {{", package); sw.WriteLine("\t\t\t\tpackage_{0}_mappings = new string[]{{", package); map.Value.Sort((a, b) => a.Key.CompareTo(b.Key)); foreach (KeyValuePair <string, string> t in map.Value) { sw.WriteLine("\t\t\t\t\t\"{0}:{1}\",", t.Key, t.Value); } sw.WriteLine("\t\t\t\t};"); sw.WriteLine("\t\t\t}"); sw.WriteLine(""); sw.WriteLine("\t\t\treturn Lookup (package_{0}_mappings, klass);", package); sw.WriteLine("\t\t}"); } sw.WriteLine("\t}"); sw.WriteLine("}"); sw.Close(); gen_info.Writer = null; }
public override void Generate(StreamWriter sw, string indent, CodeGenerationOptions opt, GenerationInfo gen_info) { opt.ContextTypes.Push(this); opt.ContextGeneratedMethods = new List <Method> (); gen_info.TypeRegistrations.Add(new KeyValuePair <string, string>(RawJniName, AssemblyQualifiedName)); bool is_enum = base_symbol != null && base_symbol.FullName == "Java.Lang.Enum"; if (is_enum) { gen_info.Enums.Add(RawJniName.Replace('/', '.') + ":" + Namespace + ":" + JavaSimpleName); } StringBuilder sb = new StringBuilder(); foreach (ISymbol isym in Interfaces) { GenericSymbol gs = isym as GenericSymbol; InterfaceGen gen = (gs == null ? isym : gs.Gen) as InterfaceGen; if (gen != null && gen.IsConstSugar) { continue; } if (sb.Length > 0) { sb.Append(", "); } sb.Append(opt.GetOutputName(isym.FullName)); } string obj_type = null; if (base_symbol != null) { GenericSymbol gs = base_symbol as GenericSymbol; obj_type = gs != null && gs.IsConcrete ? gs.GetGenericType(null) : opt.GetOutputName(base_symbol.FullName); } sw.WriteLine("{0}// Metadata.xml XPath class reference: path=\"{1}\"", indent, MetadataXPathReference); if (this.IsDeprecated) { sw.WriteLine("{0}[ObsoleteAttribute (@\"{1}\")]", indent, this.DeprecatedComment); } sw.WriteLine("{0}[global::Android.Runtime.Register (\"{1}\", DoNotGenerateAcw=true{2})]", indent, RawJniName, this.AdditionalAttributeString()); if (this.TypeParameters != null && this.TypeParameters.Any()) { sw.WriteLine("{0}{1}", indent, TypeParameters.ToGeneratedAttributeString()); } string inherits = ""; if (inherits_object && obj_type != null) { inherits = ": " + obj_type; } if (sb.Length > 0) { if (string.IsNullOrEmpty(inherits)) { inherits = ": "; } else { inherits += ", "; } } sw.WriteLine("{0}{1} {2}{3}{4}partial class {5} {6}{7} {{", indent, Visibility, needs_new ? "new " : String.Empty, IsAbstract ? "abstract " : String.Empty, IsFinal ? "sealed " : String.Empty, Name, inherits, sb.ToString()); sw.WriteLine(); var seen = new HashSet <string> (); GenFields(sw, indent + "\t", opt, seen); bool haveNested = false; foreach (var iface in GetAllImplementedInterfaces() .Except(BaseGen == null ? new InterfaceGen[0] : BaseGen.GetAllImplementedInterfaces()) .Where(i => i.Fields.Count > 0)) { if (!haveNested) { sw.WriteLine(); sw.WriteLine("{0}\tpublic static class InterfaceConsts {{", indent); haveNested = true; } sw.WriteLine(); sw.WriteLine("{0}\t\t// The following are fields from: {1}", indent, iface.JavaName); iface.GenFields(sw, indent + "\t\t", opt, seen); } if (haveNested) { sw.WriteLine("{0}\t}}\n", indent); } foreach (GenBase nest in NestedTypes) { if (BaseGen != null && BaseGen.ContainsNestedType(nest)) { if (nest is ClassGen) { (nest as ClassGen).needs_new = true; } } nest.Generate(sw, indent + "\t", opt, gen_info); sw.WriteLine(); } bool requireNew = InheritsObject; if (!requireNew) { for (var bg = BaseGen; bg != null && bg is XmlClassGen; bg = bg.BaseGen) { if (bg.InheritsObject) { requireNew = true; break; } } } opt.CodeGenerator.WriteClassHandle(this, sw, indent, opt, requireNew); GenConstructors(sw, indent + "\t", opt); GenProperties(sw, indent + "\t", opt); GenMethods(sw, indent + "\t", opt); if (IsAbstract) { GenerateAbstractMembers(sw, indent + "\t", opt); } bool is_char_seq = false; foreach (ISymbol isym in Interfaces) { if (isym is GenericSymbol) { GenericSymbol gs = isym as GenericSymbol; if (gs.IsConcrete) { // FIXME: not sure if excluding default methods is a valid idea... foreach (Method m in gs.Gen.Methods.Where(m => !m.IsInterfaceDefaultMethod && !m.IsStatic)) { if (m.IsGeneric) { m.GenerateExplicitIface(sw, indent + "\t", opt, gs); } } } } else if (isym.FullName == "Java.Lang.ICharSequence") { is_char_seq = true; } } if (is_char_seq) { GenCharSequenceEnumerator(sw, indent + "\t", opt); } sw.WriteLine(indent + "}"); if (!AssemblyQualifiedName.Contains('/')) { foreach (InterfaceExtensionInfo nestedIface in GetNestedInterfaceTypes()) { nestedIface.Type.GenerateExtensionsDeclaration(sw, indent, opt, nestedIface.DeclaringType); } } if (IsAbstract) { sw.WriteLine(); GenerateInvoker(sw, indent, opt); } opt.ContextGeneratedMethods.Clear(); opt.ContextTypes.Pop(); }
public abstract void Generate(StreamWriter sw, string indent, CodeGenerationOptions opt, GenerationInfo gen_info);
public abstract void Generate(CodeGenerationOptions opt, GenerationInfo gen_info);
public override void Generate(StreamWriter sw, string indent, CodeGenerationOptions opt, GenerationInfo gen_info) { opt.ContextTypes.Push(this); // interfaces don't nest, so generate as siblings foreach (GenBase nest in NestedTypes) { nest.Generate(sw, indent, opt, gen_info); sw.WriteLine(); } var staticMethods = Methods.Where(m => m.IsStatic); if (Fields.Any() || staticMethods.Any()) { string name = hasManagedName ? Name.Substring(1) + "Consts" : Name.Substring(1); sw.WriteLine("{0}[Register (\"{1}\"{2}, DoNotGenerateAcw=true)]", indent, RawJniName, this.AdditionalAttributeString()); sw.WriteLine("{0}public abstract class {1} : Java.Lang.Object {{", indent, name); sw.WriteLine(); sw.WriteLine("{0}\tinternal {1} ()", indent, name); sw.WriteLine("{0}\t{{", indent); sw.WriteLine("{0}\t}}", indent); var seen = new HashSet <string> (); bool needsClassRef = GenFields(sw, indent + "\t", opt, seen) || staticMethods.Any(); foreach (var iface in GetAllImplementedInterfaces().OfType <InterfaceGen>()) { sw.WriteLine(); sw.WriteLine("{0}\t// The following are fields from: {1}", indent, iface.JavaName); bool v = iface.GenFields(sw, indent + "\t", opt, seen); needsClassRef = needsClassRef || v; } foreach (var m in Methods.Where(m => m.IsStatic)) { m.Generate(sw, indent + "\t", opt, this, true); } if (needsClassRef) { sw.WriteLine(); opt.CodeGenerator.WriteClassHandle(this, sw, indent + "\t", opt, name); } sw.WriteLine("{0}}}", indent, Name); sw.WriteLine(); if (!hasManagedName) { sw.WriteLine("{0}[Register (\"{1}\"{2}, DoNotGenerateAcw=true)]", indent, RawJniName, this.AdditionalAttributeString()); sw.WriteLine("{0}[global::System.Obsolete (\"Use the '{1}' type. This type will be removed in a future release.\")]", indent, name); sw.WriteLine("{0}public abstract class {1}Consts : {1} {{", indent, name); sw.WriteLine(); sw.WriteLine("{0}\tprivate {1}Consts ()", indent, name); sw.WriteLine("{0}\t{{", indent); sw.WriteLine("{0}\t}}", indent); sw.WriteLine("{0}}}", indent); sw.WriteLine(); } } if (IsConstSugar) { return; } GenerateDeclaration(sw, indent, opt); if (!AssemblyQualifiedName.Contains('/')) { GenerateExtensionsDeclaration(sw, indent, opt, null); } GenerateInvoker(sw, indent, opt); GenerateEventHandler(sw, indent, opt); opt.ContextTypes.Pop(); }