[mdoc] `multiassembly` option for duplicated types
authorJoel Martinez <joelmartinez@gmail.com>
Wed, 7 Oct 2015 21:32:52 +0000 (17:32 -0400)
committerJoel Martinez <joelmartinez@gmail.com>
Tue, 13 Oct 2015 15:25:15 +0000 (11:25 -0400)
The new `multiassembly` option lets you run `mdoc update` on assemblies that
contain the same types. This can come into play when you have a set of assemblies
that run on different platforms, with a slightly differing API surface area on
each platform (for example: tvOS, watchOS, iOS); in this case you can maintain
all of the documentation in a single set of XML documents.

With this option enabled, an `AssemblyInfo` node will be added for every assembly
that a type is found in, in addition to every member. While this may seem verbose,
it's really the only way to capture the information about what assemblies a given
type or member can be found in.

mcs/tools/mdoc/Makefile
mcs/tools/mdoc/Mono.Documentation/monodocer.cs
mcs/tools/mdoc/Test/DocTest-DropNS-classic.cs
mcs/tools/mdoc/Test/DocTest-DropNS-unified.cs
mcs/tools/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/MyClass.xml [new file with mode: 0644]
mcs/tools/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/OnlyInMulti.xml [new file with mode: 0644]
mcs/tools/mdoc/Test/en.expected-dropns-multi/index.xml [new file with mode: 0644]
mcs/tools/mdoc/Test/en.expected-dropns-multi/ns-MyFramework.MyNamespace.xml [new file with mode: 0644]

index 0991269d178ba765710c12989456cfbdaaff90e2..26e6087462d01344c2cbf9b15af0041b16c64cab 100644 (file)
@@ -60,6 +60,9 @@ EXTRA_DISTFILES = \
        $(MDOC_RESOURCES) \
        $(MDOC_TEST_FILES)
 
+MULTI-CLASSIC = Test/DocTest-DropNS-classic.dll Test/DocTest-DropNS-classic-multitest.dll
+MULTI-UNIFIED = Test/DocTest-DropNS-unified.dll Test/DocTest-DropNS-unified-multitest.dll
+
 $(PROGRAM) : $(MDOC_RESOURCES) $(MONODOC_RESOURCES) $(PROGRAM_DEPS)
 
 PROGRAM_COMPILE = $(CSCOMPILE) -platform:x86
@@ -108,6 +111,14 @@ Test/DocTest-DropNS-classic.dll:
 Test/DocTest-DropNS-unified.dll:
        $(CSCOMPILE) $(TEST_CSCFLAGS) -debug -unsafe -target:library -out:$@ Test/DocTest-DropNS-unified.cs
 
+Test/DocTest-DropNS-unified-multitest.dll:
+       rm -f $@
+       $(CSCOMPILE) $(TEST_CSCFLAGS) -debug -unsafe -target:library -out:$@ Test/DocTest-DropNS-unified.cs /define:MULTITEST
+
+Test/DocTest-DropNS-classic-multitest.dll:
+       rm -f $@
+       $(CSCOMPILE) $(TEST_CSCFLAGS) -debug -unsafe -target:library -out:$@ Test/DocTest-DropNS-classic.cs /define:MULTITEST
+
 Test/DocTest-DropNS-unified-deletetest.dll:
        rm -f Test/DocTest-DropNS-unified-deletetest.dll
        $(CSCOMPILE) $(TEST_CSCFLAGS) -debug -unsafe -target:library -out:$@ Test/DocTest-DropNS-unified.cs /define:DELETETEST
@@ -167,6 +178,23 @@ check-monodocer-dropns-classic: $(PROGRAM)
        $(MAKE) update-monodocer-dropns-unified
        diff --exclude=.svn -rup Test/en.expected-dropns-classic-v1 Test/en.actual
 
