Skip to content

Commit

Permalink
Even more work :)
Browse files Browse the repository at this point in the history
  • Loading branch information
modmuss50 committed Feb 22, 2024
1 parent 2673557 commit 63f127e
Show file tree
Hide file tree
Showing 9 changed files with 161 additions and 80 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public final void afterEvaluation() {
// Decompiler will be passed to the constructor of GenerateSourcesTask
project.getTasks().register(taskName, GenerateSourcesTask.class, options).configure(task -> {
task.getInputJarName().set(minecraftJar.getName());
task.getOutputJar().fileValue(GenerateSourcesTask.getMappedJarFileWithSuffix("-sources.jar", minecraftJar.getPath()));
task.getOutputJar().fileValue(GenerateSourcesTask.getJarFileWithSuffix("-sources.jar", minecraftJar.getPath()));

task.dependsOn(project.getTasks().named("validateAccessWidener"));
task.setDescription("Decompile minecraft using %s.".formatted(decompilerName));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public void afterEvaluation() {

final TaskProvider<Task> commonDecompileTask = createDecompileTasks("Common", task -> {
task.getInputJarName().set(commonJar.getName());
task.getOutputJar().fileValue(GenerateSourcesTask.getMappedJarFileWithSuffix("-sources.jar", commonJar.getPath()));
task.getOutputJar().fileValue(GenerateSourcesTask.getJarFileWithSuffix("-sources.jar", commonJar.getPath()));

if (mappingConfiguration.hasUnpickDefinitions()) {
File unpickJar = new File(extension.getMappingConfiguration().mappingsWorkingDir().toFile(), "minecraft-common-unpicked.jar");
Expand All @@ -65,7 +65,7 @@ public void afterEvaluation() {

final TaskProvider<Task> clientOnlyDecompileTask = createDecompileTasks("ClientOnly", task -> {
task.getInputJarName().set(clientOnlyJar.getName());
task.getOutputJar().fileValue(GenerateSourcesTask.getMappedJarFileWithSuffix("-sources.jar", clientOnlyJar.getPath()));
task.getOutputJar().fileValue(GenerateSourcesTask.getJarFileWithSuffix("-sources.jar", clientOnlyJar.getPath()));

if (mappingConfiguration.hasUnpickDefinitions()) {
File unpickJar = new File(extension.getMappingConfiguration().mappingsWorkingDir().toFile(), "minecraft-clientonly-unpicked.jar");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@

package net.fabricmc.loom.decompilers;

import org.jetbrains.annotations.Nullable;

import static java.text.MessageFormat.format;

import java.io.BufferedReader;
Expand All @@ -38,6 +40,14 @@
import java.util.Objects;

public record ClassLineNumbers(Map<String, ClassLineNumbers.Entry> lineMap) {
public ClassLineNumbers {
Objects.requireNonNull(lineMap, "lineMap");

if (lineMap.isEmpty()) {
throw new IllegalArgumentException("lineMap is empty");
}
}

public static ClassLineNumbers readMappings(Path lineMappingsPath) {
try (BufferedReader reader = Files.newBufferedReader(lineMappingsPath)) {
return readMappings(reader);
Expand Down Expand Up @@ -108,7 +118,14 @@ public void write(Writer writer) throws IOException {
/**
* Merge two ClassLineNumbers together, throwing an exception if there are any duplicate class line mappings.
*/
public static ClassLineNumbers merge(ClassLineNumbers a, ClassLineNumbers b) {
@Nullable
public static ClassLineNumbers merge(@Nullable ClassLineNumbers a, @Nullable ClassLineNumbers b) {
if (a == null) {
return b;
} else if (b == null) {
return a;
}

var lineMap = new HashMap<>(a.lineMap());

for (Map.Entry<String, Entry> entry : b.lineMap().entrySet()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,15 @@
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.IOStringConsumer;

public record LineNumberRemapper(ClassLineNumbers lineNumbers) {
public void process(IOStringConsumer logger, Path input, Path output) throws IOException {
private static final Logger LOGGER = LoggerFactory.getLogger(LineNumberRemapper.class);

public void process(Path input, Path output) throws IOException {
Files.walkFileTree(input, new SimpleFileVisitor<>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Expand All @@ -64,9 +67,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IO

String idx = rel.substring(0, rel.length() - 6);

if (logger != null) {
logger.accept("Remapping " + idx);
}
LOGGER.debug("Remapping line numbers for class: " + idx);

int dollarPos = idx.indexOf('$'); //This makes the assumption that only Java classes are to be remapped.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,16 @@
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

import org.jetbrains.annotations.Nullable;

public record CachedFileStoreImpl<T>(Path root, EntrySerializer<T> entrySerializer, CacheRules cacheRules) implements CachedFileStore<T> {
public CachedFileStoreImpl {
Objects.requireNonNull(root, "root");
}

@Override
public @Nullable T getEntry(String key) throws IOException {
Path path = resolve(key);
Expand All @@ -56,6 +61,7 @@ public record CachedFileStoreImpl<T>(Path root, EntrySerializer<T> entrySerializ
@Override
public void putEntry(String key, T data) throws IOException {
Path path = resolve(key);
Files.createDirectories(path.getParent());
entrySerializer.write(data, path);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import java.util.Map;
import java.util.stream.Stream;

import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -65,7 +66,7 @@ public WorkRequest prepareJob(Path inputJar) throws IOException {

for (ClassEntry entry : inputClasses) {
String outputFileName = entry.sourcesFileName();
String fullHash = baseHash + entry.hash(inputFs.getRoot());
String fullHash = baseHash + "/" + entry.hash(inputFs.getRoot());

final CachedData entryData = fileStore.getEntry(fullHash);

Expand All @@ -92,7 +93,7 @@ public WorkRequest prepareJob(Path inputJar) throws IOException {
Path outputJar = Files.createTempFile("loom-cache-output", ".jar");
Files.delete(outputJar);

final var lineNumbers = new ClassLineNumbers(Collections.unmodifiableMap(lineNumbersMap));
final ClassLineNumbers lineNumbers = lineNumbersMap.isEmpty() ? null : new ClassLineNumbers(Collections.unmodifiableMap(lineNumbersMap));

if (isIncomplete && !hasSomeExisting) {
// The cache contained nothing of use, fully process the input jar
Expand Down Expand Up @@ -149,7 +150,13 @@ public void completeJob(Path output, WorkJob workJob, ClassLineNumbers lineNumbe
final String className = fsPath.toString().substring(1, fsPath.toString().length() - ".java".length());
final String sources = Files.readString(fsPath);

final var cachedData = new CachedData(className, sources, lineNumbers.lineMap().get(className));
ClassLineNumbers.Entry lineMapEntry = null;

if (lineNumbers != null) {
lineMapEntry = lineNumbers.lineMap().get(className);
}

final var cachedData = new CachedData(className, sources, lineMapEntry);
fileStore.putEntry(hash, cachedData);

LOGGER.debug("Saving processed entry to cache: {}", fsPath);
Expand Down Expand Up @@ -191,11 +198,11 @@ public void completeJob(Path output, WorkJob workJob, ClassLineNumbers lineNumbe
}
}

public record WorkRequest(WorkJob job, ClassLineNumbers lineNumbers) {
public record WorkRequest(WorkJob job, @Nullable ClassLineNumbers lineNumbers) {
}

public sealed interface WorkJob permits CompletedWorkJob, WorkToDoJob {
default WorkRequest asRequest(ClassLineNumbers lineNumbers) {
default WorkRequest asRequest(@Nullable ClassLineNumbers lineNumbers) {
return new WorkRequest(this, lineNumbers);
}
}
Expand Down
1 change: 1 addition & 0 deletions src/main/java/net/fabricmc/loom/extension/LoomFiles.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,5 @@ static LoomFiles create(Settings settings) {
File getRemapClasspathFile();
File getGlobalMinecraftRepo();
File getLocalMinecraftRepo();
File getDecompileCache(String version);
}
Original file line number Diff line number Diff line change
Expand Up @@ -107,4 +107,9 @@ public File getGlobalMinecraftRepo() {
public File getLocalMinecraftRepo() {
return new File(getRootProjectPersistentCache(), "minecraftMaven");
}

@Override
public File getDecompileCache(String version) {
return new File(getUserCache(), "decompile/" + version + ".cache");
}
}
Loading

0 comments on commit 63f127e

Please sign in to comment.