summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/analysis/SourceIndex.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/analysis/SourceIndex.java')
-rw-r--r--src/cuchaz/enigma/analysis/SourceIndex.java51
1 files changed, 31 insertions, 20 deletions
diff --git a/src/cuchaz/enigma/analysis/SourceIndex.java b/src/cuchaz/enigma/analysis/SourceIndex.java
index 645a71d..bf890e3 100644
--- a/src/cuchaz/enigma/analysis/SourceIndex.java
+++ b/src/cuchaz/enigma/analysis/SourceIndex.java
@@ -10,6 +10,7 @@
10 ******************************************************************************/ 10 ******************************************************************************/
11package cuchaz.enigma.analysis; 11package cuchaz.enigma.analysis;
12 12
13import java.util.HashMap;
13import java.util.List; 14import java.util.List;
14import java.util.Map; 15import java.util.Map;
15import java.util.TreeMap; 16import java.util.TreeMap;
@@ -24,15 +25,17 @@ import cuchaz.enigma.mapping.Entry;
24public class SourceIndex 25public class SourceIndex
25{ 26{
26 private String m_source; 27 private String m_source;
27 private TreeMap<Token,Entry> m_tokens; 28 private TreeMap<Token,EntryReference<Entry,Entry>> m_tokenToReference;
28 private Map<Entry,Token> m_declarations; 29 private HashMap<EntryReference<Entry,Entry>,Token> m_referenceToToken;
30 private Map<Entry,Token> m_declarationToToken;
29 private List<Integer> m_lineOffsets; 31 private List<Integer> m_lineOffsets;
30 32
31 public SourceIndex( String source ) 33 public SourceIndex( String source )
32 { 34 {
33 m_source = source; 35 m_source = source;
34 m_tokens = Maps.newTreeMap(); 36 m_tokenToReference = Maps.newTreeMap();
35 m_declarations = Maps.newHashMap(); 37 m_referenceToToken = Maps.newHashMap();
38 m_declarationToToken = Maps.newHashMap();
36 m_lineOffsets = Lists.newArrayList(); 39 m_lineOffsets = Lists.newArrayList();
37 40
38 // count the lines 41 // count the lines
@@ -87,12 +90,13 @@ public class SourceIndex
87 return token; 90 return token;
88 } 91 }
89 92
90 public void add( Identifier node, Entry deobfEntry ) 93 public void addReference( Identifier node, EntryReference<Entry,Entry> deobfReference )
91 { 94 {
92 Token token = getToken( node ); 95 Token token = getToken( node );
93 if( token != null ) 96 if( token != null )
94 { 97 {
95 m_tokens.put( token, deobfEntry ); 98 m_tokenToReference.put( token, deobfReference );
99 m_referenceToToken.put( deobfReference, token );
96 } 100 }
97 } 101 }
98 102
@@ -101,19 +105,16 @@ public class SourceIndex
101 Token token = getToken( node ); 105 Token token = getToken( node );
102 if( token != null ) 106 if( token != null )
103 { 107 {
104 m_tokens.put( token, deobfEntry ); 108 EntryReference<Entry,Entry> reference = new EntryReference<Entry,Entry>( deobfEntry );
105 m_declarations.put( deobfEntry, token ); 109 m_tokenToReference.put( token, reference );
110 m_referenceToToken.put( reference, token );
111 m_declarationToToken.put( deobfEntry, token );
106 } 112 }
107 } 113 }
108 114
109 public Token getToken( int pos ) 115 public Token getReferenceToken( int pos )
110 { 116 {
111 Map.Entry<Token,Entry> mapEntry = m_tokens.floorEntry( new Token( pos, pos ) ); 117 Token token = m_tokenToReference.floorKey( new Token( pos, pos ) );
112 if( mapEntry == null )
113 {
114 return null;
115 }
116 Token token = mapEntry.getKey();
117 if( token.contains( pos ) ) 118 if( token.contains( pos ) )
118 { 119 {
119 return token; 120 return token;
@@ -121,23 +122,33 @@ public class SourceIndex
121 return null; 122 return null;
122 } 123 }
123 124
124 public Entry getEntry( Token token ) 125 public Token getReferenceToken( EntryReference<Entry,Entry> deobfReference )
126 {
127 return m_referenceToToken.get( deobfReference );
128 }
129
130 public EntryReference<Entry,Entry> getDeobfReference( Token token )
125 { 131 {
126 if( token == null ) 132 if( token == null )
127 { 133 {
128 return null; 134 return null;
129 } 135 }
130 return m_tokens.get( token ); 136 return m_tokenToReference.get( token );
137 }
138
139 public Iterable<Token> referenceTokens( )
140 {
141 return m_tokenToReference.keySet();
131 } 142 }
132 143
133 public Iterable<Token> tokens( ) 144 public Iterable<Token> declarationTokens( )
134 { 145 {
135 return m_tokens.keySet(); 146 return m_declarationToToken.values();
136 } 147 }
137 148
138 public Token getDeclarationToken( Entry deobfEntry ) 149 public Token getDeclarationToken( Entry deobfEntry )
139 { 150 {
140 return m_declarations.get( deobfEntry ); 151 return m_declarationToToken.get( deobfEntry );
141 } 152 }
142 153
143 private int toPos( int line, int col ) 154 private int toPos( int line, int col )