Browse Source

PassBuilder is now generic. Driver Passes is now called TranslationUnitPasses. Added to driver GeneratorOutputPasses. Removed most of the PassBuilder Extensions.

pull/17/head
marcos henrich 12 years ago
parent
commit
0cf8c03aa3
  1. 12
      examples/SDL/SDL.cs
  2. 27
      src/Generator.Tests/Passes/TestPasses.cs
  3. 61
      src/Generator/Driver.cs
  4. 2
      src/Generator/Generators/CLI/CLIGenerator.cs
  5. 6
      src/Generator/Generators/CSharp/CSharpGenerator.cs
  6. 2
      src/Generator/Generators/Generator.cs
  7. 3
      src/Generator/Library.cs
  8. 10
      src/Generator/Passes/CheckAbiParameters.cs
  9. 9
      src/Generator/Passes/CheckDuplicatedNamesPass.cs
  10. 9
      src/Generator/Passes/CheckFlagEnumsPass.cs
  11. 9
      src/Generator/Passes/CheckIgnoredDecls.cs
  12. 9
      src/Generator/Passes/CheckOperatorsOverloads.cs
  13. 9
      src/Generator/Passes/CleanInvalidDeclNamesPass.cs
  14. 10
      src/Generator/Passes/CleanUnitPass.cs
  15. 9
      src/Generator/Passes/FunctionToInstanceMethodPass.cs
  16. 9
      src/Generator/Passes/FunctionToStaticMethodPass.cs
  17. 15
      src/Generator/Passes/Pass.cs
  18. 19
      src/Generator/Passes/PassBuilder.cs
  19. 10
      src/Generator/Passes/RenamePass.cs
  20. 9
      src/Generator/Passes/ResolveIncompleteDeclsPass.cs
  21. 9
      src/Generator/Passes/SortDeclarationsPass.cs
  22. 2
      src/Generator/Utils/TestsUtils.cs

12
examples/SDL/SDL.cs

@ -14,13 +14,13 @@ namespace CppSharp
options.OutputDir = "SDL"; options.OutputDir = "SDL";
} }
public void SetupPasses(Driver driver, PassBuilder passes) public void SetupPasses(Driver driver)
{ {
passes.RemovePrefix("SDL_"); driver.TranslationUnitPasses.RemovePrefix("SDL_");
passes.RemovePrefix("SCANCODE_"); driver.TranslationUnitPasses.RemovePrefix("SCANCODE_");
passes.RemovePrefix("SDLK_"); driver.TranslationUnitPasses.RemovePrefix("SDLK_");
passes.RemovePrefix("KMOD_"); driver.TranslationUnitPasses.RemovePrefix("KMOD_");
passes.RemovePrefix("LOG_CATEGORY_"); driver.TranslationUnitPasses.RemovePrefix("LOG_CATEGORY_");
} }
public void Preprocess(Driver driver, Library lib) public void Preprocess(Driver driver, Library lib)

27
src/Generator.Tests/Passes/TestPasses.cs

