From 1dc5c34662d3f99467cc484c5d886ae8ed52b733 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 14 Jul 2017 02:00:48 +0300 Subject: [PATCH] Removed the useless marking of supported system template specialisations. Signed-off-by: Dimitar Dobrev --- src/Generator/Driver.cs | 4 +- .../Passes/IgnoreSystemDeclarationsPass.cs | 73 +++++++++---------- ...pportedClassTemplateSpecializationsPass.cs | 63 ---------------- 3 files changed, 37 insertions(+), 103 deletions(-) delete mode 100644 src/Generator/Passes/MarkSupportedClassTemplateSpecializationsPass.cs diff --git a/src/Generator/Driver.cs b/src/Generator/Driver.cs index f0ac0688..940ad82f 100644 --- a/src/Generator/Driver.cs +++ b/src/Generator/Driver.cs @@ -280,10 +280,8 @@ namespace CppSharp TranslationUnitPasses.AddPass(new SortDeclarationsPass()); TranslationUnitPasses.AddPass(new ResolveIncompleteDeclsPass()); - if (Options.IsCSharpGenerator) - TranslationUnitPasses.AddPass(new MarkSupportedSpecializationsPass()); - TranslationUnitPasses.AddPass(new IgnoreSystemDeclarationsPass()); TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass()); + TranslationUnitPasses.AddPass(new IgnoreSystemDeclarationsPass()); if (Options.IsCSharpGenerator) { diff --git a/src/Generator/Passes/IgnoreSystemDeclarationsPass.cs b/src/Generator/Passes/IgnoreSystemDeclarationsPass.cs index 78ab597d..8a8866a5 100644 --- a/src/Generator/Passes/IgnoreSystemDeclarationsPass.cs +++ b/src/Generator/Passes/IgnoreSystemDeclarationsPass.cs @@ -9,6 +9,7 @@ namespace CppSharp.Passes public IgnoreSystemDeclarationsPass() { VisitOptions.VisitClassBases = false; + VisitOptions.VisitClassTemplateSpecializations = false; VisitOptions.VisitClassFields = false; VisitOptions.VisitClassMethods = false; VisitOptions.VisitClassProperties = false; @@ -17,6 +18,7 @@ namespace CppSharp.Passes VisitOptions.VisitNamespaceEnums = false; VisitOptions.VisitNamespaceEvents = false; VisitOptions.VisitNamespaceTemplates = false; + VisitOptions.VisitNamespaceTypedefs = false; VisitOptions.VisitTemplateArguments = false; } @@ -44,7 +46,7 @@ namespace CppSharp.Passes if (!@class.IsExplicitlyGenerated) @class.ExplicitlyIgnore(); - if (!@class.IsDependent) + if (!@class.IsDependent || @class.Specializations.Count == 0) return false; // we only need a few members for marshalling so strip the rest @@ -53,54 +55,51 @@ namespace CppSharp.Passes case "basic_string": foreach (var method in @class.Methods.Where(m => !m.IsDestructor && m.OriginalName != "c_str")) 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)); + basicString.GenerationKind = GenerationKind.Generate; + foreach (var method in basicString.Methods) { - foreach (var method in specialization.Methods) + if (method.IsDestructor || method.OriginalName == "c_str" || + (method.IsConstructor && method.Parameters.Count == 2 && + method.Parameters[0].Type.Desugar().IsPointerToPrimitiveType(PrimitiveType.Char) && + !method.Parameters[1].Type.Desugar().IsPrimitiveType())) { - if (method.IsDestructor || method.OriginalName == "c_str" || - (method.IsConstructor && method.Parameters.Count == 2 && - method.Parameters[0].Type.Desugar().IsPointerToPrimitiveType(PrimitiveType.Char) && - !method.Parameters[1].Type.Desugar().IsPrimitiveType())) - { - method.GenerationKind = GenerationKind.Generate; - method.InstantiatedFrom.GenerationKind = GenerationKind.Generate; - method.InstantiatedFrom.Namespace.GenerationKind = GenerationKind.Generate; - } - else - { - method.ExplicitlyIgnore(); - } + method.GenerationKind = GenerationKind.Generate; + method.Namespace.GenerationKind = GenerationKind.Generate; + method.InstantiatedFrom.GenerationKind = GenerationKind.Generate; + method.InstantiatedFrom.Namespace.GenerationKind = GenerationKind.Generate; + } + else + { + method.ExplicitlyIgnore(); } } break; case "allocator": foreach (var method in @class.Methods.Where(m => !m.IsConstructor || m.Parameters.Any())) method.ExplicitlyIgnore(); - foreach (var specialization in @class.Specializations.Where(s => !s.Ignore)) - { - foreach (var method in specialization.Methods.Where(m => !m.IsDestructor && m.OriginalName != "c_str")) - method.ExplicitlyIgnore(); - var ctor = specialization.Methods.Single(m => m.IsConstructor && !m.Parameters.Any()); - ctor.GenerationKind = GenerationKind.Generate; - ctor.InstantiatedFrom.GenerationKind = GenerationKind.Generate; - ctor.InstantiatedFrom.Namespace.GenerationKind = GenerationKind.Generate; - foreach (var parameter in ctor.Parameters) - parameter.DefaultArgument = null; - } + var allocator = @class.Specializations.First(s => + s.Arguments[0].Type.Type.Desugar().IsPrimitiveType(PrimitiveType.Char)); + allocator.GenerationKind = GenerationKind.Generate; + foreach (var method in allocator.Methods.Where(m => !m.IsDestructor && m.OriginalName != "c_str")) + method.ExplicitlyIgnore(); + var ctor = allocator.Methods.Single(m => m.IsConstructor && !m.Parameters.Any()); + ctor.GenerationKind = GenerationKind.Generate; + ctor.InstantiatedFrom.GenerationKind = GenerationKind.Generate; + ctor.InstantiatedFrom.Namespace.GenerationKind = GenerationKind.Generate; + foreach (var parameter in ctor.Parameters) + parameter.DefaultArgument = null; break; case "char_traits": foreach (var method in @class.Methods) method.ExplicitlyIgnore(); - foreach (var specialization in @class.Specializations) - { - foreach (var method in specialization.Methods) - method.ExplicitlyIgnore(); - if (specialization.Arguments[0].Type.Type.IsPrimitiveType(PrimitiveType.Char)) - { - specialization.GenerationKind = GenerationKind.Generate; - specialization.TemplatedDecl.TemplatedDecl.GenerationKind = GenerationKind.Generate; - } - } + var charTraits = @class.Specializations.First(s => + s.Arguments[0].Type.Type.Desugar().IsPrimitiveType(PrimitiveType.Char)); + foreach (var method in charTraits.Methods) + method.ExplicitlyIgnore(); + charTraits.GenerationKind = GenerationKind.Generate; + charTraits.TemplatedDecl.TemplatedDecl.GenerationKind = GenerationKind.Generate; break; } return true; diff --git a/src/Generator/Passes/MarkSupportedClassTemplateSpecializationsPass.cs b/src/Generator/Passes/MarkSupportedClassTemplateSpecializationsPass.cs deleted file mode 100644 index 079d33ef..00000000 --- a/src/Generator/Passes/MarkSupportedClassTemplateSpecializationsPass.cs +++ /dev/null @@ -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" }; - } -}