Пример #1
0
        public static void CheckTypeForSpecialization(Type type, Declaration container,
                                                      Action <ClassTemplateSpecialization> addSpecialization,
                                                      ITypeMapDatabase typeMaps, bool internalOnly = false)
        {
            type = type.Desugar();
            type = type.GetFinalPointee() ?? type;
            ClassTemplateSpecialization specialization;

            type.TryGetDeclaration(out specialization);
            if (specialization == null || specialization.IsExplicitlyGenerated)
            {
                if (specialization != null)
                {
                    addSpecialization(specialization);
                }
                return;
            }

            TypeMap typeMap;

            typeMaps.FindTypeMap(specialization, out typeMap);

            if ((!internalOnly && (((specialization.Ignore ||
                                     specialization.TemplatedDecl.TemplatedClass.Ignore) && typeMap == null) ||
                                   specialization.Arguments.Any(a => UnsupportedTemplateArgument(
                                                                    specialization, a, typeMaps)))) ||
                specialization.IsIncomplete ||
                (!internalOnly && specialization.TemplatedDecl.TemplatedClass.IsIncomplete) ||
                specialization is ClassTemplatePartialSpecialization ||
                container.Namespace == specialization)
            {
                return;
            }

            while (container.Namespace != null)
            {
                if (container.Namespace == specialization)
                {
                    return;
                }
                container = container.Namespace;
            }

            if (!internalOnly && typeMaps.FindTypeMap(specialization, out typeMap))
            {
                var typePrinterContext = new TypePrinterContext {
                    Type = type
                };
                var mappedTo = typeMap.CSharpSignatureType(typePrinterContext);
                mappedTo = mappedTo.Desugar();
                mappedTo = (mappedTo.GetFinalPointee() ?? mappedTo);
                if (mappedTo.IsPrimitiveType() || mappedTo.IsPointerToPrimitiveType() || mappedTo.IsEnum())
                {
                    return;
                }
            }

            addSpecialization(specialization);
        }
Пример #2
0
        private static ClassTemplateSpecialization GetParentSpecialization(Type type)
        {
            Declaration declaration;

            if (type.TryGetDeclaration(out declaration))
            {
                ClassTemplateSpecialization specialization = null;
                do
                {
                    specialization = declaration as ClassTemplateSpecialization;
                    declaration    = declaration.Namespace;
                } while (declaration != null && specialization == null);
                return(specialization);
            }
            return(null);
        }