Browse Source

Simplified the generators interface.

pull/12/merge
triton 13 years ago
parent
commit
6dc4f120cb
  1. 16
      src/Generator/Generators/CLI/CLIGenerator.cs
  2. 13
      src/Generator/Generators/CSharp/CSharpGenerator.cs
  3. 68
      src/Generator/Generators/Generator.cs

16
src/Generator/Generators/CLI/CLIGenerator.cs

@ -1,6 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using CppSharp.Types.Std;
namespace CppSharp.Generators.CLI namespace CppSharp.Generators.CLI
{ {
@ -18,19 +16,17 @@ namespace CppSharp.Generators.CLI
Type.TypePrinterDelegate += type => type.Visit(typePrinter); Type.TypePrinterDelegate += type => type.Visit(typePrinter);
} }
/// <summary> public override List<TextTemplate> Generate(TranslationUnit unit)
/// Generates the code for a given translation unit.
/// </summary>
public override bool Generate(TranslationUnit unit,
List<GeneratorOutput> outputs)
{ {
var outputs = new List<TextTemplate>();
var header = new CLIHeadersTemplate(Driver, unit); var header = new CLIHeadersTemplate(Driver, unit);
outputs.Add(GenerateTemplateOutput(header)); outputs.Add(header);
var source = new CLISourcesTemplate(Driver, unit); var source = new CLISourcesTemplate(Driver, unit);
outputs.Add(GenerateTemplateOutput(source)); outputs.Add(source);
return true; return outputs;
} }
public override bool SetupPasses(PassBuilder builder) public override bool SetupPasses(PassBuilder builder)

13
src/Generator/Generators/CSharp/CSharpGenerator.cs

@ -1,5 +1,5 @@
using System.Collections.Generic; using System;
using System.IO; using System.Collections.Generic;
using CppSharp.Passes; using CppSharp.Passes;
namespace CppSharp.Generators.CSharp namespace CppSharp.Generators.CSharp
@ -14,13 +14,14 @@ namespace CppSharp.Generators.CSharp
Type.TypePrinterDelegate += type => type.Visit(typePrinter).Type; Type.TypePrinterDelegate += type => type.Visit(typePrinter).Type;
} }
public override bool Generate(TranslationUnit unit, public override List<TextTemplate> Generate(TranslationUnit unit)
List<GeneratorOutput> outputs)
{ {
var outputs = new List<TextTemplate>();
var template = new CSharpTextTemplate(Driver, unit, typePrinter); var template = new CSharpTextTemplate(Driver, unit, typePrinter);
outputs.Add(GenerateTemplateOutput(template)); outputs.Add(template);
return true; return outputs;
} }
public override bool SetupPasses(PassBuilder builder) public override bool SetupPasses(PassBuilder builder)

68
src/Generator/Generators/Generator.cs

@ -1,5 +1,5 @@
using System.Collections.Generic; using System;
using System.IO; using System.Collections.Generic;
namespace CppSharp.Generators namespace CppSharp.Generators
{ {
@ -23,14 +23,9 @@ namespace CppSharp.Generators
public TranslationUnit TranslationUnit; public TranslationUnit TranslationUnit;
/// <summary> /// <summary>
/// Text template with generated output. /// Text templates with generated output.
/// </summary> /// </summary>
public TextTemplate Template; public List<TextTemplate> Templates;
/// <summary>
/// Output path of the generated output.
/// </summary>
public string OutputPath;
} }
/// <summary> /// <summary>
@ -46,42 +41,53 @@ namespace CppSharp.Generators
} }
/// <summary> /// <summary>
/// Generates the code for a given translation unit. /// Called when a translation unit is generated.
/// </summary> /// </summary>
public abstract bool Generate(TranslationUnit unit, public Action<GeneratorOutput> OnUnitGenerated = delegate { };
List<GeneratorOutput> outputs);
/// <summary> /// <summary>
/// Setup any generator-specific passes here. /// Setup any generator-specific passes here.
/// </summary> /// </summary>
public abstract bool SetupPasses(PassBuilder builder); public abstract bool SetupPasses(PassBuilder builder);
protected string GetOutputPath(TranslationUnit unit)
/// <summary>
/// Generates the outputs.
/// </summary>
public virtual List<GeneratorOutput> Generate()
{ {
var file = unit.FileNameWithoutExtension; var outputs = new List<GeneratorOutput>();
foreach (var unit in Driver.Library.TranslationUnits)
{
if (unit.Ignore || !unit.HasDeclarations)
continue;
if (Driver.Options.GenerateName != null) if (unit.IsSystemHeader)
file = Driver.Options.GenerateName(unit); continue;
var path = Path.Combine(Driver.Options.OutputDir, file); var templates = Generate(unit);
return Path.GetFullPath(path); if (templates.Count == 0)
} continue;
protected GeneratorOutput GenerateTemplateOutput(TextTemplate template) foreach (var template in templates)
{ template.GenerateBlocks();
var path = GetOutputPath(template.TranslationUnit)
+ "." + template.FileExtension;
template.Generate(); var output = new GeneratorOutput
{
TranslationUnit = unit,
Templates = templates
};
var output = new GeneratorOutput() OnUnitGenerated(output);
{ }
OutputPath = path,
Template = template,
TranslationUnit = template.TranslationUnit
};
return output; return outputs;
} }
/// <summary>
/// Generates the outputs for a given translation unit.
/// </summary>
public abstract List<TextTemplate> Generate(TranslationUnit unit);
} }
} }
Loading…
Cancel
Save