Skip to content

Commit 5fbd7b2

Browse files
committed
[generator] Handle multiple @return javadoc values
Context: dotnet/android#5485 In an attempt to generate updated documentation for API 30 I've noticed a minor issue in generator. When a `<javadoc>` element contains multiple @return values, we will generate multiple `<returns>` elements in our C# documentation. This results in invalid C# documentation with partially missing return information, and the second `<returns>` element value is not displayed in IDE intellisense. This also causes an issue when the xml is processed by `mdoc`. These extra return lines will continue to be appended to the `mdoc` output every time the tool is ran against the invalid `Mono.Android.xml`.
1 parent 12e670a commit 5fbd7b2

File tree

2 files changed

+40
-18
lines changed

2 files changed

+40
-18
lines changed

src/Java.Interop.Tools.JavaSource/Java.Interop.Tools.JavaSource/SourceJavadocToXmldocGrammar.BlockTagsBnfTerms.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,23 @@ internal void CreateRules (SourceJavadocToXmldocGrammar grammar)
114114
if (!grammar.ShouldImport (ImportJavadoc.ReturnTag)) {
115115
return;
116116
}
117-
var r = new XElement ("returns",
117+
// When encountering multiple @return keys in a line, append subsequent @return key content to the original <returns> element.
118+
var jdi = FinishParse (context, parseNode);
119+
if (jdi.Returns.Count == 0) {
120+
var r = new XElement ("returns",
118121
AstNodeToXmlContent (parseNode.ChildNodes [1]));
119-
FinishParse (context, parseNode).Returns.Add (r);
120-
parseNode.AstNode = r;
122+
FinishParse (context, parseNode).Returns.Add (r);
123+
parseNode.AstNode = r;
124+
125+
} else {
126+
var r = jdi.Returns.First () as XElement;
127+
if (r != null) {
128+
r.Add (" ", AstNodeToXmlContent (parseNode.ChildNodes [1]));
129+
FinishParse (context, parseNode).Returns.Clear ();
130+
FinishParse (context, parseNode).Returns.Add (r);
131+
parseNode.AstNode = r;
132+
}
133+
}
121134
};
122135

123136
SeeDeclaration.Rule = "@see" + BlockValues;

tests/Java.Interop.Tools.JavaSource-Tests/SourceJavadocToXmldocParserTests.cs

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,19 @@ namespace Java.Interop.Tools.JavaSource.Tests
1717
[TestFixture]
1818
public class SourceJavadocToXmldocParserTests : SourceJavadocToXmldocGrammarFixture {
1919

20-
[Test]
21-
public void TryParse ()
20+
[Test, TestCaseSource (nameof (TryParse_Success))]
21+
public void TryParse (ParseResult parseResult)
2222
{
23-
foreach (var values in TryParse_Success) {
24-
ParseTree parseTree;
25-
var p = new SourceJavadocToXmldocParser (XmldocStyle.Full);
26-
var n = p.TryParse (values.Javadoc, null, out parseTree);
27-
Assert.IsFalse (parseTree.HasErrors (), DumpMessages (parseTree, p));
28-
Assert.AreEqual (values.FullXml, GetMemberXml (n), $"while parsing input: ```{values.Javadoc}```");
23+
ParseTree parseTree;
24+
var p = new SourceJavadocToXmldocParser (XmldocStyle.Full);
25+
var n = p.TryParse (parseResult.Javadoc, null, out parseTree);
26+
Assert.IsFalse (parseTree.HasErrors (), DumpMessages (parseTree, p));
27+
Assert.AreEqual (parseResult.FullXml, GetMemberXml (n), $"while parsing input: ```{parseResult.Javadoc}```");
2928

30-
p = new SourceJavadocToXmldocParser (XmldocStyle.IntelliSense);
31-
n = p.TryParse (values.Javadoc, null, out parseTree);
32-
Assert.IsFalse (parseTree.HasErrors (), DumpMessages (parseTree, p));
33-
Assert.AreEqual (values.IntelliSenseXml, GetMemberXml (n), $"while parsing input: ```{values.Javadoc}```");
34-
}
29+
p = new SourceJavadocToXmldocParser (XmldocStyle.IntelliSense);
30+
n = p.TryParse (parseResult.Javadoc, null, out parseTree);
31+
Assert.IsFalse (parseTree.HasErrors (), DumpMessages (parseTree, p));
32+
Assert.AreEqual (parseResult.IntelliSenseXml, GetMemberXml (n), $"while parsing input: ```{parseResult.Javadoc}```");
3533
}
3634

3735
static string GetMemberXml (IEnumerable<XNode> members)
@@ -40,7 +38,7 @@ static string GetMemberXml (IEnumerable<XNode> members)
4038
return e.ToString ();
4139
}
4240

43-
static readonly ParseResult[] TryParse_Success = new ParseResult[]{
41+
public static readonly ParseResult[] TryParse_Success = new ParseResult[]{
4442
new ParseResult {
4543
Javadoc = "Summary.\n\nP2.\n\n<p>Hello!</p>",
4644
FullXml = @"<member>
@@ -78,6 +76,17 @@ static string GetMemberXml (IEnumerable<XNode> members)
7876
<returns>
7977
<c>true</c> if something
8078
or other; otherwise <c>false</c>.</returns>
79+
</member>",
80+
},
81+
new ParseResult {
82+
Javadoc = "@return {@code true} if something else @return {@code false}.",
83+
FullXml = @"<member>
84+
<returns>
85+
<c>true</c> if something else <c>false</c>.</returns>
86+
</member>",
87+
IntelliSenseXml = @"<member>
88+
<returns>
89+
<c>true</c> if something else <c>false</c>.</returns>
8190
</member>",
8291
},
8392
new ParseResult {
@@ -166,7 +175,7 @@ more description here.</para>
166175
},
167176
};
168177

169-
class ParseResult {
178+
public class ParseResult {
170179
public string Javadoc;
171180
public string FullXml;
172181
public string IntelliSenseXml;

0 commit comments

Comments
 (0)