Skip to content

Commit 1cea12a

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 30b0281 commit 1cea12a

File tree

10 files changed

+228
-67
lines changed

10 files changed

+228
-67
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.7.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: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,18 @@ val accessWiden by sourceSets.creating {
2020
val shadow by sourceSets.creating {
2121
configurations.named(this.implementationConfigurationName) { extendsFrom(commonDeps) }
2222
}
23+
val transformer by sourceSets.creating {
24+
configurations.named(this.implementationConfigurationName) { extendsFrom(commonDeps) }
25+
}
2326

2427
configurations {
2528
api { extendsFrom(commonDeps) }
26-
"jarDecompileCompileClasspath" {
27-
attributes {
28-
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 11) // VF needs 11
29-
}
30-
}
3129
}
3230

3331
val accessWidenerVersion: String by project
3432
val asmVersion: String by project
3533
val checkerVersion: String by project
3634
val vineFlowerVersion: String by project
37-
val forgeAutoRenamingToolVersion: String by project
3835
val junitVersion: String by project
3936
val mergeToolVersion: String by project
4037
dependencies {
@@ -43,10 +40,6 @@ dependencies {
4340
commonDeps(libs.asm)
4441
commonDeps(libs.asm.commons)
4542
commonDeps(libs.asm.util)
46-
commonDeps(libs.forgeAutoRenamingTool) {
47-
exclude("org.ow2.asm") // Use our own ASM
48-
exclude("net.sf.jopt-simple")
49-
}
5043
commonDeps(libs.mammoth)
5144

5245
// Just main
@@ -77,11 +70,14 @@ dependencies {
7770
"accessWidenCompileOnly"(libs.accessWidener) {
7871
exclude("org.ow2.asm")
7972
}
73+
"accessWidenCompileOnly"(transformer.output)
8074
implementation(accessWiden.output)
8175

8276
"shadowCompileOnly"(libs.shadowPlugin)
8377
implementation(shadow.output)
8478

79+
implementation(transformer.output)
80+
8581
testImplementation(platform(libs.junit.bom))
8682
testImplementation(libs.junit.api)
8783
testRuntimeOnly(libs.junit.launcher)

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

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,33 +26,18 @@
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;
34-
import org.objectweb.asm.Opcodes;
30+
import org.spongepowered.gradle.vanilla.internal.transformer.ClassTransformer;
3531

36-
final class AccessWidenerEntryTransformer implements Transformer {
32+
final class AccessWidenerEntryTransformer implements ClassTransformer {
3733
private final AccessWidener widener;
3834

3935
public AccessWidenerEntryTransformer(final AccessWidener widener) {
4036
this.widener = widener;
4137
}
4238

4339
@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);
49-
// 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-
}
40+
public ClassVisitor apply(final ClassVisitor parent) {
41+
return AccessWidenerClassVisitor.createClassVisitor(ClassTransformer.ASM_VERSION, parent, this.widener);
5742
}
5843
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@
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;
3130
import org.slf4j.Logger;
3231
import org.slf4j.LoggerFactory;
32+
import org.spongepowered.gradle.vanilla.internal.transformer.ClassTransformer;
3333

3434
import java.io.BufferedReader;
3535
import java.io.IOException;
@@ -39,12 +39,12 @@
3939
import java.util.Set;
4040
import java.util.function.Function;
4141

42-
public final class AccessWidenerTransformerProvider implements Function<Set<Path>, Transformer> {
42+
public final class AccessWidenerTransformerProvider implements Function<Set<Path>, ClassTransformer> {
4343

4444
private static final Logger LOGGER = LoggerFactory.getLogger(AccessWidenerTransformerProvider.class);
4545

4646
@Override
47-
public Transformer apply(final Set<Path> paths) {
47+
public ClassTransformer apply(final Set<Path> paths) {
4848
final AccessWidener widener = new AccessWidener();
4949
final AccessWidenerReader reader = new AccessWidenerReader(widener);
5050

subprojects/gradle-plugin/src/main/java/org/spongepowered/gradle/vanilla/internal/Constants.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public final class Constants {
4848
public static final String USER_AGENT = String.format("%s/%s Gradle/%s", Constants.NAME, Constants.VERSION, GradleVersion.current().getVersion());
4949
public static final String MINECRAFT_RESOURCES_HOST = "resources.download.minecraft.net";
5050
public static final String TASK_GROUP = "vanilla gradle";
51-
public static final int ASM_VERSION = Opcodes.ASM9;
5251
public static final String FIRST_TARGETABLE_RELEASE_TIMESTAMP = "2019-09-04T11:19:34+00:00"; // 19w36a+
5352
public static final String OUT_OF_BAND_RELEASE = "1.14.4"; // Cause it is special
5453
public static final String INDENT = " "; // indent to use when writing files

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
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;
3029
import org.spongepowered.gradle.vanilla.internal.repository.ResolvableTool;
3130
import org.spongepowered.gradle.vanilla.internal.resolver.AsyncUtils;
31+
import org.spongepowered.gradle.vanilla.internal.transformer.ClassTransformer;
3232
import org.spongepowered.gradle.vanilla.repository.MinecraftResolver;
3333
import org.spongepowered.gradle.vanilla.resolver.HashAlgorithm;
3434

@@ -86,13 +86,13 @@ public String stateKey() {
8686

8787
@Override
8888
@SuppressWarnings("unchecked")
89-
public CompletableFuture<TransformerProvider> providePopulator(
89+
public CompletableFuture<ClassTransformer.Provider> providePopulator(
9090
final MinecraftResolver.Context context
9191
) {
9292
final Supplier<URLClassLoader> loaderProvider = context.classLoaderWithTool(ResolvableTool.ACCESS_WIDENER);
93-
return AsyncUtils.failableFuture(() -> new TransformerProvider() {
93+
return AsyncUtils.failableFuture(() -> new ClassTransformer.Provider() {
9494
private final URLClassLoader loader = loaderProvider.get();
95-
private @Nullable Function<Set<Path>, Transformer> accessWidenerLoader = (Function<Set<Path>, Transformer>) Class.forName(
95+
private @Nullable Function<Set<Path>, ClassTransformer> accessWidenerLoader = (Function<Set<Path>, ClassTransformer>) Class.forName(
9696
"org.spongepowered.gradle.vanilla.internal.worker.AccessWidenerTransformerProvider",
9797
true,
9898
this.loader
@@ -101,7 +101,7 @@ public CompletableFuture<TransformerProvider> providePopulator(
101101
.newInstance();
102102

103103
@Override
104-
public Transformer provide() {
104+
public ClassTransformer provide() {
105105
if (this.accessWidenerLoader == null) {
106106
throw new IllegalStateException("Already closed!");
107107
}

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.ClassTransformer;
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 ClassTransformer.Provider}.
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<ClassTransformer.Provider> 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
}

subprojects/gradle-plugin/src/main/java/org/spongepowered/gradle/vanilla/repository/MinecraftResolverImpl.java

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

27-
import net.minecraftforge.fart.api.Renamer;
2827
import org.checkerframework.checker.nullness.qual.Nullable;
2928
import org.immutables.value.Value;
3029
import org.slf4j.Logger;
@@ -41,6 +40,8 @@
4140
import org.spongepowered.gradle.vanilla.internal.repository.modifier.AssociatedResolutionFlags;
4241
import org.spongepowered.gradle.vanilla.internal.resolver.AsyncUtils;
4342
import org.spongepowered.gradle.vanilla.internal.resolver.FileUtils;
43+
import org.spongepowered.gradle.vanilla.internal.transformer.ClassTransformer;
44+
import org.spongepowered.gradle.vanilla.internal.transformer.JarTransformer;
4445
import org.spongepowered.gradle.vanilla.internal.util.FunctionalUtils;
4546
import org.spongepowered.gradle.vanilla.internal.util.SelfPreferringClassLoader;
4647
import org.spongepowered.gradle.vanilla.resolver.Downloader;
@@ -336,7 +337,7 @@ public CompletableFuture<ResolutionResult<MinecraftEnvironment>> provide(
336337
boolean requiresLocalStorage = false;
337338
// Synchronously compute the modifier populator providers
338339
@SuppressWarnings({"unchecked", "rawtypes"})
339-
final CompletableFuture<ArtifactModifier.TransformerProvider>[] populators = new CompletableFuture[modifiers.size()];
340+
final CompletableFuture<ClassTransformer.Provider>[] populators = new CompletableFuture[modifiers.size()];
340341

341342
int idx = 0;
342343
for (final ArtifactModifier modifier : modifiers) {
@@ -368,16 +369,12 @@ public CompletableFuture<ResolutionResult<MinecraftEnvironment>> provide(
368369
final Path outputTmp = Files.createTempDirectory("vanillagradle").resolve("output" + decoratedArtifact + ".jar");
369370
FileUtils.createDirectoriesSymlinkSafe(output.getParent());
370371

371-
final Renamer.Builder builder = Renamer.builder()
372-
.logger(MinecraftResolverImpl.LOGGER::info);
373-
374-
for (final CompletableFuture<ArtifactModifier.TransformerProvider> populator : populators) {
372+
final JarTransformer.Builder builder = JarTransformer.builder();
373+
for (final CompletableFuture<ClassTransformer.Provider> populator : populators) {
375374
builder.add(populator.get().provide());
376375
}
377376

378-
try (final Renamer ren = builder.build()) {
379-
ren.run(input.get().jar().toFile(), outputTmp.toFile());
380-
}
377+
builder.build().transform(input.get().jar(), outputTmp);
381378

382379
FileUtils.atomicMove(outputTmp, output);
383380
this.writeMetaIfNecessary(side, decoratedArtifact, input.mapIfPresent((upToDate, env) -> env.metadata()), input.get()::dependencies, output.getParent());
@@ -386,7 +383,7 @@ public CompletableFuture<ResolutionResult<MinecraftEnvironment>> provide(
386383
} catch (final Exception ex) {
387384
throw new CompletionException(ex);
388385
} finally {
389-
for (final CompletableFuture<ArtifactModifier.TransformerProvider> populator : populators) {
386+
for (final CompletableFuture<ClassTransformer.Provider> populator : populators) {
390387
if (!populator.isCompletedExceptionally()) {
391388
try {
392389
populator.join().close();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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+
* Transforms the content of a class using a {@link ClassVisitor}.
35+
*/
36+
public interface ClassTransformer extends UnaryOperator<ClassVisitor> {
37+
int ASM_VERSION = Opcodes.ASM9;
38+
39+
/**
40+
* A function that can provide a {@link ClassTransformer}, optionally having a post-rename operation to clean up resources.
41+
*/
42+
@FunctionalInterface
43+
interface Provider extends AutoCloseable {
44+
ClassTransformer provide();
45+
46+
@Override
47+
default void close() throws IOException {
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)