Browse Source

Extract some generator logic into the driver.

pull/1/head
triton 13 years ago
parent
commit
0be133da70
  1. 30
      src/Generator/Driver.cs
  2. 82
      src/Generator/Generators/Generator.cs

30
src/Generator/Driver.cs

@ -70,8 +70,34 @@ namespace Cxxi
Console.WriteLine("Generating wrapper code..."); Console.WriteLine("Generating wrapper code...");
var gen = new Generator(options, library, transform, typeDatabase); Generator generator = null;
gen.Generate();
switch (Options.GeneratorKind)
{
case LanguageGeneratorKind.CSharp:
generator = new CSharpGenerator(this);
break;
case LanguageGeneratorKind.CPlusPlusCLI:
default:
generator = new CLIGenerator(this);
break;
}
if (!Directory.Exists(Options.OutputDir))
Directory.CreateDirectory(Options.OutputDir);
// Process everything in the global namespace for now.
foreach (var unit in Library.TranslationUnits)
{
if (unit.ExplicityIgnored || !unit.HasDeclarations)
continue;
if (unit.IsSystemHeader)
continue;
// Generate the target code.
generator.Generate(unit);
}
} }
} }

82
src/Generator/Generators/Generator.cs

@ -1,6 +1,4 @@
using Cxxi.Generators.CLI; using Cxxi.Types;
using Cxxi.Types;
using System.IO;
namespace Cxxi.Generators namespace Cxxi.Generators
{ {
@ -10,86 +8,20 @@ namespace Cxxi.Generators
CSharp CSharp
} }
public interface ILanguageGenerator public interface IGenerator
{ {
DriverOptions Options { get; set; }
Library Library { get; set; }
ILibrary Transform { get; set; }
ITypeMapDatabase TypeMapDatabase { get; set; }
Generator Generator { get; set; }
bool Generate(TranslationUnit unit); bool Generate(TranslationUnit unit);
} }
public partial class Generator public abstract class Generator : IGenerator
{
public DriverOptions Options;
public Library Library;
public ILibrary LibraryTransform;
public ITypeMapDatabase TypeMapDatabase;
public Generator(DriverOptions options, Library library, ILibrary libraryTransform,
ITypeMapDatabase typeMapDatabase)
{
this.Options = options;
this.Library = library;
this.LibraryTransform = libraryTransform;
this.TypeMapDatabase = typeMapDatabase;
}
public void Generate()
{
var generator = CreateLanguageGenerator(Options.Template);
if (!Directory.Exists(Options.OutputDir))
Directory.CreateDirectory(Options.OutputDir);
// Process everything in the global namespace for now.
foreach (var module in Library.TranslationUnits)
{
if (module.ExplicityIgnored || !module.HasDeclarations)
continue;
if (module.IsSystemHeader)
continue;
// Generate the target code.
generator.Generate(module);
}
}
ILanguageGenerator CreateLanguageGenerator(LanguageGeneratorKind kind)
{ {
ILanguageGenerator generator = null; public Driver Driver { get; private set; }
switch (kind) protected Generator(Driver driver)
{ {
case LanguageGeneratorKind.CPlusPlusCLI: Driver = driver;
generator = new CLIGenerator(this);
break;
case LanguageGeneratorKind.CSharp:
//generator = new CSharpGenerator();
break;
} }
generator.Options = Options; public abstract bool Generate(TranslationUnit unit);
generator.Library = Library;
generator.Transform = LibraryTransform;
generator.TypeMapDatabase = TypeMapDatabase;
return generator;
}
ILanguageGenerator CreateLanguageGenerator(string kind)
{
switch (kind)
{
default:
case "cli":
return CreateLanguageGenerator(LanguageGeneratorKind.CPlusPlusCLI);
case "cs":
return CreateLanguageGenerator(LanguageGeneratorKind.CSharp);
}
}
} }
} }
Loading…
Cancel
Save