From 840ce34552ad03c59151c6f74f957240cdd78ad7 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Mon, 10 Feb 2014 19:56:40 +0200 Subject: [PATCH] Added an option to generate a single source file per extension. Signed-off-by: Dimitar Dobrev Conflicts: src/Generator/Driver.cs src/Generator/Options.cs --- src/Generator/Generator.cs | 16 +++++++- .../Generators/CLI/CLIHeadersTemplate.cs | 2 +- .../Generators/CLI/CLISourcesTemplate.cs | 2 +- .../Generators/CLI/CLITextTemplate.cs | 2 +- .../Generators/CSharp/CSharpTextTemplate.cs | 40 +++++++++++-------- src/Generator/Generators/Template.cs | 14 +++++-- src/Generator/Options.cs | 4 ++ 7 files changed, 55 insertions(+), 25 deletions(-) diff --git a/src/Generator/Generator.cs b/src/Generator/Generator.cs index 436c8909..8f3a6093 100644 --- a/src/Generator/Generator.cs +++ b/src/Generator/Generator.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using CppSharp.AST; namespace CppSharp.Generators @@ -78,8 +79,19 @@ namespace CppSharp.Generators if (templates.Count == 0) continue; - foreach (var template in templates) - template.Process(); + if (templates.Count == 1) + { + templates[0].Process(Template.Order.First | Template.Order.Last); + } + else + { + templates.First().Process(Template.Order.First); + for (var i = 1; i < templates.Count - 1; i++) + { + templates[i].Process(Template.Order.InBetween); + } + templates.Last().Process(Template.Order.Last); + } var output = new GeneratorOutput { diff --git a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs index 9793602b..af3d2541 100644 --- a/src/Generator/Generators/CLI/CLIHeadersTemplate.cs +++ b/src/Generator/Generators/CLI/CLIHeadersTemplate.cs @@ -20,7 +20,7 @@ namespace CppSharp.Generators.CLI { } - public override void Process() + public override void Process(Order order) { PushBlock(BlockKind.Header); PopBlock(); diff --git a/src/Generator/Generators/CLI/CLISourcesTemplate.cs b/src/Generator/Generators/CLI/CLISourcesTemplate.cs index 7484a178..8d0e8684 100644 --- a/src/Generator/Generators/CLI/CLISourcesTemplate.cs +++ b/src/Generator/Generators/CLI/CLISourcesTemplate.cs @@ -22,7 +22,7 @@ namespace CppSharp.Generators.CLI } - public override void Process() + public override void Process(Order order) { PushBlock(BlockKind.Header); PopBlock(); diff --git a/src/Generator/Generators/CLI/CLITextTemplate.cs b/src/Generator/Generators/CLI/CLITextTemplate.cs index 0ae556b8..63aa0798 100644 --- a/src/Generator/Generators/CLI/CLITextTemplate.cs +++ b/src/Generator/Generators/CLI/CLITextTemplate.cs @@ -70,7 +70,7 @@ namespace CppSharp.Generators.CLI public abstract override string FileExtension { get; } - public abstract override void Process(); + public abstract override void Process(Order order); #region Helpers diff --git a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs index 9a016aa9..d02e8aa6 100644 --- a/src/Generator/Generators/CSharp/CSharpTextTemplate.cs +++ b/src/Generator/Generators/CSharp/CSharpTextTemplate.cs @@ -128,33 +128,39 @@ namespace CppSharp.Generators.CSharp #endregion - public override void Process() + public override void Process(Order order) { GenerateHeader(); - PushBlock(CSharpBlockKind.Usings); - WriteLine("using System;"); - WriteLine("using System.Runtime.InteropServices;"); - WriteLine("using System.Security;"); - foreach (var customUsingStatement in Options.DependentNameSpaces) + if (!Options.GenerateSingleCSharpFile || order.HasFlag(Order.First)) { - WriteLine(string.Format("using {0};", customUsingStatement));; - } - PopBlock(NewLineKind.BeforeNextBlock); + PushBlock(CSharpBlockKind.Usings); + WriteLine("using System;"); + WriteLine("using System.Runtime.InteropServices;"); + WriteLine("using System.Security;"); + foreach (var customUsingStatement in Options.DependentNameSpaces) + { + WriteLine(string.Format("using {0};", customUsingStatement)); + } + PopBlock(NewLineKind.BeforeNextBlock); - if (Options.GenerateLibraryNamespace) - { - PushBlock(CSharpBlockKind.Namespace); - WriteLine("namespace {0}", Driver.Options.OutputNamespace); - WriteStartBraceIndent(); + if (Options.GenerateLibraryNamespace) + { + PushBlock(CSharpBlockKind.Namespace); + WriteLine("namespace {0}", Driver.Options.OutputNamespace); + WriteStartBraceIndent(); + } } GenerateDeclContext(TranslationUnit); - if (Options.GenerateLibraryNamespace) + if (!Options.GenerateSingleCSharpFile || order.HasFlag(Order.Last)) { - WriteCloseBraceIndent(); - PopBlock(NewLineKind.BeforeNextBlock); + if (Options.GenerateLibraryNamespace) + { + WriteCloseBraceIndent(); + PopBlock(NewLineKind.BeforeNextBlock); + } } } diff --git a/src/Generator/Generators/Template.cs b/src/Generator/Generators/Template.cs index dc7e36f0..f5b8c567 100644 --- a/src/Generator/Generators/Template.cs +++ b/src/Generator/Generators/Template.cs @@ -31,7 +31,7 @@ namespace CppSharp.Generators public NewLineKind NewLineKind { get; set; } public Block Parent { get; set; } - private List Blocks { get; set; } + public List Blocks { get; set; } public Declaration Declaration { get; set; } @@ -247,6 +247,14 @@ namespace CppSharp.Generators public abstract class Template : ITextGenerator { + [Flags] + public enum Order + { + First = 1, + InBetween = 2, + Last = 4 + } + public Driver Driver { get; private set; } public DriverOptions Options { get; private set; } public TranslationUnit TranslationUnit { get; private set; } @@ -269,7 +277,7 @@ namespace CppSharp.Generators ActiveBlock = RootBlock; } - public abstract void Process(); + public abstract void Process(Order order); public string Generate() { @@ -313,7 +321,7 @@ namespace CppSharp.Generators public Block FindBlock(int kind) { - return FindBlocks(kind).Single(); + return FindBlocks(kind).SingleOrDefault(); } #endregion diff --git a/src/Generator/Options.cs b/src/Generator/Options.cs index 87bec23e..705ce66d 100644 --- a/src/Generator/Options.cs +++ b/src/Generator/Options.cs @@ -178,6 +178,10 @@ namespace CppSharp public List CodeFiles { get; private set; } public readonly List DependentNameSpaces = new List(); public bool MarshalCharAsManagedChar { get; set; } + /// + /// Generates a single C# file. + /// + public bool GenerateSingleCSharpFile { get; set; } } public class InvalidOptionException : Exception