Merge pull request #5159 from MaurGi/patch-1
[mono.git] / mcs / class / Mono.C5 / doc / docnet.cs
index 7ca6e48dbcfad5b82ec368fb5b0f3803728bbd3f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,772 +0,0 @@
-/*\r
- Copyright (c) 2003-2006 Niels Kokholm and Peter Sestoft\r
- Permission is hereby granted, free of charge, to any person obtaining a copy\r
- of this software and associated documentation files (the "Software"), to deal\r
- in the Software without restriction, including without limitation the rights\r
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
- copies of the Software, and to permit persons to whom the Software is\r
- furnished to do so, subject to the following conditions:\r
\r
- The above copyright notice and this permission notice shall be included in\r
- all copies or substantial portions of the Software.\r
\r
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
- SOFTWARE.\r
-*/\r
-\r
-// DocNet.cs\r
-// Author: Antonio Cisternino\r
-// Version: 0.1\r
-// Last update: 5/12/2001\r
-// Modified Jan 2004 by kokholm@itu.dk\r
-\r
-using System;\r
-using System.IO;\r
-using System.Reflection;\r
-using System.Xml;\r
-using System.Text;\r
-using System.Diagnostics;\r
-\r
-namespace DocNet\r
-{\r
-  class DocNet\r
-  {\r
-    private Assembly assembly;\r
-\r
-    //private XmlDocument xml;\r
-\r
-    private string defaultNamespace;\r
-\r
-    private string assemblyName;\r
-\r
-    private static C5.HashDictionary<string, string> longtype2short;\r
-\r
-    private static C5.HashDictionary<string, XmlNode> cachedDocComments;\r
-\r
-    static DocNet()\r
-    {\r
-      longtype2short = new C5.HashDictionary<string, string>();\r
-      cachedDocComments = new C5.HashDictionary<string, XmlNode>();\r
-      longtype2short.Add("System.Boolean", "bool");\r
-      longtype2short.Add("System.Byte", "byte");\r
-      longtype2short.Add("System.Int32", "int");\r
-      longtype2short.Add("System.Double", "double");\r
-      longtype2short.Add("System.Void", "void");\r
-      longtype2short.Add("System.Object", "object");\r
-      longtype2short.Add("System.String", "string");\r
-      longtype2short.Add("System.Collections.Generic.IEnumerable{T}", "IEnumerable{T}");\r
-      longtype2short.Add("System.Collections.Generic.IEnumerable{U}", "IEnumerable{U}");\r
-      //longtype2short.Add("", "");\r
-    }\r
-\r
-\r
-    DocNet(string a, string x, string defaultNamespace)\r
-    {\r
-      this.defaultNamespace = defaultNamespace;\r
-      assembly = Assembly.LoadFrom(a, null);\r
-      XmlDocument xml = new XmlDocument();\r
-      xml.Load(x);\r
-      assemblyName = xml.SelectSingleNode("doc/assembly/name").InnerXml;\r
-\r
-      if (!assembly.FullName.StartsWith(assemblyName + ","))\r
-        throw new Exception("Wrong assembly specified!\n>> " + assembly.FullName + "\n>> " + assemblyName);\r
-\r
-      foreach (XmlNode node in xml.SelectNodes("doc/members/member"))\r
-        cachedDocComments.Add(node.SelectNodes("@name").Item(0).Value, node);\r
-    }\r
-\r
-\r
-    private void CopyCodeDoc(XmlElement p, string xpath, XmlDocument ret)\r
-    {\r
-      XmlNode n;\r
-      //xml.SelectSingleNode(xpath);\r
-\r
-      if (cachedDocComments.Find(xpath, out n))\r
-      {\r
-        foreach (XmlNode child in n.ChildNodes)\r
-          p.AppendChild(ret.ImportNode(child, true));\r
-      }\r
-      //else\r
-      //  Console.Error.WriteLine("docNet: {0} not found", xpath);\r
-    }\r
-\r
-    string xmlClean(string s)\r
-    {\r
-//            return s.Replace("&", "&amp;").Replace("{", "&lt;").Replace("}", "&gt;").Replace("<", "&lt;").Replace(">", "&gt;");\r
-      return s.Replace("{", "<").Replace("}", ">");\r
-    }\r
-\r
-    private void AddSignature(XmlElement p, string signtext, XmlDocument ret)\r
-    {\r
-      XmlElement sign = CreateElement(ret, "Signature");\r
-\r
-      try\r
-      {\r
-        sign.InnerXml = signtext.Replace("&", "&amp;").Replace("{", "&lt;").Replace("}", "&gt;").Replace("<", "&lt;").Replace(">", "&gt;");\r
-      }\r
-      catch (XmlException)\r
-      {\r
-        Console.Error.WriteLine(signtext);\r
-      }\r
-      p.AppendChild(sign);\r
-    }\r
-\r
-    private void addImplements(XmlElement p, Type t, XmlDocument ret)\r
-    {\r
-      foreach (Type ty in t.GetInterfaces())\r
-      {\r
-        XmlElement impl = CreateElement(ret, "Implements");\r
-\r
-        if (ty.Assembly == assembly)\r
-        {\r
-          impl.SetAttribute("refid", "T:" + canonicalTypeName(ty, null));\r
-          impl.SetAttribute("C5", "");\r
-        }\r
-        AddSignature(impl, prettyTypeName(ty), ret);\r
-        p.AppendChild(impl);\r
-      }\r
-    }\r
-\r
-    private void addBases(XmlElement p, Type t, XmlDocument ret)\r
-    {\r
-      Type ty = t.BaseType;\r
-\r
-      while (ty != null)\r
-      {\r
-        XmlElement @base = CreateElement(ret, "Bases");\r
-\r
-        if (ty.Assembly == assembly)\r
-        {\r
-          @base.SetAttribute("refid", "T:" + canonicalTypeName(ty, null));\r
-          @base.SetAttribute("C5", "");\r
-        }\r
-\r
-        AddSignature(@base, prettyTypeName(ty), ret);\r
-        p.PrependChild(@base);\r
-        ty = ty.BaseType;\r
-      }\r
-    }\r
-\r
-\r
-\r
-    private XmlElement CreateElement(XmlDocument ret, string name)\r
-    {\r
-      return ret.CreateElement(null, name, null);\r
-    }\r
-\r
-    private void VisitField(bool inherited, FieldInfo f, XmlElement type, XmlDocument refman)\r
-    {\r
-      if (f.Name.Equals("value__"))\r
-        return;\r
-      string refid = "F:" + canonicalTypeName(f.DeclaringType, null) + "." + f.Name;\r
-      //string xpath = "doc/members/member[@name = \"" + refid + "\"]";\r
-      XmlElement el = CreateElement(refman, "Field");\r
-\r
-      el.SetAttribute("Name", f.Name);\r
-      el.SetAttribute("refid", refid);\r
-      el.SetAttribute("Static", f.IsStatic.ToString());\r
-      el.SetAttribute("Declared", xmlClean(prettyTypeName(f.DeclaringType)));\r
-      el.SetAttribute("CDeclared", canonicalTypeName(f.DeclaringType, null));\r
-      el.SetAttribute("Type", xmlClean(prettyTypeName(f.FieldType)));\r
-      el.SetAttribute("Access", f.IsPublic ? "public" : (f.IsPrivate || f.IsAssembly ? "private" : "protected"));\r
-      if (f.DeclaringType.Assembly == assembly)\r
-        el.SetAttribute("C5", "");\r
-\r
-      if (inherited)\r
-        el.SetAttribute("Inherited", "");\r
-\r
-      AddSignature(el, /*prettyTypeName(f.FieldType) + " " +*/ f.Name, refman);\r
-      CopyCodeDoc(el, refid, refman);\r
-      //AddSummary(el, xpath + "/summary", ret, doc);\r
-      type.AppendChild(el);\r
-    }\r
-\r
-    private void VisitEvent(bool inherited, EventInfo e, XmlElement type, XmlDocument ret)\r
-    {\r
-      string refid = "E:" + canonicalTypeName(e.DeclaringType, null) + "." + e.Name;\r
-      //string xpath = "doc/members/member[@name = \"" + refid + "\"]";\r
-      XmlElement el = CreateElement(ret, "Event");\r
-\r
-      el.SetAttribute("Name", e.Name);\r
-      el.SetAttribute("refid", refid);\r
-      //el.SetAttribute("Static", f.IsStatic.ToString());\r
-      //TODO: check virtual and final values on adders/removers\r
-      //el.SetAttribute("Virtual", e..IsVirtual.ToString());\r
-      //el.SetAttribute("Final", e.IsFinal.ToString());\r
-      el.SetAttribute("Declared", xmlClean(prettyTypeName(e.DeclaringType)));\r
-      el.SetAttribute("CDeclared", canonicalTypeName(e.DeclaringType, null));\r
-      el.SetAttribute("Type", xmlClean(prettyTypeName(e.EventHandlerType)));\r
-      MethodInfo addMethod = e.GetAddMethod(true);\r
-      el.SetAttribute("Access", addMethod.IsPublic ? "public" : addMethod.IsFamily ? "protected" : "private");//NBNBNB! e.IsPublic ? "public" : (e.IsPrivate || e.IsAssembly ? "private" : "protected"));\r
-      if (e.DeclaringType.Assembly == assembly)\r
-        el.SetAttribute("C5", "");\r
-\r
-      if (inherited)\r
-        el.SetAttribute("Inherited", "");\r
-\r
-      AddSignature(el, /*prettyTypeName(e.EventHandlerType) + " " +*/ e.Name, ret);\r
-      CopyCodeDoc(el, refid, ret);\r
-      //AddSummary(el, xpath + "/summary", ret, doc);\r
-      type.AppendChild(el);\r
-    }\r
-\r
-\r
-    private void VisitProperty(bool inherited, PropertyInfo p, XmlElement type, XmlDocument ret)\r
-    {\r
-      string refid = "P:" + canonicalPropertyName(p);\r
-      string xpath = "doc/members/member[@name = \"" + refid + "\"]";\r
-      XmlElement el = CreateElement(ret, "Property");\r
-\r
-      el.SetAttribute("Name", p.Name);\r
-      el.SetAttribute("refid", refid);\r
-      el.SetAttribute("Access", "public");//TODO: check if reasonable\r
-      MethodInfo m = p.CanRead ? p.GetGetMethod() : p.GetSetMethod();\r
-      if (m != null)\r
-      {\r
-        el.SetAttribute("Static", m.IsStatic.ToString());\r
-        el.SetAttribute("Abstract", m.IsAbstract.ToString());\r
-        el.SetAttribute("Virtual", m.IsVirtual.ToString());\r
-        el.SetAttribute("Final", m.IsFinal.ToString());\r
-      }\r
-      //else\r
-      //Console.Error.WriteLine("%%%%% {0} | {1}", p, p.DeclaringType);\r
-      el.SetAttribute("Declared", xmlClean(prettyTypeName(p.DeclaringType)));\r
-      el.SetAttribute("CDeclared", canonicalTypeName(p.DeclaringType, null));\r
-      el.SetAttribute("Get", p.CanRead.ToString());\r
-      el.SetAttribute("Set", p.CanWrite.ToString());\r
-      el.SetAttribute("Type", xmlClean(prettyTypeName(p.PropertyType)));\r
-\r
-      if (p.DeclaringType.Assembly == assembly)\r
-        el.SetAttribute("C5", "");\r
-\r
-      if (inherited)\r
-        el.SetAttribute("Inherited", "");\r
-\r
-      if (p.Name.Equals("Item"))\r
-        AddSignature(el, prettyIndexerSignature(p), ret);\r
-      else\r
-        AddSignature(el, /*prettyTypeName(p.PropertyType) + " " +*/ p.Name, ret);\r
-\r
-      //AddSummary(el, xpath + "/summary", ret, doc);\r
-      CopyCodeDoc(el, refid, ret);\r
-      //AddValue(el, xpath + "/value", ret, doc);\r
-      VisitParameters(p.GetIndexParameters(), el, ret, xpath);\r
-      type.AppendChild(el);\r
-    }\r
-\r
-\r
-    private void VisitParameters(ParameterInfo[] pars, XmlElement n, XmlDocument ret, string xpath)\r
-    {\r
-      foreach (ParameterInfo p in pars)\r
-      {\r
-        XmlElement el = CreateElement(ret, "Parameter");\r
-\r
-        el.SetAttribute("Name", p.Name);\r
-        el.SetAttribute("Type", prettyTypeName(p.ParameterType));\r
-        //AddSummary(el, xpath + "/param[@name = \"" + p.Name + "\"]", ret, doc);\r
-        CopyCodeDoc(el, xpath + "/param[@name = \"" + p.Name + "\"]", ret);\r
-\r
-        n.AppendChild(el);\r
-      }\r
-    }\r
-\r
-\r
-    private void VisitConstructor(Type t, ConstructorInfo c, XmlElement type, XmlDocument ret)\r
-    {\r
-      Type declaringType = c.DeclaringType;\r
-      string refid = "M:" + canonicalTypeName(c.DeclaringType, null) + "." + "#ctor";\r
-\r
-      refid += canonicalParameters(c.GetParameters(), new string[]{});\r
-\r
-      string xpath = "doc/members/member[@name = \"" + refid + "\"]";\r
-      XmlElement el = CreateElement(ret, "Constructor");\r
-      el.SetAttribute("Foo", c.IsConstructor ? "Con" : "San");\r
-      el.SetAttribute("refid", refid);\r
-      el.SetAttribute("Declared", prettyTypeName(declaringType));\r
-      el.SetAttribute("CDeclared", canonicalTypeName(declaringType, null));\r
-      el.SetAttribute("Access", c.IsPublic ? "public" : (c.IsPrivate ? "private" : "protected"));\r
-      //el.SetAttribute("Access", c.IsPublic ? "public" : (c.IsPrivate || c.IsAssembly ? "private" : "protected"));\r
-      if (declaringType.Assembly == assembly)\r
-        el.SetAttribute("C5", "");\r
-      if (declaringType != t)\r
-        el.SetAttribute("Inherited", "");\r
-      AddSignature(el, prettyConstructorSignature(c), ret);\r
-      CopyCodeDoc(el, refid, ret);\r
-      //AddSummary(el, xpath + "/summary", ret, doc);\r
-      VisitParameters(c.GetParameters(), el, ret, xpath);\r
-      type.AppendChild(el);\r
-    }\r
-\r
-\r
-    private void VisitMethod(bool inherited, MethodInfo m, XmlElement type, XmlDocument ret)\r
-    {\r
-      if (m.Name.StartsWith("get_") || m.Name.StartsWith("set_") || m.Name.StartsWith("add_") || m.Name.StartsWith("remove_"))\r
-        return;\r
-      bool isOperator = m.Name.StartsWith("op_");\r
-\r
-      string refid = "M:" + canonicalMethodName(m);\r
-\r
-      string xpath = "doc/members/member[@name = \"" + refid + "\"]";\r
-      XmlElement el = CreateElement(ret, isOperator ? "Operator" : "Method");\r
-\r
-      string mangledName = m.Name;\r
-      if (isOperator)\r
-      {\r
-        switch (mangledName)\r
-        {\r
-          case "op_Equality": mangledName = "operator =="; break;\r
-          case "op_Inequality": mangledName = "operator !="; break;\r
-          default: throw new ApplicationException("unknown operatorname, " + mangledName);\r
-        }\r
-      }\r
-      el.SetAttribute("Name", mangledName);\r
-      el.SetAttribute("refid", refid);\r
-      el.SetAttribute("Static", m.IsStatic.ToString());\r
-      el.SetAttribute("Abstract", m.IsAbstract.ToString());\r
-      el.SetAttribute("Virtual", m.IsVirtual.ToString());\r
-      el.SetAttribute("Final", m.IsFinal.ToString());\r
-      el.SetAttribute("Declared", xmlClean(prettyTypeName(m.DeclaringType)));\r
-      el.SetAttribute("CDeclared", canonicalTypeName(m.DeclaringType, null));\r
-      el.SetAttribute("ReturnType", xmlClean(prettyTypeName(m.ReturnType)));\r
-      if (m.DeclaringType.Assembly == assembly)\r
-        el.SetAttribute("C5", "");\r
-      if (inherited)\r
-        el.SetAttribute("Inherited", "");\r
-      el.SetAttribute("Access", m.IsPublic ? "public" : (m.IsPrivate || m.IsAssembly ? "private" : "protected"));\r
-      el.SetAttribute("Sealed", m.IsFinal.ToString());\r
-      AddSignature(el, prettyMethodSignature(mangledName, m), ret);\r
-      CopyCodeDoc(el, refid, ret);\r
-      VisitParameters(m.GetParameters(), el, ret, xpath);\r
-\r
-      foreach (Type gp in m.GetGenericArguments())\r
-        foreach (Type gc in gp.GetGenericParameterConstraints())\r
-          if (gc != typeof(object))\r
-          {\r
-            XmlElement constraint = CreateElement(ret, "constraint");\r
-            constraint.SetAttribute("Value", prettyTypeName(gp) + " : " + xmlClean(prettyTypeName(gc)));\r
-            el.AppendChild(constraint);\r
-          }\r
-      type.AppendChild(el);\r
-    }\r
-\r
-    public XmlDocument GenerateDoc()\r
-    {\r
-      BindingFlags flags = BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic;\r
-\r
-      XmlDocument ret = new XmlDocument();\r
-      XmlElement root = CreateElement(ret, "Assembly");\r
-\r
-      root.SetAttribute("Name", assemblyName);\r
-\r
-      ret.AppendChild(root);\r
-\r
-      XmlElement type = null;\r
-      //string xpath = null;\r
-\r
-      foreach (Type t in assembly.GetTypes())\r
-      {\r
-        if (t.Name.StartsWith("DocNet"))\r
-          continue;\r
-\r
-        if (t.IsInterface)\r
-        {\r
-          type = CreateElement(ret, "Interface");\r
-          foreach (EventInfo e in t.GetEvents(flags))\r
-            VisitEvent(e.DeclaringType != t, e, type, ret);\r
-\r
-          foreach (PropertyInfo p in t.GetProperties(flags))\r
-            VisitProperty(false, p, type, ret);\r
-\r
-          foreach (MethodInfo m in t.GetMethods(flags))\r
-            VisitMethod(false, m, type, ret);\r
-        }\r
-        else if (t.IsValueType)\r
-        {\r
-          type = CreateElement(ret, "Struct");\r
-          foreach (FieldInfo f in t.GetFields(flags))\r
-            VisitField(f.DeclaringType != t, f, type, ret);\r
-\r
-          foreach (EventInfo e in t.GetEvents(flags))\r
-            VisitEvent(e.DeclaringType != t, e, type, ret);\r
-\r
-          foreach (PropertyInfo p in t.GetProperties(flags))\r
-            VisitProperty(p.DeclaringType != t, p, type, ret);\r
-\r
-          foreach (ConstructorInfo c in t.GetConstructors(flags))\r
-            VisitConstructor(t, c, type, ret);\r
-\r
-          foreach (MethodInfo m in t.GetMethods(flags))\r
-            VisitMethod(m.DeclaringType != t, m, type, ret);\r
-        }\r
-        else if (t.IsSubclassOf(typeof(Delegate)))\r
-        {\r
-          type = CreateElement(ret, "Delegate");\r
-          VisitMethod(false, t.GetMethod("Invoke"), type, ret);\r
-        }\r
-        else\r
-        { // Class\r
-          type = CreateElement(ret, "Class");\r
-          foreach (FieldInfo f in t.GetFields(flags))\r
-            VisitField(f.DeclaringType != t, f, type, ret);\r
-\r
-          foreach (EventInfo e in t.GetEvents(flags))\r
-            VisitEvent(e.DeclaringType != t, e, type, ret);\r
-\r
-          foreach (PropertyInfo p in t.GetProperties(flags))\r
-            VisitProperty(p.DeclaringType != t, p, type, ret);\r
-\r
-          foreach (ConstructorInfo c in t.GetConstructors(flags))\r
-            VisitConstructor(t, c, type, ret);\r
-\r
-          foreach (MethodInfo m in t.GetMethods(flags))\r
-            VisitMethod(m.DeclaringType != t, m, type, ret);\r
-        }\r
-\r
-        type.SetAttribute("Name", xmlClean(prettyTypeName(t)));\r
-        type.SetAttribute("Access", t.IsPublic || t.IsNestedPublic ? "public" : t.IsNestedFamily ? "protected" : "private");\r
-\r
-        string refid = "T:" + canonicalTypeName(t, null);\r
-\r
-        type.SetAttribute("refid", refid);\r
-        type.SetAttribute("C5", "");\r
-        AddSignature(type, prettyTypeName(t), ret);\r
-        addImplements(type, t, ret);\r
-        addBases(type, t, ret);\r
-\r
-        foreach (Type gp in t.GetGenericArguments())\r
-        {\r
-          if (gp.GenericParameterAttributes != GenericParameterAttributes.None)\r
-          {\r
-            XmlElement constraint = CreateElement(ret, "constraint");\r
-            string constraintText = null;\r
-            switch (gp.GenericParameterAttributes)\r
-            {\r
-              case GenericParameterAttributes.Contravariant:\r
-                break;\r
-              case GenericParameterAttributes.Covariant:\r
-                break;\r
-              case GenericParameterAttributes.DefaultConstructorConstraint:\r
-                constraintText = "new()";\r
-                break;\r
-              case GenericParameterAttributes.None:\r
-                break;\r
-              case GenericParameterAttributes.ReferenceTypeConstraint:\r
-                constraintText = "class";\r
-                break;\r
-              case GenericParameterAttributes.SpecialConstraintMask:\r
-                break;\r
-              case GenericParameterAttributes.NotNullableValueTypeConstraint:\r
-                constraintText = "struct";\r
-                break;\r
-              case GenericParameterAttributes.VarianceMask:\r
-                break;\r
-            }\r
-            constraint.SetAttribute("Value", String.Format("{0} : {1}", gp, constraintText));\r
-            type.AppendChild(constraint);\r
-          }\r
-          foreach (Type gc in gp.GetGenericParameterConstraints())\r
-          {\r
-            if (gc != typeof(object))\r
-            {\r
-              XmlElement constraint = CreateElement(ret, "constraint");\r
-              constraint.SetAttribute("Value", String.Format("{0} : {1}", prettyTypeName(gp), xmlClean(prettyTypeName(gc))));\r
-              type.AppendChild(constraint);\r
-            }\r
-          }\r
-        }\r
-\r
-        CopyCodeDoc(type, refid, ret);\r
-        root.AppendChild(type);\r
-      }\r
-\r
-      return ret;\r
-    }\r
-\r
-    C5.HashDictionary<Type, string> t2ptn = new C5.HashDictionary<Type, string>();\r
-    private string prettyTypeName(Type t)\r
-    {\r
-      string retval;\r
-      //if (!t2ptn.Find(t, out retval))\r
-      //{\r
-      int consumed = 0;\r
-      retval = prettyTypeName(t, ref consumed);\r
-      //    t2ptn.Add(t, retval);\r
-      //}\r
-      return retval;\r
-    }\r
-\r
-    private string prettyTypeName(Type t, ref int consumed)\r
-    {\r
-      StringBuilder ret = new StringBuilder();\r
-\r
-      if (t.IsGenericParameter)\r
-        ret.Append(t.Name);\r
-      else if (t.IsArray)\r
-        ret.Append(prettyTypeName(t.GetElementType()) + "[]");\r
-      else if (t.IsByRef)\r
-        ret.Append("ref ").Append(prettyTypeName(t.GetElementType()));\r
-      else if (!t.IsGenericType)\r
-        ret.Append(t.IsNested ? prettyTypeName(t.DeclaringType, ref consumed) + "." + t.Name : t.FullName);\r
-      else\r
-      {\r
-        bool first = true;\r
-        StringBuilder gps = new StringBuilder();\r
-        Type[] gp = t.GetGenericArguments();\r
-\r
-        ret.Append(t.IsNested ? prettyTypeName(t.DeclaringType, ref consumed) : t.Namespace).Append(".").Append(t.Name);\r
-        if (consumed < gp.Length)\r
-        {\r
-          //TODO: fix this ugly hack to remove `n \r
-          ret.Remove(ret.Length - 2, 2);\r
-          //ret = ret.Substring(0, ret.Length - 2);\r
-          for (int i = consumed, length = gp.Length; i < length; i++)\r
-          {\r
-            Type ty = gp[i];\r
-\r
-            if (first) first = false;\r
-            else\r
-              gps.Append(",");\r
-\r
-            gps.Append(prettyTypeName(ty));\r
-          }\r
-\r
-          consumed = gp.Length;\r
-          ret.Append("{").Append(gps.ToString()).Append("}");\r
-        }\r
-      }\r
-\r
-      string retval = ret.ToString();\r
-\r
-      if (retval.StartsWith(defaultNamespace + "."))\r
-        retval = retval.Substring(defaultNamespace.Length + 1);\r
-\r
-      if (longtype2short.Contains(retval))\r
-        retval = longtype2short[retval];\r
-\r
-      return retval;\r
-    }\r
-\r
-    private string prettyParameters(ParameterInfo[] pars)\r
-    {\r
-      string ret = "";\r
-      bool first = true;\r
-\r
-      foreach (ParameterInfo p in pars)\r
-      {\r
-        if (first) first = false;\r
-        else\r
-          ret += ", ";\r
-        Type pt = p.ParameterType;\r
-        if (p.IsOut)\r
-        {\r
-          ret += "out ";\r
-          pt = pt.GetElementType();\r
-        }\r
-\r
-        ret += prettyTypeName(pt) + " " + p.Name;\r
-      }\r
-\r
-      return ret;\r
-    }\r
-\r
-    private string prettyMethodSignature(string name, MethodInfo m)\r
-    {\r
-      string gp = "";\r
-      if (m.IsGenericMethod)\r
-      {\r
-        Type[] gps = m.GetGenericArguments();\r
-        gp = "<";\r
-\r
-        for (int i = 0; i < gps.Length; i++)\r
-          gp += (i == 0 ? "" : ",") + gps[i].Name;\r
-\r
-        gp += ">";\r
-      }\r
-\r
-      return name + gp + "(" + prettyParameters(m.GetParameters()) + ")";\r
-    }\r
-\r
-    private string prettyConstructorSignature(ConstructorInfo c)\r
-    {\r
-      Type t = c.DeclaringType;\r
-\r
-      return prettyTypeName(t) + "(" + prettyParameters(c.GetParameters()) + ")";\r
-    }\r
-\r
-    private string prettyIndexerSignature(PropertyInfo p)\r
-    {\r
-      return /*prettyTypeName(p.PropertyType) + " " + */ "this[" + prettyParameters(p.GetIndexParameters()) + "]";\r
-    }\r
-\r
-\r
-    private string simpleTypeName(Type t)\r
-    {\r
-      return (t.IsNested ? simpleTypeName(t.DeclaringType) : t.Namespace) + "." + t.Name;\r
-    }\r
-\r
-\r
-    private string canonicalTypeName(Type t, string[] mgps)\r
-    {\r
-      string ret;\r
-\r
-      if (t.IsGenericParameter)\r
-        ret = "`" + t.GenericParameterPosition;\r
-      else if (t.IsArray)\r
-        ret = canonicalTypeName(t.GetElementType(), mgps) + "[]";\r
-      else if (t.IsByRef)\r
-        ret = canonicalTypeName(t.GetElementType(), mgps) + "@";\r
-      else\r
-      {\r
-        ret = simpleTypeName(t);\r
-        if (!t.IsGenericType)\r
-          ret += "";\r
-        else if (mgps == null)\r
-          ret += "";//"`" + t.GetGenericArguments().Length;\r
-        else\r
-        {\r
-          //TODO: fix this ugly hack to remove `n \r
-          ret = ret.Substring(0, ret.Length - 2);\r
-\r
-          bool first = true;\r
-          string gps = "";\r
-          Type[] gp = t.GetGenericArguments();\r
-\r
-          foreach (Type ty in gp)\r
-          {\r
-            if (first) first = false;\r
-            else\r
-              gps += ",";\r
-\r
-            if (ty.IsGenericParameter)\r
-            {\r
-              bool ismgp = false;\r
-\r
-              foreach (string s in mgps) if (s.Equals(ty.Name)) ismgp = true;\r
-\r
-              gps += (ismgp ? "``" : "`") + ty.GenericParameterPosition;\r
-            }\r
-            else\r
-              gps += canonicalTypeName(ty, mgps);\r
-          }\r
-\r
-          ret += "{" + gps + "}";\r
-        }\r
-      }\r
-\r
-      return ret;\r
-    }\r
-\r
-    private string canonicalMethodName(MethodInfo m)\r
-    {\r
-      string ret = canonicalTypeName(m.DeclaringType, null) + "." + m.Name;\r
-\r
-      string[] gmps;\r
-\r
-      if (m.IsGenericMethod)\r
-      {\r
-        Type[] gps = m.GetGenericArguments();\r
-\r
-        ret += "``" + gps.Length;\r
-        gmps = new string[gps.Length];\r
-        for (int i = 0; i < gps.Length; i++)\r
-          gmps[i] = gps[i].Name;\r
-      }\r
-      else\r
-        gmps = new string[]{};\r
-\r
-      ret += canonicalParameters(m.GetParameters(), gmps);\r
-      return ret;\r
-    }\r
-\r
-    private string canonicalPropertyName(PropertyInfo p)\r
-    {\r
-      string pname = canonicalTypeName(p.DeclaringType, null) + "." + p.Name;\r
-      ParameterInfo[] pars = p.GetIndexParameters();\r
-\r
-      if (pars.Length > 0)\r
-        pname += canonicalParameters(pars, new string[]{});\r
-\r
-      return pname;\r
-    }\r
-\r
-    private string canonicalParameters(ParameterInfo[] pars, string[] gmps)\r
-    {\r
-      if (pars.Length == 0) return "";\r
-\r
-      string ret = "";\r
-      bool first = true;\r
-\r
-      foreach (ParameterInfo p in pars)\r
-      {\r
-        if (first) first = false;\r
-        else\r
-          ret += ",";\r
-\r
-        ret += canonicalTypeName(p.ParameterType, gmps); ;\r
-      }\r
-\r
-      return "(" + ret + ")";\r
-    }\r
-\r
-\r
-\r
-    static void Main(string[] args)\r
-    {\r
-      if (args.Length != 2)\r
-      {\r
-        args = new string[] { @"C5.dll", @"C5.xml" };\r
-\r
-      }\r
-      {\r
-        Timer timer = new Timer();\r
-        timer.snap();\r
-        DocNet doc = new DocNet(args[0], args[1], "C5");\r
-        XmlDocument merged = doc.GenerateDoc();\r
-        Console.Error.WriteLine("Time merge: {0} ms", timer.snap());\r
-\r
-        System.Xml.Xsl.XslCompiledTransform overview = new System.Xml.Xsl.XslCompiledTransform();\r
-        overview.Load(@"overview.xslt");\r
-        overview.Transform(merged, new XmlTextWriter(new StreamWriter(@"docbuild\contents.htm")));\r
-        Console.Error.WriteLine("Time, overview: {0} ms", timer.snap());\r
-\r
-        StringBuilder megaDoc = new StringBuilder();\r
-        using (XmlWriter writer = XmlWriter.Create(megaDoc))\r
-        {\r
-          writer.WriteStartElement("hack");\r
-          System.Xml.Xsl.XslCompiledTransform trans = new System.Xml.Xsl.XslCompiledTransform();\r
-          trans.Load(@"trans.xslt");\r
-          trans.Transform(merged, writer);\r
-          writer.WriteEndElement();\r
-          writer.Close();\r
-        }\r
-        Console.Error.WriteLine("Time trans: {0} ms", timer.snap());\r
-        System.Xml.XPath.XPathDocument megaXml =\r
-          new System.Xml.XPath.XPathDocument(XmlReader.Create(new StringReader(megaDoc.ToString())));\r
-        System.Xml.XPath.XPathNodeIterator nodes = megaXml.CreateNavigator().Select("/hack/*");\r
-        string docfn = null;\r
-        foreach (System.Xml.XPath.XPathNavigator var in nodes)\r
-        {\r
-          if (var.Name == "filestart")\r
-            docfn = var.GetAttribute("name", "");\r
-          if (var.Name == "html")\r
-          {\r
-            Console.Error.Write(".");\r
-            XmlWriter w = new XmlTextWriter(new StreamWriter(@"docbuild\types\" + docfn));\r
-            var.WriteSubtree(w);\r
-            w.Close();\r
-          }\r
-        }\r
-        Console.Error.WriteLine();\r
-        Console.Error.WriteLine("Time split: {0} ms", timer.snap());\r
-      }\r
-      Console.Write("? ");\r
-      Console.Read();\r
-    }\r
-  }\r
-}\r
-\r