sb.Append ('.');
sb.Append (TypeName);
- if (GenericTypeArguments != null) {
+ if (GenericTypeArguments != null && GenericTypeArgumentsIsNumeric) {
+ sb.AppendFormat ("`{0}", GenericTypeArgumentsCount);
+ } else if (GenericTypeArguments != null) {
sb.Append ('<');
int i=0;
foreach (var t in GenericTypeArguments) {
<xsl:with-param name="child-id" select="concat ($linkid, ':Related:')" />
<xsl:with-param name="content">
<div class="related">
+ <xsl:call-template name="CreateRelatedSection">
+ <xsl:with-param name="section" select="'Platform Docs'" />
+ <xsl:with-param name="type" select="'PlatformDocAPI'" />
+ </xsl:call-template>
<xsl:call-template name="CreateRelatedSection">
<xsl:with-param name="section" select="'Articles'" />
<xsl:with-param name="type" select="'article'" />
Assert.IsFalse (desc.GenericTypeArgumentsIsNumeric);
}
+ [Test]
+ public void GenericTypeArgsNumericToStringTest ()
+ {
+ string stringCref = "T:System.Collections.Generic.Dictionary`2";
+ var desc = parser.Parse (stringCref);
+ Assert.IsTrue (desc.GenericTypeArgumentsIsNumeric);
+ Assert.AreEqual (2, desc.GenericTypeArguments.Count);
+ string generatedEcmaCref = desc.ToEcmaCref ();
+ Assert.AreEqual (stringCref, generatedEcmaCref);
+ }
+
[Test]
public void MetaEtcNodeTest ()
{
-rm -Rf Test/en.actual Test/html.actual
-rm -f monodocer1.exe*
+Test/DocTest-addNonGeneric.dll:
+ $(CSCOMPILE) $(TEST_CSCFLAGS) -debug -unsafe -target:library -out:$@ Test/DocTest-addNonGeneric.cs
+
+Test/DocTest-addNonGeneric-v2.dll:
+ $(CSCOMPILE) $(TEST_CSCFLAGS) -debug -unsafe -target:library -out:$@ Test/DocTest-addNonGeneric.cs /define:V2
+
Test/DocTest-DropNS-classic-secondary.dll:
@echo $(value @)
$(CSCOMPILE) $(TEST_CSCFLAGS) -debug -unsafe -target:library -out:$@ Test/DocTest-DropNS-classic-secondary.cs
-rm -f Test/DocTest.dll
$(MAKE) TEST_CSCFLAGS=$(TEST_CSCFLAGS) Test/DocTest.dll
+check-monodocer-addNonGeneric: $(PROGRAM)
+ -rm -Rf Test/en.actual
+ # first, make a docset with the generic method
+ $(MAKE) Test/DocTest-addNonGeneric.dll
+ $(MONO) $(PROGRAM) update --exceptions=all -o Test/en.actual Test/DocTest-addNonGeneric.dll
+
+ # now add a non-generic version of the method and update several times
+ $(MAKE) Test/DocTest-addNonGeneric-v2.dll
+ $(MONO) $(PROGRAM) update --exceptions=all -o Test/en.actual Test/DocTest-addNonGeneric-v2.dll
+ $(MONO) $(PROGRAM) update --exceptions=all -o Test/en.actual Test/DocTest-addNonGeneric-v2.dll
+ $(MONO) $(PROGRAM) update --exceptions=all -o Test/en.actual Test/DocTest-addNonGeneric-v2.dll
+ diff --exclude=.svn -rup Test/en.expected-addNonGeneric Test/en.actual
+
check-monodocer-dropns-classic: $(PROGRAM)
# tests the simplest --dropns case, a single class where the root namespace was dropped.
-rm -Rf Test/en.actual
check-mdoc-export-msxdoc-update \
check-mdoc-validate-update
+check: check-doc-tools \
+ check-doc-tools-update
if (mi is MethodDefinition) {
MethodDefinition mb = (MethodDefinition) mi;
pis = mb.Parameters;
- if (docTypeParams != null && mb.IsGenericMethod ()) {
+ if (mb.IsGenericMethod ()) {
IList<GenericParameter> args = mb.GenericParameters;
- if (args.Count == docTypeParams.Length) {
- typeParams = args.Select (p => p.Name).ToArray ();
- }
+ typeParams = args.Select (p => p.Name).ToArray ();
}
}
else if (mi is PropertyDefinition)
pis = ((PropertyDefinition)mi).Parameters;
-
+
+ // check type parameters
+ int methodTcount = member.TypeParameters == null ? 0 : member.TypeParameters.Count;
+ int reflectionTcount = typeParams == null ? 0 : typeParams.Length;
+ if (methodTcount != reflectionTcount)
+ continue;
+
+ // check member parameters
int mcount = member.Parameters == null ? 0 : member.Parameters.Count;
int pcount = pis == null ? 0 : pis.Count;
if (mcount != pcount)
public StringToStringMap MemberSignatures = new StringToStringMap ();
public string ReturnType;
public StringList Parameters;
+ public StringList TypeParameters;
public string MemberName;
public string MemberType;
int depth = reader.Depth;
bool go = true;
StringList p = new StringList ();
+ StringList tp = new StringList ();
do {
if (reader.NodeType != XmlNodeType.Element)
continue;
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;
if (p.Count > 0) {
Parameters = p;
}
+ if (tp.Count > 0) {
+ TypeParameters = tp;
+ } else {
+ DiscernTypeParameters ();
+ }
}
public DocumentationMember (XmlNode node)
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 ();
+ }
+ }
+
+ 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);
+ }
}
}
--- /dev/null
+namespace MyNamespace {
+ public class MyClass {
+ public string SomeMethod<T>() { return string.Empty; }
+
+ #if V2
+ public string SomeMethod() { return string.Empty; }
+ #endif
+ }
+}
<OutputType>Exe</OutputType>
<RootNamespace>mdoc</RootNamespace>
<AssemblyName>mdoc</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<DebugSymbols>True</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>False</Optimize>
<OutputPath>bin\Debug</OutputPath>
- <DefineConstants>DEBUG;NET_4_0</DefineConstants>
+ <DefineConstants>DEBUG;NET_4_5</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<Reference Include="System.Xml" />
<Reference Include="Mono.Cecil, Version=0.9.5.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
<Reference Include="monodoc">
- <HintPath>..\..\class\lib\net_4_0\monodoc.dll</HintPath>
+ <HintPath>..\..\class\lib\net_4_5\monodoc.dll</HintPath>
</Reference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />