diff options
Diffstat (limited to 'src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java')
| -rw-r--r-- | src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java b/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java index ab50552..a1dac4b 100644 --- a/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java +++ b/src/cuchaz/enigma/analysis/SourceIndexBehaviorVisitor.java | |||
| @@ -12,9 +12,11 @@ package cuchaz.enigma.analysis; | |||
| 12 | 12 | ||
| 13 | import com.strobel.assembler.metadata.MemberReference; | 13 | import com.strobel.assembler.metadata.MemberReference; |
| 14 | import com.strobel.assembler.metadata.MethodDefinition; | 14 | import com.strobel.assembler.metadata.MethodDefinition; |
| 15 | import com.strobel.assembler.metadata.MethodReference; | ||
| 15 | import com.strobel.assembler.metadata.ParameterDefinition; | 16 | import com.strobel.assembler.metadata.ParameterDefinition; |
| 16 | import com.strobel.assembler.metadata.TypeReference; | 17 | import com.strobel.assembler.metadata.TypeReference; |
| 17 | import com.strobel.decompiler.languages.TextLocation; | 18 | import com.strobel.decompiler.languages.TextLocation; |
| 19 | import com.strobel.decompiler.languages.java.ast.AstNode; | ||
| 18 | import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; | 20 | import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; |
| 19 | import com.strobel.decompiler.languages.java.ast.IdentifierExpression; | 21 | import com.strobel.decompiler.languages.java.ast.IdentifierExpression; |
| 20 | import com.strobel.decompiler.languages.java.ast.InvocationExpression; | 22 | import com.strobel.decompiler.languages.java.ast.InvocationExpression; |
| @@ -24,6 +26,8 @@ import com.strobel.decompiler.languages.java.ast.MethodDeclaration; | |||
| 24 | import com.strobel.decompiler.languages.java.ast.ObjectCreationExpression; | 26 | import com.strobel.decompiler.languages.java.ast.ObjectCreationExpression; |
| 25 | import com.strobel.decompiler.languages.java.ast.ParameterDeclaration; | 27 | import com.strobel.decompiler.languages.java.ast.ParameterDeclaration; |
| 26 | import com.strobel.decompiler.languages.java.ast.SimpleType; | 28 | import com.strobel.decompiler.languages.java.ast.SimpleType; |
| 29 | import com.strobel.decompiler.languages.java.ast.SuperReferenceExpression; | ||
| 30 | import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression; | ||
| 27 | 31 | ||
| 28 | import cuchaz.enigma.mapping.ArgumentEntry; | 32 | import cuchaz.enigma.mapping.ArgumentEntry; |
| 29 | import cuchaz.enigma.mapping.BehaviorEntry; | 33 | import cuchaz.enigma.mapping.BehaviorEntry; |
| @@ -58,14 +62,49 @@ public class SourceIndexBehaviorVisitor extends SourceIndexVisitor | |||
| 58 | public Void visitInvocationExpression( InvocationExpression node, SourceIndex index ) | 62 | public Void visitInvocationExpression( InvocationExpression node, SourceIndex index ) |
| 59 | { | 63 | { |
| 60 | MemberReference ref = node.getUserData( Keys.MEMBER_REFERENCE ); | 64 | MemberReference ref = node.getUserData( Keys.MEMBER_REFERENCE ); |
| 65 | |||
| 66 | // get the behavior entry | ||
| 61 | ClassEntry classEntry = new ClassEntry( ref.getDeclaringType().getInternalName() ); | 67 | ClassEntry classEntry = new ClassEntry( ref.getDeclaringType().getInternalName() ); |
| 62 | if( node.getTarget() instanceof MemberReferenceExpression ) | 68 | BehaviorEntry behaviorEntry = null; |
| 69 | if( ref instanceof MethodReference ) | ||
| 63 | { | 70 | { |
| 64 | MethodEntry methodEntry = new MethodEntry( classEntry, ref.getName(), ref.getSignature() ); | 71 | MethodReference methodRef = (MethodReference)ref; |
| 65 | index.addReference( | 72 | if( methodRef.isConstructor() ) |
| 66 | ((MemberReferenceExpression)node.getTarget()).getMemberNameToken(), | 73 | { |
| 67 | new EntryReference<Entry,Entry>( methodEntry, m_behaviorEntry ) | 74 | behaviorEntry = new ConstructorEntry( classEntry, ref.getSignature() ); |
| 68 | ); | 75 | } |
| 76 | else if( methodRef.isTypeInitializer() ) | ||
| 77 | { | ||
| 78 | behaviorEntry = new ConstructorEntry( classEntry ); | ||
| 79 | } | ||
| 80 | else | ||
| 81 | { | ||
| 82 | behaviorEntry = new MethodEntry( classEntry, ref.getName(), ref.getSignature() ); | ||
| 83 | } | ||
| 84 | } | ||
| 85 | if( behaviorEntry != null ) | ||
| 86 | { | ||
| 87 | // get the node for the token | ||
| 88 | AstNode tokenNode = null; | ||
| 89 | if( node.getTarget() instanceof MemberReferenceExpression ) | ||
| 90 | { | ||
| 91 | tokenNode = ((MemberReferenceExpression)node.getTarget()).getMemberNameToken(); | ||
| 92 | } | ||
| 93 | else if( node.getTarget() instanceof SuperReferenceExpression ) | ||
| 94 | { | ||
| 95 | tokenNode = node.getTarget(); | ||
| 96 | } | ||
| 97 | else if( node.getTarget() instanceof ThisReferenceExpression ) | ||
| 98 | { | ||
| 99 | tokenNode = node.getTarget(); | ||
| 100 | } | ||
| 101 | if( tokenNode != null ) | ||
| 102 | { | ||
| 103 | index.addReference( | ||
| 104 | tokenNode, | ||
| 105 | new EntryReference<Entry,Entry>( behaviorEntry, m_behaviorEntry ) | ||
| 106 | ); | ||
| 107 | } | ||
| 69 | } | 108 | } |
| 70 | 109 | ||
| 71 | return recurse( node, index ); | 110 | return recurse( node, index ); |