summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.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/analysis/SourceIndexBehaviorVisitor.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/analysis/SourceIndexBehaviorVisitor.java')
-rw-r--r--src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java163
1 files changed, 163 insertions, 0 deletions
diff --git a/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java b/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java
new file mode 100644
index 0000000..43c1749
--- /dev/null
+++ b/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java
@@ -0,0 +1,163 @@
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.analysis;
12
13import com.strobel.assembler.metadata.MemberReference;
14import com.strobel.assembler.metadata.MethodDefinition;
15import com.strobel.assembler.metadata.MethodReference;
16import com.strobel.assembler.metadata.ParameterDefinition;
17import com.strobel.assembler.metadata.TypeReference;
18import com.strobel.decompiler.languages.TextLocation;
19import com.strobel.decompiler.languages.java.ast.AstNode;
20import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration;
21import com.strobel.decompiler.languages.java.ast.IdentifierExpression;
22import com.strobel.decompiler.languages.java.ast.InvocationExpression;
23import com.strobel.decompiler.languages.java.ast.Keys;
24import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression;
25import com.strobel.decompiler.languages.java.ast.MethodDeclaration;
26import com.strobel.decompiler.languages.java.ast.ObjectCreationExpression;
27import com.strobel.decompiler.languages.java.ast.ParameterDeclaration;
28import com.strobel.decompiler.languages.java.ast.SimpleType;
29import com.strobel.decompiler.languages.java.ast.SuperReferenceExpression;
30import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression;
31
32import cuchaz.enigma.mapping.ArgumentEntry;
33import cuchaz.enigma.mapping.BehaviorEntry;
34import cuchaz.enigma.mapping.ClassEntry;
35import cuchaz.enigma.mapping.ConstructorEntry;
36import cuchaz.enigma.mapping.FieldEntry;
37import cuchaz.enigma.mapping.MethodEntry;
38
39public class SourceIndexBehaviorVisitor extends SourceIndexVisitor {
40
41 private BehaviorEntry m_behaviorEntry;
42
43 public SourceIndexBehaviorVisitor(BehaviorEntry behaviorEntry) {
44 m_behaviorEntry = behaviorEntry;
45 }
46
47 @Override
48 public Void visitMethodDeclaration(MethodDeclaration node, SourceIndex index) {
49 return recurse(node, index);
50 }
51
52 @Override
53 public Void visitConstructorDeclaration(ConstructorDeclaration node, SourceIndex index) {
54 return recurse(node, index);
55 }
56
57 @Override
58 public Void visitInvocationExpression(InvocationExpression node, SourceIndex index) {
59 MemberReference ref = node.getUserData(Keys.MEMBER_REFERENCE);
60
61 // get the behavior entry
62 ClassEntry classEntry = new ClassEntry(ref.getDeclaringType().getInternalName());
63 BehaviorEntry behaviorEntry = null;
64 if (ref instanceof MethodReference) {
65 MethodReference methodRef = (MethodReference)ref;
66 if (methodRef.isConstructor()) {
67 behaviorEntry = new ConstructorEntry(classEntry, ref.getSignature());
68 } else if (methodRef.isTypeInitializer()) {
69 behaviorEntry = new ConstructorEntry(classEntry);
70 } else {
71 behaviorEntry = new MethodEntry(classEntry, ref.getName(), ref.getSignature());
72 }
73 }
74 if (behaviorEntry != null) {
75 // get the node for the token
76 AstNode tokenNode = null;
77 if (node.getTarget() instanceof MemberReferenceExpression) {
78 tokenNode = ((MemberReferenceExpression)node.getTarget()).getMemberNameToken();
79 } else if (node.getTarget() instanceof SuperReferenceExpression) {
80 tokenNode = node.getTarget();
81 } else if (node.getTarget() instanceof ThisReferenceExpression) {
82 tokenNode = node.getTarget();
83 }
84 if (tokenNode != null) {
85 index.addReference(tokenNode, behaviorEntry, m_behaviorEntry);
86 }
87 }
88
89 return recurse(node, index);
90 }
91
92 @Override
93 public Void visitMemberReferenceExpression(MemberReferenceExpression node, SourceIndex index) {
94 MemberReference ref = node.getUserData(Keys.MEMBER_REFERENCE);
95 if (ref != null) {
96 // make sure this is actually a field
97 if (ref.getSignature().indexOf('(') >= 0) {
98 throw new Error("Expected a field here! got " + ref);
99 }
100
101 ClassEntry classEntry = new ClassEntry(ref.getDeclaringType().getInternalName());
102 FieldEntry fieldEntry = new FieldEntry(classEntry, ref.getName());
103 index.addReference(node.getMemberNameToken(), fieldEntry, m_behaviorEntry);
104 }
105
106 return recurse(node, index);
107 }
108
109 @Override
110 public Void visitSimpleType(SimpleType node, SourceIndex index) {
111 TypeReference ref = node.getUserData(Keys.TYPE_REFERENCE);
112 if (node.getIdentifierToken().getStartLocation() != TextLocation.EMPTY) {
113 ClassEntry classEntry = new ClassEntry(ref.getInternalName());
114 index.addReference(node.getIdentifierToken(), classEntry, m_behaviorEntry);
115 }
116
117 return recurse(node, index);
118 }
119
120 @Override
121 public Void visitParameterDeclaration(ParameterDeclaration node, SourceIndex index) {
122 ParameterDefinition def = node.getUserData(Keys.PARAMETER_DEFINITION);
123 ClassEntry classEntry = new ClassEntry(def.getDeclaringType().getInternalName());
124 MethodDefinition methodDef = (MethodDefinition)def.getMethod();
125 BehaviorEntry behaviorEntry;
126 if (methodDef.isConstructor()) {
127 behaviorEntry = new ConstructorEntry(classEntry, methodDef.getSignature());
128 } else {
129 behaviorEntry = new MethodEntry(classEntry, methodDef.getName(), methodDef.getSignature());
130 }
131 ArgumentEntry argumentEntry = new ArgumentEntry(behaviorEntry, def.getPosition(), node.getName());
132 index.addDeclaration(node.getNameToken(), argumentEntry);
133
134 return recurse(node, index);
135 }
136
137 @Override
138 public Void visitIdentifierExpression(IdentifierExpression node, SourceIndex index) {
139 MemberReference ref = node.getUserData(Keys.MEMBER_REFERENCE);
140 if (ref != null) {
141 ClassEntry classEntry = new ClassEntry(ref.getDeclaringType().getInternalName());
142 FieldEntry fieldEntry = new FieldEntry(classEntry, ref.getName());
143 index.addReference(node.getIdentifierToken(), fieldEntry, m_behaviorEntry);
144 }
145
146 return recurse(node, index);
147 }
148
149 @Override
150 public Void visitObjectCreationExpression(ObjectCreationExpression node, SourceIndex index) {
151 MemberReference ref = node.getUserData(Keys.MEMBER_REFERENCE);
152 if (ref != null) {
153 ClassEntry classEntry = new ClassEntry(ref.getDeclaringType().getInternalName());
154 ConstructorEntry constructorEntry = new ConstructorEntry(classEntry, ref.getSignature());
155 if (node.getType() instanceof SimpleType) {
156 SimpleType simpleTypeNode = (SimpleType)node.getType();
157 index.addReference(simpleTypeNode.getIdentifierToken(), constructorEntry, m_behaviorEntry);
158 }
159 }
160
161 return recurse(node, index);
162 }
163}