Skip to content

Commit 09e1d53

Browse files
JoJoDevelopingLexManos
authored andcommitted
Add class javadoc injection (#617)
1 parent 1b7bd5e commit 09e1d53

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

src/common/java/net/minecraftforge/gradle/common/util/JavadocAdder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ private JavadocAdder() { /* no constructing */ }
3737
* Converts a raw javadoc string into a nicely formatted, indented, and wrapped string.
3838
* @param indent the indent to be inserted before every line.
3939
* @param javadoc The javadoc string to be processed
40-
* @param isMethod If this javadoc is for a method or a field
40+
* @param multiline If this javadoc is mutlilined (for a field, it isn't) even if there is only one line in the doc
4141
* @return A fully formatted javadoc comment string complete with comment characters and newlines.
4242
*/
43-
public static String buildJavadoc(String indent, String javadoc, boolean isMethod)
43+
public static String buildJavadoc(String indent, String javadoc, boolean multiline)
4444
{
4545
StringBuilder builder = new StringBuilder();
4646

@@ -51,7 +51,7 @@ public static String buildJavadoc(String indent, String javadoc, boolean isMetho
5151
list.addAll(wrapText(line, 120 - (indent.length() + 3)));
5252
}
5353

54-
if (list.size() > 1 || isMethod)
54+
if (list.size() > 1 || multiline)
5555
{
5656
builder.append(indent);
5757
builder.append("/**");

src/common/java/net/minecraftforge/gradle/common/util/McpNames.java

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
import java.io.InputStream;
2626
import java.io.InputStreamReader;
2727
import java.util.ArrayList;
28+
import java.util.Deque;
2829
import java.util.HashMap;
30+
import java.util.LinkedList;
2931
import java.util.List;
3032
import java.util.Map;
3133
import java.util.regex.Matcher;
@@ -41,12 +43,16 @@
4143
import de.siegmar.fastcsv.reader.CsvContainer;
4244
import de.siegmar.fastcsv.reader.CsvReader;
4345
import de.siegmar.fastcsv.reader.CsvRow;
46+
import org.apache.commons.lang3.tuple.Pair;
4447

4548
public class McpNames {
4649
private static final String NEWLINE = System.getProperty("line.separator");
4750
private static final Pattern SRG_FINDER = Pattern.compile("func_[0-9]+_[a-zA-Z_]+|field_[0-9]+_[a-zA-Z_]+|p_[\\w]+_\\d+_\\b");
4851
private static final Pattern METHOD_JAVADOC_PATTERN = Pattern.compile("^(?<indent>(?: {3})+|\\t+)(?!return)(?:\\w+\\s+)*(?<generic><[\\w\\W]*>\\s+)?(?<return>\\w+[\\w$.]*(?:<[\\w\\W]*>)?[\\[\\]]*)\\s+(?<name>func_[0-9]+_[a-zA-Z_]+)\\(");
4952
private static final Pattern FIELD_JAVADOC_PATTERN = Pattern.compile("^(?<indent>(?: {3})+|\\t+)(?!return)(?:\\w+\\s+)*(?:\\w+[\\w$.]*(?:<[\\w\\W]*>)?[\\[\\]]*)\\s+(?<name>field_[0-9]+_[a-zA-Z_]+) *(?:=|;)");
53+
private static final Pattern CLASS_JAVADOC_PATTERN = Pattern.compile("^(?<indent>(?: )*|\\t*)([\\w|@]*\\s)*(class|interface|@interface|enum) (?<name>[\\w]+)");
54+
private static final Pattern CLOSING_CURLY_BRACE = Pattern.compile("^(?<indent>(?: )*|\\t*)}");
55+
private static final Pattern PACKAGE_DECL = Pattern.compile("^[\\s]*package(\\s)*(?<name>[\\w|.]+);$");
5056

5157
public static McpNames load(File data) throws IOException {
5258
Map<String, String> names = new HashMap<>();
@@ -84,9 +90,15 @@ private McpNames(String hash, Map<String, String> names, Map<String, String> doc
8490

8591
public String rename(InputStream stream, boolean javadocs) throws IOException {
8692
List<String> lines = new ArrayList<>();
93+
Deque<Pair<String, Integer>> innerClasses = new LinkedList<>(); //pair of inner class name & indentation
94+
String _package = ""; //default package
8795
for (String line : CharStreams.readLines(new InputStreamReader(stream))) {
96+
Matcher m = PACKAGE_DECL.matcher(line);
97+
if(m.find())
98+
_package = m.group("name") + ".";
99+
88100
if (javadocs)
89-
injectJavadoc(lines, line);
101+
injectJavadoc(lines, line, _package, innerClasses);
90102
lines.add(replaceInLine(line));
91103
}
92104
return Joiner.on(NEWLINE).join(lines);
@@ -99,13 +111,12 @@ public String rename(String entry) {
99111
/**
100112
* Injects a javadoc into the given list of lines, if the given line is a
101113
* method or field declaration.
102-
*
103114
* @param lines The current file content (to be modified by this method)
104115
* @param line The line that was just read (will not be in the list)
105-
* @param methodFunc A function that takes a method SRG id and returns its javadoc
106-
* @param fieldFunc A function that takes a field SRG id and returns its javadoc
116+
* @param _package the name of the package this file is declared to be in, in com.example format;
117+
* @param innerClasses current position in inner class
107118
*/
108-
private void injectJavadoc(List<String> lines, String line) {
119+
private void injectJavadoc(List<String> lines, String line, String _package, Deque<Pair<String, Integer>> innerClasses) {
109120
// methods
110121
Matcher matcher = METHOD_JAVADOC_PATTERN.matcher(line);
111122
if (matcher.find()) {
@@ -123,6 +134,36 @@ private void injectJavadoc(List<String> lines, String line) {
123134
String javadoc = docs.get(matcher.group("name"));
124135
if (!Strings.isNullOrEmpty(javadoc))
125136
insertAboveAnnotations(lines, JavadocAdder.buildJavadoc(matcher.group("indent"), javadoc, false));
137+
138+
return;
139+
}
140+
141+
//classes
142+
matcher = CLASS_JAVADOC_PATTERN.matcher(line);
143+
if(matcher.find()) {
144+
//we maintain a stack of the current (inner) class in com.example.ClassName$Inner format (along with indentation)
145+
//if the stack is not empty we are entering a new inner class
146+
String currentClass = (innerClasses.isEmpty() ? _package : innerClasses.peek().getLeft() + "$") + matcher.group("name");
147+
innerClasses.push(Pair.of(currentClass, matcher.group("indent").length()));
148+
String javadoc = docs.get(currentClass);
149+
if (!Strings.isNullOrEmpty(javadoc)) {
150+
insertAboveAnnotations(lines, JavadocAdder.buildJavadoc(matcher.group("indent"), javadoc, true));
151+
}
152+
153+
return;
154+
}
155+
156+
//detect curly braces for inner class stacking/end identification
157+
matcher = CLOSING_CURLY_BRACE.matcher(line);
158+
if(matcher.find()){
159+
if(!innerClasses.isEmpty()) {
160+
int len = matcher.group("indent").length();
161+
if (len == innerClasses.peek().getRight()) {
162+
innerClasses.pop();
163+
} else if (len < innerClasses.peek().getRight()) {
164+
throw new IllegalArgumentException("Failed to properly track class blocks around class " + innerClasses.peek().getLeft() + ":" + (lines.size() + 1));
165+
}
166+
}
126167
}
127168
}
128169

0 commit comments

Comments
 (0)