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,14 +27,7 @@ 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",
@ -49,8 +42,7 @@ public class Commodore
"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();
@ -60,53 +52,40 @@ public class Commodore
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"); JarEntry entry = inJar.getJarEntry(".commodore");
if ( entry != null ) 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());
} }
@ -119,33 +98,25 @@ public class Commodore
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;
@ -185,20 +156,16 @@ public class Commodore
} }
} }
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;
@ -206,18 +173,14 @@ public class Commodore
} }
// 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;
@ -249,13 +212,10 @@ public class Commodore
return; return;
} }
if ( owner.equals( "org/bukkit/Material" ) ) if (owner.equals("org/bukkit/Material")) {
{ try {
try
{
Material.valueOf("LEGACY_" + name); Material.valueOf("LEGACY_" + name);
} catch ( IllegalArgumentException ex ) } 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?"); throw new AuthorNagException("No legacy enum constant for " + name + ". Did you forget to define a modern (1.13+) api-version in your plugin.yml?");
} }
@ -263,10 +223,8 @@ public class Commodore
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;
@ -276,20 +234,16 @@ public class Commodore
} }
} }
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":
@ -302,51 +256,41 @@ public class Commodore
} }
@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;
@ -360,8 +304,7 @@ public class Commodore
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;
} }
@ -371,8 +314,7 @@ public class Commodore
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);
@ -382,25 +324,20 @@ public class Commodore
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":
@ -417,8 +354,7 @@ public class Commodore
} }
} }
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;
@ -428,10 +364,8 @@ public class Commodore
} }
@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;
} }
@ -440,11 +374,9 @@ public class Commodore
} }
@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]; Type samMethodType = (Type) bootstrapMethodArguments[0];
Handle implMethod = (Handle) bootstrapMethodArguments[1]; Handle implMethod = (Handle) bootstrapMethodArguments[1];
Type instantiatedMethodType = (Type) bootstrapMethodArguments[2]; Type instantiatedMethodType = (Type) bootstrapMethodArguments[2];
@ -452,8 +384,7 @@ public class Commodore
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());
} }