Merge branch 'cecil-light'
[mono.git] / mcs / tools / mdoc / Mono.Documentation / monodocer.cs
index c9144904fa66d32b75d749b67abe61bb195a2d46..35dae5a55d9742fc088ff90b01d375380ec0dd4d 100644 (file)
@@ -1247,9 +1247,32 @@ class MDocUpdater : MDocCommand
                if (!DocUtils.IsDelegate (type))
                        WriteElement (root, "Members");
 
+               OrderTypeNodes (root, root.ChildNodes);
                NormalizeWhitespace(root);
        }
 
+       static readonly string[] TypeNodeOrder = {
+               "TypeSignature",
+               "MemberOfLibrary",
+               "AssemblyInfo",
+               "ThreadingSafetyStatement",
+               "ThreadSafetyStatement",
+               "TypeParameters",
+               "Base",
+               "Interfaces",
+               "Attributes",
+               "Parameters",
+               "ReturnValue",
+               "Docs",
+               "Members",
+               "TypeExcluded",
+       };
+
+       static void OrderTypeNodes (XmlNode member, XmlNodeList children)
+       {
+               ReorderNodes (member, children, TypeNodeOrder);
+       }
+
        internal static IEnumerable<T> Sort<T> (IEnumerable<T> list)
        {
                List<T> l = new List<T> (list);
@@ -1293,9 +1316,51 @@ class MDocUpdater : MDocCommand
                
                info.Node = WriteElement (me, "Docs");
                MakeDocNode (info);
+               OrderMemberNodes (me, me.ChildNodes);
                UpdateExtensionMethods (me, info);
        }
 
+       static readonly string[] MemberNodeOrder = {
+               "MemberSignature",
+               "MemberType",
+               "AssemblyInfo",
+               "Attributes",
+               "ReturnValue",
+               "TypeParameters",
+               "Parameters",
+               "MemberValue",
+               "Docs",
+               "Excluded",
+               "ExcludedLibrary",
+               "Link",
+       };
+
+       static void OrderMemberNodes (XmlNode member, XmlNodeList children)
+       {
+               ReorderNodes (member, children, MemberNodeOrder);
+       }
+
+       static void ReorderNodes (XmlNode node, XmlNodeList children, string[] ordering)
+       {
+               MyXmlNodeList newChildren = new MyXmlNodeList (children.Count);
+               for (int i = 0; i < ordering.Length; ++i) {
+                       for (int j = 0; j < children.Count; ++j) {
+                               XmlNode c = children [j];
+                               if (c.Name == ordering [i]) {
+                                       newChildren.Add (c);
+                               }
+                       }
+               }
+               if (newChildren.Count >= 0)
+                       node.PrependChild ((XmlNode) newChildren [0]);
+               for (int i = 1; i < newChildren.Count; ++i) {
+                       XmlNode prev = (XmlNode) newChildren [i-1];
+                       XmlNode cur  = (XmlNode) newChildren [i];
+                       node.RemoveChild (cur);
+                       node.InsertAfter (cur, prev);
+               }
+       }
+
        IEnumerable<string> GetCustomAttributes (MemberReference mi)
        {
                IEnumerable<string> attrs = Enumerable.Empty<string>();
@@ -1601,23 +1666,7 @@ class MDocUpdater : MDocCommand
 
        private static void OrderDocsNodes (XmlNode docs, XmlNodeList children)
        {
-               MyXmlNodeList newChildren = new MyXmlNodeList (children.Count);
-               for (int i = 0; i < DocsNodeOrder.Length; ++i) {
-                       for (int j = 0; j < children.Count; ++j) {
-                               XmlNode c = children [j];
-                               if (c.Name == DocsNodeOrder [i]) {
-                                       newChildren.Add (c);
-                               }
-                       }
-               }
-               if (newChildren.Count >= 0)
-                       docs.PrependChild ((XmlNode) newChildren [0]);
-               for (int i = 1; i < newChildren.Count; ++i) {
-                       XmlNode prev = (XmlNode) newChildren [i-1];
-                       XmlNode cur  = (XmlNode) newChildren [i];
-                       docs.RemoveChild (cur);
-                       docs.InsertAfter (cur, prev);
-               }
+               ReorderNodes (docs, children, DocsNodeOrder);
        }
        
 
@@ -1842,6 +1891,8 @@ class MDocUpdater : MDocCommand
                "System.Runtime.CompilerServices.UnsafeValueTypeAttribute",
                // extension methods
                "System.Runtime.CompilerServices.ExtensionAttribute",
+               // Used to differentiate 'object' from C#4 'dynamic'
+               "System.Runtime.CompilerServices.DynamicAttribute",
        };
 
        private void MakeAttributes (XmlElement root, IEnumerable<string> attributes)
@@ -4295,6 +4346,21 @@ class CSharpFullMemberFormatter : MemberFormatter {
                return null;
        }
 
+       protected override string GetTypeName (MethodReturnType returnType)
+       {
+               return GetTypeName (returnType, () => returnType.ReturnType);
+       }
+
+       string GetTypeName (ICustomAttributeProvider provider, Func<TypeReference> selector)
+       {
+               string type = GetName (selector ());
+               if (type == "object" && provider.HasCustomAttributes &&
+                               provider.CustomAttributes.Cast<CustomAttribute>()
+                               .Any (ca => ca.Constructor.DeclaringType.FullName == "System.Runtime.CompilerServices.DynamicAttribute"))
+                       return "dynamic";
+               return type;
+       }
+
        protected override StringBuilder AppendMethodName (StringBuilder buf, MethodDefinition method)
        {
                if (DocUtils.IsExplicitlyImplemented (method)) {
@@ -4396,7 +4462,7 @@ class CSharpFullMemberFormatter : MemberFormatter {
                        else
                                buf.Append ("ref ");
                }
-               buf.Append (GetName (parameter.ParameterType)).Append (" ");
+               buf.Append (GetTypeName (parameter, () => parameter.ParameterType)).Append (" ");
                return buf.Append (parameter.Name);
        }