mirror of https://github.com/mono/CppSharp.git
				
				
			
				 3 changed files with 37 additions and 103 deletions
			
			
		@ -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…
					
					
				
		Reference in new issue