From 72bdd3caa5bc21e4830e764eaf804bd42cedf23e Mon Sep 17 00:00:00 2001 From: Thog Date: Thu, 27 Oct 2016 19:28:10 +0200 Subject: Rework setFieldName to only check name in the actual class mapping and mothers classes mappings (Fix #51) --- src/main/java/cuchaz/enigma/analysis/JarIndex.java | 8 ++++++++ src/main/java/cuchaz/enigma/mapping/Mappings.java | 16 +++++++++++----- .../java/cuchaz/enigma/mapping/MappingsRenamer.java | 19 +++++++++++++++++-- 3 files changed, 36 insertions(+), 7 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/cuchaz/enigma/analysis/JarIndex.java b/src/main/java/cuchaz/enigma/analysis/JarIndex.java index f955a408..ee1dd544 100644 --- a/src/main/java/cuchaz/enigma/analysis/JarIndex.java +++ b/src/main/java/cuchaz/enigma/analysis/JarIndex.java @@ -771,6 +771,14 @@ public class JarIndex { return this.access.containsKey(obfBehaviorEntry); } + public boolean containsEntryWithSameName(Entry entry) + { + for (Entry target : this.access.keySet()) + if (target.getName().equals(entry.getName()) && entry.getClass().isInstance(target.getClass())) + return true; + return false; + } + public boolean containsObfArgument(ArgumentEntry obfArgumentEntry) { // check the behavior if (!containsObfBehavior(obfArgumentEntry.getBehaviorEntry())) { diff --git a/src/main/java/cuchaz/enigma/mapping/Mappings.java b/src/main/java/cuchaz/enigma/mapping/Mappings.java index 912a57ab..2166bb9f 100644 --- a/src/main/java/cuchaz/enigma/mapping/Mappings.java +++ b/src/main/java/cuchaz/enigma/mapping/Mappings.java @@ -15,11 +15,7 @@ import com.google.common.collect.Maps; import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import com.google.common.collect.Sets; import cuchaz.enigma.analysis.TranslationIndex; @@ -177,6 +173,16 @@ public class Mappings { return classMapping != null && classMapping.containsDeobfField(deobfName, obfType); } + public boolean containsDeobfField(ClassEntry obfClassEntry, String deobfName) { + ClassMapping classMapping = this.classesByObf.get(obfClassEntry.getName()); + if (classMapping != null) + for (FieldMapping fieldMapping : classMapping.fields()) + if (deobfName.equals(fieldMapping.getDeobfName()) || deobfName.equals(fieldMapping.getObfName())) + return true; + + return false; + } + public boolean containsDeobfMethod(ClassEntry obfClassEntry, String deobfName, Signature obfSignature) { ClassMapping classMapping = this.classesByObf.get(obfClassEntry.getName()); return classMapping != null && classMapping.containsDeobfMethod(deobfName, obfSignature); diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java index 5c299e3e..4e812b10 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsRenamer.java @@ -90,8 +90,23 @@ public class MappingsRenamer { public void setFieldName(FieldEntry obf, String deobfName) { deobfName = NameValidator.validateFieldName(deobfName); FieldEntry targetEntry = new FieldEntry(obf.getClassEntry(), deobfName, obf.getType()); - if (m_mappings.containsDeobfField(obf.getClassEntry(), deobfName, obf.getType()) || m_index.containsObfField(targetEntry)) { - throw new IllegalNameException(deobfName, "There is already a field with that name"); + ClassEntry definedClass = null; + if (m_mappings.containsDeobfField(obf.getClassEntry(), deobfName) || m_index.containsEntryWithSameName(targetEntry)) + definedClass = obf.getClassEntry(); + else { + for (ClassEntry ancestorEntry : this.m_index.getTranslationIndex().getAncestry(obf.getClassEntry())) { + if (m_mappings.containsDeobfField(ancestorEntry, deobfName) || m_index.containsEntryWithSameName(targetEntry.cloneToNewClass(ancestorEntry))) { + definedClass = ancestorEntry; + break; + } + } + } + + if (definedClass != null) { + String className = m_mappings.getTranslator(TranslationDirection.Deobfuscating, m_index.getTranslationIndex()).translateClass(definedClass.getClassName()); + if (className == null) + className = definedClass.getClassName(); + throw new IllegalNameException(deobfName, "There is already a field with that name in " + className); } ClassMapping classMapping = getOrCreateClassMapping(obf.getClassEntry()); -- cgit v1.2.3