aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorLogic <38597904+LogicFan@users.noreply.github.com>2021-07-28 03:50:14 -0400
committerGitHub <noreply@github.com>2021-07-28 08:50:14 +0100
commite124d483879f70d1eab12b7f85519ffe7de22f99 (patch)
treeae714ebbfd126be58043685c0b345b8392853360 /src/main
parent32837d71eb5dc1b6212f1efbc22b3fed60d7aa1d (diff)
downloadarchitectury-loom-e124d483879f70d1eab12b7f85519ffe7de22f99.tar.gz
architectury-loom-e124d483879f70d1eab12b7f85519ffe7de22f99.tar.bz2
architectury-loom-e124d483879f70d1eab12b7f85519ffe7de22f99.zip
fix #448 (#451)
* fix #448 * minor fix
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java93
-rw-r--r--src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java2
-rw-r--r--src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java2
-rw-r--r--src/main/java/net/fabricmc/loom/extension/MixinApExtension.java38
-rw-r--r--src/main/java/net/fabricmc/loom/extension/MixinApExtensionImpl.java17
5 files changed, 77 insertions, 75 deletions
diff --git a/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java
index 27712c3a..4fc8de83 100644
--- a/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java
+++ b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java
@@ -25,13 +25,21 @@
package net.fabricmc.loom.build;
import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
import java.nio.file.Path;
+import java.util.Collection;
import java.util.Objects;
+import java.util.stream.Collectors;
import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
import org.gradle.api.Project;
+import org.jetbrains.annotations.NotNull;
import org.zeroturnaround.zip.ZipUtil;
import org.zeroturnaround.zip.transform.StringZipEntryTransformer;
import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry;
@@ -43,29 +51,72 @@ import net.fabricmc.loom.extension.MixinApExtension;
public final class MixinRefmapHelper {
private MixinRefmapHelper() { }
+ private static final String FABRIC_MOD_JSON = "fabric.mod.json";
+
public static boolean addRefmapName(Project project, Path outputPath) {
- MixinApExtension mixin = LoomGradleExtension.get(project).getMixin();
- File output = outputPath.toFile();
-
- return mixin.getMixinSourceSetsStream().map(sourceSet -> {
- MixinApExtension.MixinInformationContainer container = Objects.requireNonNull(
- MixinApExtension.getMixinInformationContainer(sourceSet)
- );
- Stream<String> mixinJsonNames = container.getMixinJsonNames();
- String refmapName = container.getRefmapName();
-
- return ZipUtil.transformEntries(output, mixinJsonNames.map(f -> new ZipEntryTransformerEntry(f, new StringZipEntryTransformer("UTF-8") {
- @Override
- protected String transform(ZipEntry zipEntry, String input) {
- JsonObject json = LoomGradlePlugin.GSON.fromJson(input, JsonObject.class);
-
- if (!json.has("refmap")) {
- json.addProperty("refmap", refmapName);
+ try {
+ MixinApExtension mixin = LoomGradleExtension.get(project).getMixin();
+ File output = outputPath.toFile();
+
+ Collection<String> allMixinConfigs = getMixinConfigurationFiles(readFabricModJson(output));
+
+ return mixin.getMixinSourceSetsStream().map(sourceSet -> {
+ MixinApExtension.MixinInformationContainer container = Objects.requireNonNull(
+ MixinApExtension.getMixinInformationContainer(sourceSet)
+ );
+
+ Stream<String> mixinConfigs = sourceSet.getResources()
+ .matching(container.mixinConfigPattern())
+ .getFiles()
+ .stream()
+ .map(File::getName)
+ .filter(allMixinConfigs::contains);
+
+ String refmapName = container.refmapNameProvider().get();
+
+ return ZipUtil.transformEntries(output, mixinConfigs.map(f -> new ZipEntryTransformerEntry(f, new StringZipEntryTransformer("UTF-8") {
+ @Override
+ protected String transform(ZipEntry zipEntry, String input) {
+ JsonObject json = LoomGradlePlugin.GSON.fromJson(input, JsonObject.class);
+
+ if (!json.has("refmap")) {
+ json.addProperty("refmap", refmapName);
+ }
+
+ return LoomGradlePlugin.GSON.toJson(json);
}
+ })).toArray(ZipEntryTransformerEntry[]::new));
+ }).reduce(false, Boolean::logicalOr);
+ } catch (Exception e) {
+ project.getLogger().error(e.getMessage());
+ return false;
+ }
+ }
+
+ @NotNull
+ private static JsonObject readFabricModJson(File output) {
+ try (ZipFile zip = new ZipFile(output)) {
+ ZipEntry entry = zip.getEntry(FABRIC_MOD_JSON);
- return LoomGradlePlugin.GSON.toJson(json);
- }
- })).toArray(ZipEntryTransformerEntry[]::new));
- }).reduce(false, Boolean::logicalOr);
+ try (InputStreamReader reader = new InputStreamReader(zip.getInputStream(entry))) {
+ return LoomGradlePlugin.GSON.fromJson(reader, JsonObject.class);
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Cannot read file fabric.mod.json in the output jar.", e);
+ }
+ }
+
+ @NotNull
+ private static Collection<String> getMixinConfigurationFiles(JsonObject fabricModJson) {
+ return StreamSupport.stream(fabricModJson.getAsJsonArray("mixins").spliterator(), false)
+ .map(e -> {
+ if (e instanceof JsonPrimitive str) {
+ return str.getAsString();
+ } else if (e instanceof JsonObject obj) {
+ return obj.get("config").getAsString();
+ } else {
+ throw new RuntimeException("Incorrect fabric.mod.json format");
+ }
+ }).collect(Collectors.toSet());
}
}
diff --git a/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java
index 40221850..83ebadff 100644
--- a/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java
+++ b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java
@@ -80,7 +80,7 @@ public abstract class AnnotationProcessorInvoker<T extends Task> {
private void passMixinArguments(T task, SourceSet sourceSet) {
try {
LoomGradleExtension loom = LoomGradleExtension.get(project);
- String refmapName = Objects.requireNonNull(MixinApExtension.getMixinInformationContainer(sourceSet)).getRefmapName();
+ String refmapName = Objects.requireNonNull(MixinApExtension.getMixinInformationContainer(sourceSet)).refmapNameProvider().get();
Map<String, String> args = new HashMap<>() {{
put(Constants.MixinArguments.IN_MAP_FILE_NAMED_INTERMEDIARY, loom.getMappingsProvider().tinyMappings.getCanonicalPath());
put(Constants.MixinArguments.OUT_MAP_FILE_NAMED_INTERMEDIARY, loom.getNextMixinMappings().getCanonicalPath());
diff --git a/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java
index 04b00c6c..d49a473a 100644
--- a/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java
+++ b/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java
@@ -82,7 +82,7 @@ public class KaptApInvoker extends AnnotationProcessorInvoker<JavaCompile> {
SourceSet sourceSet = entry.getKey();
task.doLast(t -> {
try {
- String refmapName = Objects.requireNonNull(MixinApExtension.getMixinInformationContainer(sourceSet)).getRefmapName();
+ String refmapName = Objects.requireNonNull(MixinApExtension.getMixinInformationContainer(sourceSet)).refmapNameProvider().get();
Path src = Paths.get(getRefmapDestination(task, refmapName));
Path dest = Paths.get(task.getDestinationDir().toString(), refmapName);
diff --git a/src/main/java/net/fabricmc/loom/extension/MixinApExtension.java b/src/main/java/net/fabricmc/loom/extension/MixinApExtension.java
index 28f64c3f..73e78858 100644
--- a/src/main/java/net/fabricmc/loom/extension/MixinApExtension.java
+++ b/src/main/java/net/fabricmc/loom/extension/MixinApExtension.java
@@ -26,7 +26,6 @@ package net.fabricmc.loom.extension;
import java.util.Collection;
import java.util.Map;
-import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Stream;
@@ -56,42 +55,7 @@ public interface MixinApExtension extends MixinApExtensionAPI {
* for configuring the mixin annotation processor. It's stored
* in [SourceSet].ext.mixin.
*/
- final class MixinInformationContainer {
- private final SourceSet sourceSet;
- private final Provider<String> refmapName;
- private Stream<String> mixinJsonNames;
-
- final PatternSet mixinJsonPattern;
-
- public MixinInformationContainer(@NotNull SourceSet sourceSet,
- @NotNull Provider<String> refmapName,
- @NotNull PatternSet mixinJsonPattern) {
- this.sourceSet = sourceSet;
- this.refmapName = refmapName;
- this.mixinJsonPattern = mixinJsonPattern;
- }
-
- void setMixinJsonNames(@NotNull Stream<String> mixinJsonNames) {
- if (this.mixinJsonNames == null) {
- this.mixinJsonNames = mixinJsonNames;
- }
- }
-
- @NotNull
- public Stream<String> getMixinJsonNames() {
- return Objects.requireNonNull(mixinJsonNames);
- }
-
- @NotNull
- public SourceSet getSourceSet() {
- return sourceSet;
- }
-
- @NotNull
- public String getRefmapName() {
- return refmapName.get();
- }
- }
+ record MixinInformationContainer(SourceSet sourceSet, Provider<String> refmapNameProvider, PatternSet mixinConfigPattern) { }
@Nullable
static MixinInformationContainer getMixinInformationContainer(SourceSet sourceSet) {
diff --git a/src/main/java/net/fabricmc/loom/extension/MixinApExtensionImpl.java b/src/main/java/net/fabricmc/loom/extension/MixinApExtensionImpl.java
index bdd306ce..3602e75a 100644
--- a/src/main/java/net/fabricmc/loom/extension/MixinApExtensionImpl.java
+++ b/src/main/java/net/fabricmc/loom/extension/MixinApExtensionImpl.java
@@ -24,7 +24,6 @@
package net.fabricmc.loom.extension;
-import java.io.File;
import java.util.AbstractMap;
import java.util.Collection;
import java.util.Collections;
@@ -79,7 +78,7 @@ public class MixinApExtensionImpl extends MixinApExtensionApiImpl implements Mix
@Override
protected PatternSet add0(SourceSet sourceSet, Provider<String> refmapName) {
- PatternSet pattern = new PatternSet().setIncludes(Collections.singletonList("*.mixins.json"));
+ PatternSet pattern = new PatternSet().setIncludes(Collections.singletonList("*.json"));
MixinApExtension.setMixinInformationContainer(sourceSet, new MixinApExtension.MixinInformationContainer(sourceSet, refmapName, pattern));
isDefault = false;
@@ -91,19 +90,7 @@ public class MixinApExtensionImpl extends MixinApExtensionApiImpl implements Mix
@NotNull
public Stream<SourceSet> getMixinSourceSetsStream() {
return project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().stream()
- .filter(sourceSet -> {
- MixinApExtension.MixinInformationContainer container = MixinApExtension.getMixinInformationContainer(sourceSet);
-
- if (container != null) {
- PatternSet pattern = container.mixinJsonPattern;
- Stream<String> mixinJsonNames = sourceSet.getResources()
- .matching(pattern).getFiles().stream().map(File::getName);
- container.setMixinJsonNames(mixinJsonNames);
- return true;
- }
-
- return false;
- });
+ .filter(sourceSet -> MixinApExtension.getMixinInformationContainer(sourceSet) != null);
}
@Override