summaryrefslogtreecommitdiff
path: root/src/main/java/cuchaz/enigma/mapping
diff options
context:
space:
mode:
authorGravatar gegy10002018-05-19 20:38:14 +0200
committerGravatar gegy10002018-05-19 20:38:14 +0200
commitd72aad82c795726efcf6145f5a4172e4c8d3a5b2 (patch)
treed4456f34813a6be127867951d21ec775aeff5a5c /src/main/java/cuchaz/enigma/mapping
parentMore bytecode translation (diff)
downloadenigma-fork-d72aad82c795726efcf6145f5a4172e4c8d3a5b2.tar.gz
enigma-fork-d72aad82c795726efcf6145f5a4172e4c8d3a5b2.tar.xz
enigma-fork-d72aad82c795726efcf6145f5a4172e4c8d3a5b2.zip
Signature refactoring
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping')
-rw-r--r--src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java42
-rw-r--r--src/main/java/cuchaz/enigma/mapping/Signature.java82
-rw-r--r--src/main/java/cuchaz/enigma/mapping/Translator.java2
-rw-r--r--src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java10
-rw-r--r--src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java12
-rw-r--r--src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java12
-rw-r--r--src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java5
7 files changed, 132 insertions, 33 deletions
diff --git a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java
index dec5acf..fe141c6 100644
--- a/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java
+++ b/src/main/java/cuchaz/enigma/mapping/DirectionalTranslator.java
@@ -15,20 +15,13 @@ import com.google.common.collect.Lists;
15import com.google.common.collect.Maps; 15import com.google.common.collect.Maps;
16import cuchaz.enigma.analysis.TranslationIndex; 16import cuchaz.enigma.analysis.TranslationIndex;
17import cuchaz.enigma.bytecode.AccessFlags; 17import cuchaz.enigma.bytecode.AccessFlags;
18import cuchaz.enigma.bytecode.translators.TranslationSignatureVisitor;
19import cuchaz.enigma.mapping.entry.*; 18import cuchaz.enigma.mapping.entry.*;
20import org.objectweb.asm.signature.SignatureReader;
21import org.objectweb.asm.signature.SignatureVisitor;
22import org.objectweb.asm.signature.SignatureWriter;
23 19
24import java.util.ArrayList; 20import java.util.ArrayList;
25import java.util.List; 21import java.util.List;
26import java.util.Map; 22import java.util.Map;
27import java.util.regex.Pattern;
28 23
29public class DirectionalTranslator implements Translator { 24public class DirectionalTranslator implements Translator {
30 private static final Pattern OBJECT_PATTERN = Pattern.compile(".*:Ljava/lang/Object;:.*");
31
32 private final TranslationDirection direction; 25 private final TranslationDirection direction;
33 private final Map<String, ClassMapping> classes; 26 private final Map<String, ClassMapping> classes;
34 private final TranslationIndex index; 27 private final TranslationIndex index;
@@ -62,7 +55,7 @@ public class DirectionalTranslator implements Translator {
62 @Override 55 @Override
63 public ClassDefEntry getTranslatedClassDef(ClassDefEntry entry) { 56 public ClassDefEntry getTranslatedClassDef(ClassDefEntry entry) {
64 String className = entry.isInnerClass() ? translateInnerClassName(entry) : translateClassName(entry); 57 String className = entry.isInnerClass() ? translateInnerClassName(entry) : translateClassName(entry);
65 return new ClassDefEntry(className, getClassModifier(entry).transform(entry.getAccess())); 58 return new ClassDefEntry(className, entry.getSignature(), getClassModifier(entry).transform(entry.getAccess()));
66 } 59 }
67 60
68 private String translateClassName(ClassEntry entry) { 61 private String translateClassName(ClassEntry entry) {
@@ -108,8 +101,9 @@ public class DirectionalTranslator implements Translator {
108 } 101 }
109 ClassEntry translatedOwner = getTranslatedClass(entry.getOwnerClassEntry()); 102 ClassEntry translatedOwner = getTranslatedClass(entry.getOwnerClassEntry());
110 TypeDescriptor translatedDesc = getTranslatedTypeDesc(entry.getDesc()); 103 TypeDescriptor translatedDesc = getTranslatedTypeDesc(entry.getDesc());
104 Signature translatedSignature = getTranslatedSignature(entry.getSignature());
111 AccessFlags translatedAccess = getFieldModifier(entry).transform(entry.getAccess()); 105 AccessFlags translatedAccess = getFieldModifier(entry).transform(entry.getAccess());
112 return new FieldDefEntry(translatedOwner, translatedName, translatedDesc, translatedAccess); 106 return new FieldDefEntry(translatedOwner, translatedName, translatedDesc, translatedSignature, translatedAccess);
113 } 107 }
114 108
115 @Override 109 @Override
@@ -148,8 +142,9 @@ public class DirectionalTranslator implements Translator {
148 } 142 }
149 ClassEntry translatedOwner = getTranslatedClass(entry.getOwnerClassEntry()); 143 ClassEntry translatedOwner = getTranslatedClass(entry.getOwnerClassEntry());
150 MethodDescriptor translatedDesc = getTranslatedMethodDesc(entry.getDesc()); 144 MethodDescriptor translatedDesc = getTranslatedMethodDesc(entry.getDesc());
145 Signature translatedSignature = getTranslatedSignature(entry.getSignature());
151 AccessFlags access = getMethodModifier(entry).transform(entry.getAccess()); 146 AccessFlags access = getMethodModifier(entry).transform(entry.getAccess());
152 return new MethodDefEntry(translatedOwner, translatedName, translatedDesc, access); 147 return new MethodDefEntry(translatedOwner, translatedName, translatedDesc, translatedSignature, access);
153 } 148 }
154 149
155 @Override 150 @Override
@@ -265,7 +260,7 @@ public class DirectionalTranslator implements Translator {
265 260
266 @Override 261 @Override
267 public TypeDescriptor getTranslatedTypeDesc(TypeDescriptor desc) { 262 public TypeDescriptor getTranslatedTypeDesc(TypeDescriptor desc) {
268 return desc.remap(name -> getTranslatedClass(new ClassEntry(name)).getName()); 263 return desc.remap(this::remapClass);
269 } 264 }
270 265
271 @Override 266 @Override
@@ -279,23 +274,11 @@ public class DirectionalTranslator implements Translator {
279 } 274 }
280 275
281 @Override 276 @Override
282 public String getTranslatedSignature(String signature, boolean isType, int api) { 277 public Signature getTranslatedSignature(Signature signature) {
283 if (signature == null) { 278 if (signature == null) {
284 return null; 279 return null;
285 } 280 }
286 SignatureReader reader = new SignatureReader(signature); 281 return signature.remap(this::remapClass);
287 SignatureWriter writer = new SignatureWriter();
288 SignatureVisitor visitor = new TranslationSignatureVisitor(this, api, writer);
289 if (isType) {
290 reader.acceptType(visitor);
291 } else {
292 reader.accept(visitor);
293 }
294 String translatedSignature = writer.toString();
295 if (OBJECT_PATTERN.matcher(signature).matches()) {
296 translatedSignature = signature.replaceAll(":Ljava/lang/Object;:", "::");
297 }
298 return translatedSignature;
299 } 282 }
300 283
301 private ClassMapping findClassMapping(ClassEntry entry) { 284 private ClassMapping findClassMapping(ClassEntry entry) {
@@ -360,4 +343,13 @@ public class DirectionalTranslator implements Translator {
360 } 343 }
361 return Mappings.EntryModifier.UNCHANGED; 344 return Mappings.EntryModifier.UNCHANGED;
362 } 345 }
346
347 private String remapClass(String name) {
348 String translatedName = getTranslatedClass(new ClassEntry(name)).getName();
349 int separatorIndex = translatedName.lastIndexOf("$");
350 if (separatorIndex != -1) {
351 translatedName = translatedName.substring(separatorIndex + 1);
352 }
353 return translatedName;
354 }
363} 355}
diff --git a/src/main/java/cuchaz/enigma/mapping/Signature.java b/src/main/java/cuchaz/enigma/mapping/Signature.java
new file mode 100644
index 0000000..071e4af
--- /dev/null
+++ b/src/main/java/cuchaz/enigma/mapping/Signature.java
@@ -0,0 +1,82 @@
1package cuchaz.enigma.mapping;
2
3import cuchaz.enigma.bytecode.translators.TranslationSignatureVisitor;
4import org.objectweb.asm.signature.SignatureReader;
5import org.objectweb.asm.signature.SignatureVisitor;
6import org.objectweb.asm.signature.SignatureWriter;
7
8import java.util.function.Function;
9import java.util.regex.Pattern;
10
11public class Signature {
12 private static final Pattern OBJECT_PATTERN = Pattern.compile(".*:Ljava/lang/Object;:.*");
13
14 private final String signature;
15 private final boolean isType;
16
17 private Signature(String signature, boolean isType) {
18 if (signature != null && OBJECT_PATTERN.matcher(signature).matches()) {
19 signature = signature.replaceAll(":Ljava/lang/Object;:", "::");
20 }
21
22 this.signature = signature;
23 this.isType = isType;
24 }
25
26 public static Signature createTypedSignature(String signature) {
27 if (signature != null && !signature.isEmpty()) {
28 return new Signature(signature, true);
29 }
30 return new Signature(null, true);
31 }
32
33 public static Signature createSignature(String signature) {
34 if (signature != null && !signature.isEmpty()) {
35 return new Signature(signature, false);
36 }
37 return new Signature(null, false);
38 }
39
40 public String getSignature() {
41 return signature;
42 }
43
44 public boolean isType() {
45 return isType;
46 }
47
48 public Signature remap(Function<String, String> remapper) {
49 if (signature == null) {
50 return this;
51 }
52 SignatureWriter writer = new SignatureWriter();
53 SignatureVisitor visitor = new TranslationSignatureVisitor(remapper, writer);
54 if (isType) {
55 new SignatureReader(signature).acceptType(visitor);
56 } else {
57 new SignatureReader(signature).accept(visitor);
58 }
59 return new Signature(writer.toString(), isType);
60 }
61
62 @Override
63 public boolean equals(Object obj) {
64 if (obj instanceof Signature) {
65 Signature other = (Signature) obj;
66 return (other.signature == null && signature == null || other.signature != null
67 && signature != null && other.signature.equals(signature))
68 && other.isType == this.isType;
69 }
70 return false;
71 }
72
73 @Override
74 public int hashCode() {
75 return signature.hashCode() | (isType ? 1 : 0) << 16;
76 }
77
78 @Override
79 public String toString() {
80 return signature;
81 }
82}
diff --git a/src/main/java/cuchaz/enigma/mapping/Translator.java b/src/main/java/cuchaz/enigma/mapping/Translator.java
index 1bc2f37..a9ff1cb 100644
--- a/src/main/java/cuchaz/enigma/mapping/Translator.java
+++ b/src/main/java/cuchaz/enigma/mapping/Translator.java
@@ -44,7 +44,7 @@ public interface Translator {
44 44
45 MethodDescriptor getTranslatedMethodDesc(MethodDescriptor descriptor); 45 MethodDescriptor getTranslatedMethodDesc(MethodDescriptor descriptor);
46 46
47 String getTranslatedSignature(String signature, boolean isType, int api); 47 Signature getTranslatedSignature(Signature signature);
48 48
49 default Type getTranslatedType(Type type) { 49 default Type getTranslatedType(Type type) {
50 String descString = type.getDescriptor(); 50 String descString = type.getDescriptor();
diff --git a/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java
index 75e7f1b..ac1fe2a 100644
--- a/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java
+++ b/src/main/java/cuchaz/enigma/mapping/entry/ClassDefEntry.java
@@ -13,16 +13,24 @@ package cuchaz.enigma.mapping.entry;
13 13
14import com.google.common.base.Preconditions; 14import com.google.common.base.Preconditions;
15import cuchaz.enigma.bytecode.AccessFlags; 15import cuchaz.enigma.bytecode.AccessFlags;
16import cuchaz.enigma.mapping.Signature;
16 17
17public class ClassDefEntry extends ClassEntry { 18public class ClassDefEntry extends ClassEntry {
18 private final AccessFlags access; 19 private final AccessFlags access;
20 private final Signature signature;
19 21
20 public ClassDefEntry(String className, AccessFlags access) { 22 public ClassDefEntry(String className, Signature signature, AccessFlags access) {
21 super(className); 23 super(className);
24 Preconditions.checkNotNull(signature, "Class signature cannot be null");
22 Preconditions.checkNotNull(access, "Class access cannot be null"); 25 Preconditions.checkNotNull(access, "Class access cannot be null");
26 this.signature = signature;
23 this.access = access; 27 this.access = access;
24 } 28 }
25 29
30 public Signature getSignature() {
31 return signature;
32 }
33
26 public AccessFlags getAccess() { 34 public AccessFlags getAccess() {
27 return access; 35 return access;
28 } 36 }
diff --git a/src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java
index 78ea5f7..d18115b 100644
--- a/src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java
+++ b/src/main/java/cuchaz/enigma/mapping/entry/FieldDefEntry.java
@@ -13,23 +13,31 @@ package cuchaz.enigma.mapping.entry;
13 13
14import com.google.common.base.Preconditions; 14import com.google.common.base.Preconditions;
15import cuchaz.enigma.bytecode.AccessFlags; 15import cuchaz.enigma.bytecode.AccessFlags;
16import cuchaz.enigma.mapping.Signature;
16import cuchaz.enigma.mapping.TypeDescriptor; 17import cuchaz.enigma.mapping.TypeDescriptor;
17 18
18public class FieldDefEntry extends FieldEntry { 19public class FieldDefEntry extends FieldEntry {
19 private final AccessFlags access; 20 private final AccessFlags access;
21 private final Signature signature;
20 22
21 public FieldDefEntry(ClassEntry ownerEntry, String name, TypeDescriptor desc, AccessFlags access) { 23 public FieldDefEntry(ClassEntry ownerEntry, String name, TypeDescriptor desc, Signature signature, AccessFlags access) {
22 super(ownerEntry, name, desc); 24 super(ownerEntry, name, desc);
23 Preconditions.checkNotNull(access, "Field access cannot be null"); 25 Preconditions.checkNotNull(access, "Field access cannot be null");
26 Preconditions.checkNotNull(signature, "Field signature cannot be null");
24 this.access = access; 27 this.access = access;
28 this.signature = signature;
25 } 29 }
26 30
27 public AccessFlags getAccess() { 31 public AccessFlags getAccess() {
28 return access; 32 return access;
29 } 33 }
30 34
35 public Signature getSignature() {
36 return signature;
37 }
38
31 @Override 39 @Override
32 public FieldDefEntry updateOwnership(ClassEntry owner) { 40 public FieldDefEntry updateOwnership(ClassEntry owner) {
33 return new FieldDefEntry(owner, this.name, this.desc, access); 41 return new FieldDefEntry(owner, this.name, this.desc, signature, access);
34 } 42 }
35} 43}
diff --git a/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java b/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java
index 1d2c094..ec3af69 100644
--- a/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java
+++ b/src/main/java/cuchaz/enigma/mapping/entry/MethodDefEntry.java
@@ -14,23 +14,31 @@ package cuchaz.enigma.mapping.entry;
14import com.google.common.base.Preconditions; 14import com.google.common.base.Preconditions;
15import cuchaz.enigma.bytecode.AccessFlags; 15import cuchaz.enigma.bytecode.AccessFlags;
16import cuchaz.enigma.mapping.MethodDescriptor; 16import cuchaz.enigma.mapping.MethodDescriptor;
17import cuchaz.enigma.mapping.Signature;
17 18
18public class MethodDefEntry extends MethodEntry { 19public class MethodDefEntry extends MethodEntry {
19 20
20 private final AccessFlags access; 21 private final AccessFlags access;
22 private final Signature signature;
21 23
22 public MethodDefEntry(ClassEntry classEntry, String name, MethodDescriptor descriptor, AccessFlags access) { 24 public MethodDefEntry(ClassEntry classEntry, String name, MethodDescriptor descriptor, Signature signature, AccessFlags access) {
23 super(classEntry, name, descriptor); 25 super(classEntry, name, descriptor);
24 Preconditions.checkNotNull(access, "Method access cannot be null"); 26 Preconditions.checkNotNull(access, "Method access cannot be null");
27 Preconditions.checkNotNull(signature, "Method signature cannot be null");
25 this.access = access; 28 this.access = access;
29 this.signature = signature;
26 } 30 }
27 31
28 public AccessFlags getAccess() { 32 public AccessFlags getAccess() {
29 return access; 33 return access;
30 } 34 }
31 35
36 public Signature getSignature() {
37 return signature;
38 }
39
32 @Override 40 @Override
33 public MethodDefEntry updateOwnership(ClassEntry classEntry) { 41 public MethodDefEntry updateOwnership(ClassEntry classEntry) {
34 return new MethodDefEntry(new ClassEntry(classEntry.getName()), name, descriptor, access); 42 return new MethodDefEntry(new ClassEntry(classEntry.getName()), name, descriptor, signature, access);
35 } 43 }
36} 44}
diff --git a/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java b/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java
index e42a334..5892a03 100644
--- a/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java
+++ b/src/main/java/cuchaz/enigma/mapping/entry/ProcyonEntryFactory.java
@@ -14,6 +14,7 @@ package cuchaz.enigma.mapping.entry;
14import com.strobel.assembler.metadata.*; 14import com.strobel.assembler.metadata.*;
15import cuchaz.enigma.bytecode.AccessFlags; 15import cuchaz.enigma.bytecode.AccessFlags;
16import cuchaz.enigma.mapping.MethodDescriptor; 16import cuchaz.enigma.mapping.MethodDescriptor;
17import cuchaz.enigma.mapping.Signature;
17import cuchaz.enigma.mapping.TypeDescriptor; 18import cuchaz.enigma.mapping.TypeDescriptor;
18 19
19import java.util.List; 20import java.util.List;
@@ -56,7 +57,7 @@ public class ProcyonEntryFactory {
56 57
57 public FieldDefEntry getFieldDefEntry(FieldDefinition def) { 58 public FieldDefEntry getFieldDefEntry(FieldDefinition def) {
58 ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); 59 ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName());
59 return new FieldDefEntry(classEntry, def.getName(), new TypeDescriptor(def.getErasedSignature()), new AccessFlags(def.getModifiers())); 60 return new FieldDefEntry(classEntry, def.getName(), new TypeDescriptor(def.getErasedSignature()), Signature.createTypedSignature(def.getSignature()), new AccessFlags(def.getModifiers()));
60 } 61 }
61 62
62 public MethodEntry getMethodEntry(MemberReference def) { 63 public MethodEntry getMethodEntry(MemberReference def) {
@@ -66,6 +67,6 @@ public class ProcyonEntryFactory {
66 67
67 public MethodDefEntry getMethodDefEntry(MethodDefinition def) { 68 public MethodDefEntry getMethodDefEntry(MethodDefinition def) {
68 ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName()); 69 ClassEntry classEntry = entryPool.getClass(def.getDeclaringType().getInternalName());
69 return new MethodDefEntry(classEntry, def.getName(), new MethodDescriptor(def.getErasedSignature()), new AccessFlags(def.getModifiers())); 70 return new MethodDefEntry(classEntry, def.getName(), new MethodDescriptor(def.getErasedSignature()), Signature.createSignature(def.getSignature()), new AccessFlags(def.getModifiers()));
70 } 71 }
71} 72}