2020
2121package net .minecraftforge .gradle .common .util ;
2222
23+ import java .io .BufferedReader ;
2324import java .io .File ;
2425import java .io .IOException ;
2526import java .io .InputStream ;
2627import java .io .InputStreamReader ;
28+ import java .io .OutputStream ;
29+ import java .io .StringReader ;
30+ import java .io .StringWriter ;
31+ import java .nio .charset .StandardCharsets ;
2732import java .util .ArrayList ;
2833import java .util .Deque ;
2934import java .util .HashMap ;
35+ import java .util .HashSet ;
3036import java .util .LinkedList ;
3137import java .util .List ;
3238import java .util .Locale ;
3339import java .util .Map ;
40+ import java .util .Set ;
3441import java .util .regex .Matcher ;
3542import java .util .regex .Pattern ;
3643import java .util .stream .Collectors ;
3744import java .util .zip .ZipEntry ;
3845import 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
4448import de .siegmar .fastcsv .reader .CsvContainer ;
4549import de .siegmar .fastcsv .reader .CsvReader ;
4650import de .siegmar .fastcsv .reader .CsvRow ;
51+
52+ import org .apache .commons .io .IOUtils ;
4753import org .apache .commons .lang3 .tuple .Pair ;
4854
4955public 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 ();
0 commit comments