void UpdateExistingLibraries(XDocument docs, HashSet <string> seenLibraries) { foreach (XElement types in docs.Root.Elements("Types")) { XAttribute library = types.Attribute("Library"); HashSet <string> libraryTypes; if (library == null || !libraries.TryGetValue(library.Value, out libraryTypes)) { continue; } seenLibraries.Add(library.Value); var seenTypes = new HashSet <string> (); foreach (XElement type in types.Elements("Type").ToList()) { XAttribute fullName = type.Attribute("FullName"); string typeName = fullName == null ? null : XmlDocUtils.ToEscapedTypeName(fullName.Value); if (typeName == null || !libraryTypes.Contains(typeName)) { continue; } type.Remove(); seenTypes.Add(typeName); types.Add(LoadType(typeName, library.Value)); } foreach (string typeName in libraryTypes.Except(seenTypes)) { types.Add(LoadType(typeName, library.Value)); } } }
static string GetCref(XmlElement member) { string typeName = XmlDocUtils.ToEscapedTypeName(member.SelectSingleNode("/Type/@FullName").InnerText); if (member.Name == "Type") { return("T:" + typeName); } string memberType = member.SelectSingleNode("MemberType").InnerText; switch (memberType) { case "Constructor": return("C:" + typeName + MakeArgs(member)); case "Event": return("E:" + typeName + "." + XmlDocUtils.ToEscapedMemberName(member.GetAttribute("MemberName"))); case "Field": return("F:" + typeName + "." + XmlDocUtils.ToEscapedMemberName(member.GetAttribute("MemberName"))); case "Method": { string name = "M:" + typeName + "." + XmlDocUtils.ToEscapedMemberName(member.GetAttribute("MemberName")) + MakeArgs(member); if (member.GetAttribute("MemberName") == "op_Implicit" || member.GetAttribute("MemberName") == "op_Explicit") { name += "~" + XmlDocUtils.ToTypeName(member.SelectSingleNode("ReturnValue/ReturnType").InnerText, member); } return(name); } case "Property": return("P:" + typeName + "." + XmlDocUtils.ToEscapedMemberName(member.GetAttribute("MemberName")) + MakeArgs(member)); default: throw new NotSupportedException("MemberType '" + memberType + "' is not supported."); } }
private static void Process(string basepath, Dictionary <string, XmlElement> outputfiles, XmlDocument nsSummaries, bool implicitFiles) { if (System.Environment.CurrentDirectory == System.IO.Path.GetFullPath(basepath) && implicitFiles) { Console.WriteLine("Don't run this tool from your documentation directory, since some files could be accidentally overwritten."); return; } XmlDocument index_doc = new XmlDocument(); index_doc.Load(Path.Combine(basepath, "index.xml")); XmlElement index = index_doc.DocumentElement; foreach (XmlElement assmbly in index.SelectNodes("Assemblies/Assembly")) { string assemblyName = assmbly.GetAttribute("Name"); if (outputfiles.ContainsKey(assemblyName)) { continue; } XmlDocument output = new XmlDocument(); XmlElement output_root = output.CreateElement("doc"); output.AppendChild(output_root); XmlElement output_assembly = output.CreateElement("assembly"); output_root.AppendChild(output_assembly); XmlElement output_assembly_name = output.CreateElement("name"); output_assembly.AppendChild(output_assembly_name); output_assembly_name.InnerText = assemblyName; XmlElement members = output.CreateElement("members"); output_root.AppendChild(members); outputfiles.Add(assemblyName, members); } foreach (XmlElement nsnode in index.SelectNodes("Types/Namespace")) { string ns = nsnode.GetAttribute("Name"); foreach (XmlElement typedoc in nsnode.SelectNodes("Type")) { string typename = typedoc.GetAttribute("Name"); XmlDocument type = new XmlDocument(); type.Load(Path.Combine(Path.Combine(basepath, ns), typename) + ".xml"); string assemblyname = type.SelectSingleNode("Type/AssemblyInfo/AssemblyName").InnerText; XmlElement members = outputfiles [assemblyname]; if (members == null) { continue; // assembly is strangely not listed in the index } string typeName = XmlDocUtils.ToEscapedTypeName(type.SelectSingleNode("Type/@FullName").InnerText); CreateMember("T:" + typeName, type.DocumentElement, members); foreach (XmlElement memberdoc in type.SelectNodes("Type/Members/Member")) { string name = typeName; switch (memberdoc.SelectSingleNode("MemberType").InnerText) { case "Constructor": name = "C:" + name + MakeArgs(memberdoc); break; case "Method": name = "M:" + name + "." + XmlDocUtils.ToEscapedMemberName(memberdoc.GetAttribute("MemberName")) + MakeArgs(memberdoc); if (memberdoc.GetAttribute("MemberName") == "op_Implicit" || memberdoc.GetAttribute("MemberName") == "op_Explicit") { name += "~" + XmlDocUtils.ToTypeName(memberdoc.SelectSingleNode("ReturnValue/ReturnType").InnerText, memberdoc); } break; case "Property": name = "P:" + name + "." + XmlDocUtils.ToEscapedMemberName(memberdoc.GetAttribute("MemberName")) + MakeArgs(memberdoc); break; case "Field": name = "F:" + name + "." + XmlDocUtils.ToEscapedMemberName(memberdoc.GetAttribute("MemberName")); break; case "Event": name = "E:" + name + "." + XmlDocUtils.ToEscapedMemberName(memberdoc.GetAttribute("MemberName")); break; } CreateMember(name, memberdoc, members); } } } foreach (XmlElement nsnode in index.SelectNodes("Types/Namespace")) { AddNamespaceSummary(nsSummaries, basepath, nsnode.GetAttribute("Name")); } }