Skip to content

Generic '&' operator / fabric #507

@Sneakometer

Description

@Sneakometer

Hello,

i'm developing a fabric mod using the sponge mixins where i need to to invoke a private method from within a mixin.
I created an interface with the method signatures i want to call from the target class. It look like the following:

@Mixin(Screen.class)
public interface IScreen {

	@Invoker(remap = true)
	<T extends Drawable> T callAddDrawable(T drawable);

	@Invoker(remap = true)
	<T extends Element & Selectable> T callAddSelectableChild(T child);
}

Now in my implementing (abstract) screen mixin, i can call the "callAddDrawable" method and it works great.
However, calling the "callAddSelectableChild" the same way does ONLY work in dev (gradle runClient) and not if i build the mod and run it with the fabric loader.
I get the following exception:

Mixin apply failed mymod.mixins.json:IScreen -> net.minecraft.class_437: org.spongepowered.asm.mixin.gen.throwables.InvalidAccessorException No candidates were found matching addSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364; in net/minecraft/class_437 for mymod.mixins.json:IScreen->@Invoker[METHOD_PROXY]::invokeAddSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364; [INJECT Applicator Phase -> mymod.mixins.json:IScreen -> Apply Accessors ->  -> Locate -> mymod.mixins.json:IScreen->@Invoker[METHOD_PROXY]::invokeAddSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364;]
org.spongepowered.asm.mixin.gen.throwables.InvalidAccessorException: No candidates were found matching addSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364; in net/minecraft/class_437 for mymod.mixins.json:IScreen->@Invoker[METHOD_PROXY]::invokeAddSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364; [INJECT Applicator Phase -> mymod.mixins.json:IScreen -> Apply Accessors ->  -> Locate -> mymod.mixins.json:IScreen->@Invoker[METHOD_PROXY]::invokeAddSelectableChild(Lnet/minecraft/class_364;)Lnet/minecraft/class_364;]
	at org.spongepowered.asm.mixin.gen.InvokerInfo.findTargetMethod(InvokerInfo.java:117)
	at org.spongepowered.asm.mixin.gen.InvokerInfo.locate(InvokerInfo.java:101)
	at org.spongepowered.asm.mixin.transformer.MixinTargetContext.generateAccessors(MixinTargetContext.java:1318)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyAccessors(MixinApplicatorStandard.java:1051)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.applyMixin(MixinApplicatorStandard.java:393)
	at org.spongepowered.asm.mixin.transformer.MixinApplicatorStandard.apply(MixinApplicatorStandard.java:320)
	at org.spongepowered.asm.mixin.transformer.TargetClassContext.applyMixins(TargetClassContext.java:345)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:569)
	at org.spongepowered.asm.mixin.transformer.MixinProcessor.applyMixins(MixinProcessor.java:351)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClass(MixinTransformer.java:208)
	at org.spongepowered.asm.mixin.transformer.MixinTransformer.transformClassBytes(MixinTransformer.java:178)
	at org.spongepowered.asm.mixin.transformer.FabricMixinTransformerProxy.transformClassBytes(FabricMixinTransformerProxy.java:23)
	at net.fabricmc.loader.launch.knot.KnotClassDelegate.getPostMixinClassByteArray(KnotClassDelegate.java:157)
	at net.fabricmc.loader.launch.knot.KnotClassLoader.loadClass(KnotClassLoader.java:150)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)
	at net.optifine.reflect.Reflector.<clinit>(Reflector.java:185)
	at net.minecraft.class_128.<init>(class_128.java:44)
	at net.minecraft.class_128.method_24305(class_128.java:349)
	at net.minecraft.client.main.Main.main(Main.java:137)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:567)
	at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:226)
	at net.fabricmc.loader.launch.knot.Knot.launch(Knot.java:146)
	at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:28)

The other one (callAddDrawable) still works with fabric for some reason. I suspect the problem with the '&' operator of the generic T type of the function.

Enrivonment:

  • Java 16 AdoptOpenJDK
  • Minecraft 1.17

I don't know if this is a bug with fabric, sponge or my fault and need your help.
Any help is greatly appreciated, thanks.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions