Skip to content

Commit c077542

Browse files
committed
Fix Apply Mappings task not preserving new lines at end of files.
Allow the Apply Mappings task to skip lambda arguments. There is no unique way to identify lambda arguments so S2S can't unmap them correctly. So disable lambda mappings by default for the Patcher plugin.
1 parent 9dcce0d commit c077542

File tree

4 files changed

+85
-16
lines changed

4 files changed

+85
-16
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def gitVersion() {
2525
def branch = grgit.branch.current().name
2626
return "${tag}.${offset}" //${t -> if (branch != 'master') t << '-' + branch}"
2727
}
28+
println('Version: ' + version + ' Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
2829

2930
sourceSets {
3031
common

src/common/java/net/minecraftforge/gradle/common/task/TaskApplyMappings.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
import org.apache.commons.io.IOUtils;
3131
import org.gradle.api.DefaultTask;
32+
import org.gradle.api.tasks.Input;
3233
import org.gradle.api.tasks.InputFile;
3334
import org.gradle.api.tasks.OutputFile;
3435
import org.gradle.api.tasks.TaskAction;
@@ -37,6 +38,8 @@
3738
import net.minecraftforge.gradle.common.util.Utils;
3839

3940
public class TaskApplyMappings extends DefaultTask {
41+
private boolean javadocs = false;
42+
private boolean lambdas = true;
4043
private File mappings;
4144
private File input;
4245
private File output = getProject().file("build/" + getName() + "/output.zip");
@@ -54,7 +57,7 @@ public void apply() throws IOException {
5457
if (!e.getName().endsWith(".java")) {
5558
IOUtils.copy(zin.getInputStream(e), out);
5659
} else {
57-
out.write(names.rename(zin.getInputStream(e), false).getBytes(StandardCharsets.UTF_8));
60+
out.write(names.rename(zin.getInputStream(e), getJavadocs(), getLambdas()).getBytes(StandardCharsets.UTF_8));
5861
}
5962
out.closeEntry();
6063
} catch (IOException e1) {
@@ -65,6 +68,16 @@ public void apply() throws IOException {
6568
}
6669
}
6770

71+
@Input
72+
public boolean getJavadocs() {
73+
return this.javadocs;
74+
}
75+
76+
@Input
77+
public boolean getLambdas() {
78+
return this.lambdas;
79+
}
80+
6881
@InputFile
6982
public File getInput() {
7083
return input;
@@ -80,6 +93,14 @@ public File getOutput() {
8093
return output;
8194
}
8295

96+
public void setJavadocs(boolean value) {
97+
this.javadocs = value;
98+
}
99+
100+
public void setLambdas(boolean value) {
101+
this.lambdas = value;
102+
}
103+
83104
public void setInput(File clean) {
84105
input = clean;
85106
}

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

Lines changed: 59 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,36 @@
2020

2121
package net.minecraftforge.gradle.common.util;
2222

23+
import java.io.BufferedReader;
2324
import java.io.File;
2425
import java.io.IOException;
2526
import java.io.InputStream;
2627
import java.io.InputStreamReader;
28+
import java.io.OutputStream;
29+
import java.io.StringReader;
30+
import java.io.StringWriter;
31+
import java.nio.charset.StandardCharsets;
2732
import java.util.ArrayList;
2833
import java.util.Deque;
2934
import java.util.HashMap;
35+
import java.util.HashSet;
3036
import java.util.LinkedList;
3137
import java.util.List;
3238
import java.util.Locale;
3339
import java.util.Map;
40+
import java.util.Set;
3441
import java.util.regex.Matcher;
3542
import java.util.regex.Pattern;
3643
import java.util.stream.Collectors;
3744
import java.util.zip.ZipEntry;
3845
import java.util.zip.ZipFile;
39-
40-
import com.google.common.base.Joiner;
41-
import com.google.common.base.Strings;
42-
import com.google.common.io.CharStreams;
46+
import java.util.zip.ZipOutputStream;
4347

4448
import de.siegmar.fastcsv.reader.CsvContainer;
4549
import de.siegmar.fastcsv.reader.CsvReader;
4650
import de.siegmar.fastcsv.reader.CsvRow;
51+
52+
import org.apache.commons.io.IOUtils;
4753
import org.apache.commons.lang3.tuple.Pair;
4854

4955
public class McpNames {
@@ -54,6 +60,7 @@ public class McpNames {
5460
private static final Pattern CLASS_JAVADOC_PATTERN = Pattern.compile("^(?<indent>(?: )*|\\t*)([\\w|@]*\\s)*(class|interface|@interface|enum) (?<name>[\\w]+)");
5561
private static final Pattern CLOSING_CURLY_BRACE = Pattern.compile("^(?<indent>(?: )*|\\t*)}");
5662
private static final Pattern PACKAGE_DECL = Pattern.compile("^[\\s]*package(\\s)*(?<name>[\\w|.]+);$");
63+
private static final Pattern LAMBDA_DECL = Pattern.compile("\\((?<args>(?:(?:, ){0,1}(?:p_[\\w]+_\\d+_\\b))+)\\) ->");
5764

5865
public static McpNames load(File data) throws IOException {
5966
Map<String, String> names = new HashMap<>();
@@ -70,7 +77,7 @@ public static McpNames load(File data) throws IOException {
7077
searge = row.getField("param");
7178
String desc = row.getField("desc");
7279
names.put(searge, row.getField("name"));
73-
if (desc != null)
80+
if (desc != null && !desc.isEmpty())
7481
docs.put(searge, desc);
7582
}
7683
}
@@ -90,10 +97,43 @@ private McpNames(String hash, Map<String, String> names, Map<String, String> doc
9097
}
9198

9299
public String rename(InputStream stream, boolean javadocs) throws IOException {
100+
return rename(stream, javadocs, true);
101+
}
102+
103+
public String rename(InputStream stream, boolean javadocs, boolean lambdas) throws IOException {
104+
List<String> input = new ArrayList<>();
105+
StringWriter writer = new StringWriter();
106+
IOUtils.copy(stream, writer, StandardCharsets.UTF_8);
107+
String data = writer.toString();
108+
109+
try (BufferedReader reader = new BufferedReader(new StringReader(data))) {
110+
String line = null;
111+
while ((line = reader.readLine()) != null) {
112+
input.add(line);
113+
}
114+
}
115+
116+
//Reader doesn't give us the empty line if the file ends with a newline.. so add one.
117+
if (data.charAt(data.length() - 1) == '\r' || data.charAt(data.length() - 1) == '\n')
118+
input.add("");
119+
93120
List<String> lines = new ArrayList<>();
94121
Deque<Pair<String, Integer>> innerClasses = new LinkedList<>(); //pair of inner class name & indentation
95122
String _package = ""; //default package
96-
for (String line : CharStreams.readLines(new InputStreamReader(stream))) {
123+
Set<String> blacklist = null;
124+
125+
if (!lambdas) {
126+
blacklist = new HashSet<>();
127+
for (String line : input) {
128+
Matcher m = LAMBDA_DECL.matcher(line);
129+
if (!m.find())
130+
continue;
131+
for (String arg : m.group("args").split(", "))
132+
blacklist.add(arg);
133+
}
134+
}
135+
136+
for (String line : input) {
97137
Matcher m = PACKAGE_DECL.matcher(line);
98138
if(m.find())
99139
_package = m.group("name") + ".";
@@ -102,9 +142,9 @@ public String rename(InputStream stream, boolean javadocs) throws IOException {
102142
if (!injectJavadoc(lines, line, _package, innerClasses))
103143
javadocs = false;
104144
}
105-
lines.add(replaceInLine(line));
145+
lines.add(replaceInLine(line, blacklist));
106146
}
107-
return Joiner.on(NEWLINE).join(lines);
147+
return lines.stream().collect(Collectors.joining(NEWLINE));
108148
}
109149

110150
public String rename(String entry) {
@@ -124,7 +164,7 @@ private boolean injectJavadoc(List<String> lines, String line, String _package,
124164
Matcher matcher = METHOD_JAVADOC_PATTERN.matcher(line);
125165
if (matcher.find()) {
126166
String javadoc = docs.get(matcher.group("name"));
127-
if (!Strings.isNullOrEmpty(javadoc))
167+
if (javadoc != null)
128168
insertAboveAnnotations(lines, JavadocAdder.buildJavadoc(matcher.group("indent"), javadoc, true));
129169

130170
// worked, so return and don't try the fields.
@@ -135,7 +175,7 @@ private boolean injectJavadoc(List<String> lines, String line, String _package,
135175
matcher = FIELD_JAVADOC_PATTERN.matcher(line);
136176
if (matcher.find()) {
137177
String javadoc = docs.get(matcher.group("name"));
138-
if (!Strings.isNullOrEmpty(javadoc))
178+
if (javadoc != null)
139179
insertAboveAnnotations(lines, JavadocAdder.buildJavadoc(matcher.group("indent"), javadoc, false));
140180

141181
return true;
@@ -149,7 +189,7 @@ private boolean injectJavadoc(List<String> lines, String line, String _package,
149189
String currentClass = (innerClasses.isEmpty() ? _package : innerClasses.peek().getLeft() + "$") + matcher.group("name");
150190
innerClasses.push(Pair.of(currentClass, matcher.group("indent").length()));
151191
String javadoc = docs.get(currentClass);
152-
if (!Strings.isNullOrEmpty(javadoc)) {
192+
if (javadoc != null) {
153193
insertAboveAnnotations(lines, JavadocAdder.buildJavadoc(matcher.group("indent"), javadoc, true));
154194
}
155195

@@ -184,22 +224,26 @@ private static void insertAboveAnnotations(List<String> list, String line) {
184224
/*
185225
* There are certain times, such as Mixin Accessors that we wish to have the name of this method with the first character upper case.
186226
*/
187-
private String getMapped(String srg) {
227+
private String getMapped(String srg, Set<String> blacklist) {
228+
if (blacklist != null && blacklist.contains(srg))
229+
return srg;
230+
188231
boolean cap = srg.charAt(0) == 'F';
189232
if (cap)
190-
srg = 'f' + srg.substring(1);
233+
srg = 'f' + srg.substring(1);;
234+
191235
String ret = names.getOrDefault(srg, srg);
192236
if (cap)
193237
ret = ret.substring(0, 1).toUpperCase(Locale.ENGLISH) + ret.substring(1);
194238
return ret;
195239
}
196240

197-
private String replaceInLine(String line) {
241+
private String replaceInLine(String line, Set<String> blacklist) {
198242
StringBuffer buf = new StringBuffer();
199243
Matcher matcher = SRG_FINDER.matcher(line);
200244
while (matcher.find()) {
201245
// Since '$' is a valid character in identifiers, but we need to NOT treat this as a regex group, escape any occurrences
202-
matcher.appendReplacement(buf, Matcher.quoteReplacement(getMapped(matcher.group())));
246+
matcher.appendReplacement(buf, Matcher.quoteReplacement(getMapped(matcher.group(), blacklist)));
203247
}
204248
matcher.appendTail(buf);
205249
return buf.toString();

src/patcher/java/net/minecraftforge/gradle/patcher/PatcherPlugin.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ public void apply(@Nonnull Project project) {
156156
task.dependsOn(dlMappingsConfig, applyConfig);
157157
task.setInput(applyConfig.get().getOutput());
158158
task.setMappings(dlMappingsConfig.get().getOutput());
159+
task.setLambdas(false);
159160
});
160161
extractMapped.configure(task -> {
161162
task.dependsOn(toMCPConfig);
@@ -288,6 +289,7 @@ public void apply(@Nonnull Project project) {
288289
task.dependsOn(dlMappingsNew.get(), applyRangeConfig.get());
289290
task.setInput(applyRangeConfig.get().getOutput());
290291
task.setMappings(dlMappingsConfig.get().getOutput());
292+
task.setLambdas(false);
291293
});
292294

293295
TaskProvider<TaskExtractExistingFiles> extractMappedNew = project.getTasks().register("extractMappedNew", TaskExtractExistingFiles.class);
@@ -612,6 +614,7 @@ public void apply(@Nonnull Project project) {
612614
toMCPClean.dependsOn(dlMappingsConfig, Lists.newArrayList(applyConfig.get().getDependsOn()));
613615
toMCPClean.setInput(applyConfig.get().getClean());
614616
toMCPClean.setMappings(dlMappingsConfig.get().getOutput());
617+
toMCPClean.setLambdas(false);
615618

616619
//Zip up the current working folder as genPatches takes a zip
617620
Zip dirtyZip = project.getTasks().register("patchedZip", Zip.class).get();

0 commit comments

Comments
 (0)