Skip to content

Commit 96ecbb3

Browse files
committed
Replace FART with our own JarTransformer
We still need jar transformation for the AWs, but it is now much lighter as it doesn't require all the tracking and built-in transformers that FART was providing.
1 parent f0bbf3a commit 96ecbb3

File tree

9 files changed

+223
-64
lines changed

9 files changed

+223
-64
lines changed

gradle/libs.versions.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ version = "1.0"
55
accessWidener = "2.1.0"
66
asm = "9.9.1"
77
checker = "3.48.4"
8-
forgeAutoRenamingTool = "1.0.8"
98
vineFlower = "1.10.1"
109
ideaExt = "1.3"
1110
immutables = "2.10.1"
@@ -26,7 +25,6 @@ accessWidener = { module = "net.fabricmc:access-widener", version.ref = "accessW
2625
asm = { module = "org.ow2.asm:asm", version.ref = "asm" }
2726
asm-commons = { module = "org.ow2.asm:asm-commons", version.ref = "asm" }
2827
asm-util = { module = "org.ow2.asm:asm-util", version.ref = "asm" }
29-
forgeAutoRenamingTool = { module = "net.minecraftforge:ForgeAutoRenamingTool", version.ref = "forgeAutoRenamingTool" }
3028
vineFlower = { module = "org.vineflower:vineflower", version.ref = "vineFlower" }
3129
gson = { module = "com.google.code.gson:gson", version = "2.11.0" }
3230
ideaExt = { module = "gradle.plugin.org.jetbrains.gradle.plugin.idea-ext:gradle-idea-ext", version.ref = "ideaExt" }

subprojects/gradle-plugin/build.gradle.kts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,12 @@ val shadow by sourceSets.creating {
2323

2424
configurations {
2525
api { extendsFrom(commonDeps) }
26-
"jarDecompileCompileClasspath" {
27-
attributes {
28-
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 11) // VF needs 11
29-
}
30-
}
3126
}
3227

3328
val accessWidenerVersion: String by project
3429
val asmVersion: String by project
3530
val checkerVersion: String by project
3631
val vineFlowerVersion: String by project
37-
val forgeAutoRenamingToolVersion: String by project
3832
val junitVersion: String by project
3933
val mergeToolVersion: String by project
4034
dependencies {
@@ -43,10 +37,6 @@ dependencies {
4337
commonDeps(libs.asm)
4438
commonDeps(libs.asm.commons)
4539
commonDeps(libs.asm.util)
46-
commonDeps(libs.forgeAutoRenamingTool) {
47-
exclude("org.ow2.asm") // Use our own ASM
48-
exclude("net.sf.jopt-simple")
49-
}
5040
commonDeps(libs.mammoth)
5141

5242
// Just main

subprojects/gradle-plugin/src/accessWiden/java/org/spongepowered/gradle/vanilla/internal/worker/AccessWidenerEntryTransformer.java

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,33 +26,21 @@
2626

2727
import net.fabricmc.accesswidener.AccessWidener;
2828
import net.fabricmc.accesswidener.AccessWidenerClassVisitor;
29-
import net.fabricmc.accesswidener.AccessWidenerVisitor;
30-
import net.minecraftforge.fart.api.Transformer;
31-
import org.objectweb.asm.ClassReader;
3229
import org.objectweb.asm.ClassVisitor;
33-
import org.objectweb.asm.ClassWriter;
3430
import org.objectweb.asm.Opcodes;
3531

36-
final class AccessWidenerEntryTransformer implements Transformer {
32+
import java.util.function.UnaryOperator;
33+
34+
final class AccessWidenerEntryTransformer implements UnaryOperator<ClassVisitor> {
3735
private final AccessWidener widener;
3836

3937
public AccessWidenerEntryTransformer(final AccessWidener widener) {
4038
this.widener = widener;
4139
}
4240

4341
@Override
44-
public ClassEntry process(final ClassEntry entry) {
45-
// Because InnerClass attributes can be present in any class AW'd classes
46-
// are referenced from, we have to target every class to get a correct output.
47-
final ClassReader reader = new ClassReader(entry.getData());
48-
final ClassWriter writer = new ClassWriter(reader, 0);
42+
public ClassVisitor apply(final ClassVisitor parent) {
4943
// TODO: Expose the ASM version constant somewhere visible to this worker
50-
final ClassVisitor visitor = AccessWidenerClassVisitor.createClassVisitor(Opcodes.ASM9, writer, this.widener);
51-
reader.accept(visitor, 0);
52-
if (entry.isMultiRelease()) {
53-
return ClassEntry.create(entry.getName(), entry.getTime(), writer.toByteArray(), entry.getVersion());
54-
} else {
55-
return ClassEntry.create(entry.getName(), entry.getTime(), writer.toByteArray());
56-
}
44+
return AccessWidenerClassVisitor.createClassVisitor(Opcodes.ASM9, parent, this.widener);
5745
}
5846
}

subprojects/gradle-plugin/src/accessWiden/java/org/spongepowered/gradle/vanilla/internal/worker/AccessWidenerTransformerProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626

2727
import net.fabricmc.accesswidener.AccessWidener;
2828
import net.fabricmc.accesswidener.AccessWidenerReader;
29-
import net.minecraftforge.fart.api.Transformer;
3029
import org.gradle.api.GradleException;
30+
import org.objectweb.asm.ClassVisitor;
3131
import org.slf4j.Logger;
3232
import org.slf4j.LoggerFactory;
3333

@@ -38,13 +38,14 @@
3838
import java.nio.file.Path;
3939
import java.util.Set;
4040
import java.util.function.Function;
41+
import java.util.function.UnaryOperator;
4142

42-
public final class AccessWidenerTransformerProvider implements Function<Set<Path>, Transformer> {
43+
public final class AccessWidenerTransformerProvider implements Function<Set<Path>, UnaryOperator<ClassVisitor>> {
4344

4445
private static final Logger LOGGER = LoggerFactory.getLogger(AccessWidenerTransformerProvider.class);
4546

4647
@Override
47-
public Transformer apply(final Set<Path> paths) {
48+
public UnaryOperator<ClassVisitor> apply(final Set<Path> paths) {
4849
final AccessWidener widener = new AccessWidener();
4950
final AccessWidenerReader reader = new AccessWidenerReader(widener);
5051

subprojects/gradle-plugin/src/main/java/org/spongepowered/gradle/vanilla/internal/repository/modifier/AccessWidenerModifier.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@
2424
*/
2525
package org.spongepowered.gradle.vanilla.internal.repository.modifier;
2626

27-
import net.minecraftforge.fart.api.Transformer;
2827
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
2928
import org.checkerframework.checker.nullness.qual.Nullable;
29+
import org.objectweb.asm.ClassVisitor;
3030
import org.spongepowered.gradle.vanilla.internal.repository.ResolvableTool;
3131
import org.spongepowered.gradle.vanilla.internal.resolver.AsyncUtils;
32+
import org.spongepowered.gradle.vanilla.internal.transformer.ClassTransformerProvider;
3233
import org.spongepowered.gradle.vanilla.repository.MinecraftResolver;
3334
import org.spongepowered.gradle.vanilla.resolver.HashAlgorithm;
3435

@@ -44,6 +45,7 @@
4445
import java.util.concurrent.CompletableFuture;
4546
import java.util.function.Function;
4647
import java.util.function.Supplier;
48+
import java.util.function.UnaryOperator;
4749
import java.util.stream.Collectors;
4850

4951
public final class AccessWidenerModifier implements ArtifactModifier {
@@ -86,13 +88,13 @@ public String stateKey() {
8688

8789
@Override
8890
@SuppressWarnings("unchecked")
89-
public CompletableFuture<TransformerProvider> providePopulator(
91+
public CompletableFuture<ClassTransformerProvider> providePopulator(
9092
final MinecraftResolver.Context context
9193
) {
9294
final Supplier<URLClassLoader> loaderProvider = context.classLoaderWithTool(ResolvableTool.ACCESS_WIDENER);
93-
return AsyncUtils.failableFuture(() -> new TransformerProvider() {
95+
return AsyncUtils.failableFuture(() -> new ClassTransformerProvider() {
9496
private final URLClassLoader loader = loaderProvider.get();
95-
private @Nullable Function<Set<Path>, Transformer> accessWidenerLoader = (Function<Set<Path>, Transformer>) Class.forName(
97+
private @Nullable Function<Set<Path>, UnaryOperator<ClassVisitor>> accessWidenerLoader = (Function<Set<Path>, UnaryOperator<ClassVisitor>>) Class.forName(
9698
"org.spongepowered.gradle.vanilla.internal.worker.AccessWidenerTransformerProvider",
9799
true,
98100
this.loader
@@ -101,7 +103,7 @@ public CompletableFuture<TransformerProvider> providePopulator(
101103
.newInstance();
102104

103105
@Override
104-
public Transformer provide() {
106+
public UnaryOperator<ClassVisitor> provide() {
105107
if (this.accessWidenerLoader == null) {
106108
throw new IllegalStateException("Already closed!");
107109
}

subprojects/gradle-plugin/src/main/java/org/spongepowered/gradle/vanilla/internal/repository/modifier/ArtifactModifier.java

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,14 @@
2424
*/
2525
package org.spongepowered.gradle.vanilla.internal.repository.modifier;
2626

27-
import net.minecraftforge.fart.api.Renamer;
28-
import net.minecraftforge.fart.api.Transformer;
27+
import org.spongepowered.gradle.vanilla.internal.transformer.ClassTransformerProvider;
2928
import org.spongepowered.gradle.vanilla.repository.MinecraftResolver;
3029

31-
import java.io.IOException;
3230
import java.util.Set;
3331
import java.util.concurrent.CompletableFuture;
3432

3533
/**
36-
* Some sort of operation that can be performed on a jar, via a {@link Renamer}.
34+
* Some sort of operation that can be performed on a jar, via a {@link ClassTransformerProvider}.
3735
*/
3836
public interface ArtifactModifier {
3937

@@ -86,7 +84,7 @@ static String decorateArtifactId(final String originalId, final Set<ArtifactModi
8684
* asynchronously
8785
* @return a future providing the populator
8886
*/
89-
CompletableFuture<TransformerProvider> providePopulator(final MinecraftResolver.Context context);
87+
CompletableFuture<ClassTransformerProvider> providePopulator(final MinecraftResolver.Context context);
9088

9189
/**
9290
* Indicates that the result of this modification should be stored in the
@@ -96,16 +94,4 @@ static String decorateArtifactId(final String originalId, final Set<ArtifactModi
9694
*/
9795
boolean requiresLocalStorage();
9896

99-
/**
100-
* A function that can provide a {@link Transformer} for use with a renamer, optionally having a post-rename operation to clean up resources.
101-
*/
102-
@FunctionalInterface
103-
interface TransformerProvider extends AutoCloseable {
104-
Transformer provide();
105-
106-
@Override
107-
default void close() throws IOException {
108-
}
109-
}
110-
11197
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* This file is part of VanillaGradle, licensed under the MIT License (MIT).
3+
*
4+
* Copyright (c) SpongePowered <https://www.spongepowered.org>
5+
* Copyright (c) contributors
6+
*
7+
* Permission is hereby granted, free of charge, to any person obtaining a copy
8+
* of this software and associated documentation files (the "Software"), to deal
9+
* in the Software without restriction, including without limitation the rights
10+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11+
* copies of the Software, and to permit persons to whom the Software is
12+
* furnished to do so, subject to the following conditions:
13+
*
14+
* The above copyright notice and this permission notice shall be included in
15+
* all copies or substantial portions of the Software.
16+
*
17+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23+
* THE SOFTWARE.
24+
*/
25+
package org.spongepowered.gradle.vanilla.internal.transformer;
26+
27+
import org.objectweb.asm.ClassVisitor;
28+
import org.objectweb.asm.Opcodes;
29+
30+
import java.io.IOException;
31+
import java.util.function.UnaryOperator;
32+
33+
/**
34+
* A function that can provide a {@link UnaryOperator<ClassVisitor>}, optionally having a transformation operation to clean up resources.
35+
*/
36+
@FunctionalInterface
37+
public interface ClassTransformerProvider extends AutoCloseable {
38+
int ASM_VERSION = Opcodes.ASM9;
39+
40+
UnaryOperator<ClassVisitor> provide();
41+
42+
@Override
43+
default void close() throws IOException {
44+
}
45+
}

0 commit comments

Comments
 (0)