+check-monodocer-dropns-multi: $(PROGRAM)
+       -rm -Rf Test/en.actual
+       $(MAKE) Test/DocTest-DropNS-classic.dll
+       $(MAKE) Test/DocTest-DropNS-unified.dll
+       $(MAKE) Test/DocTest-DropNS-classic-multitest.dll
+       $(MAKE) Test/DocTest-DropNS-unified-multitest.dll
+
+       # mdoc update for both classic and unified
+       $(MONO) $(PROGRAM) update --exceptions=all -o Test/en.actual $(MULTI-CLASSIC) -multiassembly
+       $(MONO) $(PROGRAM) update --exceptions=all -o Test/en.actual $(MULTI-UNIFIED) --dropns Test/DocTest-DropNS-unified.dll=MyFramework --dropns Test/DocTest-DropNS-unified-multitest.dll=MyFramework -multiassembly
+       
+       # now run it again to verify idempotency
+       $(MONO) $(PROGRAM) update --exceptions=all -o Test/en.actual $(MULTI-CLASSIC) -multiassembly
+       $(MONO) $(PROGRAM) update --exceptions=all -o Test/en.actual $(MULTI-UNIFIED) --dropns Test/DocTest-DropNS-unified.dll=MyFramework --dropns Test/DocTest-DropNS-unified-multitest.dll=MyFramework -multiassembly
+       
+       diff --exclude=.svn -rup Test/en.expected-dropns-multi Test/en.actual
+
 check-monodocer-dropns-delete: $(PROGRAM)
        -rm -Rf Test/en.actual
        rm -Rf Test/DocTest-DropNS-classic-deletetest.dll
@@ -370,7 +398,8 @@ check-doc-tools: check-monodocer-since \
        check-monodocer-dropns-classic-withsecondary \
        check-monodocer-dropns-delete \
        check-monodocer-internal-interface \
-       check-monodocer-enumerations
+       check-monodocer-enumerations \
+       check-monodocer-dropns-multi
 
 check-doc-tools-update: check-monodocer-since-update \
        check-monodocer-importecmadoc-update \
index 7d54a28947b1f8da02de4832e9b490b9df27175a..a1f91f3b24b4cca519b4c71ddf7418b95da45ba5 100644 (file)
@@ -133,6 +133,7 @@ class MDocUpdater : MDocCommand
        List<AssemblyDefinition> 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",
@@ -767,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());
 
@@ -842,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<string> goodfiles = new HashSet<string> (StringComparer.OrdinalIgnoreCase);
@@ -1535,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<XmlElement> ().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<XmlElement> ())
+               string assemblyInfoNodeFilter = MDocUpdater.HasDroppedNamespace (type) ? "[@apistyle='unified']" : "[not(@apistyle) or @apistyle='classic']";
+               Func<XmlElement, bool> assemblyFilter = x => x.SelectSingleNode ("AssemblyName").InnerText == type.Module.Assembly.Name.Name;
+               foreach(var ass in root.SelectNodes ("AssemblyInfo" + assemblyInfoNodeFilter).Cast<XmlElement> ().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<XmlNode> ().ToList ();
@@ -1654,6 +1652,29 @@ class MDocUpdater : MDocCommand
                NormalizeWhitespace(root);
        }
 
+       /// <summary>Adds an AssemblyInfo with AssemblyName node to an XmlElement.</summary>
+       /// <returns>The assembly that was either added, or was already present</returns>
+       static XmlElement AddAssemblyNameToNode (XmlElement root, TypeDefinition type)
+       {
+               return AddAssemblyNameToNode (root, type.Module);
+       }
+
+       /// <summary>Adds an AssemblyInfo with AssemblyName node to an XmlElement.</summary>
+       /// <returns>The assembly that was either added, or was already present</returns>
+       static XmlElement AddAssemblyNameToNode (XmlElement root, ModuleDefinition module)
+       {
+               Func<XmlElement, bool> assemblyFilter = x => x.SelectSingleNode ("AssemblyName").InnerText == module.Assembly.Name.Name;
+               return AddAssemblyXmlNode (
+                       root.SelectNodes ("AssemblyInfo").Cast<XmlElement> ().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",
@@ -1709,7 +1730,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");
@@ -1743,6 +1770,25 @@ class MDocUpdater : MDocCommand
                AddXmlNode (relevant, valueMatches, setValue, makeNewNode, type.Module);
        }
 
+       static XmlElement AddAssemblyXmlNode (XmlElement[] relevant, Func<XmlElement, bool> valueMatches, Action<XmlElement> setValue, Func<XmlElement> 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;
+       }
+
        /// <summary>Adds an xml node, reusing the node if it's available</summary>
        /// <param name="relevant">The existing set of nodes</param>
        /// <param name="valueMatches">Checks to see if the node's value matches what you're trying to write.</param>
@@ -2307,7 +2353,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)
@@ -2346,9 +2398,12 @@ class MDocUpdater : MDocCommand
                        thatNode.SetAttribute ("apistyle", "classic");
                }
 