@ -7,7 +7,7 @@ namespace Generator.Tests.Passes
[TestFixture] [TestFixture]
public class TestPasses : HeaderTestFixture public class TestPasses : HeaderTestFixture
{ {
private PassBuilder passBuilder; private PassBuilder<TranslationUnitPass> passBuilder;
[TestFixtureSetUp] [TestFixtureSetUp]
public void Init() public void Init()
@ -18,7 +18,7 @@ namespace Generator.Tests.Passes
public void Setup() public void Setup()
{ {
ParseLibrary("Passes.h"); ParseLibrary("Passes.h");
passBuilder = new PassBuilder(Driver); passBuilder = new PassBuilder<TranslationUnitPass>(Driver);
} }
[Test] [Test]
@ -30,8 +30,9 @@ namespace Generator.Tests.Passes
var @enum2 = Library.Enum("FlagEnum2"); var @enum2 = Library.Enum("FlagEnum2");
Assert.IsFalse(@enum2.IsFlags); Assert.IsFalse(@enum2.IsFlags);
passBuilder.CheckFlagEnums(); passBuilder.AddPass(new CheckFlagEnumsPass());
passBuilder.RunPasses(); foreach (var pass in passBuilder.Passes)
pass.VisitLibrary(Library);
Assert.IsTrue(@enum.IsFlags); Assert.IsTrue(@enum.IsFlags);
Assert.IsFalse(@enum2.IsFlags); Assert.IsFalse(@enum2.IsFlags);
@ -44,8 +45,9 @@ namespace Generator.Tests.Passes
Assert.IsNull(c.Method("Start")); Assert.IsNull(c.Method("Start"));
passBuilder.FunctionToInstanceMethod(); passBuilder.AddPass( new FunctionToInstanceMethodPass());
passBuilder.RunPasses(); foreach (var pass in passBuilder.Passes)
pass.VisitLibrary(Library);
Assert.IsNotNull(c.Method("Start")); Assert.IsNotNull(c.Method("Start"));
} }
@ -58,8 +60,9 @@ namespace Generator.Tests.Passes
Assert.IsFalse(Library.Function("FooStart").ExplicityIgnored); Assert.IsFalse(Library.Function("FooStart").ExplicityIgnored);
Assert.IsNull(c.Method("Start")); Assert.IsNull(c.Method("Start"));
passBuilder.FunctionToStaticMethod(); passBuilder.AddPass(new FunctionToStaticMethodPass());
passBuilder.RunPasses(); foreach (var pass in passBuilder.Passes)
pass.VisitLibrary(Library);
Assert.IsTrue(Library.Function("FooStart").ExplicityIgnored); Assert.IsTrue(Library.Function("FooStart").ExplicityIgnored);
Assert.IsNotNull(c.Method("Start")); Assert.IsNotNull(c.Method("Start"));
@ -74,7 +77,8 @@ namespace Generator.Tests.Passes
var field = c.Field("lowerCaseField"); var field = c.Field("lowerCaseField");
passBuilder.RenameDeclsUpperCase(RenameTargets.Any); passBuilder.RenameDeclsUpperCase(RenameTargets.Any);
passBuilder.RunPasses(); foreach (var pass in passBuilder.Passes)
pass.VisitLibrary(Library);
Assert.That(method.Name, Is.EqualTo("LowerCaseMethod")); Assert.That(method.Name, Is.EqualTo("LowerCaseMethod"));
Assert.That(field.Name, Is.EqualTo("LowerCaseField")); Assert.That(field.Name, Is.EqualTo("LowerCaseField"));
@ -89,8 +93,9 @@ namespace Generator.Tests.Passes
Assert.IsNotNull(@enum); Assert.IsNotNull(@enum);
passBuilder.RemovePrefix("TEST_ENUM_ITEM_NAME_", RenameTargets.EnumItem); passBuilder.RemovePrefix("TEST_ENUM_ITEM_NAME_", RenameTargets.EnumItem);
passBuilder.CleanInvalidDeclNames(); passBuilder.AddPass(new CleanInvalidDeclNamesPass());
passBuilder.RunPasses(); foreach (var pass in passBuilder.Passes)
pass.VisitLibrary(Library);
Assert.That(@enum.Items[0].Name, Is.EqualTo("_0")); Assert.That(@enum.Items[0].Name, Is.EqualTo("_0"));
} }

61
src/Generator/Driver.cs

