private FieldDependency createFieldNode(FieldReference fieldRef, FieldReader field) { DependencyNode node = createNode(); if (shouldLog) { node.setTag(fieldRef.getClassName() + "#" + fieldRef.getFieldName()); } FieldDependency dep = new FieldDependency(node, field, fieldRef); if (!dep.isMissing()) { tasks.add(() -> linkClass(fieldRef.getClassName(), null).initClass(null)); } return dep; }
public static ArgPositionType getArgPositionType(DependencyTree tree, int aIdx) { Bunsetsu aBun = tree.getBunsetsuFromNodeId(aIdx); DependencyNode aBunHeadNode = aBun.getHeadNode(); if (aIdx == aBunHeadNode.getId()) { return ArgPositionType.HEAD; } else if (aIdx == aBunHeadNode.getId() - 1) { return ArgPositionType.HEAD_LEFT; } else if (aIdx == aBunHeadNode.getId() + 1) { return ArgPositionType.HEAD_RIGHT; } else { return ArgPositionType.OTHER; } }
public String formatIds(List<DependencyNode> list) { StringBuilder sb = new StringBuilder(" "); int remaining = maxDependencies; for (DependencyNode n : list) { remaining--; sb.append("(").append(n.getId()).append(") "); if (remaining == 0) { sb.append("..."); break; } } return sb.toString(); }
private void lock(MethodDependency dep, boolean lock) { for (DependencyNode node : dep.variableNodes) { if (node != null) { node.locked = lock; } } if (dep.resultNode != null) { dep.resultNode.locked = lock; } if (dep.thrown != null) { dep.thrown.locked = lock; } }
@Override public void consume(DependencyType type) { if (filter != null && !filter.match(type)) { return; } if (type.getName().startsWith("[")) { source.getArrayItem().connect(destination.getArrayItem()); destination.getArrayItem().connect(source.getArrayItem()); } if (type.getName().equals("java.lang.Class")) { source.getClassValueNode().connect(destination.getClassValueNode()); } if (!destination.hasType(type)) { destination.propagate(type); } }
private MethodDependency createMethodDep(MethodReference methodRef, MethodHolder method) { ValueType[] arguments = methodRef.getParameterTypes(); int paramCount = arguments.length + 1; DependencyNode[] parameterNodes = new DependencyNode[arguments.length + 1]; for (int i = 0; i < parameterNodes.length; ++i) { parameterNodes[i] = createNode(); parameterNodes[i].method = methodRef; if (shouldLog) { parameterNodes[i].setTag(methodRef + ":" + i); } } DependencyNode resultNode; if (methodRef.getDescriptor().getResultType() == ValueType.VOID) { resultNode = null; } else { resultNode = createNode(); resultNode.method = methodRef; if (shouldLog) { resultNode.setTag(methodRef + ":RESULT"); } } DependencyNode thrown = createNode(); thrown.method = methodRef; if (shouldLog) { thrown.setTag(methodRef + ":THROWN"); } MethodDependency dep = new MethodDependency( this, parameterNodes, paramCount, resultNode, thrown, method, methodRef); if (method != null) { tasks.add( () -> { CallLocation caller = new CallLocation(dep.getMethod().getReference()); linkClass(dep.getMethod().getOwnerName(), caller).initClass(caller); }); } return dep; }