package org.objectweb.asm.commons.cfg.tree.node; import org.objectweb.asm.commons.cfg.tree.NodeTree; import org.objectweb.asm.tree.AbstractInsnNode; import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; public class ReferenceNode extends AbstractNode { public ReferenceNode(NodeTree tree, AbstractInsnNode insn, int collapsed, int producing) { super(tree, insn, collapsed, producing); } public boolean isStatic() { return opcode() == GETSTATIC || opcode() == PUTSTATIC || opcode() == INVOKESTATIC; } public String key() { AbstractInsnNode ain = insn(); if (ain instanceof FieldInsnNode) { FieldInsnNode fin = (FieldInsnNode) ain; return fin.owner + "." + fin.name; //return fin.key(); //return fin.owner + "." + fin.name + fin.desc; } else if (ain instanceof MethodInsnNode) { MethodInsnNode min = (MethodInsnNode) ain; return min.owner + "." + min.name + min.desc; } return null; } public String owner() { AbstractInsnNode insn = insn(); if (this instanceof FieldMemberNode) { return ((FieldInsnNode) insn).owner; } else if (this instanceof MethodMemberNode) { return ((MethodInsnNode) insn).owner; } return null; } public String name() { AbstractInsnNode ain = insn(); if (ain instanceof FieldInsnNode) { return ((FieldInsnNode) ain).name; } else if (ain instanceof MethodInsnNode) { return ((MethodInsnNode) ain).name; } return null; } public String desc() { AbstractInsnNode ain = insn(); if (this instanceof FieldMemberNode) { return ((FieldInsnNode) ain).desc; } else if (this instanceof MethodMemberNode) { return ((MethodInsnNode) ain).desc; } return null; } public boolean referenced(MethodNode mn) { for (AbstractInsnNode ain : mn.instructions.toArray()) { if (ain instanceof FieldInsnNode) { FieldInsnNode fin = (FieldInsnNode) ain; if (key().equals(fin.owner + "." + fin.name)) return true; } else if (ain instanceof MethodInsnNode) { MethodInsnNode min = (MethodInsnNode) ain; if (key().equals(min.owner + "." + min.name + min.desc)) return true; } } return false; } }