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
path: root/mdoc
diff options
context:
space:
mode:
authorJoel Martinez <joelmartinez@gmail.com>2015-10-08 00:32:52 +0300
committerDuncan Mak <duncanm@microsoft.com>2016-10-08 03:31:05 +0300
commitb72b210ee0ad829d81b47e58928f7b11417b1cf4 (patch)
tree6cb7d0e25af9284d92515a70d0af1fc8a5c5a204 /mdoc
parentf95711659072d5a632b341e888c7c0e06c13ee3a (diff)
[mdoc] `multiassembly` option for duplicated types
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.
Diffstat (limited to 'mdoc')
-rw-r--r--mdoc/Makefile31
-rw-r--r--mdoc/Mono.Documentation/monodocer.cs105
-rw-r--r--mdoc/Test/DocTest-DropNS-classic.cs4
-rw-r--r--mdoc/Test/DocTest-DropNS-unified.cs5
-rw-r--r--mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/MyClass.xml118
-rw-r--r--mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/OnlyInMulti.xml40
-rw-r--r--mdoc/Test/en.expected-dropns-multi/index.xml53
-rw-r--r--mdoc/Test/en.expected-dropns-multi/ns-MyFramework.MyNamespace.xml6
8 files changed, 336 insertions, 26 deletions
diff --git a/mdoc/Makefile b/mdoc/Makefile
index 0991269d..26e60874 100644
--- a/mdoc/Makefile
+++ b/mdoc/Makefile
@@ -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 \
diff --git a/mdoc/Mono.Documentation/monodocer.cs b/mdoc/Mono.Documentation/monodocer.cs
index 7d54a289..a1f91f3b 100644
--- a/mdoc/Mono.Documentation/monodocer.cs
+++ b/mdoc/Mono.Documentation/monodocer.cs
@@ -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)
diff --git a/mdoc/Test/DocTest-DropNS-classic.cs b/mdoc/Test/DocTest-DropNS-classic.cs
index 8346834b..13ae56d2 100644
--- a/mdoc/Test/DocTest-DropNS-classic.cs
+++ b/mdoc/Test/DocTest-DropNS-classic.cs
@@ -25,4 +25,8 @@ namespace MyFramework.MyNamespace {
public string Name {get;set;}
}
#endif
+ #if MULTITEST
+ public class OnlyInMulti {
+ }
+ #endif
}
diff --git a/mdoc/Test/DocTest-DropNS-unified.cs b/mdoc/Test/DocTest-DropNS-unified.cs
index 9b0c364a..0b74be24 100644
--- a/mdoc/Test/DocTest-DropNS-unified.cs
+++ b/mdoc/Test/DocTest-DropNS-unified.cs
@@ -30,4 +30,9 @@ namespace MyNamespace {
public string Name {get;set;}
}
#endif
+
+ #if MULTITEST
+ public class OnlyInMulti {
+ }
+ #endif
}
diff --git a/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/MyClass.xml b/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/MyClass.xml
new file mode 100644
index 00000000..ee429765
--- /dev/null
+++ b/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/MyClass.xml
@@ -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/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/OnlyInMulti.xml b/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/OnlyInMulti.xml
new file mode 100644
index 00000000..dbcf1304
--- /dev/null
+++ b/mdoc/Test/en.expected-dropns-multi/MyFramework.MyNamespace/OnlyInMulti.xml
@@ -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/mdoc/Test/en.expected-dropns-multi/index.xml b/mdoc/Test/en.expected-dropns-multi/index.xml
new file mode 100644
index 00000000..3baf401c
--- /dev/null
+++ b/mdoc/Test/en.expected-dropns-multi/index.xml
@@ -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/mdoc/Test/en.expected-dropns-multi/ns-MyFramework.MyNamespace.xml b/mdoc/Test/en.expected-dropns-multi/ns-MyFramework.MyNamespace.xml
new file mode 100644
index 00000000..74df75af
--- /dev/null
+++ b/mdoc/Test/en.expected-dropns-multi/ns-MyFramework.MyNamespace.xml
@@ -0,0 +1,6 @@
+<Namespace Name="MyFramework.MyNamespace">
+ <Docs>
+ <summary>To be added.</summary>
+ <remarks>To be added.</remarks>
+ </Docs>
+</Namespace>