From a85529d1ce6ec533809575ec84572de855464b36 Mon Sep 17 00:00:00 2001 From: jeff Date: Wed, 20 Aug 2014 01:21:52 -0400 Subject: finished reference navigation system. Still need to debug and polish it, but the basic idea seems to work. =) --- src/cuchaz/enigma/analysis/SourceIndex.java | 51 ++++++++++++++++++----------- 1 file changed, 31 insertions(+), 20 deletions(-) (limited to 'src/cuchaz/enigma/analysis/SourceIndex.java') 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 @@ ******************************************************************************/ package cuchaz.enigma.analysis; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -24,15 +25,17 @@ import cuchaz.enigma.mapping.Entry; public class SourceIndex { private String m_source; - private TreeMap m_tokens; - private Map m_declarations; + private TreeMap> m_tokenToReference; + private HashMap,Token> m_referenceToToken; + private Map m_declarationToToken; private List m_lineOffsets; public SourceIndex( String source ) { m_source = source; - m_tokens = Maps.newTreeMap(); - m_declarations = Maps.newHashMap(); + m_tokenToReference = Maps.newTreeMap(); + m_referenceToToken = Maps.newHashMap(); + m_declarationToToken = Maps.newHashMap(); m_lineOffsets = Lists.newArrayList(); // count the lines @@ -87,12 +90,13 @@ public class SourceIndex return token; } - public void add( Identifier node, Entry deobfEntry ) + public void addReference( Identifier node, EntryReference deobfReference ) { Token token = getToken( node ); if( token != null ) { - m_tokens.put( token, deobfEntry ); + m_tokenToReference.put( token, deobfReference ); + m_referenceToToken.put( deobfReference, token ); } } @@ -101,19 +105,16 @@ public class SourceIndex Token token = getToken( node ); if( token != null ) { - m_tokens.put( token, deobfEntry ); - m_declarations.put( deobfEntry, token ); + EntryReference reference = new EntryReference( deobfEntry ); + m_tokenToReference.put( token, reference ); + m_referenceToToken.put( reference, token ); + m_declarationToToken.put( deobfEntry, token ); } } - public Token getToken( int pos ) + public Token getReferenceToken( int pos ) { - Map.Entry mapEntry = m_tokens.floorEntry( new Token( pos, pos ) ); - if( mapEntry == null ) - { - return null; - } - Token token = mapEntry.getKey(); + Token token = m_tokenToReference.floorKey( new Token( pos, pos ) ); if( token.contains( pos ) ) { return token; @@ -121,23 +122,33 @@ public class SourceIndex return null; } - public Entry getEntry( Token token ) + public Token getReferenceToken( EntryReference deobfReference ) + { + return m_referenceToToken.get( deobfReference ); + } + + public EntryReference getDeobfReference( Token token ) { if( token == null ) { return null; } - return m_tokens.get( token ); + return m_tokenToReference.get( token ); + } + + public Iterable referenceTokens( ) + { + return m_tokenToReference.keySet(); } - public Iterable tokens( ) + public Iterable declarationTokens( ) { - return m_tokens.keySet(); + return m_declarationToToken.values(); } public Token getDeclarationToken( Entry deobfEntry ) { - return m_declarations.get( deobfEntry ); + return m_declarationToToken.get( deobfEntry ); } private int toPos( int line, int col ) -- cgit v1.2.3