Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/api-doc-tools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mdoc/Mono.Documentation/Updater/DocumentationMember.cs')
-rw-r--r--mdoc/Mono.Documentation/Updater/DocumentationMember.cs151
1 files changed, 151 insertions, 0 deletions
diff --git a/mdoc/Mono.Documentation/Updater/DocumentationMember.cs b/mdoc/Mono.Documentation/Updater/DocumentationMember.cs
new file mode 100644
index 00000000..c581daeb
--- /dev/null
+++ b/mdoc/Mono.Documentation/Updater/DocumentationMember.cs
@@ -0,0 +1,151 @@
+using System;
+using System.Xml;
+using StringList = System.Collections.Generic.List<string>;
+using StringToStringMap = System.Collections.Generic.Dictionary<string, string>;
+
+namespace Mono.Documentation.Updater
+{
+ class DocumentationMember
+ {
+ public StringToStringMap MemberSignatures = new StringToStringMap ();
+ public string ReturnType;
+ public StringList Parameters;
+ public StringList TypeParameters;
+ public string MemberName;
+ public string MemberType;
+
+ /// <summary>Removes modreq and modopt from ReturnType, Parameters, and TypeParameters</summary>
+ private void CleanTypes ()
+ {
+ ReturnType = MemberFormatter.RemoveMod (ReturnType);
+ MemberType = MemberFormatter.RemoveMod (MemberType);
+
+ if (Parameters != null)
+ {
+ for (var i = 0; i < Parameters.Count; i++)
+ Parameters[i] = MemberFormatter.RemoveMod (Parameters[i]);
+ }
+
+ if (TypeParameters != null)
+ {
+ for (var i = 0; i < TypeParameters.Count; i++)
+ TypeParameters[i] = MemberFormatter.RemoveMod (TypeParameters[i]);
+ }
+ }
+
+ public DocumentationMember (XmlReader reader)
+ {
+ MemberName = reader.GetAttribute ("MemberName");
+ int depth = reader.Depth;
+ bool go = true;
+ StringList p = new StringList ();
+ StringList tp = new StringList ();
+ do
+ {
+ if (reader.NodeType != XmlNodeType.Element)
+ continue;
+
+ bool shouldUse = true;
+ try
+ {
+ string apistyle = reader.GetAttribute ("apistyle");
+ shouldUse = string.IsNullOrWhiteSpace (apistyle) || apistyle == "classic"; // only use this tag if it's an 'classic' style node
+ }
+ catch (Exception ex) { }
+ switch (reader.Name)
+ {
+ case "MemberSignature":
+ if (shouldUse)
+ {
+ MemberSignatures[reader.GetAttribute ("Language")] = reader.GetAttribute ("Value");
+ }
+ break;
+ case "MemberType":
+ MemberType = reader.ReadElementString ();
+ break;
+ case "ReturnType":
+ if (reader.Depth == depth + 2 && shouldUse)
+ ReturnType = reader.ReadElementString ();
+ break;
+ case "Parameter":
+ if (reader.Depth == depth + 2 && shouldUse)
+ p.Add (reader.GetAttribute ("Type"));
+ break;
+ case "TypeParameter":
+ if (reader.Depth == depth + 2 && shouldUse)
+ tp.Add (reader.GetAttribute ("Name"));
+ break;
+ case "Docs":
+ if (reader.Depth == depth + 1)
+ go = false;
+ break;
+ }
+ } while (go && reader.Read () && reader.Depth >= depth);
+ if (p.Count > 0)
+ {
+ Parameters = p;
+ }
+ if (tp.Count > 0)
+ {
+ TypeParameters = tp;
+ }
+ else
+ {
+ DiscernTypeParameters ();
+ }
+
+ CleanTypes ();
+ }
+
+ public DocumentationMember (XmlNode node)
+ {
+ MemberName = node.Attributes["MemberName"].Value;
+ foreach (XmlNode n in node.SelectNodes ("MemberSignature"))
+ {
+ XmlAttribute l = n.Attributes["Language"];
+ XmlAttribute v = n.Attributes["Value"];
+ XmlAttribute apistyle = n.Attributes["apistyle"];
+ bool shouldUse = apistyle == null || apistyle.Value == "classic";
+ if (l != null && v != null && shouldUse)
+ MemberSignatures[l.Value] = v.Value;
+ }
+ MemberType = node.SelectSingleNode ("MemberType").InnerText;
+ XmlNode rt = node.SelectSingleNode ("ReturnValue/ReturnType[not(@apistyle) or @apistyle='classic']");
+ if (rt != null)
+ ReturnType = rt.InnerText;
+ XmlNodeList p = node.SelectNodes ("Parameters/Parameter[not(@apistyle) or @apistyle='classic']");
+ if (p.Count > 0)
+ {
+ Parameters = new StringList (p.Count);
+ for (int i = 0; i < p.Count; ++i)
+ Parameters.Add (p[i].Attributes["Type"].Value);
+ }
+ XmlNodeList tp = node.SelectNodes ("TypeParameters/TypeParameter[not(@apistyle) or @apistyle='classic']");
+ if (tp.Count > 0)
+ {
+ TypeParameters = new StringList (tp.Count);
+ for (int i = 0; i < tp.Count; ++i)
+ TypeParameters.Add (tp[i].Attributes["Name"].Value);
+ }
+ else
+ {
+ DiscernTypeParameters ();
+ }
+
+ CleanTypes ();
+ }
+
+ void DiscernTypeParameters ()
+ {
+ // see if we can discern the param list from the name
+ if (MemberName.Contains ("<") && MemberName.EndsWith (">"))
+ {
+ var starti = MemberName.IndexOf ("<") + 1;
+ var endi = MemberName.LastIndexOf (">");
+ var paramlist = MemberName.Substring (starti, endi - starti);
+ var tparams = paramlist.Split (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
+ TypeParameters = new StringList (tparams);
+ }
+ }
+ }
+} \ No newline at end of file