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); }
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); }