Very early source remapping
This commit is contained in:
		
							parent
							
								
									79ec748a12
								
							
						
					
					
						commit
						2b85714448
					
				
					 4 changed files with 200 additions and 1 deletions
				
			
		|  | @ -11,7 +11,7 @@ targetCompatibility = 1.8 | ||||||
| 
 | 
 | ||||||
| group = 'net.fabricmc' | group = 'net.fabricmc' | ||||||
| archivesBaseName = project.name | archivesBaseName = project.name | ||||||
| version = '0.1.0-SNAPSHOT' | version = '0.1.1-SNAPSHOT' | ||||||
| 
 | 
 | ||||||
| def build = "local" | def build = "local" | ||||||
| def ENV = System.getenv() | def ENV = System.getenv() | ||||||
|  | @ -25,6 +25,10 @@ repositories { | ||||||
| 		name = "Fabric" | 		name = "Fabric" | ||||||
| 		url = 'https://maven.fabricmc.net/' | 		url = 'https://maven.fabricmc.net/' | ||||||
| 	} | 	} | ||||||
|  | 	maven { | ||||||
|  | 		name = "SonaType" | ||||||
|  | 		url = "https://oss.sonatype.org/content/repositories/snapshots/" | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| dependencies { | dependencies { | ||||||
|  | @ -45,6 +49,9 @@ dependencies { | ||||||
| 		exclude module: 'launchwrapper' | 		exclude module: 'launchwrapper' | ||||||
| 		exclude module: 'guava' | 		exclude module: 'guava' | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	implementation ('org.cadixdev:mercury:0.1.0-SNAPSHOT') | ||||||
|  | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| jar { | jar { | ||||||
|  |  | ||||||
|  | @ -42,6 +42,8 @@ public class LoomGradlePlugin extends AbstractPlugin { | ||||||
| 		makeTask("vscode", GenVsCodeProjectTask.class).setGroup("ide"); | 		makeTask("vscode", GenVsCodeProjectTask.class).setGroup("ide"); | ||||||
| 		makeTask("genEclipseRuns", GenEclipseRunsTask.class).setGroup("ide"); | 		makeTask("genEclipseRuns", GenEclipseRunsTask.class).setGroup("ide"); | ||||||
| 
 | 
 | ||||||
|  | 		makeTask("remapSources", RemapSourcesTask.class); | ||||||
|  | 
 | ||||||
| 		makeTask("runClient", RunClientTask.class).dependsOn("buildNeeded").setGroup("minecraftMapped"); | 		makeTask("runClient", RunClientTask.class).dependsOn("buildNeeded").setGroup("minecraftMapped"); | ||||||
| 		makeTask("runServer", RunServerTask.class).dependsOn("buildNeeded").setGroup("minecraftMapped"); | 		makeTask("runServer", RunServerTask.class).dependsOn("buildNeeded").setGroup("minecraftMapped"); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
							
								
								
									
										38
									
								
								src/main/java/net/fabricmc/loom/task/RemapSourcesTask.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/main/java/net/fabricmc/loom/task/RemapSourcesTask.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | ||||||
|  | /* | ||||||
|  |  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2016, 2017, 2018 FabricMC | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in all | ||||||
|  |  * copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |  * SOFTWARE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package net.fabricmc.loom.task; | ||||||
|  | 
 | ||||||
|  | import net.fabricmc.loom.util.SourceRemapper; | ||||||
|  | import org.gradle.api.DefaultTask; | ||||||
|  | import org.gradle.api.tasks.TaskAction; | ||||||
|  | 
 | ||||||
|  | public class RemapSourcesTask extends DefaultTask { | ||||||
|  | 
 | ||||||
|  | 	@TaskAction | ||||||
|  | 	public void remap() throws Exception { | ||||||
|  | 		SourceRemapper.remapSources(getProject()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										152
									
								
								src/main/java/net/fabricmc/loom/util/SourceRemapper.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								src/main/java/net/fabricmc/loom/util/SourceRemapper.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,152 @@ | ||||||
|  | /* | ||||||
|  |  * This file is part of fabric-loom, licensed under the MIT License (MIT). | ||||||
|  |  * | ||||||
|  |  * Copyright (c) 2016, 2017, 2018 FabricMC | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in all | ||||||
|  |  * copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  |  * SOFTWARE. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package net.fabricmc.loom.util; | ||||||
|  | 
 | ||||||
|  | import net.fabricmc.loom.LoomGradleExtension; | ||||||
|  | import net.fabricmc.loom.providers.MappingsProvider; | ||||||
|  | import net.fabricmc.stitch.util.Pair; | ||||||
|  | import org.cadixdev.lorenz.MappingSet; | ||||||
|  | import org.cadixdev.lorenz.io.TextMappingsReader; | ||||||
|  | import org.cadixdev.mercury.Mercury; | ||||||
|  | import org.cadixdev.mercury.remapper.MercuryRemapper; | ||||||
|  | import org.gradle.api.Project; | ||||||
|  | 
 | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.FileReader; | ||||||
|  | import java.io.Reader; | ||||||
|  | 
 | ||||||
|  | public class SourceRemapper { | ||||||
|  | 
 | ||||||
|  | 	public static void remapSources(Project project) throws Exception { | ||||||
|  | 
 | ||||||
|  | 		LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); | ||||||
|  | 		MappingsProvider mappingsProvider = extension.getMappingsProvider(); | ||||||
|  | 
 | ||||||
|  | 		project.getLogger().lifecycle("Setting up source remapper"); | ||||||
|  | 
 | ||||||
|  | 		FileReader mappingsReader = new FileReader(mappingsProvider.MAPPINGS_TINY); | ||||||
|  | 		MappingSet mappings = new TinyReader(mappingsReader, "intermediary", "named").read(); | ||||||
|  | 		mappingsReader.close(); | ||||||
|  | 
 | ||||||
|  | 		Mercury mercury = new Mercury(); | ||||||
|  | 
 | ||||||
|  | 		for (File file : project.getConfigurations().getByName("compile").getFiles()) { | ||||||
|  | 			mercury.getClassPath().add(file.toPath()); | ||||||
|  | 		} | ||||||
|  | 		for (File file : extension.getUnmappedMods()) { | ||||||
|  | 			if (file.isFile()) { | ||||||
|  | 				mercury.getClassPath().add(file.toPath()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		mercury.getClassPath().add(extension.getMinecraftMappedProvider().MINECRAFT_INTERMEDIARY_JAR.toPath()); | ||||||
|  | 		mercury.getClassPath().add(extension.getMinecraftMappedProvider().MINECRAFT_MAPPED_JAR.toPath()); | ||||||
|  | 
 | ||||||
|  | 		mercury.getProcessors().add(MercuryRemapper.create(mappings)); | ||||||
|  | 
 | ||||||
|  | 		project.getLogger().lifecycle("Remapping source"); | ||||||
|  | 		mercury.rewrite(new File(project.getRootDir(), "src/main/java").toPath(), new File(project.getRootDir(), "src_mapped").toPath()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	//Thanks jamierocks | ||||||
|  | 	public static class TinyReader extends TextMappingsReader { | ||||||
|  | 
 | ||||||
|  | 		public TinyReader(final Reader reader, String to, String from) { | ||||||
|  | 			super(reader, mappingSet -> new Processor(mappingSet, to, from)); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		public static class Processor extends TextMappingsReader.Processor { | ||||||
|  | 
 | ||||||
|  | 			String to; | ||||||
|  | 			String from; | ||||||
|  | 
 | ||||||
|  | 			int toOffset = 0; | ||||||
|  | 			int fromOffset = 1; | ||||||
|  | 
 | ||||||
|  | 			public Processor(MappingSet mappings, String to, String from) { | ||||||
|  | 				super(mappings); | ||||||
|  | 				this.to = to; | ||||||
|  | 				this.from = from; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			@Override | ||||||
|  | 			public void accept(final String line) { | ||||||
|  | 				final String[] params = line.split("\t"); | ||||||
|  | 				switch (params[0]) { | ||||||
|  | 					case "v1": | ||||||
|  | 						Pair<Integer, Integer> offset = getMappingOffset(to, from, line); | ||||||
|  | 						System.out.println("To: " + to + " From: " + from + " toOffset:" + offset.getLeft() + " from:" + offset.getRight()); | ||||||
|  | 						toOffset = offset.getLeft(); | ||||||
|  | 						fromOffset = offset.getRight(); | ||||||
|  | 						return; | ||||||
|  | 					case "CLASS": { | ||||||
|  | 						this.mappings.getOrCreateClassMapping(params[1 + toOffset]) | ||||||
|  | 							.setDeobfuscatedName(params[1 + fromOffset]); | ||||||
|  | 						System.out.println("Class " + params[1 + toOffset] + " -> " + params[1 + fromOffset]); | ||||||
|  | 						return; | ||||||
|  | 					} | ||||||
|  | 					case "FIELD": { | ||||||
|  | 						this.mappings.getOrCreateClassMapping(params[1 + toOffset]) | ||||||
|  | 							// params[2] is the descriptor | ||||||
|  | 							.getOrCreateFieldMapping(params[3 + toOffset]) | ||||||
|  | 							.setDeobfuscatedName(params[3 + fromOffset]); | ||||||
|  | 
 | ||||||
|  | 						System.out.println("Field " + params[3 + toOffset] + " -> " + params[3 + fromOffset]); | ||||||
|  | 						return; | ||||||
|  | 					} | ||||||
|  | 					case "METHOD": { | ||||||
|  | 						this.mappings.getOrCreateClassMapping(params[1 + toOffset]) | ||||||
|  | 							.getOrCreateMethodMapping(params[3 + toOffset], params[2]) | ||||||
|  | 							.setDeobfuscatedName(params[3 + fromOffset]); | ||||||
|  | 
 | ||||||
|  | 						System.out.println("Method " + params[3 + toOffset] + " -> " + params[3 + fromOffset]); | ||||||
|  | 						return; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			//This looks at the first line of the tiny file and finds the column of the mappings, horrible but works. | ||||||
|  | 			public Pair<Integer, Integer> getMappingOffset(String to, String from, String line){ | ||||||
|  | 				int toOffset = -1; | ||||||
|  | 				int fromOffset = -1; | ||||||
|  | 				String[] split = line.split("\t"); | ||||||
|  | 				for (int i = 0; i < split.length; i++) { | ||||||
|  | 					String mapping = split[i]; | ||||||
|  | 					if(mapping.equalsIgnoreCase(to)){ | ||||||
|  | 						fromOffset = i -1; | ||||||
|  | 					} | ||||||
|  | 					if(mapping.equalsIgnoreCase(from)){ | ||||||
|  | 						toOffset = i -1; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 				return Pair.of(toOffset, fromOffset); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
		Reference in a new issue