-/*\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("&", "&").Replace("{", "<").Replace("}", ">").Replace("<", "<").Replace(">", ">");\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("&", "&").Replace("{", "<").Replace("}", ">").Replace("<", "<").Replace(">", ">");\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