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