X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Ftools%2Fmdoc%2FMono.Documentation%2Fmonodocer.cs;h=0b2dfe252099ede509f5b904cb0e6f5fb3c31d9a;hb=3e6ffdf99fedc90e114b5ed91ae6923a965a5710;hp=9cf59a11bcf6d57471dca5da231f068bfd987237;hpb=b94920854fdab174f9e0b90a7919b19b8fefa256;p=mono.git diff --git a/mcs/tools/mdoc/Mono.Documentation/monodocer.cs b/mcs/tools/mdoc/Mono.Documentation/monodocer.cs index 9cf59a11bcf..0b2dfe25209 100644 --- a/mcs/tools/mdoc/Mono.Documentation/monodocer.cs +++ b/mcs/tools/mdoc/Mono.Documentation/monodocer.cs @@ -133,6 +133,7 @@ class MDocUpdater : MDocCommand List assemblies; readonly DefaultAssemblyResolver assemblyResolver = new DefaultAssemblyResolver(); + bool multiassembly; bool delete; bool show_exceptions; bool no_assembly_versions, ignore_missing_types; @@ -278,6 +279,9 @@ class MDocUpdater : MDocCommand { "preserve", "Do not delete members that don't exist in the assembly, but rather mark them as preserved.", v => PreserveTag = "true" }, + { "multiassembly", + "Allow types to be in multiple assemblies.", + v => multiassembly = true }, }; var assemblies = Parse (p, args, "update", "[OPTIONS]+ ASSEMBLIES", @@ -678,12 +682,6 @@ class MDocUpdater : MDocCommand XmlElement td = StubType(type, output); if (td == null) return null; - - System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo (DocUtils.PathCombine (dest, type.Namespace)); - if (!dir.Exists) { - dir.Create(); - Console.WriteLine("Namespace Directory Created: " + type.Namespace); - } } return reltypefile; } @@ -773,7 +771,13 @@ class MDocUpdater : MDocCommand private void AddIndexAssembly (AssemblyDefinition assembly, XmlElement parent) { - XmlElement index_assembly = parent.OwnerDocument.CreateElement("Assembly"); + XmlElement index_assembly = null; + if (multiassembly) + index_assembly = (XmlElement)parent.SelectSingleNode ("Assembly[@Name='"+ assembly.Name.Name +"']"); + + if (index_assembly == null) + index_assembly = parent.OwnerDocument.CreateElement ("Assembly"); + index_assembly.SetAttribute ("Name", assembly.Name.Name); index_assembly.SetAttribute ("Version", assembly.Name.Version.ToString()); @@ -848,7 +852,8 @@ class MDocUpdater : MDocCommand XmlElement index_types = WriteElement(index.DocumentElement, "Types"); XmlElement index_assemblies = WriteElement(index.DocumentElement, "Assemblies"); - index_assemblies.RemoveAll (); + if (!multiassembly) + index_assemblies.RemoveAll (); HashSet goodfiles = new HashSet (StringComparer.OrdinalIgnoreCase); @@ -1165,6 +1170,16 @@ class MDocUpdater : MDocCommand foreach (DocsNodeInfo info in docEnum.GetDocumentationMembers (basefile, type)) { XmlElement oldmember = info.Node; MemberReference oldmember2 = info.Member; + + if (info.Member != null && info.Node != null) { + // Check for an error condition where the xml MemberName doesn't match the matched member + var memberName = GetMemberName (info.Member); + var memberAttribute = info.Node.Attributes ["MemberName"]; + if (memberAttribute == null || (memberAttribute.Value != memberName && memberAttribute.Value.Split (',').Length != memberName.Split (',').Length)) { + oldmember.SetAttribute ("MemberName", memberName); + } + } + string sig = oldmember2 != null ? memberFormatters [0].GetDeclaration (oldmember2) : null; // Interface implementations and overrides are deleted from the docs @@ -1531,28 +1546,15 @@ class MDocUpdater : MDocCommand type); } - string assemblyInfoNodeFilter = MDocUpdater.HasDroppedNamespace (type) ? "[@apistyle='unified']" : "[not(@apistyle) or @apistyle='classic']"; - - AddXmlNode( - root.SelectNodes ("AssemblyInfo" + assemblyInfoNodeFilter).Cast ().ToArray (), - x => x.SelectSingleNode("AssemblyName").InnerText == type.Module.Assembly.Name.Name, - x => WriteElementText(x, "AssemblyName", type.Module.Assembly.Name.Name), - () => { - XmlElement ass = WriteElement(root, "AssemblyInfo", forceNewElement:true); - - if (MDocUpdater.HasDroppedNamespace (type)) ass.SetAttribute ("apistyle", "unified"); + AddAssemblyNameToNode (root, type); - - - return ass; - }, - type); - - foreach(var ass in root.SelectNodes ("AssemblyInfo" + assemblyInfoNodeFilter).Cast ()) + string assemblyInfoNodeFilter = MDocUpdater.HasDroppedNamespace (type) ? "[@apistyle='unified']" : "[not(@apistyle) or @apistyle='classic']"; + Func assemblyFilter = x => x.SelectSingleNode ("AssemblyName").InnerText == type.Module.Assembly.Name.Name; + foreach(var ass in root.SelectNodes ("AssemblyInfo" + assemblyInfoNodeFilter).Cast ().Where (assemblyFilter)) { WriteElementText(ass, "AssemblyName", type.Module.Assembly.Name.Name); if (!no_assembly_versions) { - UpdateAssemblyVersions (root, type, true); + UpdateAssemblyVersions (ass, type, true); } else { var versions = ass.SelectNodes ("AssemblyVersion").Cast ().ToList (); @@ -1650,6 +1652,33 @@ class MDocUpdater : MDocCommand NormalizeWhitespace(root); } + /// Adds an AssemblyInfo with AssemblyName node to an XmlElement. + /// The assembly that was either added, or was already present + static XmlElement AddAssemblyNameToNode (XmlElement root, TypeDefinition type) + { + return AddAssemblyNameToNode (root, type.Module); + } + + /// Adds an AssemblyInfo with AssemblyName node to an XmlElement. + /// The assembly that was either added, or was already present + static XmlElement AddAssemblyNameToNode (XmlElement root, ModuleDefinition module) + { + Func assemblyFilter = x => { + var existingName = x.SelectSingleNode ("AssemblyName"); + return existingName != null && existingName.InnerText == module.Assembly.Name.Name; + }; + + return AddAssemblyXmlNode ( + root.SelectNodes ("AssemblyInfo").Cast ().ToArray (), + assemblyFilter, x => WriteElementText (x, "AssemblyName", module.Assembly.Name.Name), + () => { + XmlElement ass = WriteElement (root, "AssemblyInfo", forceNewElement: true); + if (MDocUpdater.HasDroppedNamespace (module)) + ass.SetAttribute ("apistyle", "unified"); + return ass; + }, module); + } + static readonly string[] TypeNodeOrder = { "TypeSignature", "MemberOfLibrary", @@ -1705,7 +1734,13 @@ class MDocUpdater : MDocCommand WriteElementText(me, "MemberType", GetMemberType(mi)); if (!no_assembly_versions) { - UpdateAssemblyVersions (me, mi, true); + if (!multiassembly) + UpdateAssemblyVersions (me, mi, true); + else { + var node = AddAssemblyNameToNode (me, mi.Module); + + UpdateAssemblyVersionForAssemblyInfo (node, me, new[] { GetAssemblyVersion (mi.Module.Assembly) }, add: true); + } } else { ClearElement (me, "AssemblyInfo"); @@ -1739,6 +1774,25 @@ class MDocUpdater : MDocCommand AddXmlNode (relevant, valueMatches, setValue, makeNewNode, type.Module); } + static XmlElement AddAssemblyXmlNode (XmlElement[] relevant, Func valueMatches, Action setValue, Func makeNewNode, ModuleDefinition module) + { + bool isUnified = MDocUpdater.HasDroppedNamespace (module); + XmlElement thisAssemblyNode = relevant.FirstOrDefault (valueMatches); + if (thisAssemblyNode == null) { + thisAssemblyNode = makeNewNode (); + setValue (thisAssemblyNode); + } + + if (isUnified) { + thisAssemblyNode.AddApiStyle (ApiStyle.Unified); + + foreach (var otherNodes in relevant.Where (n => n != thisAssemblyNode && n.DoesNotHaveApiStyle (ApiStyle.Unified))) { + otherNodes.AddApiStyle (ApiStyle.Classic); + } + } + return thisAssemblyNode; + } + /// Adds an xml node, reusing the node if it's available /// The existing set of nodes /// Checks to see if the node's value matches what you're trying to write. @@ -2303,7 +2357,13 @@ class MDocUpdater : MDocCommand TypeDefinition type = member as TypeDefinition; if (type == null) type = member.DeclaringType as TypeDefinition; - return UpdateAssemblyVersions(root, type.Module.Assembly, new string[]{ GetAssemblyVersion (type.Module.Assembly) }, add); + + var versions = new string[] { GetAssemblyVersion (type.Module.Assembly) }; + + if (root.LocalName == "AssemblyInfo") + return UpdateAssemblyVersionForAssemblyInfo (root, root.ParentNode as XmlElement, versions, add: true); + else + return UpdateAssemblyVersions (root, type.Module.Assembly, versions, add); } private static string GetAssemblyVersion (AssemblyDefinition assembly) @@ -2342,9 +2402,12 @@ class MDocUpdater : MDocCommand thatNode.SetAttribute ("apistyle", "classic"); } - List matches = e.SelectNodes ("AssemblyVersion").Cast() - .Where(v => Array.IndexOf (assemblyVersions, v.InnerText) >= 0) - .ToList (); + return UpdateAssemblyVersionForAssemblyInfo (e, root, assemblyVersions, add); + } + + static bool UpdateAssemblyVersionForAssemblyInfo (XmlElement e, XmlElement root, string[] assemblyVersions, bool add) + { + List matches = e.SelectNodes ("AssemblyVersion").Cast ().Where (v => Array.IndexOf (assemblyVersions, v.InnerText) >= 0).ToList (); // matches.Count > 0 && add: ignore -- already present if (matches.Count > 0 && !add) { foreach (XmlNode c in matches) @@ -3290,7 +3353,7 @@ class DocumentationEnumerator { string docName = member.MemberName; - string[] docTypeParams = GetTypeParameters (docName); + string[] docTypeParams = GetTypeParameters (docName, member.TypeParameters); // If we're using 'magic types', then we might get false positives ... in those cases, we keep searching MemberReference likelyCandidate = null; @@ -3400,7 +3463,7 @@ class DocumentationEnumerator { return likelyCandidate; } - static string[] GetTypeParameters (string docName) + static string[] GetTypeParameters (string docName, IEnumerable knownParameters) { if (docName [docName.Length-1] != '>') return null; @@ -3417,7 +3480,12 @@ class DocumentationEnumerator { } while (--i >= 0); types.Reverse (); - return types.ToArray (); + var arrayTypes = types.ToArray (); + + if (knownParameters != null && knownParameters.Any () && arrayTypes.Length != knownParameters.Count ()) + return knownParameters.ToArray (); + else + return arrayTypes; } protected static IEnumerable GetReflectionMembers (TypeDefinition type, string docName)