Reformat Commodore.java

This commit is contained in:
md_5 2024-01-06 16:15:21 +11:00
parent 9fde4c037c
commit 1462ebe85d
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11

View File

@ -27,16 +27,9 @@ import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type; import org.objectweb.asm.Type;
/** public class Commodore {
* This file is imported from Commodore.
*
* @author md_5
*/
// CHECKSTYLE:OFF
public class Commodore
{
private static final Set<String> EVIL = new HashSet<>( Arrays.asList( private static final Set<String> EVIL = new HashSet<>(Arrays.asList(
"org/bukkit/World (III)I getBlockTypeIdAt", "org/bukkit/World (III)I getBlockTypeIdAt",
"org/bukkit/World (Lorg/bukkit/Location;)I getBlockTypeIdAt", "org/bukkit/World (Lorg/bukkit/Location;)I getBlockTypeIdAt",
"org/bukkit/block/Block ()I getTypeId", "org/bukkit/block/Block ()I getTypeId",
@ -47,177 +40,147 @@ public class Commodore
"org/bukkit/block/Block (BZ)V setData", "org/bukkit/block/Block (BZ)V setData",
"org/bukkit/inventory/ItemStack ()I getTypeId", "org/bukkit/inventory/ItemStack ()I getTypeId",
"org/bukkit/inventory/ItemStack (I)V setTypeId" "org/bukkit/inventory/ItemStack (I)V setTypeId"
) ); ));
public static void main(String[] args) public static void main(String[] args) {
{
OptionParser parser = new OptionParser(); OptionParser parser = new OptionParser();
OptionSpec<File> inputFlag = parser.acceptsAll( Arrays.asList( "i", "input" ) ).withRequiredArg().ofType( File.class ).required(); OptionSpec<File> inputFlag = parser.acceptsAll(Arrays.asList("i", "input")).withRequiredArg().ofType(File.class).required();
OptionSpec<File> outputFlag = parser.acceptsAll( Arrays.asList( "o", "output" ) ).withRequiredArg().ofType( File.class ).required(); OptionSpec<File> outputFlag = parser.acceptsAll(Arrays.asList("o", "output")).withRequiredArg().ofType(File.class).required();
OptionSet options = parser.parse( args ); OptionSet options = parser.parse(args);
File input = options.valueOf( inputFlag ); File input = options.valueOf(inputFlag);
File output = options.valueOf( outputFlag ); File output = options.valueOf(outputFlag);
if ( input.isDirectory() ) if (input.isDirectory()) {
{ if (!output.isDirectory()) {
if ( !output.isDirectory() ) System.err.println("If input directory specified, output directory required too");
{
System.err.println( "If input directory specified, output directory required too" );
return; return;
} }
for ( File in : input.listFiles() ) for (File in : input.listFiles()) {
{ if (in.getName().endsWith(".jar")) {
if ( in.getName().endsWith( ".jar" ) ) convert(in, new File(output, in.getName()));
{
convert( in, new File( output, in.getName() ) );
} }
} }
} else } else {
{ convert(input, output);
convert( input, output );
} }
} }
private static void convert(File in, File out) private static void convert(File in, File out) {
{ System.out.println("Attempting to convert " + in + " to " + out);
System.out.println( "Attempting to convert " + in + " to " + out );
try try {
{ try (JarFile inJar = new JarFile(in, false)) {
try ( JarFile inJar = new JarFile( in, false ) ) JarEntry entry = inJar.getJarEntry(".commodore");
{ if (entry != null) {
JarEntry entry = inJar.getJarEntry( ".commodore" );
if ( entry != null )
{
return; return;
} }
try ( JarOutputStream outJar = new JarOutputStream( new FileOutputStream( out ) ) ) try (JarOutputStream outJar = new JarOutputStream(new FileOutputStream(out))) {
{ for (Enumeration<JarEntry> entries = inJar.entries(); entries.hasMoreElements();) {
for ( Enumeration<JarEntry> entries = inJar.entries(); entries.hasMoreElements(); )
{
entry = entries.nextElement(); entry = entries.nextElement();
try ( InputStream is = inJar.getInputStream( entry ) ) try (InputStream is = inJar.getInputStream(entry)) {
{ byte[] b = ByteStreams.toByteArray(is);
byte[] b = ByteStreams.toByteArray( is );
if ( entry.getName().endsWith( ".class" ) ) if (entry.getName().endsWith(".class")) {
{ b = convert(b, false);
b = convert( b, false ); entry = new JarEntry(entry.getName());
entry = new JarEntry( entry.getName() );
} }
outJar.putNextEntry( entry ); outJar.putNextEntry(entry);
outJar.write( b ); outJar.write(b);
} }
} }
outJar.putNextEntry( new ZipEntry( ".commodore" ) ); outJar.putNextEntry(new ZipEntry(".commodore"));
} }
} }
} catch ( Exception ex ) } catch (Exception ex) {
{ System.err.println("Fatal error trying to convert " + in);
System.err.println( "Fatal error trying to convert " + in );
ex.printStackTrace(); ex.printStackTrace();
} }
} }
public static byte[] convert(byte[] b, final boolean modern) public static byte[] convert(byte[] b, final boolean modern) {
{ ClassReader cr = new ClassReader(b);
ClassReader cr = new ClassReader( b ); ClassWriter cw = new ClassWriter(cr, 0);
ClassWriter cw = new ClassWriter( cr, 0 );
cr.accept( new ClassVisitor( Opcodes.ASM9, cw ) cr.accept(new ClassVisitor(Opcodes.ASM9, cw) {
{
@Override @Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
{ return new MethodVisitor(api, super.visitMethod(access, name, desc, signature, exceptions)) {
return new MethodVisitor( api, super.visitMethod( access, name, desc, signature, exceptions ) )
{
@Override @Override
public void visitFieldInsn(int opcode, String owner, String name, String desc) public void visitFieldInsn(int opcode, String owner, String name, String desc) {
{ if (owner.equals("org/bukkit/block/Biome")) {
if ( owner.equals( "org/bukkit/block/Biome" ) ) switch (name) {
{
switch ( name )
{
case "NETHER": case "NETHER":
super.visitFieldInsn( opcode, owner, "NETHER_WASTES", desc ); super.visitFieldInsn(opcode, owner, "NETHER_WASTES", desc);
return; return;
case "TALL_BIRCH_FOREST": case "TALL_BIRCH_FOREST":
super.visitFieldInsn( opcode, owner, "OLD_GROWTH_BIRCH_FOREST", desc ); super.visitFieldInsn(opcode, owner, "OLD_GROWTH_BIRCH_FOREST", desc);
return; return;
case "GIANT_TREE_TAIGA": case "GIANT_TREE_TAIGA":
super.visitFieldInsn( opcode, owner, "OLD_GROWTH_PINE_TAIGA", desc ); super.visitFieldInsn(opcode, owner, "OLD_GROWTH_PINE_TAIGA", desc);
return; return;
case "GIANT_SPRUCE_TAIGA": case "GIANT_SPRUCE_TAIGA":
super.visitFieldInsn( opcode, owner, "OLD_GROWTH_SPRUCE_TAIGA", desc ); super.visitFieldInsn(opcode, owner, "OLD_GROWTH_SPRUCE_TAIGA", desc);
return; return;
case "SNOWY_TUNDRA": case "SNOWY_TUNDRA":
super.visitFieldInsn( opcode, owner, "SNOWY_PLAINS", desc ); super.visitFieldInsn(opcode, owner, "SNOWY_PLAINS", desc);
return; return;
case "JUNGLE_EDGE": case "JUNGLE_EDGE":
super.visitFieldInsn( opcode, owner, "SPARSE_JUNGLE", desc ); super.visitFieldInsn(opcode, owner, "SPARSE_JUNGLE", desc);
return; return;
case "STONE_SHORE": case "STONE_SHORE":
super.visitFieldInsn( opcode, owner, "STONY_SHORE", desc ); super.visitFieldInsn(opcode, owner, "STONY_SHORE", desc);
return; return;
case "MOUNTAINS": case "MOUNTAINS":
super.visitFieldInsn( opcode, owner, "WINDSWEPT_HILLS", desc ); super.visitFieldInsn(opcode, owner, "WINDSWEPT_HILLS", desc);
return; return;
case "WOODED_MOUNTAINS": case "WOODED_MOUNTAINS":
super.visitFieldInsn( opcode, owner, "WINDSWEPT_FOREST", desc ); super.visitFieldInsn(opcode, owner, "WINDSWEPT_FOREST", desc);
return; return;
case "GRAVELLY_MOUNTAINS": case "GRAVELLY_MOUNTAINS":
super.visitFieldInsn( opcode, owner, "WINDSWEPT_GRAVELLY_HILLS", desc ); super.visitFieldInsn(opcode, owner, "WINDSWEPT_GRAVELLY_HILLS", desc);
return; return;
case "SHATTERED_SAVANNA": case "SHATTERED_SAVANNA":
super.visitFieldInsn( opcode, owner, "WINDSWEPT_SAVANNA", desc ); super.visitFieldInsn(opcode, owner, "WINDSWEPT_SAVANNA", desc);
return; return;
case "WOODED_BADLANDS_PLATEAU": case "WOODED_BADLANDS_PLATEAU":
super.visitFieldInsn( opcode, owner, "WOODED_BADLANDS", desc ); super.visitFieldInsn(opcode, owner, "WOODED_BADLANDS", desc);
return; return;
} }
} }
if ( owner.equals( "org/bukkit/entity/EntityType" ) ) if (owner.equals("org/bukkit/entity/EntityType")) {
{ switch (name) {
switch ( name )
{
case "PIG_ZOMBIE": case "PIG_ZOMBIE":
super.visitFieldInsn( opcode, owner, "ZOMBIFIED_PIGLIN", desc ); super.visitFieldInsn(opcode, owner, "ZOMBIFIED_PIGLIN", desc);
return; return;
} }
} }
if ( owner.equals( "org/bukkit/loot/LootTables" ) ) if (owner.equals("org/bukkit/loot/LootTables")) {
{ switch (name) {
switch ( name )
{
case "ZOMBIE_PIGMAN": case "ZOMBIE_PIGMAN":
super.visitFieldInsn( opcode, owner, "ZOMBIFIED_PIGLIN", desc ); super.visitFieldInsn(opcode, owner, "ZOMBIFIED_PIGLIN", desc);
return; return;
} }
} }
// SPIGOT-7335 // SPIGOT-7335
if ( owner.equals( "org/bukkit/entity/TextDisplay$TextAligment" ) ) if (owner.equals("org/bukkit/entity/TextDisplay$TextAligment")) {
{ super.visitFieldInsn(opcode, "org/bukkit/entity/TextDisplay$TextAlignment", name, desc);
super.visitFieldInsn( opcode, "org/bukkit/entity/TextDisplay$TextAlignment", name, desc );
return; return;
} }
if ( modern ) if (modern) {
{ if (owner.equals("org/bukkit/Material")) {
if ( owner.equals( "org/bukkit/Material" ) ) switch (name) {
{
switch ( name )
{
case "CACTUS_GREEN": case "CACTUS_GREEN":
name = "GREEN_DYE"; name = "GREEN_DYE";
break; break;
@ -245,231 +208,199 @@ public class Commodore
} }
} }
super.visitFieldInsn( opcode, owner, name, desc ); super.visitFieldInsn(opcode, owner, name, desc);
return; return;
} }
if ( owner.equals( "org/bukkit/Material" ) ) if (owner.equals("org/bukkit/Material")) {
{ try {
try Material.valueOf("LEGACY_" + name);
{ } catch (IllegalArgumentException ex) {
Material.valueOf( "LEGACY_" + name ); throw new AuthorNagException("No legacy enum constant for " + name + ". Did you forget to define a modern (1.13+) api-version in your plugin.yml?");
} catch ( IllegalArgumentException ex )
{
throw new AuthorNagException( "No legacy enum constant for " + name + ". Did you forget to define a modern (1.13+) api-version in your plugin.yml?" );
} }
super.visitFieldInsn( opcode, owner, "LEGACY_" + name, desc ); super.visitFieldInsn(opcode, owner, "LEGACY_" + name, desc);
return; return;
} }
if ( owner.equals( "org/bukkit/Art" ) ) if (owner.equals("org/bukkit/Art")) {
{ switch (name) {
switch ( name )
{
case "BURNINGSKULL": case "BURNINGSKULL":
super.visitFieldInsn( opcode, owner, "BURNING_SKULL", desc ); super.visitFieldInsn(opcode, owner, "BURNING_SKULL", desc);
return; return;
case "DONKEYKONG": case "DONKEYKONG":
super.visitFieldInsn( opcode, owner, "DONKEY_KONG", desc ); super.visitFieldInsn(opcode, owner, "DONKEY_KONG", desc);
return; return;
} }
} }
if ( owner.equals( "org/bukkit/DyeColor" ) ) if (owner.equals("org/bukkit/DyeColor")) {
{ switch (name) {
switch ( name )
{
case "SILVER": case "SILVER":
super.visitFieldInsn( opcode, owner, "LIGHT_GRAY", desc ); super.visitFieldInsn(opcode, owner, "LIGHT_GRAY", desc);
return; return;
} }
} }
if ( owner.equals( "org/bukkit/Particle" ) ) if (owner.equals("org/bukkit/Particle")) {
{ switch (name) {
switch ( name )
{
case "BLOCK_CRACK": case "BLOCK_CRACK":
case "BLOCK_DUST": case "BLOCK_DUST":
case "FALLING_DUST": case "FALLING_DUST":
super.visitFieldInsn( opcode, owner, "LEGACY_" + name, desc ); super.visitFieldInsn(opcode, owner, "LEGACY_" + name, desc);
return; return;
} }
} }
super.visitFieldInsn( opcode, owner, name, desc ); super.visitFieldInsn(opcode, owner, name, desc);
} }
@Override @Override
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) {
{
// SPIGOT-4496 // SPIGOT-4496
if ( owner.equals( "org/bukkit/map/MapView" ) && name.equals( "getId" ) && desc.equals( "()S" ) ) if (owner.equals("org/bukkit/map/MapView") && name.equals("getId") && desc.equals("()S")) {
{
// Should be same size on stack so just call other method // Should be same size on stack so just call other method
super.visitMethodInsn( opcode, owner, name, "()I", itf ); super.visitMethodInsn(opcode, owner, name, "()I", itf);
return; return;
} }
// SPIGOT-4608 // SPIGOT-4608
if ( (owner.equals( "org/bukkit/Bukkit" ) || owner.equals( "org/bukkit/Server" ) ) && name.equals( "getMap" ) && desc.equals( "(S)Lorg/bukkit/map/MapView;" ) ) if ((owner.equals("org/bukkit/Bukkit") || owner.equals("org/bukkit/Server")) && name.equals("getMap") && desc.equals("(S)Lorg/bukkit/map/MapView;")) {
{
// Should be same size on stack so just call other method // Should be same size on stack so just call other method
super.visitMethodInsn( opcode, owner, name, "(I)Lorg/bukkit/map/MapView;", itf ); super.visitMethodInsn(opcode, owner, name, "(I)Lorg/bukkit/map/MapView;", itf);
return; return;
} }
// SPIGOT-7335 // SPIGOT-7335
if ( owner.equals( "org/bukkit/entity/TextDisplay$TextAligment" ) ) if (owner.equals("org/bukkit/entity/TextDisplay$TextAligment")) {
{ super.visitMethodInsn(opcode, "org/bukkit/entity/TextDisplay$TextAlignment", name, desc, itf);
super.visitMethodInsn( opcode, "org/bukkit/entity/TextDisplay$TextAlignment", name, desc, itf );
return; return;
} }
if ( desc.equals( "(Lorg/bukkit/entity/TextDisplay$TextAligment;)V" ) ) if (desc.equals("(Lorg/bukkit/entity/TextDisplay$TextAligment;)V")) {
{ super.visitMethodInsn(opcode, owner, name, "(Lorg/bukkit/entity/TextDisplay$TextAlignment;)V", itf);
super.visitMethodInsn( opcode, owner, name, "(Lorg/bukkit/entity/TextDisplay$TextAlignment;)V", itf );
return; return;
} }
if ( desc.equals( "()Lorg/bukkit/entity/TextDisplay$TextAligment;" ) ) if (desc.equals("()Lorg/bukkit/entity/TextDisplay$TextAligment;")) {
{ super.visitMethodInsn(opcode, owner, name, "()Lorg/bukkit/entity/TextDisplay$TextAlignment;", itf);
super.visitMethodInsn( opcode, owner, name, "()Lorg/bukkit/entity/TextDisplay$TextAlignment;", itf );
return; return;
} }
if ( owner.startsWith( "org/bukkit" ) && desc.contains( "org/bukkit/util/Consumer" ) ) 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);
super.visitMethodInsn( opcode, owner, name, desc.replace( "org/bukkit/util/Consumer", "java/util/function/Consumer" ), itf );
return; return;
} }
if ( modern ) if (modern) {
{ if (owner.equals("org/bukkit/Material")) {
if ( owner.equals( "org/bukkit/Material" ) ) switch (name) {
{
switch ( name )
{
case "values": case "values":
super.visitMethodInsn( opcode, "org/bukkit/craftbukkit/util/CraftLegacy", "modern_" + name, desc, itf ); super.visitMethodInsn(opcode, "org/bukkit/craftbukkit/util/CraftLegacy", "modern_" + name, desc, itf);
return; return;
case "ordinal": case "ordinal":
super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftLegacy", "modern_" + name, "(Lorg/bukkit/Material;)I", false ); super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftLegacy", "modern_" + name, "(Lorg/bukkit/Material;)I", false);
return; return;
} }
} }
super.visitMethodInsn( opcode, owner, name, desc, itf ); super.visitMethodInsn(opcode, owner, name, desc, itf);
return; return;
} }
if ( owner.equals( "org/bukkit/ChunkSnapshot" ) && name.equals( "getBlockData" ) && desc.equals( "(III)I" ) ) if (owner.equals("org/bukkit/ChunkSnapshot") && name.equals("getBlockData") && desc.equals("(III)I")) {
{ super.visitMethodInsn(opcode, owner, "getData", desc, itf);
super.visitMethodInsn( opcode, owner, "getData", desc, itf );
return; return;
} }
Type retType = Type.getReturnType( desc ); Type retType = Type.getReturnType(desc);
if ( EVIL.contains( owner + " " + desc + " " + name ) if (EVIL.contains(owner + " " + desc + " " + name)
|| ( owner.startsWith( "org/bukkit/block/" ) && ( desc + " " + name ).equals( "()I getTypeId" ) ) || (owner.startsWith("org/bukkit/block/") && (desc + " " + name).equals("()I getTypeId"))
|| ( owner.startsWith( "org/bukkit/block/" ) && ( desc + " " + name ).equals( "(I)Z setTypeId" ) ) || (owner.startsWith("org/bukkit/block/") && (desc + " " + name).equals("(I)Z setTypeId"))
|| ( owner.startsWith( "org/bukkit/block/" ) && ( desc + " " + name ).equals( "()Lorg/bukkit/Material; getType" ) ) ) || (owner.startsWith("org/bukkit/block/") && (desc + " " + name).equals("()Lorg/bukkit/Material; getType"))) {
{ Type[] args = Type.getArgumentTypes(desc);
Type[] args = Type.getArgumentTypes( desc ); Type[] newArgs = new Type[args.length + 1];
Type[] newArgs = new Type[ args.length + 1 ]; newArgs[0] = Type.getObjectType(owner);
newArgs[0] = Type.getObjectType( owner ); System.arraycopy(args, 0, newArgs, 1, args.length);
System.arraycopy( args, 0, newArgs, 1, args.length );
super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/legacy/CraftEvil", name, Type.getMethodDescriptor( retType, newArgs ), false ); super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/legacy/CraftEvil", name, Type.getMethodDescriptor(retType, newArgs), false);
return; return;
} }
if ( owner.equals( "org/bukkit/DyeColor" ) ) if (owner.equals("org/bukkit/DyeColor")) {
{ if (name.equals("valueOf") && desc.equals("(Ljava/lang/String;)Lorg/bukkit/DyeColor;")) {
if ( name.equals( "valueOf" ) && desc.equals( "(Ljava/lang/String;)Lorg/bukkit/DyeColor;" ) ) super.visitMethodInsn(opcode, owner, "legacyValueOf", desc, itf);
{
super.visitMethodInsn( opcode, owner, "legacyValueOf", desc, itf );
return; return;
} }
} }
if ( owner.equals( "org/bukkit/Material" ) ) if (owner.equals("org/bukkit/Material")) {
{ if (name.equals("getMaterial") && desc.equals("(I)Lorg/bukkit/Material;")) {
if ( name.equals( "getMaterial" ) && desc.equals( "(I)Lorg/bukkit/Material;" ) ) super.visitMethodInsn(opcode, "org/bukkit/craftbukkit/legacy/CraftEvil", name, desc, itf);
{
super.visitMethodInsn( opcode, "org/bukkit/craftbukkit/legacy/CraftEvil", name, desc, itf );
return; return;
} }
switch ( name ) switch (name) {
{
case "values": case "values":
case "valueOf": case "valueOf":
case "getMaterial": case "getMaterial":
case "matchMaterial": case "matchMaterial":
super.visitMethodInsn( opcode, "org/bukkit/craftbukkit/legacy/CraftLegacy", name, desc, itf ); super.visitMethodInsn(opcode, "org/bukkit/craftbukkit/legacy/CraftLegacy", name, desc, itf);
return; return;
case "ordinal": case "ordinal":
super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/legacy/CraftLegacy", "ordinal", "(Lorg/bukkit/Material;)I", false ); super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/legacy/CraftLegacy", "ordinal", "(Lorg/bukkit/Material;)I", false);
return; return;
case "name": case "name":
case "toString": case "toString":
super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/legacy/CraftLegacy", name, "(Lorg/bukkit/Material;)Ljava/lang/String;", false ); super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/legacy/CraftLegacy", name, "(Lorg/bukkit/Material;)Ljava/lang/String;", false);
return; return;
} }
} }
if ( retType.getSort() == Type.OBJECT && retType.getInternalName().equals( "org/bukkit/Material" ) && owner.startsWith( "org/bukkit" ) ) if (retType.getSort() == Type.OBJECT && retType.getInternalName().equals("org/bukkit/Material") && owner.startsWith("org/bukkit")) {
{ super.visitMethodInsn(opcode, owner, name, desc, itf);
super.visitMethodInsn( opcode, owner, name, desc, itf ); super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/legacy/CraftLegacy", "toLegacy", "(Lorg/bukkit/Material;)Lorg/bukkit/Material;", false);
super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/legacy/CraftLegacy", "toLegacy", "(Lorg/bukkit/Material;)Lorg/bukkit/Material;", false );
return; return;
} }
super.visitMethodInsn( opcode, owner, name, desc, itf ); super.visitMethodInsn(opcode, owner, name, desc, itf);
} }
@Override @Override
public void visitLdcInsn(Object value) public void visitLdcInsn(Object value) {
{ if (value instanceof String && ((String) value).equals("com.mysql.jdbc.Driver")) {
if ( value instanceof String && ( (String) value ).equals( "com.mysql.jdbc.Driver" ) ) super.visitLdcInsn("com.mysql.cj.jdbc.Driver");
{
super.visitLdcInsn( "com.mysql.cj.jdbc.Driver" );
return; return;
} }
super.visitLdcInsn( value ); super.visitLdcInsn(value);
} }
@Override @Override
public void visitInvokeDynamicInsn( String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments ) public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments) {
{ if (bootstrapMethodHandle.getOwner().equals("java/lang/invoke/LambdaMetafactory")
if ( bootstrapMethodHandle.getOwner().equals( "java/lang/invoke/LambdaMetafactory" ) && bootstrapMethodHandle.getName().equals("metafactory") && bootstrapMethodArguments.length == 3) {
&& bootstrapMethodHandle.getName().equals( "metafactory" ) && bootstrapMethodArguments.length == 3 ) Type samMethodType = (Type) bootstrapMethodArguments[0];
{ Handle implMethod = (Handle) bootstrapMethodArguments[1];
Type samMethodType = (Type) bootstrapMethodArguments[ 0 ]; Type instantiatedMethodType = (Type) bootstrapMethodArguments[2];
Handle implMethod = (Handle) bootstrapMethodArguments[ 1 ];
Type instantiatedMethodType = (Type) bootstrapMethodArguments[ 2 ];
List<Object> newTypes = new ArrayList<>(); List<Object> newTypes = new ArrayList<>();
newTypes.add( samMethodType ); newTypes.add(samMethodType);
if ( implMethod.getOwner().startsWith( "org/bukkit" ) && implMethod.getDesc().contains( "org/bukkit/util/Consumer" ) ) if (implMethod.getOwner().startsWith("org/bukkit") && implMethod.getDesc().contains("org/bukkit/util/Consumer")) {
{ implMethod = new Handle(implMethod.getTag(), implMethod.getOwner(), implMethod.getName(),
implMethod = new Handle( implMethod.getTag(), implMethod.getOwner(), implMethod.getName(), implMethod.getDesc().replace("org/bukkit/util/Consumer", "java/util/function/Consumer"), implMethod.isInterface());
implMethod.getDesc().replace( "org/bukkit/util/Consumer", "java/util/function/Consumer" ), implMethod.isInterface() );
} }
newTypes.add( implMethod ); newTypes.add(implMethod);
newTypes.add( instantiatedMethodType ); newTypes.add(instantiatedMethodType);
super.visitInvokeDynamicInsn( name, descriptor, bootstrapMethodHandle, newTypes.toArray() ); super.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, newTypes.toArray());
return; return;
} }
super.visitInvokeDynamicInsn( name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments ); super.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);
} }
}; };
} }
}, 0 ); }, 0);
return cw.toByteArray(); return cw.toByteArray();
} }