Browse Source

Ensured symbols for exported template specializations on Windows.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/661/head
Dimitar Dobrev 10 years ago
parent
commit
57192c2d9e
  1. 15
      src/Generator/Passes/GenerateTemplatesCodePass.cs

15
src/Generator/Passes/GenerateTemplatesCodePass.cs

@ -3,7 +3,6 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using CppSharp.AST; using CppSharp.AST;
using CppSharp.AST.Extensions;
using CppSharp.Types; using CppSharp.Types;
namespace CppSharp.Passes namespace CppSharp.Passes
@ -17,18 +16,13 @@ namespace CppSharp.Passes
return true; return true;
} }
public override bool VisitTemplateSpecializationType(TemplateSpecializationType template, TypeQualifiers quals) public override bool VisitClassTemplateSpecializationDecl(ClassTemplateSpecialization specialization)
{ {
if (AlreadyVisited(template) || template.Template.Access == AccessSpecifier.Private) if (!specialization.IsDependent)
return false;
if (template.Arguments.Select(a => a.Type.Type.Desugar()).All(t => t.IsAddress() && !t.GetFinalPointee().IsDependent))
{ {
var cppTypePrinter = new CppTypePrinter { PrintScopeKind = CppTypePrintScopeKind.Qualified }; var cppTypePrinter = new CppTypePrinter { PrintScopeKind = CppTypePrintScopeKind.Qualified };
templateInstantiations.Add(string.Format("{0}<{1}>", template.Template.Name, templateInstantiations.Add(specialization.Visit(cppTypePrinter));
string.Join(", ", template.Arguments.Select(a => a.Type.Type.Visit(cppTypePrinter)))));
} }
return true; return true;
} }
@ -40,7 +34,8 @@ namespace CppSharp.Passes
foreach (var header in module.Headers) foreach (var header in module.Headers)
cppBuilder.AppendFormat("#include <{0}>\n", header); cppBuilder.AppendFormat("#include <{0}>\n", header);
foreach (var templateInstantiation in templateInstantiations) foreach (var templateInstantiation in templateInstantiations)
cppBuilder.AppendFormat("\ntemplate class {0};", templateInstantiation); cppBuilder.AppendFormat("\ntemplate class {0}{1};",
Platform.IsWindows ? "__declspec(dllexport) " : string.Empty, templateInstantiation);
var cpp = string.Format("{0}.cpp", module.TemplatesLibraryName); var cpp = string.Format("{0}.cpp", module.TemplatesLibraryName);
Directory.CreateDirectory(Driver.Options.OutputDir); Directory.CreateDirectory(Driver.Options.OutputDir);
var path = Path.Combine(Driver.Options.OutputDir, cpp); var path = Path.Combine(Driver.Options.OutputDir, cpp);

Loading…
Cancel
Save