Browse Source

Cleanup driver code.

pull/1713/head
Joao Matos 2 years ago
parent
commit
c32f4b0d78
  1. 202
      src/Generator/Driver.cs

202
src/Generator/Driver.cs

@ -183,27 +183,22 @@ namespace CppSharp @@ -183,27 +183,22 @@ namespace CppSharp
ClangParser.LibraryParsed += OnFileParsed;
foreach (var module in Options.Modules)
{
using (var linkerOptions = new LinkerOptions(Context.LinkerOptions))
using var linkerOptions = new LinkerOptions(Context.LinkerOptions);
foreach (var libraryDir in module.LibraryDirs)
linkerOptions.AddLibraryDirs(libraryDir);
foreach (var library in module.Libraries.Where(library =>
Context.Symbols.Libraries.All(l => l.FileName != library)))
{
foreach (var libraryDir in module.LibraryDirs)
linkerOptions.AddLibraryDirs(libraryDir);
foreach (string library in module.Libraries)
{
if (Context.Symbols.Libraries.Any(l => l.FileName == library))
continue;
linkerOptions.AddLibraries(library);
}
using (var res = ClangParser.ParseLibrary(linkerOptions))
{
if (res.Kind != ParserResultKind.Success)
continue;
for (uint i = 0; i < res.LibrariesCount; i++)
Context.Symbols.Libraries.Add(ClangParser.ConvertLibrary(res.GetLibraries(i)));
}
linkerOptions.AddLibraries(library);
}
using var res = ClangParser.ParseLibrary(linkerOptions);
if (res.Kind != ParserResultKind.Success)
continue;
for (uint i = 0; i < res.LibrariesCount; i++)
Context.Symbols.Libraries.Add(ClangParser.ConvertLibrary(res.GetLibraries(i)));
}
ClangParser.LibraryParsed -= OnFileParsed;
@ -215,99 +210,99 @@ namespace CppSharp @@ -215,99 +210,99 @@ namespace CppSharp
public void SetupPasses(ILibrary library)
{
var TranslationUnitPasses = Context.TranslationUnitPasses;
var passes = Context.TranslationUnitPasses;
TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass());
TranslationUnitPasses.AddPass(new IgnoreSystemDeclarationsPass());
TranslationUnitPasses.AddPass(new MatchParamNamesWithInstantiatedFromPass());
passes.AddPass(new ResolveIncompleteDeclsPass());
passes.AddPass(new IgnoreSystemDeclarationsPass());
passes.AddPass(new MatchParamNamesWithInstantiatedFromPass());
if (Options.IsCSharpGenerator)
TranslationUnitPasses.AddPass(new EqualiseAccessOfOverrideAndBasePass());
passes.AddPass(new EqualiseAccessOfOverrideAndBasePass());
TranslationUnitPasses.AddPass(new FlattenAnonymousTypesToFields());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
TranslationUnitPasses.AddPass(new MarkUsedClassInternalsPass());
passes.AddPass(new FlattenAnonymousTypesToFields());
passes.AddPass(new CheckIgnoredDeclsPass());
passes.AddPass(new MarkUsedClassInternalsPass());
if (Options.IsCSharpGenerator)
{
TranslationUnitPasses.AddPass(new TrimSpecializationsPass());
TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions());
TranslationUnitPasses.AddPass(new GenerateSymbolsPass());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
passes.AddPass(new TrimSpecializationsPass());
passes.AddPass(new CheckAmbiguousFunctions());
passes.AddPass(new GenerateSymbolsPass());
passes.AddPass(new CheckIgnoredDeclsPass());
}
if (Options.IsCLIGenerator || Options.IsCSharpGenerator)
{
TranslationUnitPasses.AddPass(new MoveFunctionToClassPass());
TranslationUnitPasses.AddPass(new ValidateOperatorsPass());
passes.AddPass(new MoveFunctionToClassPass());
passes.AddPass(new ValidateOperatorsPass());
}
library.SetupPasses(this);
TranslationUnitPasses.AddPass(new FindSymbolsPass());
TranslationUnitPasses.AddPass(new CheckMacroPass());
TranslationUnitPasses.AddPass(new CheckStaticClass());
passes.AddPass(new FindSymbolsPass());
passes.AddPass(new CheckMacroPass());
passes.AddPass(new CheckStaticClass());
if (Options.IsCLIGenerator || Options.IsCSharpGenerator || Options.IsCppGenerator)
{
TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions());
passes.AddPass(new CheckAmbiguousFunctions());
}
TranslationUnitPasses.AddPass(new ConstructorToConversionOperatorPass());
TranslationUnitPasses.AddPass(new MarshalPrimitivePointersAsRefTypePass());
passes.AddPass(new ConstructorToConversionOperatorPass());
passes.AddPass(new MarshalPrimitivePointersAsRefTypePass());
if (Options.IsCLIGenerator || Options.IsCSharpGenerator)
{
TranslationUnitPasses.AddPass(new CheckOperatorsOverloadsPass());
passes.AddPass(new CheckOperatorsOverloadsPass());
}
TranslationUnitPasses.AddPass(new CheckVirtualOverrideReturnCovariance());
TranslationUnitPasses.AddPass(new CleanCommentsPass());
passes.AddPass(new CheckVirtualOverrideReturnCovariance());
passes.AddPass(new CleanCommentsPass());
Generator.SetupPasses();
TranslationUnitPasses.AddPass(new CleanInvalidDeclNamesPass());
TranslationUnitPasses.AddPass(new FastDelegateToDelegatesPass());
TranslationUnitPasses.AddPass(new FieldToPropertyPass());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
TranslationUnitPasses.AddPass(new CheckFlagEnumsPass());
TranslationUnitPasses.AddPass(new MakeProtectedNestedTypesPublicPass());
passes.AddPass(new CleanInvalidDeclNamesPass());
passes.AddPass(new FastDelegateToDelegatesPass());
passes.AddPass(new FieldToPropertyPass());
passes.AddPass(new CheckIgnoredDeclsPass());
passes.AddPass(new CheckFlagEnumsPass());
passes.AddPass(new MakeProtectedNestedTypesPublicPass());
if (Options.IsCSharpGenerator)
{
TranslationUnitPasses.AddPass(new GenerateAbstractImplementationsPass());
TranslationUnitPasses.AddPass(new MultipleInheritancePass());
passes.AddPass(new GenerateAbstractImplementationsPass());
passes.AddPass(new MultipleInheritancePass());
}
if (Options.IsCLIGenerator || Options.IsCSharpGenerator)
{
TranslationUnitPasses.AddPass(new DelegatesPass());
passes.AddPass(new DelegatesPass());
}
if (Options.GeneratorKind != GeneratorKind.C)
{
TranslationUnitPasses.AddPass(new GetterSetterToPropertyPass());
passes.AddPass(new GetterSetterToPropertyPass());
}
TranslationUnitPasses.AddPass(new StripUnusedSystemTypesPass());
passes.AddPass(new StripUnusedSystemTypesPass());
if (Options.IsCSharpGenerator)
{
TranslationUnitPasses.AddPass(new SpecializationMethodsWithDependentPointersPass());
TranslationUnitPasses.AddPass(new ParamTypeToInterfacePass());
passes.AddPass(new SpecializationMethodsWithDependentPointersPass());
passes.AddPass(new ParamTypeToInterfacePass());
}
TranslationUnitPasses.AddPass(new CheckDuplicatedNamesPass());
passes.AddPass(new CheckDuplicatedNamesPass());
if (Options.IsCLIGenerator || Options.IsCSharpGenerator)
{
TranslationUnitPasses.RenameDeclsUpperCase(RenameTargets.Any & ~RenameTargets.Parameter);
TranslationUnitPasses.AddPass(new CheckKeywordNamesPass());
passes.RenameDeclsUpperCase(RenameTargets.Any & ~RenameTargets.Parameter);
passes.AddPass(new CheckKeywordNamesPass());
}
Context.TranslationUnitPasses.AddPass(new HandleVariableInitializerPass());
passes.AddPass(new HandleVariableInitializerPass());
TranslationUnitPasses.AddPass(new MarkEventsWithUniqueIdPass());
passes.AddPass(new MarkEventsWithUniqueIdPass());
}
public void ProcessCode()
@ -349,8 +344,7 @@ namespace CppSharp @@ -349,8 +344,7 @@ namespace CppSharp
var file = Path.Combine(outputPath, fileRelativePath);
WriteGeneratedCodeToFile(file, template.Generate());
if (output.TranslationUnit.Module != null)
output.TranslationUnit.Module.CodeFiles.Add(file);
output.TranslationUnit.Module?.CodeFiles.Add(file);
Diagnostics.Message("Generated '{0}'", fileRelativePath);
}
@ -419,67 +413,63 @@ namespace CppSharp @@ -419,67 +413,63 @@ namespace CppSharp
public static void Run(ILibrary library)
{
var options = new DriverOptions();
using (var driver = new Driver(options))
{
library.Setup(driver);
using var driver = new Driver(options);
library.Setup(driver);
driver.Setup();
driver.Setup();
if (driver.Options.Verbose)
Diagnostics.Level = DiagnosticKind.Debug;
if (driver.Options.Verbose)
Diagnostics.Level = DiagnosticKind.Debug;
if (!options.Quiet)
Diagnostics.Message("Parsing libraries...");
if (!options.Quiet)
Diagnostics.Message("Parsing libraries...");
if (!driver.ParseLibraries())
return;
if (!driver.ParseLibraries())
return;
if (!options.Quiet)
Diagnostics.Message("Parsing code...");
if (!options.Quiet)
Diagnostics.Message("Parsing code...");
if (!driver.ParseCode())
{
Diagnostics.Error("CppSharp has encountered an error while parsing code.");
return;
}
if (!driver.ParseCode())
{
Diagnostics.Error("CppSharp has encountered an error while parsing code.");
return;
}
new CleanUnitPass { Context = driver.Context }.VisitASTContext(driver.Context.ASTContext);
options.Modules.RemoveAll(m => m != options.SystemModule && !m.Units.GetGenerated().Any());
new CleanUnitPass { Context = driver.Context }.VisitASTContext(driver.Context.ASTContext);
options.Modules.RemoveAll(m => m != options.SystemModule && !m.Units.GetGenerated().Any());
if (!options.Quiet)
Diagnostics.Message("Processing code...");
if (!options.Quiet)
Diagnostics.Message("Processing code...");
driver.SetupPasses(library);
driver.SetupTypeMaps();
driver.SetupDeclMaps();
driver.SetupPasses(library);
driver.SetupTypeMaps();
driver.SetupDeclMaps();
library.Preprocess(driver, driver.Context.ASTContext);
library.Preprocess(driver, driver.Context.ASTContext);
driver.ProcessCode();
library.Postprocess(driver, driver.Context.ASTContext);
driver.ProcessCode();
library.Postprocess(driver, driver.Context.ASTContext);
if (!options.Quiet)
Diagnostics.Message("Generating code...");
if (!options.Quiet)
Diagnostics.Message("Generating code...");
if (!options.DryRun)
{
var outputs = driver.GenerateCode();
if (options.DryRun)
return;
library.GenerateCode(driver, outputs);
var outputs = driver.GenerateCode();
foreach (var output in outputs)
{
foreach (var pass in driver.Context.GeneratorOutputPasses.Passes)
{
pass.VisitGeneratorOutput(output);
}
}
library.GenerateCode(driver, outputs);
driver.SaveCode(outputs);
if (driver.Options.IsCSharpGenerator && driver.Options.CompileCode)
driver.Options.Modules.Any(m => !driver.CompileCode(m));
}
foreach (var output in outputs)
{
foreach (var pass in driver.Context.GeneratorOutputPasses.Passes)
pass.VisitGeneratorOutput(output);
}
driver.SaveCode(outputs);
if (driver.Options.IsCSharpGenerator && driver.Options.CompileCode)
driver.Options.Modules.Any(m => !driver.CompileCode(m));
}
}
}

Loading…
Cancel
Save