summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/mapping/MethodMapping.java
diff options
context:
space:
mode:
authorGravatar jeff2015-02-03 22:00:53 -0500
committerGravatar jeff2015-02-03 22:00:53 -0500
commit52ab426d8fad3dbee7e728f523a35af94facebda (patch)
tree146fadfd8e639a909d6c1d6a193e7eddeab0be4a /src/cuchaz/enigma/mapping/MethodMapping.java
downloadenigma-fork-52ab426d8fad3dbee7e728f523a35af94facebda.tar.gz
enigma-fork-52ab426d8fad3dbee7e728f523a35af94facebda.tar.xz
enigma-fork-52ab426d8fad3dbee7e728f523a35af94facebda.zip
oops, don't depend on local procyon project
Diffstat (limited to 'src/cuchaz/enigma/mapping/MethodMapping.java')
-rw-r--r--src/cuchaz/enigma/mapping/MethodMapping.java162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/cuchaz/enigma/mapping/MethodMapping.java b/src/cuchaz/enigma/mapping/MethodMapping.java
new file mode 100644
index 0000000..4dab3c6
--- /dev/null
+++ b/src/cuchaz/enigma/mapping/MethodMapping.java
@@ -0,0 +1,162 @@
1/*******************************************************************************
2 * Copyright (c) 2014 Jeff Martin.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the GNU Public License v3.0
5 * which accompanies this distribution, and is available at
6 * http://www.gnu.org/licenses/gpl.html
7 *
8 * Contributors:
9 * Jeff Martin - initial API and implementation
10 ******************************************************************************/
11package cuchaz.enigma.mapping;
12
13import java.io.Serializable;
14import java.util.Map;
15import java.util.TreeMap;
16
17import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater;
18
19public class MethodMapping implements Serializable, Comparable<MethodMapping> {
20
21 private static final long serialVersionUID = -4409570216084263978L;
22
23 private String m_obfName;
24 private String m_deobfName;
25 private String m_obfSignature;
26 private Map<Integer,ArgumentMapping> m_arguments;
27
28 public MethodMapping(String obfName, String obfSignature) {
29 this(obfName, obfSignature, null);
30 }
31
32 public MethodMapping(String obfName, String obfSignature, String deobfName) {
33 if (obfName == null) {
34 throw new IllegalArgumentException("obf name cannot be null!");
35 }
36 if (obfSignature == null) {
37 throw new IllegalArgumentException("obf signature cannot be null!");
38 }
39 m_obfName = obfName;
40 m_deobfName = NameValidator.validateMethodName(deobfName);
41 m_obfSignature = obfSignature;
42 m_arguments = new TreeMap<Integer,ArgumentMapping>();
43 }
44
45 public String getObfName() {
46 return m_obfName;
47 }
48
49 public String getDeobfName() {
50 return m_deobfName;
51 }
52
53 public void setDeobfName(String val) {
54 m_deobfName = NameValidator.validateMethodName(val);
55 }
56
57 public String getObfSignature() {
58 return m_obfSignature;
59 }
60
61 public Iterable<ArgumentMapping> arguments() {
62 return m_arguments.values();
63 }
64
65 public boolean isConstructor() {
66 return m_obfName.startsWith("<");
67 }
68
69 public void addArgumentMapping(ArgumentMapping argumentMapping) {
70 boolean wasAdded = m_arguments.put(argumentMapping.getIndex(), argumentMapping) == null;
71 assert (wasAdded);
72 }
73
74 public String getObfArgumentName(int index) {
75 ArgumentMapping argumentMapping = m_arguments.get(index);
76 if (argumentMapping != null) {
77 return argumentMapping.getName();
78 }
79
80 return null;
81 }
82
83 public String getDeobfArgumentName(int index) {
84 ArgumentMapping argumentMapping = m_arguments.get(index);
85 if (argumentMapping != null) {
86 return argumentMapping.getName();
87 }
88
89 return null;
90 }
91
92 public void setArgumentName(int index, String name) {
93 ArgumentMapping argumentMapping = m_arguments.get(index);
94 if (argumentMapping == null) {
95 argumentMapping = new ArgumentMapping(index, name);
96 boolean wasAdded = m_arguments.put(index, argumentMapping) == null;
97 assert (wasAdded);
98 } else {
99 argumentMapping.setName(name);
100 }
101 }
102
103 public void removeArgumentName(int index) {
104 boolean wasRemoved = m_arguments.remove(index) != null;
105 assert (wasRemoved);
106 }
107
108 @Override
109 public String toString() {
110 StringBuilder buf = new StringBuilder();
111 buf.append("\t");
112 buf.append(m_obfName);
113 buf.append(" <-> ");
114 buf.append(m_deobfName);
115 buf.append("\n");
116 buf.append("\t");
117 buf.append(m_obfSignature);
118 buf.append("\n");
119 buf.append("\tArguments:\n");
120 for (ArgumentMapping argumentMapping : m_arguments.values()) {
121 buf.append("\t\t");
122 buf.append(argumentMapping.getIndex());
123 buf.append(" -> ");
124 buf.append(argumentMapping.getName());
125 buf.append("\n");
126 }
127 return buf.toString();
128 }
129
130 @Override
131 public int compareTo(MethodMapping other) {
132 return (m_obfName + m_obfSignature).compareTo(other.m_obfName + other.m_obfSignature);
133 }
134
135 public boolean renameObfClass(final String oldObfClassName, final String newObfClassName) {
136 // rename obf classes in the signature
137 String newSignature = SignatureUpdater.update(m_obfSignature, new ClassNameUpdater() {
138 @Override
139 public String update(String className) {
140 if (className.equals(oldObfClassName)) {
141 return newObfClassName;
142 }
143 return className;
144 }
145 });
146
147 if (newSignature != m_obfSignature) {
148 m_obfSignature = newSignature;
149 return true;
150 }
151 return false;
152 }
153
154 public boolean containsArgument(String name) {
155 for (ArgumentMapping argumentMapping : m_arguments.values()) {
156 if (argumentMapping.getName().equals(name)) {
157 return true;
158 }
159 }
160 return false;
161 }
162}