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

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

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

68
src/Generator/Generators/Generator.cs

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