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; }
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; }