@ -30,7 +30,8 @@ namespace CppSharp
public IDiagnosticConsumer Diagnostics { get; private set; } public IDiagnosticConsumer Diagnostics { get; private set; }
public Parser Parser { get; private set; } public Parser Parser { get; private set; }
public TypeMapDatabase TypeDatabase { get; private set; } public TypeMapDatabase TypeDatabase { get; private set; }
public PassBuilder Passes { get; private set; } public PassBuilder<TranslationUnitPass> TranslationUnitPasses { get; private set; }
public PassBuilder<GeneratorOutputPass> GeneratorOutputPasses { get; private set; }
public Generator Generator { get; private set; } public Generator Generator { get; private set; }
public Library Library { get; private set; } public Library Library { get; private set; }
@ -44,7 +45,8 @@ namespace CppSharp
Parser.OnHeaderParsed += OnFileParsed; Parser.OnHeaderParsed += OnFileParsed;
Parser.OnLibraryParsed += OnFileParsed; Parser.OnLibraryParsed += OnFileParsed;
TypeDatabase = new TypeMapDatabase(); TypeDatabase = new TypeMapDatabase();
Passes = new PassBuilder(this); TranslationUnitPasses = new PassBuilder<TranslationUnitPass>(this);
GeneratorOutputPasses = new PassBuilder<GeneratorOutputPass>(this);
} }
static void ValidateOptions(DriverOptions options) static void ValidateOptions(DriverOptions options)
@ -120,27 +122,28 @@ namespace CppSharp
return true; return true;
} }
public void AddPrePasses() public void SetupPasses(ILibrary library)
{ {
Passes.CleanUnit(Options); TranslationUnitPasses.AddPass(new CleanUnitPass(Options));
Passes.SortDeclarations(); TranslationUnitPasses.AddPass(new SortDeclarationsPass());
Passes.ResolveIncompleteDecls(); TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass());
Passes.CheckIgnoredDecls(); TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
}
public void AddPostPasses() library.SetupPasses(this);
{
Passes.CleanInvalidDeclNames(); TranslationUnitPasses.AddPass(new CleanInvalidDeclNamesPass());
Passes.CheckIgnoredDecls(); TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
Passes.CheckFlagEnums(); TranslationUnitPasses.AddPass(new CheckFlagEnumsPass());
Passes.CheckDuplicateNames(); TranslationUnitPasses.AddPass(new CheckDuplicatedNamesPass());
Generator.SetupPasses(Passes);
} }
public void ProcessCode() public void ProcessCode()
{ {
foreach (var pass in Passes.Passes) foreach (var pass in TranslationUnitPasses.Passes)
{
pass.Driver = this;
pass.VisitLibrary(Library); pass.VisitLibrary(Library);
}
Generator.Process(); Generator.Process();
} }
@ -174,6 +177,16 @@ namespace CppSharp
} }
} }
} }
public void AddTranslationUnitPass(TranslationUnitPass pass)
{
TranslationUnitPasses.AddPass(pass);
}
public void AddGeneratorOutputPass(GeneratorOutputPass pass)
{
GeneratorOutputPasses.AddPass(pass);
}
} }
public class DriverOptions public class DriverOptions
@ -273,15 +286,23 @@ namespace CppSharp
Console.WriteLine("Processing code..."); Console.WriteLine("Processing code...");
library.Preprocess(driver, driver.Library); library.Preprocess(driver, driver.Library);
driver.AddPrePasses(); driver.SetupPasses(library);
library.SetupPasses(driver, driver.Passes);
driver.AddPostPasses();
driver.ProcessCode(); driver.ProcessCode();
library.Postprocess(driver.Library); library.Postprocess(driver.Library);
Console.WriteLine("Generating code..."); Console.WriteLine("Generating code...");
var outputs = driver.GenerateCode(); var outputs = driver.GenerateCode();
foreach (var output in outputs)
{
foreach (var pass in driver.GeneratorOutputPasses.Passes)
{
pass.Driver = driver;
pass.VisitGeneratorOutput(output);
}
}
driver.WriteCode(outputs); driver.WriteCode(outputs);
} }
} }

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

@ -30,7 +30,7 @@ namespace CppSharp.Generators.CLI
return outputs; return outputs;
} }
public override bool SetupPasses(PassBuilder builder) public override bool SetupPasses()
{ {
return true; return true;
} }

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

@ -26,10 +26,10 @@ namespace CppSharp.Generators.CSharp
return outputs; return outputs;
} }
public override bool SetupPasses(PassBuilder builder) public override bool SetupPasses()
{ {
builder.CheckAbiParameters(Driver.Options); Driver.AddTranslationUnitPass(new CheckAbiParameters(Driver.Options));
builder.CheckOperatorOverloads(); Driver.AddTranslationUnitPass(new CheckOperatorsOverloadsPass());
return true; return true;
} }

2
src/Generator/Generators/Generator.cs

@ -49,7 +49,7 @@ namespace CppSharp.Generators
/// <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();
/// <summary> /// <summary>
/// Setup any generator-specific processing here. /// Setup any generator-specific processing here.

3
src/Generator/Library.cs

@ -31,8 +31,7 @@ namespace CppSharp
/// Setup your passes here. /// Setup your passes here.
/// </summary> /// </summary>
/// <param name="driver"></param> /// <param name="driver"></param>
/// <param name="passes"></param> void SetupPasses(Driver driver);
void SetupPasses(Driver driver, PassBuilder passes);
} }
public static class LibraryHelpers public static class LibraryHelpers

10
src/Generator/Passes/CheckAbiParameters.cs

@ -49,14 +49,4 @@ namespace CppSharp.Passes
return needsMSHiddenPtr || options.IsItaniumAbi; return needsMSHiddenPtr || options.IsItaniumAbi;
} }
} }
public static class CheckAbiParametersExtensions
{
public static void CheckAbiParameters(this PassBuilder builder,
DriverOptions options)
{
var pass = new CheckAbiParameters(options);
builder.AddPass(pass);
}
}
} }

9
src/Generator/Passes/CheckDuplicatedNamesPass.cs

@ -137,13 +137,4 @@ namespace CppSharp.Passes
Driver.Diagnostics.EmitWarning("Duplicate name {0}, renamed to {1}", fullName, decl.Name); Driver.Diagnostics.EmitWarning("Duplicate name {0}, renamed to {1}", fullName, decl.Name);
} }
} }
public static class CheckDuplicateNamesExtensions
{
public static void CheckDuplicateNames(this PassBuilder builder)
{
var pass = new CheckDuplicatedNamesPass();
builder.AddPass(pass);
}
}
} }

