Browse Source

Removed the useless marking of supported system template specialisations.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/886/head
Dimitar Dobrev 8 years ago
parent
commit
1dc5c34662
  1. 4
      src/Generator/Driver.cs
  2. 37
      src/Generator/Passes/IgnoreSystemDeclarationsPass.cs
  3. 63
      src/Generator/Passes/MarkSupportedClassTemplateSpecializationsPass.cs

4
src/Generator/Driver.cs

@ -280,10 +280,8 @@ namespace CppSharp
TranslationUnitPasses.AddPass(new SortDeclarationsPass()); TranslationUnitPasses.AddPass(new SortDeclarationsPass());
TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass()); TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass());
if (Options.IsCSharpGenerator)
TranslationUnitPasses.AddPass(new MarkSupportedSpecializationsPass());
TranslationUnitPasses.AddPass(new IgnoreSystemDeclarationsPass());
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass()); TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
TranslationUnitPasses.AddPass(new IgnoreSystemDeclarationsPass());
if (Options.IsCSharpGenerator) if (Options.IsCSharpGenerator)
{ {

37
src/Generator/Passes/IgnoreSystemDeclarationsPass.cs

@ -9,6 +9,7 @@ namespace CppSharp.Passes
public IgnoreSystemDeclarationsPass() public IgnoreSystemDeclarationsPass()
{ {
VisitOptions.VisitClassBases = false; VisitOptions.VisitClassBases = false;
VisitOptions.VisitClassTemplateSpecializations = false;
VisitOptions.VisitClassFields = false; VisitOptions.VisitClassFields = false;
VisitOptions.VisitClassMethods = false; VisitOptions.VisitClassMethods = false;
VisitOptions.VisitClassProperties = false; VisitOptions.VisitClassProperties = false;
@ -17,6 +18,7 @@ namespace CppSharp.Passes
VisitOptions.VisitNamespaceEnums = false; VisitOptions.VisitNamespaceEnums = false;
VisitOptions.VisitNamespaceEvents = false; VisitOptions.VisitNamespaceEvents = false;
VisitOptions.VisitNamespaceTemplates = false; VisitOptions.VisitNamespaceTemplates = false;
VisitOptions.VisitNamespaceTypedefs = false;
VisitOptions.VisitTemplateArguments = false; VisitOptions.VisitTemplateArguments = false;
} }
@ -44,7 +46,7 @@ namespace CppSharp.Passes
if (!@class.IsExplicitlyGenerated) if (!@class.IsExplicitlyGenerated)
@class.ExplicitlyIgnore(); @class.ExplicitlyIgnore();
if (!@class.IsDependent) if (!@class.IsDependent || @class.Specializations.Count == 0)
return false; return false;
// we only need a few members for marshalling so strip the rest // we only need a few members for marshalling so strip the rest
@ -53,9 +55,10 @@ namespace CppSharp.Passes
case "basic_string": case "basic_string":
foreach (var method in @class.Methods.Where(m => !m.IsDestructor && m.OriginalName != "c_str")) foreach (var method in @class.Methods.Where(m => !m.IsDestructor && m.OriginalName != "c_str"))
method.ExplicitlyIgnore(); method.ExplicitlyIgnore();
foreach (var specialization in @class.Specializations.Where(s => !s.Ignore)) var basicString = @class.Specializations.First(s =>
{ s.Arguments[0].Type.Type.Desugar().IsPrimitiveType(PrimitiveType.Char));
foreach (var method in specialization.Methods) basicString.GenerationKind = GenerationKind.Generate;
foreach (var method in basicString.Methods)
{ {
if (method.IsDestructor || method.OriginalName == "c_str" || if (method.IsDestructor || method.OriginalName == "c_str" ||
(method.IsConstructor && method.Parameters.Count == 2 && (method.IsConstructor && method.Parameters.Count == 2 &&
@ -63,6 +66,7 @@ namespace CppSharp.Passes
!method.Parameters[1].Type.Desugar().IsPrimitiveType())) !method.Parameters[1].Type.Desugar().IsPrimitiveType()))
{ {
method.GenerationKind = GenerationKind.Generate; method.GenerationKind = GenerationKind.Generate;
method.Namespace.GenerationKind = GenerationKind.Generate;
method.InstantiatedFrom.GenerationKind = GenerationKind.Generate; method.InstantiatedFrom.GenerationKind = GenerationKind.Generate;
method.InstantiatedFrom.Namespace.GenerationKind = GenerationKind.Generate; method.InstantiatedFrom.Namespace.GenerationKind = GenerationKind.Generate;
} }
@ -71,36 +75,31 @@ namespace CppSharp.Passes
method.ExplicitlyIgnore(); method.ExplicitlyIgnore();
} }
} }
}
break; break;
case "allocator": case "allocator":
foreach (var method in @class.Methods.Where(m => !m.IsConstructor || m.Parameters.Any())) foreach (var method in @class.Methods.Where(m => !m.IsConstructor || m.Parameters.Any()))
method.ExplicitlyIgnore(); method.ExplicitlyIgnore();
foreach (var specialization in @class.Specializations.Where(s => !s.Ignore)) var allocator = @class.Specializations.First(s =>
{ s.Arguments[0].Type.Type.Desugar().IsPrimitiveType(PrimitiveType.Char));
foreach (var method in specialization.Methods.Where(m => !m.IsDestructor && m.OriginalName != "c_str")) allocator.GenerationKind = GenerationKind.Generate;
foreach (var method in allocator.Methods.Where(m => !m.IsDestructor && m.OriginalName != "c_str"))
method.ExplicitlyIgnore(); method.ExplicitlyIgnore();
var ctor = specialization.Methods.Single(m => m.IsConstructor && !m.Parameters.Any()); var ctor = allocator.Methods.Single(m => m.IsConstructor && !m.Parameters.Any());
ctor.GenerationKind = GenerationKind.Generate; ctor.GenerationKind = GenerationKind.Generate;
ctor.InstantiatedFrom.GenerationKind = GenerationKind.Generate; ctor.InstantiatedFrom.GenerationKind = GenerationKind.Generate;
ctor.InstantiatedFrom.Namespace.GenerationKind = GenerationKind.Generate; ctor.InstantiatedFrom.Namespace.GenerationKind = GenerationKind.Generate;
foreach (var parameter in ctor.Parameters) foreach (var parameter in ctor.Parameters)
parameter.DefaultArgument = null; parameter.DefaultArgument = null;
}
break; break;
case "char_traits": case "char_traits":
foreach (var method in @class.Methods) foreach (var method in @class.Methods)
method.ExplicitlyIgnore(); method.ExplicitlyIgnore();
foreach (var specialization in @class.Specializations) var charTraits = @class.Specializations.First(s =>
{ s.Arguments[0].Type.Type.Desugar().IsPrimitiveType(PrimitiveType.Char));
foreach (var method in specialization.Methods) foreach (var method in charTraits.Methods)
method.ExplicitlyIgnore(); method.ExplicitlyIgnore();
if (specialization.Arguments[0].Type.Type.IsPrimitiveType(PrimitiveType.Char)) charTraits.GenerationKind = GenerationKind.Generate;
{ charTraits.TemplatedDecl.TemplatedDecl.GenerationKind = GenerationKind.Generate;
specialization.GenerationKind = GenerationKind.Generate;
specialization.TemplatedDecl.TemplatedDecl.GenerationKind = GenerationKind.Generate;
}
}
break; break;
} }
return true; return true;

