mirror of https://github.com/mono/CppSharp.git
7 changed files with 50 additions and 142 deletions
@ -1,67 +0,0 @@ |
|||||||
using System.Collections.Generic; |
|
||||||
using System.IO; |
|
||||||
using System.Linq; |
|
||||||
using System.Text; |
|
||||||
using CppSharp.AST; |
|
||||||
|
|
||||||
namespace CppSharp.Passes |
|
||||||
{ |
|
||||||
public class GenerateTemplatesCodePass : TranslationUnitPass |
|
||||||
{ |
|
||||||
public override bool VisitASTContext(ASTContext context) |
|
||||||
{ |
|
||||||
base.VisitASTContext(context); |
|
||||||
WriteTemplateInstantiations(); |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
public override bool VisitClassDecl(Class @class) |
|
||||||
{ |
|
||||||
if (!base.VisitClassDecl(@class) || !@class.IsDependent) |
|
||||||
return false; |
|
||||||
|
|
||||||
var cppTypePrinter = new CppTypePrinter |
|
||||||
{ |
|
||||||
PrintScopeKind = TypePrintScopeKind.Qualified, |
|
||||||
PrintLogicalNames = true |
|
||||||
}; |
|
||||||
foreach (var specialization in @class.Specializations.Where(s => !s.IsDependent && !s.Ignore)) |
|
||||||
{ |
|
||||||
var cppCode = specialization.Visit(cppTypePrinter); |
|
||||||
var module = specialization.TranslationUnit.Module; |
|
||||||
if (templateInstantiations.ContainsKey(module)) |
|
||||||
templateInstantiations[module].Add(cppCode); |
|
||||||
else |
|
||||||
templateInstantiations.Add(module, new HashSet<string> { cppCode }); |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
private void WriteTemplateInstantiations() |
|
||||||
{ |
|
||||||
foreach (var module in Options.Modules.Where(m => templateInstantiations.ContainsKey(m))) |
|
||||||
{ |
|
||||||
var cppBuilder = new StringBuilder(); |
|
||||||
if (module == Options.SystemModule) |
|
||||||
{ |
|
||||||
cppBuilder.Append("#include <string>\n"); |
|
||||||
cppBuilder.Append("#include <vector>\n"); |
|
||||||
cppBuilder.Append("#include <map>\n"); |
|
||||||
cppBuilder.Append("#include <unordered_map>\n"); |
|
||||||
} |
|
||||||
else |
|
||||||
foreach (var header in module.Headers) |
|
||||||
cppBuilder.AppendFormat("#include <{0}>\n", header); |
|
||||||
foreach (var templateInstantiation in templateInstantiations[module]) |
|
||||||
cppBuilder.AppendFormat("\ntemplate class {0}{1};", |
|
||||||
Platform.IsWindows ? "__declspec(dllexport) " : string.Empty, templateInstantiation); |
|
||||||
var cpp = string.Format("{0}.cpp", module.TemplatesLibraryName); |
|
||||||
Directory.CreateDirectory(Options.OutputDir); |
|
||||||
var path = Path.Combine(Options.OutputDir, cpp); |
|
||||||
File.WriteAllText(path, cppBuilder.ToString()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private Dictionary<Module, HashSet<string>> templateInstantiations = new Dictionary<Module, HashSet<string>>(); |
|
||||||
} |
|
||||||
} |
|
||||||
Loading…
Reference in new issue