summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/analysis/Analyzer.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/analysis/Analyzer.java')
-rw-r--r--src/cuchaz/enigma/analysis/Analyzer.java91
1 files changed, 52 insertions, 39 deletions
diff --git a/src/cuchaz/enigma/analysis/Analyzer.java b/src/cuchaz/enigma/analysis/Analyzer.java
index dad8dc5..2b7e0b0 100644
--- a/src/cuchaz/enigma/analysis/Analyzer.java
+++ b/src/cuchaz/enigma/analysis/Analyzer.java
@@ -35,6 +35,7 @@ import com.sun.source.util.Trees;
35 35
36import cuchaz.enigma.mapping.ArgumentEntry; 36import cuchaz.enigma.mapping.ArgumentEntry;
37import cuchaz.enigma.mapping.ClassEntry; 37import cuchaz.enigma.mapping.ClassEntry;
38import cuchaz.enigma.mapping.Entry;
38import cuchaz.enigma.mapping.FieldEntry; 39import cuchaz.enigma.mapping.FieldEntry;
39import cuchaz.enigma.mapping.MethodEntry; 40import cuchaz.enigma.mapping.MethodEntry;
40 41
@@ -78,39 +79,31 @@ class TreeVisitor extends TreeScanner<CompilationUnitTree, SourcedAst>
78 79
79 private ClassEntry indexClass( ClassTree classTree, SourcedAst ast ) 80 private ClassEntry indexClass( ClassTree classTree, SourcedAst ast )
80 { 81 {
81 // build the entry 82 // index the class name
82 ClassEntry entry = new ClassEntry( ast.getFullClassName( classTree.getSimpleName().toString() ) ); 83 ClassEntry classEntry = indexClassIdentifier( classTree, ast );
84 assert( classEntry != null );
83 85
84 // lex the source at this tree node 86 // index the extends clause
85 for( Token token : new Lexer( ast.getSource( classTree ).toString() ) ) 87 indexClassIdentifier( classTree.getExtendsClause(), ast );
88
89 // index the implements clauses
90 for( Tree implementsTree : classTree.getImplementsClause() )
86 { 91 {
87 // scan until we get the first identifier 92 indexClassIdentifier( implementsTree, ast );
88 if( token.type == TokenType.IDENTIFIER )
89 {
90 m_index.add( entry, offsetToken( token, ast.getStart( classTree ) ) );
91 break;
92 }
93 } 93 }
94 94
95 return entry; 95 return classEntry;
96 } 96 }
97 97
98 private FieldEntry indexField( VariableTree variableTree, SourcedAst ast, ClassEntry classEntry ) 98 private FieldEntry indexField( VariableTree variableTree, SourcedAst ast, ClassEntry classEntry )
99 { 99 {
100 // build the entry 100 // index the field name
101 FieldEntry entry = new FieldEntry( classEntry, variableTree.getName().toString() ); 101 FieldEntry entry = new FieldEntry( classEntry, variableTree.getName().toString() );
102 Token nameToken = new Lexer( ast.getSource( variableTree ) ).getFirstIdentifierMatching( variableTree.getName() );
103 addToken( entry, nameToken, variableTree, ast );
102 104
103 // lex the source at this tree node 105 // index the field type
104 Lexer lexer = new Lexer( ast.getSource( variableTree ).toString() ); 106 indexClassIdentifier( variableTree.getType(), ast );
105 for( Token token : lexer )
106 {
107 // scan until we find an identifier that matches the field name
108 if( token.type == TokenType.IDENTIFIER && lexer.getText( token ).equals( entry.getName() ) )
109 {
110 m_index.add( entry, offsetToken( token, ast.getStart( variableTree ) ) );
111 break;
112 }
113 }
114 107
115 return entry; 108 return entry;
116 } 109 }
@@ -136,13 +129,13 @@ class TreeVisitor extends TreeScanner<CompilationUnitTree, SourcedAst>
136 MethodEntry entry = new MethodEntry( classEntry, methodTree.getName().toString(), signature.toString() ); 129 MethodEntry entry = new MethodEntry( classEntry, methodTree.getName().toString(), signature.toString() );
137 130
138 // lex the source at this tree node 131 // lex the source at this tree node
139 Lexer lexer = new Lexer( ast.getSource( methodTree ).toString() ); 132 Lexer lexer = new Lexer( ast.getSource( methodTree ) );
140 for( Token token : lexer ) 133 for( Token token : lexer )
141 { 134 {
142 // scan until we find an identifier that matches the method name 135 // scan until we find an identifier that matches the method name
143 if( token.type == TokenType.IDENTIFIER && lexer.getText( token ).equals( entry.getName() ) ) 136 if( token.type == TokenType.IDENTIFIER && lexer.getText( token ).equals( entry.getName() ) )
144 { 137 {
145 m_index.add( entry, offsetToken( token, ast.getStart( methodTree ) ) ); 138 addToken( entry, token, methodTree, ast );
146 break; 139 break;
147 } 140 }
148 } 141 }
@@ -152,27 +145,47 @@ class TreeVisitor extends TreeScanner<CompilationUnitTree, SourcedAst>
152 145
153 private void indexArgument( VariableTree variableTree, SourcedAst ast, MethodEntry methodEntry, int index ) 146 private void indexArgument( VariableTree variableTree, SourcedAst ast, MethodEntry methodEntry, int index )
154 { 147 {
155 // build the entry 148 // index argument name
156 ArgumentEntry entry = new ArgumentEntry( methodEntry, index, variableTree.getName().toString() ); 149 ArgumentEntry entry = new ArgumentEntry( methodEntry, index, variableTree.getName().toString() );
150 Token token = new Lexer( ast.getSource( variableTree ) ).getLastIdentifier();
151 addToken( entry, token, variableTree, ast );
157 152
158 // lex the source at this tree node 153 // index argument type
159 Lexer lexer = new Lexer( ast.getSource( variableTree ).toString() ); 154 indexClassIdentifier( variableTree.getType(), ast );
160 for( Token token : lexer ) 155 }
156
157 private ClassEntry indexClassIdentifier( Tree tree, SourcedAst ast )
158 {
159 if( tree == null )
161 { 160 {
162 // scan until we find an identifier that matches the variable name 161 return null;
163 if( token.type == TokenType.IDENTIFIER && lexer.getText( token ).equals( entry.getName() ) ) 162 }
164 { 163
165 m_index.add( entry, offsetToken( token, ast.getStart( variableTree ) ) ); 164 Lexer lexer = new Lexer( ast.getSource( tree ) );
166 break; 165 Token token = lexer.getFirstIdentifier();
167 } 166 if( token == null )
167 {
168 return null;
168 } 169 }
170
171 ClassEntry classEntry = new ClassEntry( ast.getFullClassName( lexer.getText( token ) ) );
172 addToken( classEntry, token, tree, ast );
173 return classEntry;
169 } 174 }
170 175
171 private Token offsetToken( Token in, int offset ) 176 private void addToken( Entry entry, Token token, Tree tree, SourcedAst ast )
172 { 177 {
173 return new Token( in.type, in.start + offset, in.length ); 178 if( token == null )
179 {
180 throw new IllegalArgumentException( "token cannot be null!" );
181 }
182
183 // offset the token by the tree
184 Token offsetToken = new Token( token.type, token.start + ast.getStart( tree ), token.length );
185
186 m_index.add( entry, offsetToken );
174 } 187 }
175 188
176 private String toJvmType( Tree tree, SourcedAst ast ) 189 private String toJvmType( Tree tree, SourcedAst ast )
177 { 190 {
178 switch( tree.getKind() ) 191 switch( tree.getKind() )