Skip to content

Commit c47fb15

Browse files
Player3324Raik176SpaceWalkerRS
authored
Move builtin transform selection to game provider (#1056)
Co-authored-by: Raik176 <[email protected]> Co-authored-by: Space Walker <[email protected]>
1 parent 2d939c7 commit c47fb15

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed

minecraft/src/main/java/net/fabricmc/loader/impl/game/minecraft/MinecraftGameProvider.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Arrays;
2727
import java.util.Collection;
2828
import java.util.Collections;
29+
import java.util.EnumSet;
2930
import java.util.HashMap;
3031
import java.util.HashSet;
3132
import java.util.List;
@@ -159,6 +160,29 @@ public boolean requiresUrlClassLoader() {
159160
return hasModLoader;
160161
}
161162

163+
@Override
164+
public Set<BuiltinTransform> getBuiltinTransforms(String className) {
165+
boolean isMinecraftClass = className.startsWith("net.minecraft.") // unobf classes in indev and later
166+
|| className.startsWith("com.mojang.minecraft.") // unobf classes in classic
167+
|| className.startsWith("com.mojang.rubydung.") // unobf classes in pre-classic
168+
|| className.startsWith("com.mojang.blaze3d.") // unobf blaze3d classes
169+
|| className.indexOf('.') < 0; // obf classes
170+
171+
if (isMinecraftClass) {
172+
if (FabricLoaderImpl.INSTANCE.isDevelopmentEnvironment()) { // combined client+server jar, strip back down to production equivalent
173+
return TRANSFORM_WIDENALL_STRIPENV_CLASSTWEAKS;
174+
} else { // environment specific jar, inherently env stripped
175+
return TRANSFORM_WIDENALL_CLASSTWEAKS;
176+
}
177+
} else { // mod class TODO: exclude game libs
178+
return TRANSFORM_STRIPENV;
179+
}
180+
}
181+
182+
private static final Set<BuiltinTransform> TRANSFORM_WIDENALL_STRIPENV_CLASSTWEAKS = EnumSet.of(BuiltinTransform.WIDEN_ALL_PACKAGE_ACCESS, BuiltinTransform.STRIP_ENVIRONMENT, BuiltinTransform.CLASS_TWEAKS);
183+
private static final Set<BuiltinTransform> TRANSFORM_WIDENALL_CLASSTWEAKS = EnumSet.of(BuiltinTransform.WIDEN_ALL_PACKAGE_ACCESS, BuiltinTransform.CLASS_TWEAKS);
184+
private static final Set<BuiltinTransform> TRANSFORM_STRIPENV = EnumSet.of(BuiltinTransform.STRIP_ENVIRONMENT);
185+
162186
@Override
163187
public boolean isEnabled() {
164188
return !SystemProperties.isSet(SystemProperties.SKIP_MC_PROVIDER);

src/main/java/net/fabricmc/loader/impl/game/GameProvider.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@
2020
import java.util.Collection;
2121
import java.util.List;
2222
import java.util.Objects;
23+
import java.util.Set;
2324

25+
import net.fabricmc.api.Environment;
2426
import net.fabricmc.loader.api.metadata.ModMetadata;
2527
import net.fabricmc.loader.impl.game.patch.GameTransformer;
2628
import net.fabricmc.loader.impl.launch.FabricLauncher;
2729
import net.fabricmc.loader.impl.util.Arguments;
2830
import net.fabricmc.loader.impl.util.LoaderUtil;
31+
import net.fabricmc.loader.impl.util.SystemProperties;
2932

3033
public interface GameProvider { // name directly referenced in net.fabricmc.loader.impl.launch.knot.Knot.findEmbedddedGameProvider() and service loader records
3134
String getGameId();
@@ -38,6 +41,24 @@ public interface GameProvider { // name directly referenced in net.fabricmc.load
3841
Path getLaunchDirectory();
3942
boolean isObfuscated();
4043
boolean requiresUrlClassLoader();
44+
Set<BuiltinTransform> getBuiltinTransforms(String className);
45+
46+
enum BuiltinTransform {
47+
/**
48+
* Removes classes, fields and methods annotated with a different {@literal @}{@link Environment} from the current runtime.
49+
*/
50+
STRIP_ENVIRONMENT,
51+
/**
52+
* Widens all package-internal access modifiers to public (protected and package-private, but not private).
53+
*
54+
* <p>This only has an effect if the mappings or {@link SystemProperties#FIX_PACKAGE_ACCESS} require these access modifications.
55+
*/
56+
WIDEN_ALL_PACKAGE_ACCESS,
57+
/**
58+
* Applies class tweakers, including access wideners, as supplied by mods.
59+
*/
60+
CLASS_TWEAKS,
61+
}
4162

4263
boolean isEnabled();
4364
boolean locateGame(FabricLauncher launcher, String[] args);

src/main/java/net/fabricmc/loader/impl/transformer/FabricTransformer.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,24 @@
1616

1717
package net.fabricmc.loader.impl.transformer;
1818

19+
import java.util.Set;
20+
1921
import org.objectweb.asm.ClassReader;
2022
import org.objectweb.asm.ClassVisitor;
2123
import org.objectweb.asm.ClassWriter;
2224

2325
import net.fabricmc.accesswidener.AccessWidenerClassVisitor;
2426
import net.fabricmc.api.EnvType;
2527
import net.fabricmc.loader.impl.FabricLoaderImpl;
28+
import net.fabricmc.loader.impl.game.GameProvider.BuiltinTransform;
2629
import net.fabricmc.loader.impl.launch.FabricLauncherBase;
2730

2831
public final class FabricTransformer {
2932
public static byte[] transform(boolean isDevelopment, EnvType envType, String name, byte[] bytes) {
30-
boolean isMinecraftClass = name.startsWith("net.minecraft.") || name.startsWith("com.mojang.blaze3d.") || name.indexOf('.') < 0;
31-
boolean transformAccess = isMinecraftClass && FabricLauncherBase.getLauncher().getMappingConfiguration().requiresPackageAccessHack();
32-
boolean environmentStrip = !isMinecraftClass || isDevelopment;
33-
boolean applyAccessWidener = isMinecraftClass && FabricLoaderImpl.INSTANCE.getAccessWidener().getTargets().contains(name);
33+
Set<BuiltinTransform> transforms = FabricLoaderImpl.INSTANCE.getGameProvider().getBuiltinTransforms(name);
34+
boolean transformAccess = transforms.contains(BuiltinTransform.WIDEN_ALL_PACKAGE_ACCESS) && FabricLauncherBase.getLauncher().getMappingConfiguration().requiresPackageAccessHack();
35+
boolean environmentStrip = transforms.contains(BuiltinTransform.STRIP_ENVIRONMENT);
36+
boolean applyAccessWidener = transforms.contains(BuiltinTransform.CLASS_TWEAKS) && FabricLoaderImpl.INSTANCE.getAccessWidener().getTargets().contains(name);
3437

3538
if (!transformAccess && !environmentStrip && !applyAccessWidener) {
3639
return bytes;

0 commit comments

Comments
 (0)