// ========================================================================== // This software is subject to the provisions of the Zope Public License, // Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution. // THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED // WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS // FOR A PARTICULAR PURPOSE. // ========================================================================== using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.Collections; using System.Reflection; using System.Security; namespace Python.Runtime { /// /// This class is responsible for efficiently maintaining the bits /// of information we need to support aliases with 'nice names'. /// internal class GenericUtil { static Dictionary>> mapping; private GenericUtil() {} static GenericUtil() { mapping = new Dictionary>>(); } //==================================================================== // Register a generic type that appears in a given namespace. //==================================================================== internal static void Register(Type t) { Dictionary> nsmap = null; //for Anonymous type, there is no namespace if (t.Namespace == null) return; mapping.TryGetValue(t.Namespace, out nsmap); if (nsmap == null) { nsmap = new Dictionary>(); mapping[t.Namespace] = nsmap; } string basename = t.Name; int tick = basename.IndexOf("`"); if (tick > -1) { basename = basename.Substring(0, tick); } List gnames = null; nsmap.TryGetValue(basename, out gnames); if (gnames == null) { gnames = new List(); nsmap[basename] = gnames; } gnames.Add(t.Name); } //==================================================================== // xxx //==================================================================== public static List GetGenericBaseNames(string ns) { Dictionary> nsmap = null; mapping.TryGetValue(ns, out nsmap); if (nsmap == null) { return null; } List names = new List(); foreach (string key in nsmap.Keys) { names.Add(key); } return names; } //==================================================================== // xxx //==================================================================== public static List GenericsForType(Type t) { Dictionary> nsmap = null; mapping.TryGetValue(t.Namespace, out nsmap); if (nsmap == null) { return null; } string basename = t.Name; int tick = basename.IndexOf("`"); if (tick > -1) { basename = basename.Substring(0, tick); } List names = null; nsmap.TryGetValue(basename, out names); if (names == null) { return null; } List result = new List(); foreach (string name in names) { string qname = t.Namespace + "." + name; Type o = AssemblyManager.LookupType(qname); if (o != null) { result.Add(o); } } return result; } //==================================================================== // xxx //==================================================================== public static string GenericNameForBaseName(string ns, string name) { Dictionary> nsmap = null; mapping.TryGetValue(ns, out nsmap); if (nsmap == null) { return null; } List gnames = null; nsmap.TryGetValue(name, out gnames); if (gnames == null) { return null; } if (gnames.Count > 0) { return gnames[0]; } return null; } } }