From 72115a6e4c83422b7359a9ae4d60badc244b55ff Mon Sep 17 00:00:00 2001 From: Thog Date: Wed, 19 Oct 2016 17:44:04 +0200 Subject: Starting implementing local variables (#33) TODO: - Store format (need to be defined) - Implement some translate operations This commit also fix some cases where argument tokens are not selected --- .../cuchaz/enigma/mapping/LocalVariableEntry.java | 104 +++++++++++++++++++++ .../java/cuchaz/enigma/mapping/Translator.java | 19 ++++ 2 files changed, 123 insertions(+) create mode 100644 src/main/java/cuchaz/enigma/mapping/LocalVariableEntry.java (limited to 'src/main/java/cuchaz/enigma/mapping') diff --git a/src/main/java/cuchaz/enigma/mapping/LocalVariableEntry.java b/src/main/java/cuchaz/enigma/mapping/LocalVariableEntry.java new file mode 100644 index 0000000..8bbaaaf --- /dev/null +++ b/src/main/java/cuchaz/enigma/mapping/LocalVariableEntry.java @@ -0,0 +1,104 @@ +package cuchaz.enigma.mapping; + +import cuchaz.enigma.utils.Utils; + +/** + * Desc... + * Created by Thog + * 19/10/2016 + */ +public class LocalVariableEntry implements Entry +{ + + protected final BehaviorEntry behaviorEntry; + protected final String name; + protected final Type type; + protected final int index; + + public LocalVariableEntry(BehaviorEntry behaviorEntry, int index, String name, Type type) { + if (behaviorEntry == null) { + throw new IllegalArgumentException("Behavior cannot be null!"); + } + if (index < 0) { + throw new IllegalArgumentException("Index must be non-negative!"); + } + if (name == null) { + throw new IllegalArgumentException("Variable name cannot be null!"); + } + if (type == null) { + throw new IllegalArgumentException("Variable type cannot be null!"); + } + + this.behaviorEntry = behaviorEntry; + this.name = name; + this.type = type; + this.index = index; + } + + + public LocalVariableEntry(LocalVariableEntry other, ClassEntry newClassEntry) { + this.behaviorEntry = (BehaviorEntry) other.behaviorEntry.cloneToNewClass(newClassEntry); + this.name = other.name; + this.type = other.type; + this.index = other.index; + } + + public BehaviorEntry getBehaviorEntry() { + return this.behaviorEntry; + } + + public Type getType() { + return type; + } + + public int getIndex() { + return index; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public ClassEntry getClassEntry() { + return this.behaviorEntry.getClassEntry(); + } + + @Override + public String getClassName() { + return this.behaviorEntry.getClassName(); + } + + @Override + public LocalVariableEntry cloneToNewClass(ClassEntry classEntry) { + return new LocalVariableEntry(this, classEntry); + } + + public String getMethodName() { + return this.behaviorEntry.getName(); + } + + public Signature getMethodSignature() { + return this.behaviorEntry.getSignature(); + } + + @Override + public int hashCode() { + return Utils.combineHashesOrdered(this.behaviorEntry, this.type.hashCode(), this.name.hashCode(), Integer.hashCode(this.index)); + } + + @Override + public boolean equals(Object other) { + return other instanceof LocalVariableEntry && equals((LocalVariableEntry) other); + } + + public boolean equals(LocalVariableEntry other) { + return this.behaviorEntry.equals(other.behaviorEntry) && this.type.equals(other.type) && this.name.equals(other.name) && this.index == other.index; + } + + @Override + public String toString() { + return this.behaviorEntry.toString() + "(" + this.index + ":" + this.name + ":" + this.type + ")"; + } +} diff --git a/src/main/java/cuchaz/enigma/mapping/Translator.java b/src/main/java/cuchaz/enigma/mapping/Translator.java index b05714c..6b636f2 100644 --- a/src/main/java/cuchaz/enigma/mapping/Translator.java +++ b/src/main/java/cuchaz/enigma/mapping/Translator.java @@ -58,6 +58,8 @@ public class Translator { return (T) translateEntry((ConstructorEntry) entry); } else if (entry instanceof ArgumentEntry) { return (T) translateEntry((ArgumentEntry) entry); + } else if (entry instanceof LocalVariableEntry) { + return (T) translateEntry((LocalVariableEntry) entry); } else { throw new Error("Unknown entry type: " + entry.getClass().getName()); } @@ -74,11 +76,28 @@ public class Translator { return translate(entry); } else if (entry instanceof ArgumentEntry) { return translate((ArgumentEntry) entry); + } else if (entry instanceof LocalVariableEntry) { + return translate((LocalVariableEntry) entry); } else { throw new Error("Unknown entry type: " + entry.getClass().getName()); } } + public String translate(LocalVariableEntry in) + { + LocalVariableEntry translated = translateEntry(in); + if (translated.equals(in)) { + return null; + } + return translated.getName(); + } + + public LocalVariableEntry translateEntry(LocalVariableEntry in) + { + // TODO: Implement it + return in; + } + public String translate(ClassEntry in) { ClassEntry translated = translateEntry(in); if (translated.equals(in)) { -- cgit v1.2.3