1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2024-12-14 20:20:30 +00:00

Use mixins to construct the TestFunctionInfo class

There's some funky things going on here, but thankfully they're limited
to test code.
This commit is contained in:
Jonathan Coates 2021-01-16 12:40:00 +00:00
parent 0be030c497
commit 23bf33c454
4 changed files with 100 additions and 8 deletions

View File

@ -6,12 +6,17 @@ buildscript {
name = "forge" name = "forge"
url = "https://files.minecraftforge.net/maven" url = "https://files.minecraftforge.net/maven"
} }
maven {
name = "mixin"
url = "https://dist.creeper.host/Sponge/maven"
}
} }
dependencies { dependencies {
classpath 'com.google.code.gson:gson:2.8.1' classpath 'com.google.code.gson:gson:2.8.1'
classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.190' classpath 'net.minecraftforge.gradle:ForgeGradle:3.0.190'
classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2' classpath 'net.sf.proguard:proguard-gradle:6.1.0beta2'
classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0' classpath 'org.ajoberstar.grgit:grgit-gradle:3.0.0'
classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT'
} }
} }
@ -25,6 +30,7 @@ plugins {
} }
apply plugin: 'net.minecraftforge.gradle' apply plugin: 'net.minecraftforge.gradle'
apply plugin: 'org.spongepowered.mixin'
apply plugin: 'org.ajoberstar.grgit' apply plugin: 'org.ajoberstar.grgit'
apply plugin: 'maven-publish' apply plugin: 'maven-publish'
apply plugin: 'maven' apply plugin: 'maven'
@ -79,6 +85,10 @@ minecraft {
testServer { testServer {
workingDirectory project.file('test-files/server') workingDirectory project.file('test-files/server')
parent runs.server parent runs.server
properties 'mixin.env.disableRefMap': 'true'
arg "-mixin.config=cctest.mixin.json"
arg "--nogui"
mods { mods {
cctest { cctest {
@ -93,6 +103,10 @@ minecraft {
accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg') accessTransformer file('src/main/resources/META-INF/accesstransformer.cfg')
} }
mixin {
add sourceSets.test, "cctest.refmap.json"
}
sourceSets { sourceSets {
main.resources { main.resources {
srcDir 'src/generated/resources' srcDir 'src/generated/resources'

View File

@ -0,0 +1,76 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.ingame.mixin;
import net.minecraft.test.TestFunctionInfo;
import net.minecraft.test.TestTrackerHolder;
import net.minecraft.util.Rotation;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import java.util.function.Consumer;
/**
* Mixin to replace final fields and some getters with non-final versions.
*
* Due to (I assume) the magic of proguard, some getters are replaced with constant
* implementations. Thus we need to replace them with a sensible version.
*/
@Mixin( TestFunctionInfo.class )
public class MixinTestFunctionInfo
{
@Shadow
@Mutable
private String batchName;
@Shadow
@Mutable
private String testName;
@Shadow
@Mutable
private String structureName;
@Shadow
@Mutable
private boolean required;
@Shadow
@Mutable
private Consumer<TestTrackerHolder> function;
@Shadow
@Mutable
private int maxTicks;
@Shadow
@Mutable
private long setupTicks;
@Shadow
@Mutable
private Rotation rotation;
@Overwrite
public int getMaxTicks()
{
return this.maxTicks;
}
@Overwrite
public long getSetupTicks()
{
return setupTicks;
}
@Overwrite
public boolean isRequired()
{
return required;
}
}

View File

@ -19,7 +19,6 @@ import org.objectweb.asm.Type;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Set; import java.util.Set;
@ -110,13 +109,6 @@ class TestLoader
private static void setFinalField( TestFunctionInfo func, String name, Object value ) throws ReflectiveOperationException private static void setFinalField( TestFunctionInfo func, String name, Object value ) throws ReflectiveOperationException
{ {
Field field = TestFunctionInfo.class.getDeclaredField( name ); Field field = TestFunctionInfo.class.getDeclaredField( name );
if( (field.getModifiers() & Modifier.FINAL) != 0 )
{
Field modifiers = Field.class.getDeclaredField( "modifiers" );
modifiers.setAccessible( true );
modifiers.set( field, field.getModifiers() & ~Modifier.FINAL );
}
field.setAccessible( true ); field.setAccessible( true );
field.set( func, value ); field.set( func, value );
} }

View File

@ -0,0 +1,10 @@
{
"required": true,
"package": "dan200.computercraft.ingame.mixin",
"compatibilityLevel": "JAVA_8",
"refmap": "cctest.refmap.json",
"mixins": [
"MixinTestFunctionInfo"
],
"minVersion": "0.8"
}