Browse Source

Cleanup driver code.

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

202
src/Generator/Driver.cs

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