diff options
| author | 2018-05-19 18:02:29 +0200 | |
|---|---|---|
| committer | 2018-05-19 18:02:29 +0200 | |
| commit | 8e7453727ff059c8f1db7f89f6793d22cbd5e6fc (patch) | |
| tree | d15e55f61705fd9cd0a1d54816c09d0b6cc0ec36 /src/main/java/cuchaz/enigma/bytecode | |
| parent | Package updates (diff) | |
| download | enigma-fork-8e7453727ff059c8f1db7f89f6793d22cbd5e6fc.tar.gz enigma-fork-8e7453727ff059c8f1db7f89f6793d22cbd5e6fc.tar.xz enigma-fork-8e7453727ff059c8f1db7f89f6793d22cbd5e6fc.zip | |
Annotation + inner class translation
Diffstat (limited to 'src/main/java/cuchaz/enigma/bytecode')
5 files changed, 111 insertions, 17 deletions
diff --git a/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java b/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java index 0999abf..152f462 100644 --- a/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java +++ b/src/main/java/cuchaz/enigma/bytecode/AccessFlags.java | |||
| @@ -5,6 +5,9 @@ import org.objectweb.asm.Opcodes; | |||
| 5 | import java.lang.reflect.Modifier; | 5 | import java.lang.reflect.Modifier; |
| 6 | 6 | ||
| 7 | public class AccessFlags { | 7 | public class AccessFlags { |
| 8 | public static final AccessFlags PUBLIC = new AccessFlags(Modifier.PUBLIC); | ||
| 9 | public static final AccessFlags PUBLIC_STATIC_FINAL = new AccessFlags(Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL); | ||
| 10 | |||
| 8 | private static final int SYNTHETIC_FLAG = 0x00001000; | 11 | private static final int SYNTHETIC_FLAG = 0x00001000; |
| 9 | private static final int BRIDGED_FLAG = 0x00000040; | 12 | private static final int BRIDGED_FLAG = 0x00000040; |
| 10 | 13 | ||
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java new file mode 100644 index 0000000..177691b --- /dev/null +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationAnnotationVisitor.java | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | package cuchaz.enigma.bytecode.translators; | ||
| 2 | |||
| 3 | import cuchaz.enigma.bytecode.AccessFlags; | ||
| 4 | import cuchaz.enigma.mapping.Translator; | ||
| 5 | import cuchaz.enigma.mapping.TypeDescriptor; | ||
| 6 | import cuchaz.enigma.mapping.entry.ClassEntry; | ||
| 7 | import cuchaz.enigma.mapping.entry.FieldDefEntry; | ||
| 8 | import org.objectweb.asm.AnnotationVisitor; | ||
| 9 | import org.objectweb.asm.Type; | ||
| 10 | |||
| 11 | public class TranslationAnnotationVisitor extends AnnotationVisitor { | ||
| 12 | private final Translator translator; | ||
| 13 | private final ClassEntry annotationEntry; | ||
| 14 | |||
| 15 | public TranslationAnnotationVisitor(Translator translator, ClassEntry annotationEntry, int api, AnnotationVisitor av) { | ||
| 16 | super(api, av); | ||
| 17 | this.translator = translator; | ||
| 18 | this.annotationEntry = annotationEntry; | ||
| 19 | } | ||
| 20 | |||
| 21 | @Override | ||
| 22 | public void visit(String name, Object value) { | ||
| 23 | if (value instanceof Type) { | ||
| 24 | Type type = (Type) value; | ||
| 25 | super.visit(name, translator.getTranslatedType(type)); | ||
| 26 | } else { | ||
| 27 | super.visit(name, value); | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | @Override | ||
| 32 | public AnnotationVisitor visitAnnotation(String name, String desc) { | ||
| 33 | TypeDescriptor type = new TypeDescriptor(desc); | ||
| 34 | FieldDefEntry annotationField = translator.getTranslatedFieldDef(new FieldDefEntry(annotationEntry, name, type, AccessFlags.PUBLIC)); | ||
| 35 | return super.visitAnnotation(annotationField.getName(), annotationField.getDesc().toString()); | ||
| 36 | } | ||
| 37 | |||
| 38 | @Override | ||
| 39 | public void visitEnum(String name, String desc, String value) { | ||
| 40 | TypeDescriptor type = new TypeDescriptor(desc); | ||
| 41 | FieldDefEntry annotationField = translator.getTranslatedFieldDef(new FieldDefEntry(annotationEntry, name, type, AccessFlags.PUBLIC)); | ||
| 42 | FieldDefEntry enumField = translator.getTranslatedFieldDef(new FieldDefEntry(type.getTypeEntry(), value, type, AccessFlags.PUBLIC_STATIC_FINAL)); | ||
| 43 | super.visitEnum(annotationField.getName(), annotationField.getDesc().toString(), enumField.getName()); | ||
| 44 | } | ||
| 45 | } | ||
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java index 3f61c29..5fdfaf1 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationClassVisitor.java | |||
| @@ -54,7 +54,8 @@ public class TranslationClassVisitor extends ClassVisitor { | |||
| 54 | public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { | 54 | public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { |
| 55 | FieldDefEntry entry = new FieldDefEntry(obfClassEntry, name, new TypeDescriptor(desc), new AccessFlags(access)); | 55 | FieldDefEntry entry = new FieldDefEntry(obfClassEntry, name, new TypeDescriptor(desc), new AccessFlags(access)); |
| 56 | FieldDefEntry translatedEntry = translator.getTranslatedFieldDef(entry); | 56 | FieldDefEntry translatedEntry = translator.getTranslatedFieldDef(entry); |
| 57 | return super.visitField(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), signature, value); | 57 | FieldVisitor fv = super.visitField(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), signature, value); |
| 58 | return new TranslationFieldVisitor(translator, translatedEntry, api, fv); | ||
| 58 | } | 59 | } |
| 59 | 60 | ||
| 60 | @Override | 61 | @Override |
| @@ -64,32 +65,38 @@ public class TranslationClassVisitor extends ClassVisitor { | |||
| 64 | if (jarIndex.getBridgedMethod(entry) != null) { | 65 | if (jarIndex.getBridgedMethod(entry) != null) { |
| 65 | translatedEntry.getAccess().setBridged(); | 66 | translatedEntry.getAccess().setBridged(); |
| 66 | } | 67 | } |
| 67 | MethodVisitor mv = super.visitMethod(translatedEntry.getAccess().getFlags(), name, desc, signature, exceptions); | 68 | String[] translatedExceptions = new String[exceptions.length]; |
| 69 | for (int i = 0; i < exceptions.length; i++) { | ||
| 70 | translatedExceptions[i] = translator.getTranslatedClass(entryPool.getClass(exceptions[i])).getName(); | ||
| 71 | } | ||
| 72 | MethodVisitor mv = super.visitMethod(translatedEntry.getAccess().getFlags(), translatedEntry.getName(), translatedEntry.getDesc().toString(), signature, translatedExceptions); | ||
| 68 | return new TranslationMethodVisitor(translator, translatedEntry, api, mv); | 73 | return new TranslationMethodVisitor(translator, translatedEntry, api, mv); |
| 69 | } | 74 | } |
| 70 | 75 | ||
| 71 | @Override | 76 | @Override |
| 72 | public void visitOuterClass(String owner, String name, String desc) { | 77 | public void visitOuterClass(String owner, String name, String desc) { |
| 78 | ClassEntry ownerEntry = translator.getTranslatedClass(entryPool.getClass(owner)); | ||
| 79 | String translatedDesc = desc != null ? translator.getTranslatedTypeDesc(new TypeDescriptor(desc)).toString() : desc; | ||
| 73 | if (name != null) { | 80 | if (name != null) { |
| 74 | ClassEntry ownerEntry = translator.getTranslatedClass(entryPool.getClass(owner)); | ||
| 75 | ClassEntry entry = translator.getTranslatedClass(entryPool.getClass(name)); | 81 | ClassEntry entry = translator.getTranslatedClass(entryPool.getClass(name)); |
| 76 | String translatedDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)).toString(); | ||
| 77 | super.visitOuterClass(ownerEntry.getName(), entry.getName(), translatedDesc); | 82 | super.visitOuterClass(ownerEntry.getName(), entry.getName(), translatedDesc); |
| 78 | } else { | 83 | } else { |
| 79 | super.visitOuterClass(owner, name, desc); | 84 | super.visitOuterClass(ownerEntry.getName(), name, translatedDesc); |
| 80 | } | 85 | } |
| 81 | } | 86 | } |
| 82 | 87 | ||
| 83 | @Override | 88 | @Override |
| 84 | public AnnotationVisitor visitAnnotation(String desc, boolean visible) { | 89 | public AnnotationVisitor visitAnnotation(String desc, boolean visible) { |
| 85 | // TODO: Implement | 90 | TypeDescriptor translatedDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)); |
| 86 | return super.visitAnnotation(desc, visible); | 91 | AnnotationVisitor av = super.visitAnnotation(translatedDesc.toString(), visible); |
| 92 | return new TranslationAnnotationVisitor(translator, translatedDesc.getTypeEntry(), api, av); | ||
| 87 | } | 93 | } |
| 88 | 94 | ||
| 89 | @Override | 95 | @Override |
| 90 | public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { | 96 | public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { |
| 91 | // TODO: Implement | 97 | TypeDescriptor translatedDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)); |
| 92 | return super.visitTypeAnnotation(typeRef, typePath, desc, visible); | 98 | AnnotationVisitor av = super.visitTypeAnnotation(typeRef, typePath, translatedDesc.toString(), visible); |
| 99 | return new TranslationAnnotationVisitor(translator, translatedDesc.getTypeEntry(), api, av); | ||
| 93 | } | 100 | } |
| 94 | 101 | ||
| 95 | @Override | 102 | @Override |
| @@ -101,7 +108,11 @@ public class TranslationClassVisitor extends ClassVisitor { | |||
| 101 | ClassEntry innerEntry = translator.getTranslatedClass(entryPool.getClass(innerName)); | 108 | ClassEntry innerEntry = translator.getTranslatedClass(entryPool.getClass(innerName)); |
| 102 | super.visitInnerClass(translatedEntry.getName(), outerEntry.getName(), innerEntry.getName(), translatedEntry.getAccess().getFlags()); | 109 | super.visitInnerClass(translatedEntry.getName(), outerEntry.getName(), innerEntry.getName(), translatedEntry.getAccess().getFlags()); |
| 103 | } else { | 110 | } else { |
| 104 | super.visitInnerClass(name, outerName, innerName, access); | 111 | int separatorIndex = name.lastIndexOf("$"); |
| 112 | String parentName = name.substring(0, separatorIndex); | ||
| 113 | String childName = name.substring(separatorIndex + 1); | ||
| 114 | ClassEntry outerEntry = translator.getTranslatedClass(entryPool.getClass(parentName)); | ||
| 115 | super.visitInnerClass(outerEntry.getName() + "$" + childName, outerName, innerName, access); | ||
| 105 | } | 116 | } |
| 106 | } | 117 | } |
| 107 | } | 118 | } |
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationFieldVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationFieldVisitor.java new file mode 100644 index 0000000..e4695fb --- /dev/null +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationFieldVisitor.java | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | package cuchaz.enigma.bytecode.translators; | ||
| 2 | |||
| 3 | import cuchaz.enigma.mapping.Translator; | ||
| 4 | import cuchaz.enigma.mapping.TypeDescriptor; | ||
| 5 | import cuchaz.enigma.mapping.entry.FieldDefEntry; | ||
| 6 | import org.objectweb.asm.AnnotationVisitor; | ||
| 7 | import org.objectweb.asm.FieldVisitor; | ||
| 8 | import org.objectweb.asm.TypePath; | ||
| 9 | |||
| 10 | public class TranslationFieldVisitor extends FieldVisitor { | ||
| 11 | private final FieldDefEntry fieldEntry; | ||
| 12 | private final Translator translator; | ||
| 13 | |||
| 14 | public TranslationFieldVisitor(Translator translator, FieldDefEntry fieldEntry, int api, FieldVisitor fv) { | ||
| 15 | super(api, fv); | ||
| 16 | this.translator = translator; | ||
| 17 | this.fieldEntry = fieldEntry; | ||
| 18 | } | ||
| 19 | |||
| 20 | @Override | ||
| 21 | public AnnotationVisitor visitAnnotation(String desc, boolean visible) { | ||
| 22 | TypeDescriptor typeDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)); | ||
| 23 | AnnotationVisitor av = super.visitAnnotation(typeDesc.toString(), visible); | ||
| 24 | return new TranslationAnnotationVisitor(translator, typeDesc.getTypeEntry(), api, av); | ||
| 25 | } | ||
| 26 | |||
| 27 | @Override | ||
| 28 | public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { | ||
| 29 | TypeDescriptor typeDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)); | ||
| 30 | AnnotationVisitor av = super.visitAnnotation(typeDesc.toString(), visible); | ||
| 31 | return new TranslationAnnotationVisitor(translator, typeDesc.getTypeEntry(), api, av); | ||
| 32 | } | ||
| 33 | } | ||
diff --git a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java index b2192e4..c729962 100644 --- a/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/bytecode/translators/TranslationMethodVisitor.java | |||
| @@ -39,15 +39,17 @@ public class TranslationMethodVisitor extends MethodVisitor { | |||
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | @Override | 41 | @Override |
| 42 | public void visitAttribute(Attribute attr) { | 42 | public AnnotationVisitor visitAnnotation(String desc, boolean visible) { |
| 43 | // TODO: Implement | 43 | TypeDescriptor typeDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)); |
| 44 | super.visitAttribute(attr); | 44 | AnnotationVisitor av = super.visitAnnotation(typeDesc.toString(), visible); |
| 45 | return new TranslationAnnotationVisitor(translator, typeDesc.getTypeEntry(), api, av); | ||
| 45 | } | 46 | } |
| 46 | 47 | ||
| 47 | @Override | 48 | @Override |
| 48 | public AnnotationVisitor visitAnnotation(String desc, boolean visible) { | 49 | public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { |
| 49 | // TODO: Implement | 50 | TypeDescriptor typeDesc = translator.getTranslatedTypeDesc(new TypeDescriptor(desc)); |
| 50 | return super.visitAnnotation(desc, visible); | 51 | AnnotationVisitor av = super.visitAnnotation(typeDesc.toString(), visible); |
| 52 | return new TranslationAnnotationVisitor(translator, typeDesc.getTypeEntry(), api, av); | ||
| 51 | } | 53 | } |
| 52 | 54 | ||
| 53 | @Override | 55 | @Override |
| @@ -69,7 +71,7 @@ public class TranslationMethodVisitor extends MethodVisitor { | |||
| 69 | // List types would require this whole block again, so just go with aListx | 71 | // List types would require this whole block again, so just go with aListx |
| 70 | nameBuilder.append(nameIndex); | 72 | nameBuilder.append(nameIndex); |
| 71 | } else if (argDesc.isType()) { | 73 | } else if (argDesc.isType()) { |
| 72 | String typeName = argDesc.getOwnerEntry().getSimpleName().replace("$", ""); | 74 | String typeName = argDesc.getTypeEntry().getSimpleName().replace("$", ""); |
| 73 | typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); | 75 | typeName = typeName.substring(0, 1).toUpperCase(Locale.ROOT) + typeName.substring(1); |
| 74 | nameBuilder.append(typeName); | 76 | nameBuilder.append(typeName); |
| 75 | } | 77 | } |