Skip to content

Commit

Permalink
Fix NetworkedEnum annotation retention (#181)
Browse files Browse the repository at this point in the history
  • Loading branch information
XFactHD authored Jul 13, 2024
1 parent cd7eafe commit c2eb8f1
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
package net.neoforged.fml.common.asm.enumextension;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
Expand All @@ -14,6 +16,7 @@
* @see ExtensionInfo
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface NetworkedEnum {
NetworkCheck value();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -376,8 +376,8 @@ private static void loadConstructorParams(ListGeneratorAdapter generator, int id

private static void buildExtensionInfo(ClassNode classNode, Type classType, ListGeneratorAdapter generator, FieldNode infoField, int vanillaCount, int moddedCount) {
String netCheckValue = null;
if (classNode.invisibleAnnotations != null) {
netCheckValue = classNode.invisibleAnnotations.stream()
if (classNode.visibleAnnotations != null) {
netCheckValue = classNode.visibleAnnotations.stream()
.filter(anno -> anno.desc.equals(NETWORKED_ANNOTATION.getDescriptor()))
.findFirst()
.flatMap(anno -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

Expand Down Expand Up @@ -49,7 +51,7 @@ <T extends Enum<T>> void testExtendEnum() throws Exception {
.addClass("testmod.SomeEnum", """
import net.neoforged.fml.common.asm.enumextension.IExtensibleEnum;
import net.neoforged.fml.common.asm.enumextension.ExtensionInfo;
enum SomeEnum implements IExtensibleEnum {
public enum SomeEnum implements IExtensibleEnum {
LITERAL;
public static ExtensionInfo getExtensionInfo() {
return ExtensionInfo.nonExtended(SomeEnum.class);
Expand All @@ -69,6 +71,13 @@ public static ExtensionInfo getExtensionInfo() {
0, 1);
assertThat(Enum.valueOf(enumClass, "LITERAL")).isInstanceOf(enumClass);
assertThat(Enum.valueOf(enumClass, "TESTMOD_NEW_CONSTANT")).isInstanceOf(enumClass);

// Grab the enum info
var extensionInfo = getExtensionInfo(enumClass);
assertTrue(extensionInfo.extended());
assertEquals(1, extensionInfo.vanillaCount());
assertEquals(2, extensionInfo.totalCount());
assertNull(extensionInfo.netCheck());
}

@Test
Expand Down Expand Up @@ -313,6 +322,77 @@ public static Object getIdEnumParameter(int idx, Class<?> type) {
2);
}

@Test
void testExtensionInfoNonExtended() throws Exception {
installation.setupProductionClient();

installation.buildModJar("enum_ext_test.jar")
.withModsToml(builder -> builder.unlicensedJavaMod()
.addMod("testmod", "1.0"))
.addClass("testmod.SomeEnum", """
import net.neoforged.fml.common.asm.enumextension.IExtensibleEnum;
import net.neoforged.fml.common.asm.enumextension.ExtensionInfo;
import net.neoforged.fml.common.asm.enumextension.NetworkedEnum;
@NetworkedEnum(NetworkedEnum.NetworkCheck.CLIENTBOUND)
public enum SomeEnum implements IExtensibleEnum {
LITERAL;
public static ExtensionInfo getExtensionInfo() {
return ExtensionInfo.nonExtended(SomeEnum.class);
}
}
""")
.build();
launchAndLoad("forgeclient");

var extensibleEnum = getEnumClass("testmod.SomeEnum");
var extensionInfo = getExtensionInfo(extensibleEnum);
assertFalse(extensionInfo.extended());
assertEquals(0, extensionInfo.vanillaCount());
assertEquals(0, extensionInfo.totalCount());
assertEquals(NetworkedEnum.NetworkCheck.CLIENTBOUND, extensionInfo.netCheck());
}

@Test
void testExtensionInfoExtended() throws Exception {
installation.setupProductionClient();

installation.buildModJar("enum_ext_test.jar")
.withModsToml(getModsTomlBuilderConsumer("extensions.json"))
.addTextFile("extensions.json", """
{
"entries": [
{
"enum": "testmod/SomeEnum",
"name": "TESTMOD_NEW_CONSTANT",
"constructor": "()V",
"parameters": []
}
]
}
""")
.addClass("testmod.SomeEnum", """
import net.neoforged.fml.common.asm.enumextension.IExtensibleEnum;
import net.neoforged.fml.common.asm.enumextension.ExtensionInfo;
import net.neoforged.fml.common.asm.enumextension.NetworkedEnum;
@NetworkedEnum(NetworkedEnum.NetworkCheck.CLIENTBOUND)
public enum SomeEnum implements IExtensibleEnum {
LITERAL;
public static ExtensionInfo getExtensionInfo() {
return ExtensionInfo.nonExtended(SomeEnum.class);
}
}
""")
.build();
launchAndLoad("forgeclient");

var extensibleEnum = getEnumClass("testmod.SomeEnum");
var extensionInfo = getExtensionInfo(extensibleEnum);
assertTrue(extensionInfo.extended());
assertEquals(1, extensionInfo.vanillaCount());
assertEquals(2, extensionInfo.totalCount());
assertEquals(NetworkedEnum.NetworkCheck.CLIENTBOUND, extensionInfo.netCheck());
}

private ExtensionInfo getExtensionInfo(Class<?> enumClass) throws Exception {
var getExtensionInfo = enumClass.getMethod("getExtensionInfo");
return (ExtensionInfo) getExtensionInfo.invoke(null);
Expand Down

0 comments on commit c2eb8f1

Please sign in to comment.