diff options
| author | 2014-08-20 01:21:52 -0400 | |
|---|---|---|
| committer | 2014-08-20 01:21:52 -0400 | |
| commit | a85529d1ce6ec533809575ec84572de855464b36 (patch) | |
| tree | 8f1894c272edf0e7eb22aec2f3af41f6bd19c092 /src/cuchaz/enigma/analysis/SourceIndex.java | |
| parent | started new reference navigation system (diff) | |
| download | enigma-fork-a85529d1ce6ec533809575ec84572de855464b36.tar.gz enigma-fork-a85529d1ce6ec533809575ec84572de855464b36.tar.xz enigma-fork-a85529d1ce6ec533809575ec84572de855464b36.zip | |
finished reference navigation system. Still need to debug and polish it, but the basic idea seems to work. =)
Diffstat (limited to '')
| -rw-r--r-- | src/cuchaz/enigma/analysis/SourceIndex.java | 51 |
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 | ******************************************************************************/ |
| 11 | package cuchaz.enigma.analysis; | 11 | package cuchaz.enigma.analysis; |
| 12 | 12 | ||
| 13 | import java.util.HashMap; | ||
| 13 | import java.util.List; | 14 | import java.util.List; |
| 14 | import java.util.Map; | 15 | import java.util.Map; |
| 15 | import java.util.TreeMap; | 16 | import java.util.TreeMap; |
| @@ -24,15 +25,17 @@ import cuchaz.enigma.mapping.Entry; | |||
| 24 | public class SourceIndex | 25 | public 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 ) |