Browse Source

Rework Generator interface and add GenerationOutputMode option.

pull/1511/head
Joao Matos 5 years ago committed by João Matos
parent
commit
11d9f3ba50
  1. 98
      src/Generator/Generator.cs
  2. 7
      src/Generator/Generators/C/CCodeGenerator.cs
  3. 3
      src/Generator/Generators/CodeGenerator.cs
  4. 21
      src/Generator/Options.cs

98
src/Generator/Generator.cs

@ -22,7 +22,7 @@ namespace CppSharp.Generators @@ -22,7 +22,7 @@ namespace CppSharp.Generators
/// <summary>
/// Output generated by each backend generator.
/// </summary>
public struct GeneratorOutput
public class GeneratorOutput
{
/// <summary>
/// Translation unit associated with output.
@ -66,81 +66,103 @@ namespace CppSharp.Generators @@ -66,81 +66,103 @@ namespace CppSharp.Generators
}
/// <summary>
/// Generates the outputs for the given translation units.
/// </summary>
/// <param name="units">The units to generate outputs for.</param>
public abstract List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units);
/// <summary>
/// Generates the outputs.
/// </summary>
public virtual List<GeneratorOutput> Generate()
{
var outputs = new List<GeneratorOutput>();
var outputMode = Context.Options.GenerationOutputMode;
var units = Context.ASTContext.TranslationUnits.GetGenerated().ToList();
// TODO: Remove this once file per module works for C++ backend
if (!Context.Options.IsCSharpGenerator)
outputMode = GenerationOutputMode.FilePerUnit;
var outputs = new List<GeneratorOutput>();
if (Context.Options.IsCSharpGenerator &&
Context.Options.GenerateSingleCSharpFile)
if (outputMode == GenerationOutputMode.FilePerModule)
{
foreach (var module in Context.Options.Modules)
outputs.Add(GenerateModuleTemplate(module));
{
var output = GenerateModule(module);
if (output != null)
{
OnUnitGenerated(output);
outputs.Add(output);
}
}
}
else
{
GenerateTemplates(outputs, units.Where(u => !u.IsSystemHeader));
var units = Context.ASTContext.TranslationUnits.GetGenerated()
.Where(u => !u.IsSystemHeader).ToList();
if (Context.Options.IsCSharpGenerator && Context.Options.SystemModule != null)
outputs.Add(GenerateModuleTemplate(Context.Options.SystemModule));
foreach (var unit in units)
{
var output = GenerateUnit(unit);
if (output != null)
{
outputs.Add(output);
OnUnitGenerated(output);
}
}
if (Context.Options.SystemModule != null)
{
var output = GenerateModule(Context.Options.SystemModule);
if (output != null)
{
OnUnitGenerated(output);
outputs.Add(output);
}
}
}
return outputs;
}
private void GenerateTemplates(List<GeneratorOutput> outputs, IEnumerable<TranslationUnit> units)
public virtual GeneratorOutput GenerateUnit(TranslationUnit unit)
{
foreach (var unit in units)
{
var templates = Generate(new[] { unit });
if (templates.Count == 0)
return;
var codeGenerators = Generate(new[] { unit });
if (codeGenerators.Count == 0)
return null;
foreach (var template in templates)
{
template.Process();
}
var output = new GeneratorOutput
{
TranslationUnit = unit,
Outputs = templates
};
foreach (var codeGen in codeGenerators)
{
codeGen.Process();
}
outputs.Add(output);
var output = new GeneratorOutput
{
TranslationUnit = unit,
Outputs = codeGenerators
};
OnUnitGenerated(output);
}
return output;
}
private GeneratorOutput GenerateModuleTemplate(Module module)
public virtual GeneratorOutput GenerateModule(Module module)
{
var output = new GeneratorOutput
{
TranslationUnit = new TranslationUnit
{
FilePath = $"{module.LibraryName}.cs",
FilePath = $"{module.LibraryName}",
Module = module
},
Outputs = Generate(module.Units.GetGenerated())
};
output.Outputs[0].Process();
OnUnitGenerated(output);
output.Outputs[0].Process();
return output;
}
/// <summary>
/// Generates the outputs for the given translation units.
/// </summary>
/// <param name="units">The units to generate outputs for.</param>
public abstract List<CodeGenerator> Generate(IEnumerable<TranslationUnit> units);
protected abstract string TypePrinterDelegate(CppSharp.AST.Type type);
public static string GeneratedIdentifier(string id) =>

7
src/Generator/Generators/C/CCodeGenerator.cs

@ -35,9 +35,12 @@ namespace CppSharp.Generators.C @@ -35,9 +35,12 @@ namespace CppSharp.Generators.C
typePrinter = new CppTypePrinter(context);
}
public abstract override string FileExtension { get; }
public override string FileExtension { get; } = "h";
public abstract override void Process();
public override void Process()
{
}
public ISet<CInclude> Includes = new HashSet<CInclude>();

3
src/Generator/Generators/CodeGenerator.cs

@ -61,7 +61,8 @@ namespace CppSharp.Generators @@ -61,7 +61,8 @@ namespace CppSharp.Generators
protected CodeGenerator(BindingContext context, IEnumerable<TranslationUnit> units)
{
Context = context;
TranslationUnits = new List<TranslationUnit>(units);
if (units != null)
TranslationUnits = new List<TranslationUnit>(units);
}
public abstract void Process();

21
src/Generator/Options.cs

@ -8,6 +8,12 @@ using CppSharp.Generators; @@ -8,6 +8,12 @@ using CppSharp.Generators;
namespace CppSharp
{
public enum GenerationOutputMode
{
FilePerModule,
FilePerUnit
}
public class DriverOptions
{
public DriverOptions()
@ -137,7 +143,20 @@ namespace CppSharp @@ -137,7 +143,20 @@ namespace CppSharp
/// <summary>
/// Generates a single C# file.
/// </summary>
public bool GenerateSingleCSharpFile { get; set; } = true;
[Obsolete("Use the more general GenerationOutputMode property instead.")]
public bool GenerateSingleCSharpFile
{
get { return GenerationOutputMode == GenerationOutputMode.FilePerModule; }
set
{
GenerationOutputMode = value ? GenerationOutputMode.FilePerModule
: GenerationOutputMode.FilePerUnit;
}
}
public GenerationOutputMode GenerationOutputMode { get; set; } =
GenerationOutputMode.FilePerModule;
/// <summary>
/// Generates default values of arguments in the C# code.

Loading…
Cancel
Save