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

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

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

59
src/Generator/Driver.cs

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

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

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

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

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

2
src/Generator/Generators/Generator.cs

@ -49,7 +49,7 @@ namespace CppSharp.Generators @@ -49,7 +49,7 @@ namespace CppSharp.Generators
/// <summary>
/// Setup any generator-specific passes here.
/// </summary>
public abstract bool SetupPasses(PassBuilder builder);
public abstract bool SetupPasses();
/// <summary>
/// Setup any generator-specific processing here.

3
src/Generator/Library.cs

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

10
src/Generator/Passes/CheckAbiParameters.cs

@ -49,14 +49,4 @@ namespace CppSharp.Passes @@ -49,14 +49,4 @@ namespace CppSharp.Passes
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 @@ -137,13 +137,4 @@ namespace CppSharp.Passes
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 @@ -43,13 +43,4 @@ namespace CppSharp.Passes
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 @@ -285,13 +285,4 @@ namespace CppSharp.Passes
#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 @@ -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 @@ -93,14 +93,5 @@ namespace CppSharp.Passes
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 @@ -5,7 +5,6 @@ namespace CppSharp.Passes
public class CleanUnitPass : TranslationUnitPass
{
public DriverOptions DriverOptions;
public PassBuilder Passes;
public CleanUnitPass(DriverOptions options)
{
@ -43,13 +42,4 @@ namespace CppSharp.Passes @@ -43,13 +42,4 @@ namespace CppSharp.Passes
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 @@ -85,13 +85,4 @@ namespace CppSharp.Passes
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 @@ -57,13 +57,4 @@ namespace CppSharp.Passes
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 @@ @@ -1,5 +1,6 @@

using CppSharp.AST;
using CppSharp.Generators;
namespace CppSharp.Passes
{
@ -14,6 +15,7 @@ namespace CppSharp.Passes @@ -14,6 +15,7 @@ namespace CppSharp.Passes
public virtual bool VisitLibrary(Library library)
{
Library = library;
foreach (var unit in library.TranslationUnits)
VisitTranslationUnit(unit);
@ -44,4 +46,17 @@ namespace CppSharp.Passes @@ -44,4 +46,17 @@ namespace CppSharp.Passes
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 @@ -8,36 +8,25 @@ namespace CppSharp
/// This class is used to build passes that will be run against the AST
/// that comes from C++.
/// </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 PassBuilder(Driver driver)
{
Passes = new List<TranslationUnitPass>();
Passes = new List<T>();
Driver = driver;
}
/// <summary>
/// Adds a new pass to the builder.
/// </summary>
public void AddPass(TranslationUnitPass pass)
public void AddPass(T pass)
{
pass.Driver = Driver;
pass.Library = Driver.Library;
Passes.Add(pass);
}
/// <summary>
/// Runs the passes in the builder.
/// </summary>
public void RunPasses()
{
foreach (var pass in Passes)
pass.VisitLibrary(Driver.Library);
}
/// <summary>
/// Finds a previously-added pass of the given type.
/// </summary>

10
src/Generator/Passes/RenamePass.cs

@ -242,33 +242,33 @@ namespace CppSharp.Passes @@ -242,33 +242,33 @@ namespace CppSharp.Passes
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)
{
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)
{
builder.AddPass(new RegexRenamePass("^" + prefix, string.Empty,
targets));
}
public static void RenameDeclsCase(this PassBuilder builder,
public static void RenameDeclsCase(this PassBuilder<TranslationUnitPass> builder,
RenameTargets targets, RenameCasePattern pattern)
{
builder.AddPass(new CaseRenamePass(targets, pattern));
}
public static void RenameDeclsUpperCase(this PassBuilder builder,
public static void RenameDeclsUpperCase(this PassBuilder<TranslationUnitPass> builder,
RenameTargets targets)
{
builder.AddPass(new CaseRenamePass(targets,
RenameCasePattern.UpperCamelCase));
}
public static void RenameDeclsLowerCase(this PassBuilder builder,
public static void RenameDeclsLowerCase(this PassBuilder<TranslationUnitPass> builder,
RenameTargets targets)
{
builder.AddPass(new CaseRenamePass(targets,

9
src/Generator/Passes/ResolveIncompleteDeclsPass.cs

@ -31,13 +31,4 @@ namespace CppSharp.Passes @@ -31,13 +31,4 @@ namespace CppSharp.Passes
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 @@ -25,13 +25,4 @@ namespace CppSharp.Passes
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 @@ -42,7 +42,7 @@ namespace CppSharp.Utils
{
}
public virtual void SetupPasses(Driver driver, PassBuilder passes)
public virtual void SetupPasses(Driver driver)
{
}
}

Loading…
Cancel
Save