-               List<XmlNode> matches = e.SelectNodes ("AssemblyVersion").Cast<XmlNode>()
-                       .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<XmlNode> matches = e.SelectNodes ("AssemblyVersion").Cast<XmlNode> ().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)
index 8346834b778364e1413d16713c509c446398b228..13ae56d250c6f4168815b58384123d022b59ddbd 100644 (file)
@@ -25,4 +25,8 @@ namespace MyFramework.MyNamespace {
                public string Name {get;set;}
        }
        #endif
+       #if MULTITEST
+       public class OnlyInMulti {
+       }
+       #endif
 }
index 9b0c364aef3eb084e5079fe50527f893cda0ddf7..0b74be24c580b452801dc431904c8c051a70d5a9 100644 (file)
@@ -30,4 +30,9 @@ namespace MyNamespace {
                public string Name {get;set;}
        }
        #endif
+
+       #if MULTITEST
+       public class OnlyInMulti {
+       }
+       #endif
 }
diff --git a/mcs/tools/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/MyClass.xml b/mcs/tools/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/MyClass.xml
new file mode 100644 (file)
index 0000000..ee42976
--- /dev/null
@@ -0,0 +1,118 @@
+<Type Name="MyClass" FullName="MyFramework.MyNamespace.MyClass">
+  <TypeSignature Language="C#" Value="public class MyClass" />
+  <TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit MyClass extends System.Object" />
+  <AssemblyInfo apistyle="classic">
+    <AssemblyName>DocTest-DropNS-classic</AssemblyName>
+    <AssemblyVersion>0.0.0.0</AssemblyVersion>
+  </AssemblyInfo>
+  <AssemblyInfo apistyle="classic">
+    <AssemblyName>DocTest-DropNS-classic-multitest</AssemblyName>
+    <AssemblyVersion>0.0.0.0</AssemblyVersion>
+  </AssemblyInfo>
+  <AssemblyInfo apistyle="unified">
+    <AssemblyName>DocTest-DropNS-unified</AssemblyName>
+    <AssemblyVersion>0.0.0.0</AssemblyVersion>
+  </AssemblyInfo>
+  <AssemblyInfo apistyle="unified">
+    <AssemblyName>DocTest-DropNS-unified-multitest</AssemblyName>
+    <AssemblyVersion>0.0.0.0</AssemblyVersion>
+  </AssemblyInfo>
+  <Base>
+    <BaseTypeName>System.Object</BaseTypeName>
+  </Base>
+  <Interfaces />
+  <Docs>
+    <summary>To be added.</summary>
+    <remarks>To be added.</remarks>
+  </Docs>
+  <Members>
+    <Member MemberName=".ctor">
+      <MemberSignature Language="C#" Value="public MyClass ();" />
+      <MemberSignature Language="ILAsm" Value=".method public hidebysig specialname rtspecialname instance void .ctor() cil managed" />
+      <MemberType>Constructor</MemberType>
+      <AssemblyInfo apistyle="classic">
+        <AssemblyName>DocTest-DropNS-classic</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="classic">
+        <AssemblyName>DocTest-DropNS-classic-multitest</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="unified">
+        <AssemblyName>DocTest-DropNS-unified</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="unified">
+        <AssemblyName>DocTest-DropNS-unified-multitest</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <Parameters />
+      <Docs>
+        <summary>To be added.</summary>
+        <remarks>To be added.</remarks>
+      </Docs>
+    </Member>
+    <Member MemberName="Hello">
+      <MemberSignature Language="C#" Value="public float Hello (int value);" />
+      <MemberSignature Language="ILAsm" Value=".method public hidebysig instance float32 Hello(int32 value) cil managed" />
+      <MemberType>Method</MemberType>
+      <AssemblyInfo apistyle="classic">
+        <AssemblyName>DocTest-DropNS-classic</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="classic">
+        <AssemblyName>DocTest-DropNS-classic-multitest</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="unified">
+        <AssemblyName>DocTest-DropNS-unified</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="unified">
+        <AssemblyName>DocTest-DropNS-unified-multitest</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <ReturnValue>
+        <ReturnType>System.Single</ReturnType>
+      </ReturnValue>
+      <Parameters>
+        <Parameter Name="value" Type="System.Int32" />
+      </Parameters>
+      <Docs>
+        <param name="value">To be added.</param>
+        <summary>To be added.</summary>
+        <returns>To be added.</returns>
+        <remarks>To be added.</remarks>
+      </Docs>
+    </Member>
+    <Member MemberName="MyProperty">
+      <MemberSignature Language="C#" Value="public string MyProperty { get; set; }" />
+      <MemberSignature Language="ILAsm" Value=".property instance string MyProperty" />
+      <MemberType>Property</MemberType>
+      <AssemblyInfo apistyle="classic">
+        <AssemblyName>DocTest-DropNS-classic</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="classic">
+        <AssemblyName>DocTest-DropNS-classic-multitest</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="unified">
+        <AssemblyName>DocTest-DropNS-unified</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="unified">
+        <AssemblyName>DocTest-DropNS-unified-multitest</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <ReturnValue>
+        <ReturnType>System.String</ReturnType>
+      </ReturnValue>
+      <Docs>
+        <summary>To be added.</summary>
+        <value>To be added.</value>
+        <remarks>To be added.</remarks>
+      </Docs>
+    </Member>
+  </Members>
+</Type>
diff --git a/mcs/tools/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/OnlyInMulti.xml b/mcs/tools/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/OnlyInMulti.xml
new file mode 100644 (file)
index 0000000..dbcf130
--- /dev/null
@@ -0,0 +1,40 @@
+<Type Name="OnlyInMulti" FullName="MyFramework.MyNamespace.OnlyInMulti">
+  <TypeSignature Language="C#" Value="public class OnlyInMulti" />
+  <TypeSignature Language="ILAsm" Value=".class public auto ansi beforefieldinit OnlyInMulti extends System.Object" />
+  <AssemblyInfo apistyle="classic">
+    <AssemblyName>DocTest-DropNS-classic-multitest</AssemblyName>
+    <AssemblyVersion>0.0.0.0</AssemblyVersion>
+  </AssemblyInfo>
+  <AssemblyInfo apistyle="unified">
+    <AssemblyName>DocTest-DropNS-unified-multitest</AssemblyName>
+    <AssemblyVersion>0.0.0.0</AssemblyVersion>
+  </AssemblyInfo>
+  <Base>
+    <BaseTypeName>System.Object</BaseTypeName>
+  </Base>
+  <Interfaces />
+  <Docs>
+    <summary>To be added.</summary>
+    <remarks>To be added.</remarks>
+  </Docs>
+  <Members>
+    <Member MemberName=".ctor">
+      <MemberSignature Language="C#" Value="public OnlyInMulti ();" />
+      <MemberSignature Language="ILAsm" Value=".method public hidebysig specialname rtspecialname instance void .ctor() cil managed" />
+      <MemberType>Constructor</MemberType>
+      <AssemblyInfo apistyle="classic">
+        <AssemblyName>DocTest-DropNS-classic-multitest</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <AssemblyInfo apistyle="unified">
+        <AssemblyName>DocTest-DropNS-unified-multitest</AssemblyName>
+        <AssemblyVersion>0.0.0.0</AssemblyVersion>
+      </AssemblyInfo>
+      <Parameters />
+      <Docs>
+        <summary>To be added.</summary>
+        <remarks>To be added.</remarks>
+      </Docs>
+    </Member>
+  </Members>
+</Type>
diff --git a/mcs/tools/mdoc/Test/en.expected-dropns-multi/index.xml b/mcs/tools/mdoc/Test/en.expected-dropns-multi/index.xml
new file mode 100644 (file)
index 0000000..3baf401
--- /dev/null
@@ -0,0 +1,53 @@
+<Overview>
+  <Assemblies>
+    <Assembly Name="DocTest-DropNS-classic" Version="0.0.0.0">
+      <Attributes>
+        <Attribute>
+          <AttributeName>System.Diagnostics.Debuggable(System.Diagnostics.DebuggableAttribute+DebuggingModes.IgnoreSymbolStoreSequencePoints)</AttributeName>
+        </Attribute>
+        <Attribute>
+          <AttributeName>System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows=true)</AttributeName>
+        </Attribute>
+      </Attributes>
+    </Assembly>
+    <Assembly Name="DocTest-DropNS-classic-multitest" Version="0.0.0.0">
+      <Attributes>
+        <Attribute>
+          <AttributeName>System.Diagnostics.Debuggable(System.Diagnostics.DebuggableAttribute+DebuggingModes.IgnoreSymbolStoreSequencePoints)</AttributeName>
+        </Attribute>
+        <Attribute>
+          <AttributeName>System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows=true)</AttributeName>
+        </Attribute>
+      </Attributes>
+    </Assembly>
+    <Assembly Name="DocTest-DropNS-unified" Version="0.0.0.0">
+      <Attributes>
+        <Attribute>
+          <AttributeName>System.Diagnostics.Debuggable(System.Diagnostics.DebuggableAttribute+DebuggingModes.IgnoreSymbolStoreSequencePoints)</AttributeName>
+        </Attribute>
+        <Attribute>
+          <AttributeName>System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows=true)</AttributeName>
+        </Attribute>
+      </Attributes>
+    </Assembly>
+    <Assembly Name="DocTest-DropNS-unified-multitest" Version="0.0.0.0">
+      <Attributes>
+        <Attribute>
+          <AttributeName>System.Diagnostics.Debuggable(System.Diagnostics.DebuggableAttribute+DebuggingModes.IgnoreSymbolStoreSequencePoints)</AttributeName>
+        </Attribute>
+        <Attribute>
+          <AttributeName>System.Runtime.CompilerServices.RuntimeCompatibility(WrapNonExceptionThrows=true)</AttributeName>
+        </Attribute>
+      </Attributes>
+    </Assembly>
+  </Assemblies>
+  <Remarks>To be added.</Remarks>
+  <Copyright>To be added.</Copyright>
+  <Types>
+    <Namespace Name="MyFramework.MyNamespace">
+      <Type Name="MyClass" Kind="Class" />
+      <Type Name="OnlyInMulti" Kind="Class" />
+    </Namespace>
+  </Types>
+  <Title>Untitled</Title>
+</Overview>
diff --git a/mcs/tools/mdoc/Test/en.expected-dropns-multi/ns-MyFramework.MyNamespace.xml b/mcs/tools/mdoc/Test/en.expected-dropns-multi/ns-MyFramework.MyNamespace.xml
new file mode 100644 (file)
index 0000000..74df75a
--- /dev/null
@@ -0,0 +1,6 @@
+<Namespace Name="MyFramework.MyNamespace">
+  <Docs>
+    <summary>To be added.</summary>
+    <remarks>To be added.</remarks>
+  </Docs>
+</Namespace>