Beispiel #1
0
        public static void GenerateMembers(this IGeneratable gen, IndentWriter writer, Func <IMemberGeneratable, bool> where = null)
        {
            var array = gen.GetMemberGeneratables().Where(x => where == null || where (x)).ToArray();

            for (int i = 0; i < array.Length; ++i)
            {
                var member = array [i];

                // Generate pinvoke signature for a method
                if (!(gen is Interface) && member is INativeCallable callable)
                {
                    callable.GenerateImport(gen, writer);
                }

                // Generate documentation is a member supports it.
                if (member is IDocumented doc)
                {
                    doc.GenerateDocumentation(writer);
                }

                // Call the main member generation implementation.
                member.Generate(gen, writer);

                if (i != array.Length - 1 && member.NewlineAfterGeneration(writer.Options))
                {
                    writer.WriteLine();
                }
            }
        }
Beispiel #2
0
 void GenerateMembers(IndentWriter writer)
 {
     foreach (var member in Members)
     {
         writer.WriteDocumentation(member.Doc);
         writer.WriteLine(member.Name.ToCSharp() + " = " + HexFormat(member.Value) + ",");
     }
 }
Beispiel #3
0
        public static void GenerateDocumentation(this IDocumented gen, IndentWriter writer)
        {
            if (gen.Doc is null)
            {
                return;
            }

            writer.WriteDocumentation(gen.Doc, gen is ReturnValue ? "returns" : "summary");
        }
Beispiel #4
0
        public void Generate(GenerationOptions opts, IGeneratable parent, IndentWriter writer)
        {
            writer.WriteDocumentation(Doc);

            // Simple uncorrect gen for now
            var managedType = this.GetSymbol(opts);

            // We need something that will tell us the equivalent C# type
            // including the number of pointers.
            // For now, generate normal info.

            writer.WriteLine($"{managedType.Name} {Name};");
        }
Beispiel #5
0
        public void Generate(GenerationOptions opts, IGeneratable parent, IndentWriter writer)
        {
            writer.WriteDocumentation(Doc);

            string value = Value;

            // Make this smarter, probably pass in some options and key them.
            if (parent is Bitfield)
            {
                value = HexFormat(value);
            }

            writer.WriteLine(Name.ToCSharp() + " = " + value + ",");
        }
Beispiel #6
0
        public static string GetReturnCSharpType(this IMethodLike callable, IndentWriter writer)
        {
            var retVal = callable.ReturnValue;

            if (retVal == null)
            {
                return("void");
            }

            // TODO: Handle marshalling.

            // Try getting the array return value, then the type one.
            var retSymbol = retVal.Resolve(writer.Options);

            return(retSymbol.CSharpType);
        }
Beispiel #7
0
        public static void GenerateCallableDefinition(this INativeCallable callable, IGeneratable gen, IndentWriter writer)
        {
            callable.ReturnValue.GenerateDocumentation(writer);

            writer.WriteIndent();
            if (!string.IsNullOrEmpty(callable.GetModifiers(gen, writer.Options)) && !(gen is Interface))
            {
                writer.Write(callable.GetModifiers(gen, writer.Options) + " ");
            }

            var returnType = callable.GetReturnCSharpType(writer);

            // generate ReturnValue then Parameters
            var result = BuildParameters(callable, writer.Options, !callable.IsInstanceCallable(gen, writer.Options));

            writer.Write($"{returnType} {callable.Name.ToCSharp ()} ({result.TypesAndNames})");

            if (gen is Interface)
            {
                writer.Write(";");
                writer.WriteLine();
                return;
            }

            writer.WriteLine();
            writer.WriteLine("{");
            using (writer.Indent())
            {
                string prefix = returnType != "void" ? "return " : string.Empty;
                writer.WriteLine($"{prefix}{callable.CIdentifier} ({result.Names});");
            }
            writer.WriteLine("}");
        }
Beispiel #8
0
        static void GenerateImport(this INativeCallable callable, IGeneratable parent, IndentWriter writer)
        {
            var retType = GetReturnCSharpType(callable, writer);

            var parameters = BuildParameters(callable, writer.Options, appendInstanceParameters: true);

            // TODO: Better than using the constant string, insert a custom generatable which contains the import string as a constant.

            /* i.e.
             * static class <LibraryName>Constants
             * {
             * public const string GLib = "libglib-2.0.so";
             * }
             */
            //writer.WriteLine ($"[DllImport (\"{writer.Options.LibraryName}\", CallingConvention=CallingConvention.Cdecl)]");
            writer.WriteLine($"static extern {retType} {callable.CIdentifier} ({parameters.MarshalTypesAndNames});");
            writer.WriteLine();
        }
Beispiel #9
0
        public static void GenerateConstructor(this INativeCallable callable, IGeneratable parent, IndentWriter writer)
        {
            callable.ReturnValue.GenerateDocumentation(writer);

            var modifier = callable.GetModifiers(parent, writer.Options);

            var result = BuildParameters(callable, writer.Options, !callable.IsInstanceCallable(parent, writer.Options));

            // FIXME, should check to see if it is deprecated
            writer.WriteLine($"{modifier} {parent.Name} ({result.TypesAndNames}) : base ({result.Names})");
            writer.WriteLine("{");
            writer.WriteLine("}");
        }
Beispiel #10
0
        public static IndentWriter GetWriter(this IGeneratable gen, GenerationOptions opts)
        {
            var path = Path.Combine(opts.DirectoryPath, gen.Name + CSharpFileExtension);

            return(IndentWriter.OpenWrite(path, opts).WriteHeader());
        }
Beispiel #11
0
 public IndentDisposable(IndentWriter writer)
 {
     this.writer = writer;
 }
Beispiel #12
0
 public void Generate(IGeneratable parent, IndentWriter writer)
 {
     this.GenerateCallableDefinition(parent, writer);
 }
        public static void GenerateMembers(this IGeneratable gen, GenerationOptions opts, IndentWriter writer)
        {
            var array = gen.GetMemberGeneratables().ToArray();

            for (int i = 0; i < array.Length; ++i)
            {
                var member = array[i];
                member.Generate(opts, gen, writer);

                if (i != array.Length - 1 && member.NewlineAfterGeneration(opts))
                {
                    writer.WriteLine();
                }
            }
        }