9
src/Generator/Passes/CheckFlagEnumsPass.cs

@ -43,13 +43,4 @@ namespace CppSharp.Passes
return base.VisitEnumDecl(@enum); return base.VisitEnumDecl(@enum);
} }
} }
public static class CheckFlagEnumsExtensions
{
public static void CheckFlagEnums(this PassBuilder builder)
{
var pass = new CheckFlagEnumsPass();
builder.AddPass(pass);
}
}
} }

9
src/Generator/Passes/CheckIgnoredDecls.cs

@ -285,13 +285,4 @@ namespace CppSharp.Passes
#endregion #endregion
} }
public static class CheckIgnoredDeclsPassExtensions
{
public static void CheckIgnoredDecls(this PassBuilder builder)
{
var pass = new CheckIgnoredDeclsPass();
builder.AddPass(pass);
}
}
} }

9
src/Generator/Passes/CheckOperatorsOverloads.cs

@ -198,13 +198,4 @@ namespace CppSharp.Passes
} }
} }
} }
public static class CheckOperatorsOverloadsExtensions
{
public static void CheckOperatorOverloads(this PassBuilder builder)
{
var pass = new CheckOperatorsOverloadsPass();
builder.AddPass(pass);
}
}
} }

9
src/Generator/Passes/CleanInvalidDeclNamesPass.cs

@ -93,14 +93,5 @@ namespace CppSharp.Passes
return base.VisitEnumItem(item); return base.VisitEnumItem(item);
} }
} }
public static class CleanInvalidDeclNamesExtensions
{
public static void CleanInvalidDeclNames(this PassBuilder builder)
{
var pass = new CleanInvalidDeclNamesPass();
builder.AddPass(pass);
}
}
} }

10
src/Generator/Passes/CleanUnitPass.cs

@ -5,7 +5,6 @@ namespace CppSharp.Passes
public class CleanUnitPass : TranslationUnitPass public class CleanUnitPass : TranslationUnitPass
{ {
public DriverOptions DriverOptions; public DriverOptions DriverOptions;
public PassBuilder Passes;
public CleanUnitPass(DriverOptions options) public CleanUnitPass(DriverOptions options)
{ {
@ -43,13 +42,4 @@ namespace CppSharp.Passes
return includePath.Replace('\\', '/'); return includePath.Replace('\\', '/');
} }
} }
public static class CleanUnitPassExtensions
{
public static void CleanUnit(this PassBuilder builder, DriverOptions options)
{
var pass = new CleanUnitPass(options);
builder.AddPass(pass);
}
}
} }

9
src/Generator/Passes/FunctionToInstanceMethodPass.cs

@ -85,13 +85,4 @@ namespace CppSharp.Passes
return false; return false;
} }
} }
public static class FunctionToInstanceMethodExtensions
{
public static void FunctionToInstanceMethod(this PassBuilder builder)
{
var pass = new FunctionToInstanceMethodPass();
builder.AddPass(pass);
}
}
} }

9
src/Generator/Passes/FunctionToStaticMethodPass.cs

@ -57,13 +57,4 @@ namespace CppSharp.Passes
return true; return true;
} }
} }
public static class FunctionToStaticMethodExtensions
{
public static void FunctionToStaticMethod(this PassBuilder builder)
{
var pass = new FunctionToStaticMethodPass();
builder.AddPass(pass);
}
}
} }

15
src/Generator/Passes/Pass.cs

@ -1,5 +1,6 @@
 
using CppSharp.AST; using CppSharp.AST;
using CppSharp.Generators;
namespace CppSharp.Passes namespace CppSharp.Passes
{ {
@ -14,6 +15,7 @@ namespace CppSharp.Passes
public virtual bool VisitLibrary(Library library) public virtual bool VisitLibrary(Library library)
{ {
Library = library;
foreach (var unit in library.TranslationUnits) foreach (var unit in library.TranslationUnits)
VisitTranslationUnit(unit); VisitTranslationUnit(unit);
@ -44,4 +46,17 @@ namespace CppSharp.Passes
return decl.ExcludeFromPasses.Contains(type); return decl.ExcludeFromPasses.Contains(type);
} }
} }
/// <summary>
/// Used to modify generated output.
/// </summary>
public abstract class GeneratorOutputPass
{
public Driver Driver { get; set; }
public virtual void VisitGeneratorOutput(GeneratorOutput output)
{
}
}
} }

