Browse Source

Exported template specialisations in the native symbols.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/804/head
Dimitar Dobrev 8 years ago
parent
commit
ac83eed80a
  1. 33
      src/Generator/Passes/GenerateSymbolsPass.cs
  2. 6
      src/Generator/Passes/SymbolsCodeGenerator.cs

33
src/Generator/Passes/GenerateSymbolsPass.cs

@ -43,9 +43,16 @@ namespace CppSharp.Passes @@ -43,9 +43,16 @@ namespace CppSharp.Passes
where symbolsCodeGenerators.ContainsKey(module)
select module).ToList();
remainingCompilationTasks = modules.Count;
foreach (var module in modules)
foreach (var module in modules.Where(symbolsCodeGenerators.ContainsKey))
{
var symbolsCodeGenerator = symbolsCodeGenerators[module];
if (specializations.ContainsKey(module))
{
symbolsCodeGenerator.NewLine();
foreach (var specialization in specializations[module])
symbolsCodeGenerator.VisitClassTemplateSpecializationDecl(specialization);
}
var cpp = $"{module.SymbolsLibraryName}.{symbolsCodeGenerator.FileExtension}";
Directory.CreateDirectory(Options.OutputDir);
var path = Path.Combine(Options.OutputDir, cpp);
@ -80,6 +87,28 @@ namespace CppSharp.Passes @@ -80,6 +87,28 @@ namespace CppSharp.Passes
return function.Visit(symbolsCodeGenerator);
}
public override bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
{
if (!base.VisitClassTemplateSpecializationDecl(specialization) ||
specialization.Ignore || specialization.TemplatedDecl.TemplatedClass.Ignore)
return false;
if (specialization is ClassTemplatePartialSpecialization ||
specialization.Arguments.Any(a => a.Type.Type == null ||
CheckIgnoredDeclsPass.IsTypeExternal(
specialization.TranslationUnit.Module, a.Type.Type)))
return false;
List<ClassTemplateSpecialization> list;
if (specializations.ContainsKey(specialization.TranslationUnit.Module))
list = specializations[specialization.TranslationUnit.Module];
else
specializations[specialization.TranslationUnit.Module] =
list = new List<ClassTemplateSpecialization>();
list.Add(specialization);
return true;
}
public class SymbolsCodeEventArgs : EventArgs
{
public SymbolsCodeEventArgs(Module module)
@ -183,5 +212,7 @@ namespace CppSharp.Passes @@ -183,5 +212,7 @@ namespace CppSharp.Passes
private Dictionary<Module, SymbolsCodeGenerator> symbolsCodeGenerators =
new Dictionary<Module, SymbolsCodeGenerator>();
private Dictionary<Module, List<ClassTemplateSpecialization>> specializations =
new Dictionary<Module, List<ClassTemplateSpecialization>>();
}
}

6
src/Generator/Passes/SymbolsCodeGenerator.cs

@ -44,6 +44,12 @@ namespace CppSharp.Passes @@ -44,6 +44,12 @@ namespace CppSharp.Passes
return true;
}
public override bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
{
WriteLine($"template class {specialization.Visit(cppTypePrinter)};");
return true;
}
private string GetWrapper(Module module)
{
var symbolsLibraryName = new StringBuilder(module.SymbolsLibraryName);

Loading…
Cancel
Save