Skip to content

Commit 05009d8

Browse files
authored
[http-core] Handle @param Newlines in Javadoc Reader (#351)
* Update JavadocParserTest.java * Revert "Update JavadocParserTest.java" This reverts commit a6ff641. * handle newlines in params
1 parent 411267c commit 05009d8

File tree

2 files changed

+63
-25
lines changed

2 files changed

+63
-25
lines changed

http-generator-core/src/main/java/io/avaje/http/generator/core/javadoc/JavadocParser.java

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,25 @@ class JavadocParser {
1919
private static final int PARAM_DESC = 7;
2020
private static final int RETURN_DESC = 8;
2121
private static final int IGNORE = 9;
22+
private static final int CODE = 10;
2223
private static final String DEPRECATED = "deprecated";
2324

2425
private int previousState = TEXT;
2526

26-
private StringBuilder currentParam = new StringBuilder();
27-
private StringBuilder currentDoclet = new StringBuilder();
27+
private final StringBuilder currentParam = new StringBuilder();
28+
private final StringBuilder currentDoclet = new StringBuilder();
2829
private StringBuilder currentContent;
2930

3031
private int state = TEXT;
3132

3233
private String returnDesc = "";
3334

34-
private Map<String, String> params = new LinkedHashMap<>();
35+
private final Map<String, String> params = new LinkedHashMap<>();
3536

3637
private boolean deprecated;
3738

39+
private boolean hasReturn;
40+
3841
/**
3942
* Parse the javadoc.
4043
*/
@@ -48,6 +51,7 @@ Javadoc parse(String text) {
4851
currentContent = mainContent;
4952

5053
for (char c : text.toCharArray()) {
54+
5155
switch (state) {
5256
case RETURN_DESC:
5357
if (c == '\n') {
@@ -57,6 +61,11 @@ Javadoc parse(String text) {
5761
if (state == PARAM_DESC) {
5862
processSetParam();
5963
}
64+
case CODE:
65+
if (state == CODE && c == '}') {
66+
state = previousState;
67+
break;
68+
}
6069
case TEXT:
6170
processText(c);
6271
continue;
@@ -77,32 +86,44 @@ Javadoc parse(String text) {
7786
}
7887
}
7988

80-
if (state == RETURN_DESC) {
81-
returnDesc = currentContent.toString();
89+
if (hasReturn) {
90+
returnDesc = mergeLines(currentContent.toString());
8291
}
8392

8493
return splitMain(mainContent.toString().trim());
8594
}
8695

8796
private void processSetParam() {
88-
params.put(currentParam.toString(), currentContent.toString().trim());
97+
params.put(currentParam.toString(), mergeLines(currentContent.toString().trim()));
8998
}
9099

91100
private void processReturnDesc(StringBuilder mainContent) {
92101
state = TEXT;
93102
previousState = TEXT;
94103
returnDesc = currentContent.toString();
95-
currentContent = mainContent;
104+
currentContent = new StringBuilder(returnDesc);
96105
}
97106

98107
private void processText(char c) {
99-
if (c == '{' || c == '@') {
100-
currentDoclet.delete(0, currentDoclet.length());
101-
state = DOCLET_START;
102-
} else if (c == '<') {
103-
state = TAG_START;
104-
} else if (c != '}' && c != '>') {
105-
currentContent.append(c);
108+
switch (c) {
109+
case '{':
110+
case '@':
111+
currentDoclet.delete(0, currentDoclet.length());
112+
state = DOCLET_START;
113+
break;
114+
case '<':
115+
state = TAG_START;
116+
break;
117+
case '\n':
118+
if (state == CODE) {
119+
currentContent.append("\\n");
120+
return;
121+
}
122+
default:
123+
if (c != '}' && c != '>') {
124+
currentContent.append(c);
125+
}
126+
break;
106127
}
107128
}
108129

@@ -132,23 +153,22 @@ private void processDocletStart(char c) {
132153
deprecated = true;
133154
}
134155
state = IGNORE;
135-
} else {
136-
if (docletName.equals("param")) {
137-
currentParam.delete(0, currentParam.length());
138-
state = PARAM_NAME;
139-
}
140-
if (docletName.equals("return")) {
141-
currentContent = new StringBuilder();
142-
state = RETURN_DESC;
143-
previousState = RETURN_DESC;
144-
}
156+
} else if ("param".equals(docletName)) {
157+
currentParam.delete(0, currentParam.length());
158+
state = PARAM_NAME;
159+
} else if ("return".equals(docletName)) {
160+
currentContent = new StringBuilder();
161+
state = RETURN_DESC;
162+
previousState = RETURN_DESC;
163+
hasReturn=true;
164+
} else if ("@code".equals(docletName)) {
165+
state = CODE;
145166
}
146167
} else {
147168
currentDoclet.append(c);
148169
}
149170
}
150171

151-
152172
private Javadoc splitMain(String mainText) {
153173

154174
String desc = "";

http-generator-core/src/test/java/io/avaje/http/generator/core/javadoc/JavadocParserTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,22 @@ public void lines() {
145145
assertThat(parser.mergeLines("\n one \n two \n three \n")).isEqualTo("one two three");
146146

147147
}
148+
149+
@Test
150+
public void parse_param_with_newline() {
151+
152+
JavadocParser parser = new JavadocParser();
153+
154+
Javadoc doc = parser.parse(
155+
"This is a description with <b>bold</b> and {@code some code}\n" +
156+
"@since 1.0\n" +
157+
"@param foo The\n foo param\n" +
158+
"@param bar The {@code \n} param\n" +
159+
"@return The {@value return}\n value\n");
160+
161+
assertEquals("This is a description with bold and some code", doc.getSummary());
162+
assertEquals("The foo param", doc.getParams().get("foo"));
163+
assertEquals("The \\n param", doc.getParams().get("bar"));
164+
assertEquals("The return value", doc.getReturnDescription());
165+
}
148166
}

0 commit comments

Comments
 (0)