63
src/Generator/Passes/MarkSupportedClassTemplateSpecializationsPass.cs

@ -1,63 +0,0 @@
using System.Linq;
using CppSharp.AST;
using CppSharp.AST.Extensions;
namespace CppSharp.Passes
{
public class MarkSupportedSpecializationsPass : TranslationUnitPass
{
public override bool VisitClassDecl(Class @class)
{
if (!base.VisitClassDecl(@class) || !@class.IsDependent)
return false;
foreach (var specialization in @class.Specializations)
{
if (IsSupportedStdSpecialization(specialization))
{
MarkForGeneration(specialization);
@class.GenerationKind = GenerationKind.Generate;
}
}
return true;
}
private static bool IsSupportedStdSpecialization(ClassTemplateSpecialization specialization)
{
return IsSupportedStdType(specialization) &&
specialization.Arguments[0].Type.Type.IsPrimitiveType(PrimitiveType.Char);
}
private static bool IsSupportedStdType(Declaration declaration)
{
return declaration.Namespace != null &&
declaration.TranslationUnit.IsSystemHeader &&
IsNameSpaceStd(declaration.Namespace) &&
supportedStdTypes.Contains(declaration.OriginalName);
}
private static bool IsNameSpaceStd(DeclarationContext declarationContext)
{
if (declarationContext == null)
return false;
var @namespace = declarationContext as Namespace;
if (@namespace != null && @namespace.IsInline)
return IsNameSpaceStd(declarationContext.Namespace);
return declarationContext.OriginalName == "std";
}
private static void MarkForGeneration(ClassTemplateSpecialization specialization)
{
specialization.GenerationKind = GenerationKind.Generate;
Declaration declaration = specialization.TemplatedDecl.TemplatedDecl;
while (declaration != null)
{
declaration.GenerationKind = GenerationKind.Generate;
declaration = declaration.Namespace;
}
}
private static string[] supportedStdTypes = { "basic_string", "allocator", "char_traits" };
}
}
Loading…
Cancel
Save