Example #1
0
 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();
 }
Example #2
0
        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());
        }
Example #3
0
        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());
        }
Example #4
0
 public string[] Generate(GenerationFlags flags, string assemblyFile)
 {
     return(Generate(flags, Assembly.LoadFile(assemblyFile)));
 }
Example #5
0
        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();
        }
Example #6
0
 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();
        }