mirror of https://github.com/mono/CppSharp.git
7 changed files with 50 additions and 142 deletions
@ -1,67 +0,0 @@
@@ -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