@ -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 ) ;
}
}