From ef4be0b959b7f64080a04e5e123c47a3b2e8adfb Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Tue, 8 Jul 2014 22:28:08 +0300 Subject: [PATCH] Fixed the generation of code in a single file. Signed-off-by: Dimitar Dobrev --- src/Generator/Generator.cs | 74 ++++++++++--------- src/Generator/Generators/CLI/CLIGenerator.cs | 6 +- .../Generators/CLI/CLIHeadersTemplate.cs | 6 +- .../Generators/CLI/CLISourcesTemplate.cs | 6 +- .../Generators/CLI/CLITextTemplate.cs | 6 +- .../Generators/CSharp/CSharpGenerator.cs | 4 +- .../Generators/CSharp/CSharpTextTemplate.cs | 68 ++++++++--------- src/Generator/Generators/Template.cs | 19 ++--- tests/CSharpTemp/AnotherUnit.cpp | 5 ++ tests/CSharpTemp/AnotherUnit.h | 3 + tests/CSharpTemp/CSharpTemp.Tests.cs | 6 ++ tests/CSharpTemp/CSharpTemp.cs | 1 + 12 files changed, 111 insertions(+), 93 deletions(-) create mode 100644 tests/CSharpTemp/AnotherUnit.cpp create mode 100644 tests/CSharpTemp/AnotherUnit.h diff --git a/src/Generator/Generator.cs b/src/Generator/Generator.cs index 8f3a6093..69d0dac4 100644 --- a/src/Generator/Generator.cs +++ b/src/Generator/Generator.cs @@ -67,49 +67,57 @@ namespace CppSharp.Generators { var outputs = new List(); - foreach (var unit in Driver.ASTContext.TranslationUnits) - { - if (!unit.IsGenerated || !unit.HasDeclarations) - continue; + var units = Driver.ASTContext.TranslationUnits.Where( + u => u.IsGenerated && u.HasDeclarations && !u.IsSystemHeader && u.IsValid); + if (Driver.Options.IsCSharpGenerator && Driver.Options.GenerateSingleCSharpFile) + GenerateSingleTemplate(units, outputs); + else + foreach (var unit in units) + GenerateTemplate(unit, outputs); + return outputs; + } - if (unit.IsSystemHeader || !unit.IsValid) - continue; + private void GenerateSingleTemplate(IEnumerable units, ICollection outputs) + { + var output = new GeneratorOutput + { + TranslationUnit = new TranslationUnit + { + FilePath = string.Format("{0}.cs", Driver.Options.OutputNamespace ?? Driver.Options.LibraryName) + }, + Templates = Generate(units) + }; + output.Templates[0].Process(); + outputs.Add(output); + + OnUnitGenerated(output); + } - var templates = Generate(unit); - if (templates.Count == 0) - continue; + private void GenerateTemplate(TranslationUnit unit, ICollection outputs) + { + var templates = Generate(new[] { unit }); + if (templates.Count == 0) + return; - 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 - { - TranslationUnit = unit, - Templates = templates - }; - outputs.Add(output); - - OnUnitGenerated(output); + foreach (var template in templates) + { + template.Process(); } - return outputs; + var output = new GeneratorOutput + { + TranslationUnit = unit, + Templates = templates + }; + outputs.Add(output); + + OnUnitGenerated(output); } /// /// Generates the outputs for a given translation unit. /// - public abstract List