mirror of https://github.com/mono/CppSharp.git
Browse Source
This is going to be extended by @afesteves in his Google Summer of Code work.pull/499/head
3 changed files with 135 additions and 0 deletions
@ -0,0 +1,122 @@ |
|||||||
|
using System; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.IO; |
||||||
|
using System.Linq; |
||||||
|
using System.Runtime.InteropServices; |
||||||
|
using CppSharp; |
||||||
|
using CppSharp.AST; |
||||||
|
using CppSharp.Generators; |
||||||
|
using CppSharp.Passes; |
||||||
|
using CppSharp.Types; |
||||||
|
using CppAbi = CppSharp.Parser.AST.CppAbi; |
||||||
|
|
||||||
|
namespace CppSharp |
||||||
|
{ |
||||||
|
/// <summary>
|
||||||
|
/// Generates parser bootstrap code.
|
||||||
|
/// </summary>
|
||||||
|
class Bootstrap : ILibrary |
||||||
|
{ |
||||||
|
static string GetSourceDirectory(string dir) |
||||||
|
{ |
||||||
|
var directory = Directory.GetParent(Directory.GetCurrentDirectory()); |
||||||
|
|
||||||
|
while (directory != null) |
||||||
|
{ |
||||||
|
var path = Path.Combine(directory.FullName, dir); |
||||||
|
|
||||||
|
if (Directory.Exists(path) && |
||||||
|
Directory.Exists(Path.Combine(directory.FullName, "patches"))) |
||||||
|
return path; |
||||||
|
|
||||||
|
directory = directory.Parent; |
||||||
|
} |
||||||
|
|
||||||
|
throw new Exception("Could not find build directory: " + dir); |
||||||
|
} |
||||||
|
|
||||||
|
public void Setup(Driver driver) |
||||||
|
{ |
||||||
|
var options = driver.Options; |
||||||
|
options.LibraryName = "CppSharp"; |
||||||
|
options.DryRun = true; |
||||||
|
options.Headers.AddRange(new string[] |
||||||
|
{ |
||||||
|
"clang/AST/Expr.h", |
||||||
|
}); |
||||||
|
options.SetupXcode(); |
||||||
|
options.MicrosoftMode = false; |
||||||
|
options.TargetTriple = "i686-apple-darwin12.4.0"; |
||||||
|
|
||||||
|
options.addDefines ("__STDC_LIMIT_MACROS"); |
||||||
|
options.addDefines ("__STDC_CONSTANT_MACROS"); |
||||||
|
|
||||||
|
var llvmPath = Path.Combine (GetSourceDirectory ("deps"), "llvm"); |
||||||
|
var clangPath = Path.Combine(llvmPath, "tools", "clang"); |
||||||
|
|
||||||
|
options.addIncludeDirs(Path.Combine(llvmPath, "include")); |
||||||
|
options.addIncludeDirs(Path.Combine(llvmPath, "build", "include")); |
||||||
|
options.addIncludeDirs (Path.Combine (llvmPath, "build", "tools", "clang", "include")); |
||||||
|
options.addIncludeDirs(Path.Combine(clangPath, "include")); |
||||||
|
} |
||||||
|
|
||||||
|
public void SetupPasses(Driver driver) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public void Preprocess(Driver driver, ASTContext ctx) |
||||||
|
{ |
||||||
|
ctx.RenameNamespace("CppSharp::CppParser", "Parser"); |
||||||
|
|
||||||
|
var exprClass = ctx.FindCompleteClass ("clang::Expr"); |
||||||
|
|
||||||
|
var exprUnit = ctx.TranslationUnits [0]; |
||||||
|
var subclassVisitor = new SubclassVisitor (exprClass); |
||||||
|
exprUnit.Visit (subclassVisitor); |
||||||
|
|
||||||
|
var subclasses = subclassVisitor.Classes; |
||||||
|
} |
||||||
|
|
||||||
|
public void Postprocess(Driver driver, ASTContext ctx) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
public static void Main(string[] args) |
||||||
|
{ |
||||||
|
Console.WriteLine("Generating parser bootstrap code..."); |
||||||
|
ConsoleDriver.Run(new Bootstrap()); |
||||||
|
Console.WriteLine(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class SubclassVisitor : AstVisitor |
||||||
|
{ |
||||||
|
public HashSet<Class> Classes; |
||||||
|
Class expressionClass; |
||||||
|
|
||||||
|
public SubclassVisitor (Class expression) |
||||||
|
{ |
||||||
|
expressionClass = expression; |
||||||
|
Classes = new HashSet<Class> (); |
||||||
|
} |
||||||
|
|
||||||
|
static bool IsDerivedFrom(Class subclass, Class superclass) |
||||||
|
{ |
||||||
|
if (subclass == null) |
||||||
|
return false; |
||||||
|
|
||||||
|
if (subclass == superclass) |
||||||
|
return true; |
||||||
|
|
||||||
|
return IsDerivedFrom (subclass.BaseClass, superclass); |
||||||
|
} |
||||||
|
|
||||||
|
public override bool VisitClassDecl (Class @class) |
||||||
|
{ |
||||||
|
if (!@class.IsIncomplete && IsDerivedFrom (@class, expressionClass)) |
||||||
|
Classes.Add (@class); |
||||||
|
|
||||||
|
return base.VisitClassDecl (@class); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
project "CppSharp.Parser.Bootstrap" |
||||||
|
|
||||||
|
kind "ConsoleApp" |
||||||
|
language "C#" |
||||||
|
SetupManagedProject() |
||||||
|
debugdir "." |
||||||
|
|
||||||
|
files { "Bootstrap.cs", "*.lua" } |
||||||
|
links { "CppSharp", "CppSharp.AST", "CppSharp.Generator", "System", "System.Core" } |
||||||
|
|
||||||
|
SetupParser() |
||||||
|
|
Loading…
Reference in new issue