diff options
| author | 2018-05-19 20:38:14 +0200 | |
|---|---|---|
| committer | 2018-05-19 20:38:14 +0200 | |
| commit | d72aad82c795726efcf6145f5a4172e4c8d3a5b2 (patch) | |
| tree | d4456f34813a6be127867951d21ec775aeff5a5c /src/main/java/cuchaz/enigma/mapping | |
| parent | More bytecode translation (diff) | |
| download | enigma-fork-d72aad82c795726efcf6145f5a4172e4c8d3a5b2.tar.gz enigma-fork-d72aad82c795726efcf6145f5a4172e4c8d3a5b2.tar.xz enigma-fork-d72aad82c795726efcf6145f5a4172e4c8d3a5b2.zip | |
Signature refactoring
Diffstat (limited to 'src/main/java/cuchaz/enigma/mapping')
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; | |||
| 15 | import com.google.common.collect.Maps; | 15 | import com.google.common.collect.Maps; |
| 16 | import cuchaz.enigma.analysis.TranslationIndex; | 16 | import cuchaz.enigma.analysis.TranslationIndex; |
| 17 | import cuchaz.enigma.bytecode.AccessFlags; | 17 | import cuchaz.enigma.bytecode.AccessFlags; |
| 18 | import cuchaz.enigma.bytecode.translators.TranslationSignatureVisitor; | ||
| 19 | import cuchaz.enigma.mapping.entry.*; | 18 | import cuchaz.enigma.mapping.entry.*; |
| 20 | import org.objectweb.asm.signature.SignatureReader; | ||
| 21 | import org.objectweb.asm.signature.SignatureVisitor; | ||
| 22 | import org.objectweb.asm.signature.SignatureWriter; | ||
| 23 | 19 | ||
| 24 | import java.util.ArrayList; | 20 | import java.util.ArrayList; |
| 25 | import java.util.List; | 21 | import java.util.List; |
| 26 | import java.util.Map; | 22 | import java.util.Map; |
| 27 | import java.util.regex.Pattern; | ||
| 28 | 23 | ||
| 29 | public class DirectionalTranslator implements Translator { | 24 | public 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 @@ | |||
| 1 | package cuchaz.enigma.mapping; | ||
| 2 | |||
| 3 | import cuchaz.enigma.bytecode.translators.TranslationSignatureVisitor; | ||
| 4 | import org.objectweb.asm.signature.SignatureReader; | ||
| 5 | import org.objectweb.asm.signature.SignatureVisitor; | ||
| 6 | import org.objectweb.asm.signature.SignatureWriter; | ||
| 7 | |||
| 8 | import java.util.function.Function; | ||
| 9 | import java.util.regex.Pattern; | ||
| 10 | |||
| 11 | public 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 | ||
| 14 | import com.google.common.base.Preconditions; | 14 | import com.google.common.base.Preconditions; |
| 15 | import cuchaz.enigma.bytecode.AccessFlags; | 15 | import cuchaz.enigma.bytecode.AccessFlags; |
| 16 | import cuchaz.enigma.mapping.Signature; | ||
| 16 | 17 | ||
| 17 | public class ClassDefEntry extends ClassEntry { | 18 | public 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 | ||
| 14 | import com.google.common.base.Preconditions; | 14 | import com.google.common.base.Preconditions; |
| 15 | import cuchaz.enigma.bytecode.AccessFlags; | 15 | import cuchaz.enigma.bytecode.AccessFlags; |
| 16 | import cuchaz.enigma.mapping.Signature; | ||
| 16 | import cuchaz.enigma.mapping.TypeDescriptor; | 17 | import cuchaz.enigma.mapping.TypeDescriptor; |
| 17 | 18 | ||
| 18 | public class FieldDefEntry extends FieldEntry { | 19 | public 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; | |||
| 14 | import com.google.common.base.Preconditions; | 14 | import com.google.common.base.Preconditions; |
| 15 | import cuchaz.enigma.bytecode.AccessFlags; | 15 | import cuchaz.enigma.bytecode.AccessFlags; |
| 16 | import cuchaz.enigma.mapping.MethodDescriptor; | 16 | import cuchaz.enigma.mapping.MethodDescriptor; |
| 17 | import cuchaz.enigma.mapping.Signature; | ||
| 17 | 18 | ||
| 18 | public class MethodDefEntry extends MethodEntry { | 19 | public 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; | |||
| 14 | import com.strobel.assembler.metadata.*; | 14 | import com.strobel.assembler.metadata.*; |
| 15 | import cuchaz.enigma.bytecode.AccessFlags; | 15 | import cuchaz.enigma.bytecode.AccessFlags; |
| 16 | import cuchaz.enigma.mapping.MethodDescriptor; | 16 | import cuchaz.enigma.mapping.MethodDescriptor; |
| 17 | import cuchaz.enigma.mapping.Signature; | ||
| 17 | import cuchaz.enigma.mapping.TypeDescriptor; | 18 | import cuchaz.enigma.mapping.TypeDescriptor; |
| 18 | 19 | ||
| 19 | import java.util.List; | 20 | import 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 | } |