Skip to content

Commit

Permalink
Reintroduce Superclass Transformers
Browse files Browse the repository at this point in the history
We now can make use of superclass transformations
at both the API level and common implementation level.
  • Loading branch information
gabizou committed Feb 16, 2022
1 parent ee6029f commit 931487d
Show file tree
Hide file tree
Showing 19 changed files with 362 additions and 250 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -100,17 +100,21 @@ public String generatePlatformBuildVersionString(final String apiVersion, final
* @return the mixin configuration files that should be applied to this project
*/
public Set<String> getMixinConfigurations() {
return this.getNamedConfigurations(SpongeImplementationExtension.MIXIN_CONFIGS_PROPERTY);
}

public Set<String> getNamedConfigurations(final String name) {
final Set<String> configs = new HashSet<>();

// if we have a parent
final Project parentProject = this.project.getParent();
if (parentProject != null) {
SpongeImplementationExtension
.splitAndAddIfNonNull(configs, (String) parentProject.findProperty(SpongeImplementationExtension.MIXIN_CONFIGS_PROPERTY));
.splitAndAddIfNonNull(configs, (String) parentProject.findProperty(name));
}

// own project
SpongeImplementationExtension.splitAndAddIfNonNull(configs, (String) this.project.findProperty("mixinConfigs"));
SpongeImplementationExtension.splitAndAddIfNonNull(configs, (String) this.project.findProperty(name));
return configs;
}

Expand Down
11 changes: 11 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,17 @@ license {
newLine(false)
}

idea {
if (project != null) {
(project as ExtensionAware).extensions["settings"].run {
(this as ExtensionAware).extensions.getByType(org.jetbrains.gradle.ext.TaskTriggersConfig::class).run {
afterSync(":modlauncher-transformers:build")
}
}
}
}


allprojects {
configurations.configureEach {
resolutionStrategy.dependencySubstitution {
Expand Down
11 changes: 10 additions & 1 deletion forge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,13 @@ extensions.configure(LoomGradleExtension::class) {

// Forge extra configurations
val forgeBootstrapLibrariesConfig = configurations.register("bootstrapLibraries")
val forgeLibrariesConfig = configurations.register("spongeLibraries")
val mlTransformers = configurations.register("mltransformers")
val forgeLibrariesConfig = configurations.register("spongeLibraries") {
extendsFrom(mlTransformers.get())
}
val forgeAppLaunchConfig = configurations.register("applaunch") {
extendsFrom(forgeBootstrapLibrariesConfig.get())
extendsFrom(mlTransformers.get())
extendsFrom(configurations.getByName("minecraftNamed"))
extendsFrom(configurations.getByName("loaderLibraries"))
}
Expand Down Expand Up @@ -114,6 +118,7 @@ val forgeLaunch by sourceSets.register("launch") {
configurations.named(implementationConfigurationName) {
extendsFrom(forgeAppLaunchConfig.get())
extendsFrom(forgeLibrariesConfig.get())
extendsFrom(mlTransformers.get())
}
}
val forgeAccessors by sourceSets.register("accessors") {
Expand Down Expand Up @@ -149,6 +154,9 @@ val forgeAppLaunch by sourceSets.register("applaunch") {
spongeImpl.applyNamedDependencyOnOutput(commonProject, main.get(), this, project, this.runtimeOnlyConfigurationName)
spongeImpl.applyNamedDependencyOnOutput(commonProject, accessors.get(), this, project, this.runtimeOnlyConfigurationName)
spongeImpl.applyNamedDependencyOnOutput(project, forgeMain, this, project, this.runtimeOnlyConfigurationName)
configurations.named(runtimeClasspathConfigurationName) {
extendsFrom(mlTransformers.get())
}
}
val forgeMixinsImplementation by configurations.named(forgeMixins.implementationConfigurationName) {
extendsFrom(forgeLibrariesConfig.get())
Expand Down Expand Up @@ -204,6 +212,7 @@ dependencies {
appLaunch("net.fabricmc:access-widener:1.0.2") {
exclude(group = "org.apache.logging.log4j")
}
mlTransformers.name(project(":modlauncher-transformers"))

val libraries = forgeLibrariesConfig.name
libraries("org.spongepowered:timings:$timingsVersion")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,14 @@
import net.minecraftforge.fml.loading.FMLEnvironment;
import net.minecraftforge.fml.loading.ModDirTransformerDiscoverer;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.spongepowered.applaunch.service.AccessWidenerTransformationService;
import org.spongepowered.applaunch.service.SuperclassChanger;

import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Supplier;
Expand Down Expand Up @@ -90,11 +91,12 @@ public void initialize(final IEnvironment environment) {
throw new RuntimeException("Failed to register SpongeForge", ex);
}
// Register SF as an AW
final Optional<AccessWidenerTransformationService> aw = environment.getProperty(AccessWidenerTransformationService.INSTANCE.get());
if (aw.isPresent()) {
// todo: actually read this from the jar manifest
aw.get().offerResource(ForgeProductionBootstrap.class.getResource("/common.accesswidener"), "SpongeForge injected");
}
// todo: actually read this from the jar manifest
environment.getProperty(AccessWidenerTransformationService.INSTANCE.get()).ifPresent(aWTS ->
aWTS.offerResource(ForgeProductionBootstrap.class.getResource("/common.accesswidener"), "SpongeForge injected"));
environment.getProperty(SuperclassChanger.INSTANCE.get()).ifPresent(scc -> {
scc.offerResource(ForgeProductionBootstrap.class.getResource("/common.superclasschanger"), "SpongeForge injected");
});
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
org.spongepowered.forge.applaunch.service.AccessWidenerTransformationService
org.spongepowered.forge.applaunch.service.ForgeProductionBootstrap
org.spongepowered.forge.applaunch.service.ForgeProductionBootstrap
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ projectDescription=The SpongeAPI implementation targeting vanilla Minecraft and
mixinConfigs=mixins.sponge.accessors.json,mixins.sponge.api.json,mixins.sponge.concurrent.json,mixins.sponge.core.json,\
mixins.sponge.entityactivation.json,mixins.sponge.exploit.json,mixins.sponge.inventory.json,mixins.sponge.movementcheck.json,\
mixins.sponge.tracker.json,mixins.sponge.ipforward.json,mixins.sponge.optimization.json

superClassChanges=common.superclasschange
minecraftVersion=1.16.5
recommendedVersion=0-SNAPSHOT
asmVersion=9.2
Expand Down
45 changes: 45 additions & 0 deletions modlauncher-transformers/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
dependencies {
implementation "org.ow2.asm:asm:$asmVersion"
}

// Make sure jar is present for other projects
eclipse {
synchronizationTasks 'jar'
}

license {
properties {
name = "Sponge"
organization = project.ext.organization
url = project.ext.projectUrl
}
header = rootProject.file("HEADER.txt")

include "**/*.java"
newLine false
}

dependencies {
compileOnly("org.apache.logging.log4j:log4j-api:${project.log4jVersion}")
compileOnly("cpw.mods:modlauncher:${project.modlauncherVersion}") {
exclude group: "org.apache.logging.log4j"
exclude group: "net.sf.jopt-simple" // uses a newer version than MC
}
compileOnly(platform("org.spongepowered:configurate-bom:$apiConfigurateVersion"))
compileOnly("org.spongepowered:configurate-core") {
exclude group: "org.checkerframework", module: "checker-qual" // We use our own version
}
compileOnly("org.spongepowered:configurate-jackson") {
exclude group: "org.spongepowered", module: "configurate-core"
exclude group: "org.checkerframework", module: "checker-qual" // We use our own version
}
compileOnly("org.checkerframework:checker-qual:3.13.0")
compileOnly("net.sf.jopt-simple:jopt-simple:5.0.3")
compileOnly("org.ow2.asm:asm-commons:${project.asmVersion}")
compileOnly("cpw.mods:grossjava9hacks:1.3.3") {
exclude group: "org.apache.logging.log4j"
}
compileOnly("net.fabricmc:access-widener:1.0.2") {
exclude group: "org.apache.logging.log4j"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.spongepowered.forge.applaunch.service;
package org.spongepowered.applaunch.service;

import cpw.mods.modlauncher.api.IEnvironment;
import cpw.mods.modlauncher.api.ITransformationService;
Expand All @@ -38,7 +38,9 @@
import net.fabricmc.accesswidener.AccessWidenerVisitor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.framework.qual.DefaultQualifier;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.ClassNode;
Expand All @@ -55,17 +57,18 @@
import java.util.function.BiFunction;
import java.util.function.Supplier;

@DefaultQualifier(NonNull.class)
public class AccessWidenerTransformationService implements ITransformationService {

public static final String NAME = "access_widener";
public static final String ACCESS_WIDENER_EXTENSION = "accesswidener";
public static final Supplier<TypesafeMap.Key<AccessWidenerTransformationService>>
INSTANCE = IEnvironment.buildKey("sponge:aw", AccessWidenerTransformationService.class);
private static final Logger LOGGER = LogManager.getLogger();
static final Logger LOGGER = LogManager.getLogger();

private final AccessWidener widener = new AccessWidener();
private final AccessWidenerReader reader = new AccessWidenerReader(this.widener);
private OptionSpec<String> configSpec;
private @MonotonicNonNull OptionSpec<String> configSpec;

@NonNull
@Override
Expand Down
Loading

0 comments on commit 931487d

Please sign in to comment.