summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/analysis/SourceIndexVisitor.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/analysis/SourceIndexVisitor.java')
-rw-r--r--src/cuchaz/enigma/analysis/SourceIndexVisitor.java618
1 files changed, 618 insertions, 0 deletions
diff --git a/src/cuchaz/enigma/analysis/SourceIndexVisitor.java b/src/cuchaz/enigma/analysis/SourceIndexVisitor.java
new file mode 100644
index 0000000..2a26c85
--- /dev/null
+++ b/src/cuchaz/enigma/analysis/SourceIndexVisitor.java
@@ -0,0 +1,618 @@
1/*******************************************************************************
2 * Copyright (c) 2014 Jeff Martin.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the GNU Public License v3.0
5 * which accompanies this distribution, and is available at
6 * http://www.gnu.org/licenses/gpl.html
7 *
8 * Contributors:
9 * Jeff Martin - initial API and implementation
10 ******************************************************************************/
11package cuchaz.enigma.analysis;
12
13import com.strobel.assembler.metadata.FieldDefinition;
14import com.strobel.assembler.metadata.MemberReference;
15import com.strobel.assembler.metadata.MethodDefinition;
16import com.strobel.assembler.metadata.ParameterDefinition;
17import com.strobel.assembler.metadata.TypeDefinition;
18import com.strobel.assembler.metadata.TypeReference;
19import com.strobel.componentmodel.Key;
20import com.strobel.decompiler.languages.TextLocation;
21import com.strobel.decompiler.languages.java.ast.Annotation;
22import com.strobel.decompiler.languages.java.ast.AnonymousObjectCreationExpression;
23import com.strobel.decompiler.languages.java.ast.ArrayCreationExpression;
24import com.strobel.decompiler.languages.java.ast.ArrayInitializerExpression;
25import com.strobel.decompiler.languages.java.ast.ArraySpecifier;
26import com.strobel.decompiler.languages.java.ast.AssertStatement;
27import com.strobel.decompiler.languages.java.ast.AssignmentExpression;
28import com.strobel.decompiler.languages.java.ast.AstNode;
29import com.strobel.decompiler.languages.java.ast.BinaryOperatorExpression;
30import com.strobel.decompiler.languages.java.ast.BlockStatement;
31import com.strobel.decompiler.languages.java.ast.BreakStatement;
32import com.strobel.decompiler.languages.java.ast.CaseLabel;
33import com.strobel.decompiler.languages.java.ast.CastExpression;
34import com.strobel.decompiler.languages.java.ast.CatchClause;
35import com.strobel.decompiler.languages.java.ast.ClassOfExpression;
36import com.strobel.decompiler.languages.java.ast.Comment;
37import com.strobel.decompiler.languages.java.ast.CompilationUnit;
38import com.strobel.decompiler.languages.java.ast.ComposedType;
39import com.strobel.decompiler.languages.java.ast.ConditionalExpression;
40import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration;
41import com.strobel.decompiler.languages.java.ast.ContinueStatement;
42import com.strobel.decompiler.languages.java.ast.DoWhileStatement;
43import com.strobel.decompiler.languages.java.ast.EmptyStatement;
44import com.strobel.decompiler.languages.java.ast.EnumValueDeclaration;
45import com.strobel.decompiler.languages.java.ast.Expression;
46import com.strobel.decompiler.languages.java.ast.ExpressionStatement;
47import com.strobel.decompiler.languages.java.ast.FieldDeclaration;
48import com.strobel.decompiler.languages.java.ast.ForEachStatement;
49import com.strobel.decompiler.languages.java.ast.ForStatement;
50import com.strobel.decompiler.languages.java.ast.GotoStatement;
51import com.strobel.decompiler.languages.java.ast.IAstVisitor;
52import com.strobel.decompiler.languages.java.ast.Identifier;
53import com.strobel.decompiler.languages.java.ast.IdentifierExpression;
54import com.strobel.decompiler.languages.java.ast.IfElseStatement;
55import com.strobel.decompiler.languages.java.ast.ImportDeclaration;
56import com.strobel.decompiler.languages.java.ast.IndexerExpression;
57import com.strobel.decompiler.languages.java.ast.InstanceInitializer;
58import com.strobel.decompiler.languages.java.ast.InstanceOfExpression;
59import com.strobel.decompiler.languages.java.ast.InvocationExpression;
60import com.strobel.decompiler.languages.java.ast.JavaTokenNode;
61import com.strobel.decompiler.languages.java.ast.Keys;
62import com.strobel.decompiler.languages.java.ast.LabelStatement;
63import com.strobel.decompiler.languages.java.ast.LabeledStatement;
64import com.strobel.decompiler.languages.java.ast.LambdaExpression;
65import com.strobel.decompiler.languages.java.ast.LocalTypeDeclarationStatement;
66import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression;
67import com.strobel.decompiler.languages.java.ast.MethodDeclaration;
68import com.strobel.decompiler.languages.java.ast.MethodGroupExpression;
69import com.strobel.decompiler.languages.java.ast.NewLineNode;
70import com.strobel.decompiler.languages.java.ast.NullReferenceExpression;
71import com.strobel.decompiler.languages.java.ast.ObjectCreationExpression;
72import com.strobel.decompiler.languages.java.ast.PackageDeclaration;
73import com.strobel.decompiler.languages.java.ast.ParameterDeclaration;
74import com.strobel.decompiler.languages.java.ast.ParenthesizedExpression;
75import com.strobel.decompiler.languages.java.ast.PrimitiveExpression;
76import com.strobel.decompiler.languages.java.ast.ReturnStatement;
77import com.strobel.decompiler.languages.java.ast.SimpleType;
78import com.strobel.decompiler.languages.java.ast.SuperReferenceExpression;
79import com.strobel.decompiler.languages.java.ast.SwitchSection;
80import com.strobel.decompiler.languages.java.ast.SwitchStatement;
81import com.strobel.decompiler.languages.java.ast.SynchronizedStatement;
82import com.strobel.decompiler.languages.java.ast.TextNode;
83import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression;
84import com.strobel.decompiler.languages.java.ast.ThrowStatement;
85import com.strobel.decompiler.languages.java.ast.TryCatchStatement;
86import com.strobel.decompiler.languages.java.ast.TypeDeclaration;
87import com.strobel.decompiler.languages.java.ast.TypeParameterDeclaration;
88import com.strobel.decompiler.languages.java.ast.TypeReferenceExpression;
89import com.strobel.decompiler.languages.java.ast.UnaryOperatorExpression;
90import com.strobel.decompiler.languages.java.ast.VariableDeclarationStatement;
91import com.strobel.decompiler.languages.java.ast.VariableInitializer;
92import com.strobel.decompiler.languages.java.ast.WhileStatement;
93import com.strobel.decompiler.languages.java.ast.WildcardType;
94import com.strobel.decompiler.patterns.Pattern;
95
96import cuchaz.enigma.mapping.ArgumentEntry;
97import cuchaz.enigma.mapping.ClassEntry;
98import cuchaz.enigma.mapping.FieldEntry;
99import cuchaz.enigma.mapping.MethodEntry;
100
101public class SourceIndexVisitor implements IAstVisitor<SourceIndex, Void>
102{
103 @Override
104 public Void visitComment( Comment node, SourceIndex index )
105 {
106 return recurse( node, index );
107 }
108
109 @Override
110 public Void visitPatternPlaceholder( AstNode node, Pattern pattern, SourceIndex index )
111 {
112 return recurse( node, index );
113 }
114
115 @Override
116 public Void visitInvocationExpression( InvocationExpression node, SourceIndex index )
117 {
118 MemberReference ref = node.getUserData( Keys.MEMBER_REFERENCE );
119 ClassEntry classEntry = new ClassEntry( ref.getDeclaringType().getInternalName() );
120 MethodEntry methodEntry = new MethodEntry( classEntry, ref.getName(), ref.getSignature() );
121 if( node.getTarget() instanceof MemberReferenceExpression )
122 {
123 index.add( ((MemberReferenceExpression)node.getTarget()).getMemberNameToken(), methodEntry );
124 }
125
126 return recurse( node, index );
127 }
128
129 @Override
130 public Void visitTypeReference( TypeReferenceExpression node, SourceIndex index )
131 {
132 return recurse( node, index );
133 }
134
135 @Override
136 public Void visitJavaTokenNode( JavaTokenNode node, SourceIndex index )
137 {
138 return recurse( node, index );
139 }
140
141 @Override
142 public Void visitMemberReferenceExpression( MemberReferenceExpression node, SourceIndex index )
143 {
144 MemberReference ref = node.getUserData( Keys.MEMBER_REFERENCE );
145 if( ref != null )
146 {
147 ClassEntry classEntry = new ClassEntry( ref.getDeclaringType().getInternalName() );
148 FieldEntry fieldEntry = new FieldEntry( classEntry, ref.getName() );
149 index.add( node.getMemberNameToken(), fieldEntry );
150 }
151
152 return recurse( node, index );
153 }
154
155 @Override
156 public Void visitIdentifier( Identifier node, SourceIndex index )
157 {
158 return recurse( node, index );
159 }
160
161 @Override
162 public Void visitNullReferenceExpression( NullReferenceExpression node, SourceIndex index )
163 {
164 return recurse( node, index );
165 }
166
167 @Override
168 public Void visitThisReferenceExpression( ThisReferenceExpression node, SourceIndex index )
169 {
170 return recurse( node, index );
171 }
172
173 @Override
174 public Void visitSuperReferenceExpression( SuperReferenceExpression node, SourceIndex index )
175 {
176 return recurse( node, index );
177 }
178
179 @Override
180 public Void visitClassOfExpression( ClassOfExpression node, SourceIndex index )
181 {
182 return recurse( node, index );
183 }
184
185 @Override
186 public Void visitBlockStatement( BlockStatement node, SourceIndex index )
187 {
188 return recurse( node, index );
189 }
190
191 @Override
192 public Void visitExpressionStatement( ExpressionStatement node, SourceIndex index )
193 {
194 return recurse( node, index );
195 }
196
197 @Override
198 public Void visitBreakStatement( BreakStatement node, SourceIndex index )
199 {
200 return recurse( node, index );
201 }
202
203 @Override
204 public Void visitContinueStatement( ContinueStatement node, SourceIndex index )
205 {
206 return recurse( node, index );
207 }
208
209 @Override
210 public Void visitDoWhileStatement( DoWhileStatement node, SourceIndex index )
211 {
212 return recurse( node, index );
213 }
214
215 @Override
216 public Void visitEmptyStatement( EmptyStatement node, SourceIndex index )
217 {
218 return recurse( node, index );
219 }
220
221 @Override
222 public Void visitIfElseStatement( IfElseStatement node, SourceIndex index )
223 {
224 return recurse( node, index );
225 }
226
227 @Override
228 public Void visitLabelStatement( LabelStatement node, SourceIndex index )
229 {
230 return recurse( node, index );
231 }
232
233 @Override
234 public Void visitLabeledStatement( LabeledStatement node, SourceIndex index )
235 {
236 return recurse( node, index );
237 }
238
239 @Override
240 public Void visitReturnStatement( ReturnStatement node, SourceIndex index )
241 {
242 return recurse( node, index );
243 }
244
245 @Override
246 public Void visitSwitchStatement( SwitchStatement node, SourceIndex index )
247 {
248 return recurse( node, index );
249 }
250
251 @Override
252 public Void visitSwitchSection( SwitchSection node, SourceIndex index )
253 {
254 return recurse( node, index );
255 }
256
257 @Override
258 public Void visitCaseLabel( CaseLabel node, SourceIndex index )
259 {
260 return recurse( node, index );
261 }
262
263 @Override
264 public Void visitThrowStatement( ThrowStatement node, SourceIndex index )
265 {
266 return recurse( node, index );
267 }
268
269 @Override
270 public Void visitCatchClause( CatchClause node, SourceIndex index )
271 {
272 return recurse( node, index );
273 }
274
275 @Override
276 public Void visitAnnotation( Annotation node, SourceIndex index )
277 {
278 return recurse( node, index );
279 }
280
281 @Override
282 public Void visitNewLine( NewLineNode node, SourceIndex index )
283 {
284 return recurse( node, index );
285 }
286
287 @Override
288 public Void visitVariableDeclaration( VariableDeclarationStatement node, SourceIndex index )
289 {
290 return recurse( node, index );
291 }
292
293 @Override
294 public Void visitVariableInitializer( VariableInitializer node, SourceIndex index )
295 {
296 return recurse( node, index );
297 }
298
299 @Override
300 public Void visitText( TextNode node, SourceIndex index )
301 {
302 return recurse( node, index );
303 }
304
305 @Override
306 public Void visitImportDeclaration( ImportDeclaration node, SourceIndex index )
307 {
308 return recurse( node, index );
309 }
310
311 @Override
312 public Void visitSimpleType( SimpleType node, SourceIndex index )
313 {
314 TypeReference ref = node.getUserData( Keys.TYPE_REFERENCE );
315 if( node.getIdentifierToken().getStartLocation() != TextLocation.EMPTY )
316 {
317 index.add( node.getIdentifierToken(), new ClassEntry( ref.getInternalName() ) );
318 }
319
320 return recurse( node, index );
321 }
322
323 @Override
324 public Void visitMethodDeclaration( MethodDeclaration node, SourceIndex index )
325 {
326 MethodDefinition def = node.getUserData( Keys.METHOD_DEFINITION );
327 ClassEntry classEntry = new ClassEntry( def.getDeclaringType().getInternalName() );
328 MethodEntry methodEntry = new MethodEntry( classEntry, def.getName(), def.getSignature() );
329 index.add( node.getNameToken(), methodEntry );
330
331 return recurse( node, index );
332 }
333
334 @Override
335 public Void visitInitializerBlock( InstanceInitializer node, SourceIndex index )
336 {
337 return recurse( node, index );
338 }
339
340 @Override
341 public Void visitConstructorDeclaration( ConstructorDeclaration node, SourceIndex index )
342 {
343 MethodDefinition def = node.getUserData( Keys.METHOD_DEFINITION );
344 index.add( node.getNameToken(), new ClassEntry( def.getDeclaringType().getInternalName() ) );
345
346 return recurse( node, index );
347 }
348
349 @Override
350 public Void visitTypeParameterDeclaration( TypeParameterDeclaration node, SourceIndex index )
351 {
352 return recurse( node, index );
353 }
354
355 @Override
356 public Void visitParameterDeclaration( ParameterDeclaration node, SourceIndex index )
357 {
358 ParameterDefinition def = node.getUserData( Keys.PARAMETER_DEFINITION );
359 ClassEntry classEntry = new ClassEntry( def.getDeclaringType().getInternalName() );
360 MethodDefinition methodDef = (MethodDefinition)def.getMethod();
361 MethodEntry methodEntry = new MethodEntry( classEntry, methodDef.getName(), methodDef.getSignature() );
362 ArgumentEntry argumentEntry = new ArgumentEntry( methodEntry, def.getPosition(), def.getName() );
363 index.add( node.getNameToken(), argumentEntry );
364
365 return recurse( node, index );
366 }
367
368 @Override
369 public Void visitFieldDeclaration( FieldDeclaration node, SourceIndex index )
370 {
371 FieldDefinition def = node.getUserData( Keys.FIELD_DEFINITION );
372 ClassEntry classEntry = new ClassEntry( def.getDeclaringType().getInternalName() );
373 FieldEntry fieldEntry = new FieldEntry( classEntry, def.getName() );
374 assert( node.getVariables().size() == 1 );
375 VariableInitializer variable = node.getVariables().firstOrNullObject();
376 index.add( variable.getNameToken(), fieldEntry );
377
378 return recurse( node, index );
379 }
380
381 @Override
382 public Void visitTypeDeclaration( TypeDeclaration node, SourceIndex index )
383 {
384 TypeDefinition def = node.getUserData( Keys.TYPE_DEFINITION );
385 index.add( node.getNameToken(), new ClassEntry( def.getInternalName() ) );
386
387 return recurse( node, index );
388 }
389
390 @Override
391 public Void visitCompilationUnit( CompilationUnit node, SourceIndex index )
392 {
393 return recurse( node, index );
394 }
395
396 @Override
397 public Void visitPackageDeclaration( PackageDeclaration node, SourceIndex index )
398 {
399 return recurse( node, index );
400 }
401
402 @Override
403 public Void visitArraySpecifier( ArraySpecifier node, SourceIndex index )
404 {
405 return recurse( node, index );
406 }
407
408 @Override
409 public Void visitComposedType( ComposedType node, SourceIndex index )
410 {
411 return recurse( node, index );
412 }
413
414 @Override
415 public Void visitWhileStatement( WhileStatement node, SourceIndex index )
416 {
417 return recurse( node, index );
418 }
419
420 @Override
421 public Void visitPrimitiveExpression( PrimitiveExpression node, SourceIndex index )
422 {
423 return recurse( node, index );
424 }
425
426 @Override
427 public Void visitCastExpression( CastExpression node, SourceIndex index )
428 {
429 return recurse( node, index );
430 }
431
432 @Override
433 public Void visitBinaryOperatorExpression( BinaryOperatorExpression node, SourceIndex index )
434 {
435 return recurse( node, index );
436 }
437
438 @Override
439 public Void visitInstanceOfExpression( InstanceOfExpression node, SourceIndex index )
440 {
441 return recurse( node, index );
442 }
443
444 @Override
445 public Void visitIndexerExpression( IndexerExpression node, SourceIndex index )
446 {
447 return recurse( node, index );
448 }
449
450 @Override
451 public Void visitIdentifierExpression( IdentifierExpression node, SourceIndex index )
452 {
453 // TODO
454 return recurse( node, index );
455 }
456
457 @Override
458 public Void visitUnaryOperatorExpression( UnaryOperatorExpression node, SourceIndex index )
459 {
460 return recurse( node, index );
461 }
462
463 @Override
464 public Void visitConditionalExpression( ConditionalExpression node, SourceIndex index )
465 {
466 return recurse( node, index );
467 }
468
469 @Override
470 public Void visitArrayInitializerExpression( ArrayInitializerExpression node, SourceIndex index )
471 {
472 return recurse( node, index );
473 }
474
475 @Override
476 public Void visitObjectCreationExpression( ObjectCreationExpression node, SourceIndex index )
477 {
478 return recurse( node, index );
479 }
480
481 @Override
482 public Void visitArrayCreationExpression( ArrayCreationExpression node, SourceIndex index )
483 {
484 return recurse( node, index );
485 }
486
487 @Override
488 public Void visitAssignmentExpression( AssignmentExpression node, SourceIndex index )
489 {
490 return recurse( node, index );
491 }
492
493 @Override
494 public Void visitForStatement( ForStatement node, SourceIndex index )
495 {
496 return recurse( node, index );
497 }
498
499 @Override
500 public Void visitForEachStatement( ForEachStatement node, SourceIndex index )
501 {
502 return recurse( node, index );
503 }
504
505 @Override
506 public Void visitTryCatchStatement( TryCatchStatement node, SourceIndex index )
507 {
508 return recurse( node, index );
509 }
510
511 @Override
512 public Void visitGotoStatement( GotoStatement node, SourceIndex index )
513 {
514 return recurse( node, index );
515 }
516
517 @Override
518 public Void visitParenthesizedExpression( ParenthesizedExpression node, SourceIndex index )
519 {
520 return recurse( node, index );
521 }
522
523 @Override
524 public Void visitSynchronizedStatement( SynchronizedStatement node, SourceIndex index )
525 {
526 return recurse( node, index );
527 }
528
529 @Override
530 public Void visitAnonymousObjectCreationExpression( AnonymousObjectCreationExpression node, SourceIndex index )
531 {
532 return recurse( node, index );
533 }
534
535 @Override
536 public Void visitWildcardType( WildcardType node, SourceIndex index )
537 {
538 return recurse( node, index );
539 }
540
541 @Override
542 public Void visitMethodGroupExpression( MethodGroupExpression node, SourceIndex index )
543 {
544 return recurse( node, index );
545 }
546
547 @Override
548 public Void visitEnumValueDeclaration( EnumValueDeclaration node, SourceIndex index )
549 {
550 return recurse( node, index );
551 }
552
553 @Override
554 public Void visitAssertStatement( AssertStatement node, SourceIndex index )
555 {
556 return recurse( node, index );
557 }
558
559 @Override
560 public Void visitLambdaExpression( LambdaExpression node, SourceIndex index )
561 {
562 return recurse( node, index );
563 }
564
565 @Override
566 public Void visitLocalTypeDeclarationStatement( LocalTypeDeclarationStatement node, SourceIndex index )
567 {
568 return recurse( node, index );
569 }
570
571 private Void recurse( AstNode node, SourceIndex index )
572 {
573 // TEMP: show the tree
574 System.out.println( getIndent( node ) + node.getClass().getSimpleName() + dumpUserData( node ) + " " + node.getRegion() );
575
576 for( final AstNode child : node.getChildren() )
577 {
578 child.acceptVisitor( this, index );
579 }
580 return null;
581 }
582
583 private String dumpUserData( AstNode node )
584 {
585 StringBuilder buf = new StringBuilder();
586 for( Key<?> key : Keys.ALL_KEYS )
587 {
588 Object val = node.getUserData( key );
589 if( val != null )
590 {
591 buf.append( String.format( " [%s=%s]", key, val ) );
592 }
593 }
594 return buf.toString();
595 }
596
597 private String getIndent( AstNode node )
598 {
599 StringBuilder buf = new StringBuilder();
600 int depth = getDepth( node );
601 for( int i = 0; i < depth; i++ )
602 {
603 buf.append( "\t" );
604 }
605 return buf.toString();
606 }
607
608 private int getDepth( AstNode node )
609 {
610 int depth = -1;
611 while( node != null )
612 {
613 depth++;
614 node = node.getParent();
615 }
616 return depth;
617 }
618}