Browse Source

Split the generation and writing of bindings.

pull/12/merge
triton 12 years ago
parent
commit
c3ac9e7efc
  1. 64
      src/Generator/Driver.cs
  2. 8
      src/Generator/Passes/PassBuilder.cs

64
src/Generator/Driver.cs

@ -113,54 +113,39 @@ namespace CppSharp
public void ProcessCode() public void ProcessCode()
{ {
TypeDatabase.SetupTypeMaps(); foreach (var pass in Passes.Passes)
var passes = new PassBuilder(this); pass.VisitLibrary(Library);
passes.CleanUnit(Options);
passes.SortDeclarations();
passes.ResolveIncompleteDecls();
if (Transform != null)
Transform.SetupPasses(this, passes);
passes.CleanInvalidDeclNames();
passes.CheckIgnoredDecls();
passes.CheckTypeReferences();
passes.CheckFlagEnums();
passes.CheckAmbiguousOverloads();
Generator.SetupPasses(passes);
passes.RunPasses();
if (Transform != null)
Transform.Postprocess(Library);
} }
public void GenerateCode() public List<GeneratorOutput> GenerateCode()
{ {
if (Library.TranslationUnits.Count <= 0) var outputs = Generator.Generate();
return; return outputs;
}
foreach (var unit in Library.TranslationUnits) public void WriteCode(List<GeneratorOutput> outputs)
{ {
if (unit.Ignore || !unit.HasDeclarations) var outputPath = Options.OutputDir ?? Directory.GetCurrentDirectory();
continue;
if (unit.IsSystemHeader) if (!Directory.Exists(outputPath))
continue; Directory.CreateDirectory(outputPath);
var outputs = new List<GeneratorOutput>();
if (!Generator.Generate(unit, outputs))
continue;
foreach (var output in outputs) foreach (var output in outputs)
{ {
Diagnostics.EmitMessage(DiagnosticId.FileGenerated, var fileBase = output.TranslationUnit.FileNameWithoutExtension;
"Generated '{0}'", Path.GetFileName(output.OutputPath));
if (Options.GenerateName != null)
fileBase = Options.GenerateName(output.TranslationUnit);
foreach (var template in output.Templates)
{
var fileName = string.Format("{0}.{1}", fileBase, template.FileExtension);
Diagnostics.EmitMessage(DiagnosticId.FileGenerated, "Generated '{0}'", fileName);
var filePath = Path.Combine(outputPath, fileName);
var text = output.Template.ToString(); var text = template.GenerateText();
File.WriteAllText(output.OutputPath, text); File.WriteAllText(Path.GetFullPath(filePath), text);
} }
} }
} }
@ -296,7 +281,8 @@ namespace CppSharp
library.Postprocess(driver.Library); library.Postprocess(driver.Library);
Console.WriteLine("Generating code..."); Console.WriteLine("Generating code...");
driver.GenerateCode(); var outputs = driver.GenerateCode();
driver.WriteCode(outputs);
} }
} }
} }

8
src/Generator/Passes/PassBuilder.cs

@ -26,14 +26,6 @@ namespace CppSharp
Passes.Add(pass); Passes.Add(pass);
} }
public void RunPasses()
{
foreach (var pass in Passes)
{
pass.VisitLibrary(Driver.Library);
}
}
/// <summary> /// <summary>
/// Finds a previously-added pass of the given type. /// Finds a previously-added pass of the given type.
/// </summary> /// </summary>

Loading…
Cancel
Save