Browse Source

Ensured symbols for templates instantiating pointers or references.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/621/head
Dimitar Dobrev 10 years ago
parent
commit
4d735b5601
  1. 8
      src/Generator/Driver.cs
  2. 17
      src/Generator/Options.cs
  3. 2
      src/Generator/Passes/GenerateInlinesCodePass.cs
  4. 50
      src/Generator/Passes/GenerateTemplatesCodePass.cs

8
src/Generator/Driver.cs

@ -253,8 +253,12 @@ namespace CppSharp
TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass()); TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass()); TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
if (Options.IsCSharpGenerator && Options.GenerateInlines) if (Options.IsCSharpGenerator)
TranslationUnitPasses.AddPass(new GenerateInlinesCodePass()); {
if (Options.GenerateInlines)
TranslationUnitPasses.AddPass(new GenerateInlinesCodePass());
TranslationUnitPasses.AddPass(new GenerateTemplatesCodePass());
}
library.SetupPasses(this); library.SetupPasses(this);

17
src/Generator/Options.cs

@ -150,7 +150,6 @@ namespace CppSharp
public Encoding Encoding { get; set; } public Encoding Encoding { get; set; }
private string inlinesLibraryName;
public string InlinesLibraryName public string InlinesLibraryName
{ {
get get
@ -164,6 +163,19 @@ namespace CppSharp
set { inlinesLibraryName = value; } set { inlinesLibraryName = value; }
} }
public string TemplatesLibraryName
{
get
{
if (string.IsNullOrEmpty(templatesLibraryName))
{
return string.Format("{0}-templates", OutputNamespace);
}
return templatesLibraryName;
}
set { templatesLibraryName = value; }
}
public bool IsCSharpGenerator public bool IsCSharpGenerator
{ {
get { return GeneratorKind == GeneratorKind.CSharp; } get { return GeneratorKind == GeneratorKind.CSharp; }
@ -193,6 +205,9 @@ namespace CppSharp
/// C# end only: force patching of the virtual entries of the functions in this list. /// C# end only: force patching of the virtual entries of the functions in this list.
/// </summary> /// </summary>
public List<string> ExplicitlyPatchedVirtualFunctions { get; private set; } public List<string> ExplicitlyPatchedVirtualFunctions { get; private set; }
private string inlinesLibraryName;
private string templatesLibraryName;
} }
public class InvalidOptionException : Exception public class InvalidOptionException : Exception

2
src/Generator/Passes/GenerateInlinesCodePass.cs

@ -8,7 +8,6 @@ namespace CppSharp.Passes
{ {
public override bool VisitLibrary(ASTContext context) public override bool VisitLibrary(ASTContext context)
{ {
Directory.CreateDirectory(Driver.Options.OutputDir);
WriteInlinesIncludes(); WriteInlinesIncludes();
return true; return true;
} }
@ -19,6 +18,7 @@ namespace CppSharp.Passes
foreach (var header in Driver.Options.Headers) foreach (var header in Driver.Options.Headers)
cppBuilder.AppendFormat("#include <{0}>\n", header); cppBuilder.AppendFormat("#include <{0}>\n", header);
var cpp = string.Format("{0}.cpp", Driver.Options.InlinesLibraryName); var cpp = string.Format("{0}.cpp", Driver.Options.InlinesLibraryName);
Directory.CreateDirectory(Driver.Options.OutputDir);
var path = Path.Combine(Driver.Options.OutputDir, cpp); var path = Path.Combine(Driver.Options.OutputDir, cpp);
File.WriteAllText(path, cppBuilder.ToString()); File.WriteAllText(path, cppBuilder.ToString());
} }

50
src/Generator/Passes/GenerateTemplatesCodePass.cs

@ -0,0 +1,50 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using CppSharp.AST;
using CppSharp.AST.Extensions;
using CppSharp.Types;
namespace CppSharp.Passes
{
public class GenerateTemplatesCodePass : TranslationUnitPass
{
public override bool VisitLibrary(ASTContext context)
{
base.VisitLibrary(context);
WriteTemplateInstantiations();
return true;
}
public override bool VisitTemplateSpecializationType(TemplateSpecializationType template, TypeQualifiers quals)
{
if (AlreadyVisited(template) || template.Template.Access == AccessSpecifier.Private)
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 };
templateInstantiations.Add(string.Format("{0}<{1}>", template.Template.Name,
string.Join(", ", template.Arguments.Select(a => a.Type.Type.Visit(cppTypePrinter)))));
}
return true;
}
private void WriteTemplateInstantiations()
{
var cppBuilder = new StringBuilder();
foreach (var header in Driver.Options.Headers)
cppBuilder.AppendFormat("#include <{0}>\n", header);
foreach (var templateInstantiation in templateInstantiations)
cppBuilder.AppendFormat("\ntemplate class {0};", templateInstantiation);
var cpp = string.Format("{0}.cpp", Driver.Options.TemplatesLibraryName);
Directory.CreateDirectory(Driver.Options.OutputDir);
var path = Path.Combine(Driver.Options.OutputDir, cpp);
File.WriteAllText(path, cppBuilder.ToString());
}
private HashSet<string> templateInstantiations = new HashSet<string>();
}
}
Loading…
Cancel
Save