From 9024a09b92c2ffd88437c0cb2226ba1d5b6baa08 Mon Sep 17 00:00:00 2001 From: DerFrZocker Date: Fri, 22 Sep 2023 02:57:13 +1000 Subject: [PATCH] #1251: Use Java Consumer instead of Bukkit Consumer --- .../craftbukkit/CraftRegionAccessor.java | 2 +- .../org/bukkit/craftbukkit/CraftWorld.java | 2 +- .../generator/CraftLimitedRegion.java | 2 +- .../bukkit/craftbukkit/util/Commodore.java | 38 +++++++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java index cb26162b5..5a363abc5 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java @@ -6,6 +6,7 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Random; +import java.util.function.Consumer; import java.util.function.Predicate; import net.minecraft.core.BlockPosition; import net.minecraft.core.EnumDirection; @@ -213,7 +214,6 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; -import org.bukkit.util.Consumer; import org.bukkit.util.Vector; public abstract class CraftRegionAccessor implements RegionAccessor { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index dd58deafb..32ef94474 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -21,6 +21,7 @@ import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; import net.minecraft.core.BlockPosition; @@ -137,7 +138,6 @@ import org.bukkit.plugin.messaging.StandardMessenger; import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; import org.bukkit.util.BoundingBox; -import org.bukkit.util.Consumer; import org.bukkit.util.RayTraceResult; import org.bukkit.util.StructureSearchResult; import org.bukkit.util.Vector; diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java b/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java index 4dbfc006b..7afb8d38b 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/CraftLimitedRegion.java @@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Random; +import java.util.function.Consumer; import net.minecraft.core.BlockPosition; import net.minecraft.core.Holder; import net.minecraft.nbt.NBTTagCompound; @@ -29,7 +30,6 @@ import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.generator.LimitedRegion; import org.bukkit.util.BoundingBox; -import org.bukkit.util.Consumer; public class CraftLimitedRegion extends CraftRegionAccessor implements LimitedRegion { diff --git a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java index 41c6ad400..21a1476dd 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java +++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java @@ -4,9 +4,11 @@ import com.google.common.io.ByteStreams; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; +import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -20,6 +22,7 @@ import org.bukkit.plugin.AuthorNagException; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Handle; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -329,6 +332,12 @@ public class Commodore return; } + if ( owner.startsWith( "org/bukkit" ) && desc.contains( "org/bukkit/util/Consumer" ) ) + { + super.visitMethodInsn( opcode, owner, name, desc.replace( "org/bukkit/util/Consumer", "java/util/function/Consumer" ), itf ); + return; + } + if ( modern ) { if ( owner.equals( "org/bukkit/Material" ) ) @@ -426,6 +435,35 @@ public class Commodore super.visitLdcInsn( value ); } + + @Override + public void visitInvokeDynamicInsn( String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments ) + { + if ( bootstrapMethodHandle.getOwner().equals( "java/lang/invoke/LambdaMetafactory" ) + && bootstrapMethodHandle.getName().equals( "metafactory" ) && bootstrapMethodArguments.length == 3 ) + { + Type samMethodType = (Type) bootstrapMethodArguments[ 0 ]; + Handle implMethod = (Handle) bootstrapMethodArguments[ 1 ]; + Type instantiatedMethodType = (Type) bootstrapMethodArguments[ 2 ]; + + List newTypes = new ArrayList<>(); + newTypes.add( samMethodType ); + + if ( implMethod.getOwner().startsWith( "org/bukkit" ) && implMethod.getDesc().contains( "org/bukkit/util/Consumer" ) ) + { + implMethod = new Handle( implMethod.getTag(), implMethod.getOwner(), implMethod.getName(), + implMethod.getDesc().replace( "org/bukkit/util/Consumer", "java/util/function/Consumer" ), implMethod.isInterface() ); + } + + newTypes.add( implMethod ); + newTypes.add( instantiatedMethodType ); + + super.visitInvokeDynamicInsn( name, descriptor, bootstrapMethodHandle, newTypes.toArray() ); + return; + } + + super.visitInvokeDynamicInsn( name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments ); + } }; } }, 0 );