|
|
|
@ -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) => |
|
|
|
|