19
src/Generator/Passes/PassBuilder.cs

@ -8,36 +8,25 @@ namespace CppSharp
/// This class is used to build passes that will be run against the AST /// This class is used to build passes that will be run against the AST
/// that comes from C++. /// that comes from C++.
/// </summary> /// </summary>
public class PassBuilder public class PassBuilder<T>
{ {
public List<TranslationUnitPass> Passes { get; private set; } public List<T> Passes { get; private set; }
public Driver Driver { get; private set; } public Driver Driver { get; private set; }
public PassBuilder(Driver driver) public PassBuilder(Driver driver)
{ {
Passes = new List<TranslationUnitPass>(); Passes = new List<T>();
Driver = driver; Driver = driver;
} }
/// <summary> /// <summary>
/// Adds a new pass to the builder. /// Adds a new pass to the builder.
/// </summary> /// </summary>
public void AddPass(TranslationUnitPass pass) public void AddPass(T pass)
{ {
pass.Driver = Driver;
pass.Library = Driver.Library;
Passes.Add(pass); Passes.Add(pass);
} }
/// <summary>
/// Runs the passes in the builder.
/// </summary>
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>

10
src/Generator/Passes/RenamePass.cs

@ -242,33 +242,33 @@ namespace CppSharp.Passes
public static class RenamePassExtensions public static class RenamePassExtensions
{ {
public static void RenameWithPattern(this PassBuilder builder, public static void RenameWithPattern(this PassBuilder<TranslationUnitPass> builder,
string pattern, string replacement, RenameTargets targets) string pattern, string replacement, RenameTargets targets)
{ {
builder.AddPass(new RegexRenamePass(pattern, replacement, targets)); builder.AddPass(new RegexRenamePass(pattern, replacement, targets));
} }
public static void RemovePrefix(this PassBuilder builder, string prefix, public static void RemovePrefix(this PassBuilder<TranslationUnitPass> builder, string prefix,
RenameTargets targets = RenameTargets.Any) RenameTargets targets = RenameTargets.Any)
{ {
builder.AddPass(new RegexRenamePass("^" + prefix, string.Empty, builder.AddPass(new RegexRenamePass("^" + prefix, string.Empty,
targets)); targets));
} }
public static void RenameDeclsCase(this PassBuilder builder, public static void RenameDeclsCase(this PassBuilder<TranslationUnitPass> builder,
RenameTargets targets, RenameCasePattern pattern) RenameTargets targets, RenameCasePattern pattern)
{ {
builder.AddPass(new CaseRenamePass(targets, pattern)); builder.AddPass(new CaseRenamePass(targets, pattern));
} }
public static void RenameDeclsUpperCase(this PassBuilder builder, public static void RenameDeclsUpperCase(this PassBuilder<TranslationUnitPass> builder,
RenameTargets targets) RenameTargets targets)
{ {
builder.AddPass(new CaseRenamePass(targets, builder.AddPass(new CaseRenamePass(targets,
RenameCasePattern.UpperCamelCase)); RenameCasePattern.UpperCamelCase));
} }
public static void RenameDeclsLowerCase(this PassBuilder builder, public static void RenameDeclsLowerCase(this PassBuilder<TranslationUnitPass> builder,
RenameTargets targets) RenameTargets targets)
{ {
builder.AddPass(new CaseRenamePass(targets, builder.AddPass(new CaseRenamePass(targets,

9
src/Generator/Passes/ResolveIncompleteDeclsPass.cs

@ -31,13 +31,4 @@ namespace CppSharp.Passes
return base.VisitClassDecl(@class); return base.VisitClassDecl(@class);
} }
} }
public static class ResolveIncompleteDeclsExtensions
{
public static void ResolveIncompleteDecls(this PassBuilder builder)
{
var pass = new ResolveIncompleteDeclsPass();
builder.AddPass(pass);
}
}
} }

9
src/Generator/Passes/SortDeclarationsPass.cs

@ -25,13 +25,4 @@ namespace CppSharp.Passes
return true; return true;
} }
} }
public static class SortDeclarationsExtensions
{
public static void SortDeclarations(this PassBuilder builder)
{
var pass = new SortDeclarationsPass();
builder.AddPass(pass);
}
}
} }

2
src/Generator/Utils/TestsUtils.cs

@ -42,7 +42,7 @@ namespace CppSharp.Utils
{ {
} }
public virtual void SetupPasses(Driver driver, PassBuilder passes) public virtual void SetupPasses(Driver driver)
{ {
} }
} }

Loading…
Cancel
Save