From bad1f1b1e5ac0d861348f8c652919be555a3f921 Mon Sep 17 00:00:00 2001 From: Thiakil Date: Tue, 10 Jul 2018 15:12:02 +0800 Subject: index & resolve method/field references for usages view --- .../enigma/analysis/IndexReferenceVisitor.java | 26 ++++++++++++++++++++++ .../enigma/analysis/SourceIndexMethodVisitor.java | 23 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/main/java/cuchaz/enigma/analysis/IndexReferenceVisitor.java b/src/main/java/cuchaz/enigma/analysis/IndexReferenceVisitor.java index c05281bd..f37f1e90 100644 --- a/src/main/java/cuchaz/enigma/analysis/IndexReferenceVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/IndexReferenceVisitor.java @@ -6,7 +6,9 @@ import cuchaz.enigma.mapping.Signature; import cuchaz.enigma.mapping.entry.ClassEntry; import cuchaz.enigma.mapping.entry.MethodDefEntry; import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.Handle; import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; public class IndexReferenceVisitor extends ClassVisitor { private final JarIndex index; @@ -47,5 +49,29 @@ public class IndexReferenceVisitor extends ClassVisitor { public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { this.index.indexMethodCall(callerEntry, owner, name, desc); } + + @Override + public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { + for (Object bsmArg : bsmArgs){ + if (bsmArg instanceof Handle){ + Handle handle = (Handle)bsmArg; + switch (handle.getTag()){ + case Opcodes.H_GETFIELD: + case Opcodes.H_GETSTATIC: + case Opcodes.H_PUTFIELD: + case Opcodes.H_PUTSTATIC: + this.index.indexFieldAccess(callerEntry, handle.getOwner(), handle.getName(), handle.getDesc()); + break; + case Opcodes.H_INVOKEINTERFACE: + case Opcodes.H_INVOKESPECIAL: + case Opcodes.H_INVOKESTATIC: + case Opcodes.H_INVOKEVIRTUAL: + case Opcodes.H_NEWINVOKESPECIAL: + this.index.indexMethodCall(callerEntry, handle.getOwner(), handle.getName(), handle.getDesc()); + break; + } + } + } + } } } diff --git a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java index cc2c331f..83fe296c 100644 --- a/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java +++ b/src/main/java/cuchaz/enigma/analysis/SourceIndexMethodVisitor.java @@ -198,4 +198,27 @@ public class SourceIndexMethodVisitor extends SourceIndexVisitor { } return recurse(node, index); } + + @Override + public Void visitMethodGroupExpression(MethodGroupExpression node, SourceIndex index) { + MemberReference ref = node.getUserData(Keys.MEMBER_REFERENCE); + + if (ref instanceof MethodReference) { + // get the behavior entry + ClassEntry classEntry = entryPool.getClass(ref.getDeclaringType().getInternalName()); + MethodEntry methodEntry = null; + + methodEntry = entryPool.getMethod(classEntry, ref.getName(), ref.getErasedSignature()); + // get the node for the token + AstNode tokenNode = node.getMethodNameToken(); + if (tokenNode == null || (tokenNode.getRegion().getBeginLine() == 0 || tokenNode.getRegion().getEndLine() == 0)){ + tokenNode = node.getTarget(); + } + if (tokenNode != null) { + index.addReference(tokenNode, methodEntry, this.methodEntry); + } + } + + return recurse(node, index); + } } -- cgit v1.2.3