summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/analysis/SourceIndex.java
diff options
context:
space:
mode:
authorGravatar jeff2014-08-21 01:10:37 -0400
committerGravatar jeff2014-08-21 01:10:37 -0400
commit237b2ed2a6b6f537cdbdf9fc9c6d0c7743f34375 (patch)
treeebad059c7fa0bc7723858cb25eed0bb6e95fe42a /src/cuchaz/enigma/analysis/SourceIndex.java
parentfixed recognition of inner class tokens (diff)
downloadenigma-fork-237b2ed2a6b6f537cdbdf9fc9c6d0c7743f34375.tar.gz
enigma-fork-237b2ed2a6b6f537cdbdf9fc9c6d0c7743f34375.tar.xz
enigma-fork-237b2ed2a6b6f537cdbdf9fc9c6d0c7743f34375.zip
fixed call graph searching
added system to navigate multiple tokens for the same entry in a behavior
Diffstat (limited to 'src/cuchaz/enigma/analysis/SourceIndex.java')
-rw-r--r--src/cuchaz/enigma/analysis/SourceIndex.java37
1 files changed, 30 insertions, 7 deletions
diff --git a/src/cuchaz/enigma/analysis/SourceIndex.java b/src/cuchaz/enigma/analysis/SourceIndex.java
index bf890e3..960ec36 100644
--- a/src/cuchaz/enigma/analysis/SourceIndex.java
+++ b/src/cuchaz/enigma/analysis/SourceIndex.java
@@ -10,13 +10,15 @@
10 ******************************************************************************/ 10 ******************************************************************************/
11package cuchaz.enigma.analysis; 11package cuchaz.enigma.analysis;
12 12
13import java.util.HashMap; 13import java.util.Collection;
14import java.util.List; 14import java.util.List;
15import java.util.Map; 15import java.util.Map;
16import java.util.TreeMap; 16import java.util.TreeMap;
17 17
18import com.google.common.collect.HashMultimap;
18import com.google.common.collect.Lists; 19import com.google.common.collect.Lists;
19import com.google.common.collect.Maps; 20import com.google.common.collect.Maps;
21import com.google.common.collect.Multimap;
20import com.strobel.decompiler.languages.Region; 22import com.strobel.decompiler.languages.Region;
21import com.strobel.decompiler.languages.java.ast.Identifier; 23import com.strobel.decompiler.languages.java.ast.Identifier;
22 24
@@ -26,7 +28,7 @@ public class SourceIndex
26{ 28{
27 private String m_source; 29 private String m_source;
28 private TreeMap<Token,EntryReference<Entry,Entry>> m_tokenToReference; 30 private TreeMap<Token,EntryReference<Entry,Entry>> m_tokenToReference;
29 private HashMap<EntryReference<Entry,Entry>,Token> m_referenceToToken; 31 private Multimap<EntryReference<Entry,Entry>,Token> m_referenceToTokens;
30 private Map<Entry,Token> m_declarationToToken; 32 private Map<Entry,Token> m_declarationToToken;
31 private List<Integer> m_lineOffsets; 33 private List<Integer> m_lineOffsets;
32 34
@@ -34,7 +36,7 @@ public class SourceIndex
34 { 36 {
35 m_source = source; 37 m_source = source;
36 m_tokenToReference = Maps.newTreeMap(); 38 m_tokenToReference = Maps.newTreeMap();
37 m_referenceToToken = Maps.newHashMap(); 39 m_referenceToTokens = HashMultimap.create();
38 m_declarationToToken = Maps.newHashMap(); 40 m_declarationToToken = Maps.newHashMap();
39 m_lineOffsets = Lists.newArrayList(); 41 m_lineOffsets = Lists.newArrayList();
40 42
@@ -96,7 +98,7 @@ public class SourceIndex
96 if( token != null ) 98 if( token != null )
97 { 99 {
98 m_tokenToReference.put( token, deobfReference ); 100 m_tokenToReference.put( token, deobfReference );
99 m_referenceToToken.put( deobfReference, token ); 101 m_referenceToTokens.put( deobfReference, token );
100 } 102 }
101 } 103 }
102 104
@@ -107,7 +109,7 @@ public class SourceIndex
107 { 109 {
108 EntryReference<Entry,Entry> reference = new EntryReference<Entry,Entry>( deobfEntry ); 110 EntryReference<Entry,Entry> reference = new EntryReference<Entry,Entry>( deobfEntry );
109 m_tokenToReference.put( token, reference ); 111 m_tokenToReference.put( token, reference );
110 m_referenceToToken.put( reference, token ); 112 m_referenceToTokens.put( reference, token );
111 m_declarationToToken.put( deobfEntry, token ); 113 m_declarationToToken.put( deobfEntry, token );
112 } 114 }
113 } 115 }
@@ -122,9 +124,9 @@ public class SourceIndex
122 return null; 124 return null;
123 } 125 }
124 126
125 public Token getReferenceToken( EntryReference<Entry,Entry> deobfReference ) 127 public Collection<Token> getReferenceTokens( EntryReference<Entry,Entry> deobfReference )
126 { 128 {
127 return m_referenceToToken.get( deobfReference ); 129 return m_referenceToTokens.get( deobfReference );
128 } 130 }
129 131
130 public EntryReference<Entry,Entry> getDeobfReference( Token token ) 132 public EntryReference<Entry,Entry> getDeobfReference( Token token )
@@ -151,6 +153,27 @@ public class SourceIndex
151 return m_declarationToToken.get( deobfEntry ); 153 return m_declarationToToken.get( deobfEntry );
152 } 154 }
153 155
156 public int getLineNumber( int pos )
157 {
158 // line number is 1-based
159 int line = 0;
160 for( Integer offset : m_lineOffsets )
161 {
162 if( offset > pos )
163 {
164 break;
165 }
166 line++;
167 }
168 return line;
169 }
170
171 public int getColumnNumber( int pos )
172 {
173 // column number is 1-based
174 return pos - m_lineOffsets.get( getLineNumber( pos ) - 1 ) + 1;
175 }
176
154 private int toPos( int line, int col ) 177 private int toPos( int line, int col )
155 { 178 {
156 // line and col are 1-based 179 // line and col are 1-based