private string[] Generate(GenerationFlags flags, params Assembly[] assemblies) { List<string> ret = new List<string>(); foreach (Assembly a in assemblies) { ret.AddRange(Generate(flags, a)); } return ret.ToArray(); }
private string[] Generate(GenerationFlags flags, params Assembly[] assemblies) { List <string> ret = new List <string>(); foreach (Assembly a in assemblies) { ret.AddRange(Generate(flags, a)); } return(ret.ToArray()); }
public string[] Generate(GenerationFlags flags, Assembly assembly) { List <string> ret = new List <string>(); foreach (Type t in assembly.GetTypes()) { if (!t.IsInterface) { Dictionary <MethodInfo, MethodInfo> methods = new Dictionary <MethodInfo, MethodInfo>(); HashSet <Type> interfaces = new HashSet <Type>(); foreach (MethodInfo subm in t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Where(x => x.IsVirtual)) { Console.WriteLine(subm); if ((subm.MemberType & MemberTypes.Property) == MemberTypes.Property || (subm.MemberType & MemberTypes.Method) == MemberTypes.Method) { MethodInfo androidMethod = FindBaseForMethod(subm, null); if (androidMethod != null) { methods.Add(subm, androidMethod); } else//must be implementing an interface { androidMethod = FindInterfaceForMethod(subm); if (androidMethod != null) { if (!interfaces.Contains(androidMethod.DeclaringType)) { interfaces.Add(androidMethod.DeclaringType); } methods.Add(subm, androidMethod); } } } } if (methods.Count > 0) { StringBuilder linkMethods = new StringBuilder(), natives = new StringBuilder(); //get the link methods KeyValuePair <MethodInfo, MethodInfo>?first = null; foreach (KeyValuePair <MethodInfo, MethodInfo> pair in methods) { if (first == null) { first = pair; } StringBuilder args = new StringBuilder(), jniArgs = new StringBuilder(); ParameterInfo[] paramInfo = null; foreach (ParameterInfo p in paramInfo = pair.Key.GetParameters()) { jniArgs.Append(GetJType(p.ParameterType, true, true)); } for (int i = 0; i < paramInfo.Length; i++) { args.Append(paramInfo[i].ParameterType.FullName); if (i < paramInfo.Length - 1) { args.Append(","); } } linkMethods.AppendLine(string.Format("\t\tMonoBridge.link({0}.class, \"{1}\", \"({2}){3}\", \"{4}\");", t.Name, pair.Key.Name, jniArgs, GetJType(pair.Key.ReturnType, true, true), args)); args = new StringBuilder();//reuse var for (int i = 0; i < paramInfo.Length; i++) { args.AppendFormat("{0} {1}", paramInfo[i].ParameterType.FullName, paramInfo[i].Name); if (i < paramInfo.Length - 1) { args.Append(","); } } natives.AppendLine("\t@Override"); natives.AppendLine(string.Format("\t{0} native {1} {2}({3});", pair.Key.IsPublic ? "public" : "protected", GetJLangType(pair.Value.ReturnType), pair.Key.Name, args)); } string basePath = mOutputPath ?? Path.GetDirectoryName(t.Assembly.Location); basePath = Path.Combine(basePath, t.Namespace.Replace('.', Path.DirectorySeparatorChar)); Directory.CreateDirectory(basePath); string outputFile = Path.Combine(basePath, t.Name + ".java"); ret.Add(outputFile); StringBuilder interfacesText = new StringBuilder(); if (interfaces.Count > 0) { foreach (var iface in interfaces) { interfacesText.AppendFormat(", {0}", iface.FullName.Replace('+', '.')); } } File.WriteAllText(outputFile, string.Format(mTemplate, t.Namespace, t.Name, " extends ", t.BaseType, linkMethods, natives, interfacesText.ToString())); } } } return(ret.ToArray()); }
public string[] Generate(GenerationFlags flags, string assemblyFile) { return(Generate(flags, Assembly.LoadFile(assemblyFile))); }
public string[] Generate(GenerationFlags flags, Assembly assembly) { List<string> ret = new List<string>(); foreach (Type t in assembly.GetTypes()) { if (!t.IsInterface) { Dictionary<MethodInfo, MethodInfo> methods = new Dictionary<MethodInfo, MethodInfo>(); HashSet<Type> interfaces = new HashSet<Type>(); foreach (MethodInfo subm in t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Where(x => x.IsVirtual)) { Console.WriteLine(subm); if ((subm.MemberType & MemberTypes.Property) == MemberTypes.Property || (subm.MemberType & MemberTypes.Method) == MemberTypes.Method) { MethodInfo androidMethod = FindBaseForMethod(subm, null); if (androidMethod != null) { methods.Add(subm, androidMethod); } else//must be implementing an interface { androidMethod = FindInterfaceForMethod(subm); if (androidMethod != null) { if (!interfaces.Contains(androidMethod.DeclaringType)) interfaces.Add(androidMethod.DeclaringType); methods.Add(subm, androidMethod); } } } } if (methods.Count > 0) { StringBuilder linkMethods = new StringBuilder(), natives = new StringBuilder(); //get the link methods KeyValuePair<MethodInfo, MethodInfo>? first = null; foreach (KeyValuePair<MethodInfo, MethodInfo> pair in methods) { if (first == null) first = pair; StringBuilder args = new StringBuilder(), jniArgs = new StringBuilder(); ParameterInfo[] paramInfo = null; foreach (ParameterInfo p in paramInfo = pair.Key.GetParameters()) jniArgs.Append(GetJType(p.ParameterType, true, true)); for (int i = 0; i < paramInfo.Length; i++) { args.Append(paramInfo[i].ParameterType.FullName); if (i < paramInfo.Length - 1) args.Append(","); } linkMethods.AppendLine(string.Format("\t\tMonoBridge.link({0}.class, \"{1}\", \"({2}){3}\", \"{4}\");", t.Name, pair.Key.Name, jniArgs, GetJType(pair.Key.ReturnType, true, true), args)); args = new StringBuilder();//reuse var for (int i = 0; i < paramInfo.Length; i++) { args.AppendFormat("{0} {1}", paramInfo[i].ParameterType.FullName, paramInfo[i].Name); if (i < paramInfo.Length - 1) args.Append(","); } natives.AppendLine("\t@Override"); natives.AppendLine(string.Format("\t{0} native {1} {2}({3});", pair.Key.IsPublic ? "public" : "protected", GetJLangType(pair.Value.ReturnType), pair.Key.Name, args)); } string basePath = mOutputPath ?? Path.GetDirectoryName(t.Assembly.Location); basePath = Path.Combine(basePath, t.Namespace.Replace('.', Path.DirectorySeparatorChar)); Directory.CreateDirectory(basePath); string outputFile = Path.Combine(basePath, t.Name + ".java"); ret.Add(outputFile); StringBuilder interfacesText = new StringBuilder(); if (interfaces.Count > 0) { foreach (var iface in interfaces) { interfacesText.AppendFormat(", {0}", iface.FullName.Replace('+', '.')); } } File.WriteAllText(outputFile, string.Format(mTemplate, t.Namespace, t.Name, " extends ", t.BaseType, linkMethods, natives, interfacesText.ToString())); } } } return ret.ToArray(); }
public string[] Generate(GenerationFlags flags, string assemblyFile) { return Generate(flags, Assembly.LoadFile(assemblyFile)); }
/// <summary> /// Generates the code for the template. /// </summary> /// <param name="classes"> /// The collection of classes to generate code for /// </param> /// <param name="generationFlags"> /// The generation flags for which code to generate. /// </param> /// <returns> /// </returns> public string Generate(IList<IClassGenerationParameters> classes, GenerationFlags generationFlags) { if (classes == null) { throw new ArgumentNullException("classes"); } if (classes.Count < 1) { throw new ArgumentException("classes must have at least one item", "classes"); } if (generationFlags == GenerationFlags.None) { throw new ArgumentOutOfRangeException("generationFlags"); } var output = new StringBuilder(); var rules = new List<Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>> { // information interface rule new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( generationFlags & GenerationFlags.InformationInterface, list => new InformationInterfaceGenerator().Generate(list, false)), // information class rule new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( generationFlags & GenerationFlags.InformationClass, list => new InformationClassGenerator().Generate(list, false)), // difference interface rule new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( generationFlags & GenerationFlags.DifferenceInterface, list => new DifferenceInterfaceGenerator().Generate(list, false)), // difference class rule new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( generationFlags & GenerationFlags.DifferenceClass, list => new DifferenceClassGenerator().Generate(list, false)), /* // delta interface rule new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( generationFlags & GenerationFlags.DeltaInterface, list => new DeltaInterfaceGenerator().Generate(list)), // delta class rule new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( generationFlags & GenerationFlags.DeltaClass, list => new DeltaClassGenerator().Generate(list)), * */ // search filter interface rule /* new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( generationFlags & GenerationFlags.SearchFilterInterface, list => new SearchFilter().Generate(list)), // search filter class rule new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( generationFlags & GenerationFlags.SearchFilterClass, list => new InformationInterfaceGenerator().Generate(list)), * */ // ADO.NET new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( generationFlags & GenerationFlags.AdoNetClass, list => new AdoNetGenerator().Generate(list, false)), // Entity Framework //new Tuple<GenerationFlags, Func<IList<IClassGenerationParameters>, string>>( // generationFlags & GenerationFlags.AdoNetClass, // list => new EntityFrameworkHelpers().Generate(list)), }; foreach (var tuple in rules) { if (tuple.Item1 != GenerationFlags.None) { output.Append(tuple.Item2(classes)); } } if ((generationFlags & GenerationFlags.InformationInterface) != GenerationFlags.None) { ; } if ((generationFlags & GenerationFlags.DifferenceInterface) != GenerationFlags.None) { output.Append(new DifferenceInterfaceGenerator().Generate(classes)); } output.Append(new InformationClassGenerator().Generate(classes)); output.Append(new DifferenceClassGenerator().Generate(classes)); return output.ToString(); }