protected void addNode(LazyMap<Function, List<GTreeNode>> nodesByFunction, CallNode nodeToAdd) {

		if (ignoreNonCallReference(nodeToAdd)) {
			return;
		}

		Function function = nodeToAdd.getRemoteFunction();
		List<GTreeNode> nodes = nodesByFunction.get(function);
		if (nodes.isEmpty()) {
			nodes.add(nodeToAdd); // we can always add new nodes when the list is empty
			return;
		}

		for (GTreeNode node : nodes) {

			if (node.equals(nodeToAdd)) {
				return; // never add equal() nodes
			}

			// Don't allow a call reference and a non-call reference to the same remote function
			// at the same address.  One call node in the tree is sufficient to show the user that
			// the references exist.
			CallNode existingNode = (CallNode) node;
			if (resovleConflictingReferenceTypes(nodes, existingNode, nodeToAdd)) {
				return;
			}
		}

		// At this point we have verified that the node being added is not the same as an existing
		// node and has not replaced a similar node with a different type of reference.  We also
		// know that there are multiple child nodes for the given remote function.  Since we have
		// multiples, only add the new node if the user is allowing duplicate nodes.
		if (callTreeOptions.allowsDuplicates()) {
			nodes.add(nodeToAdd); // ok to add multiple nodes for this function with different addresses
			return;
		}

	}
Returns true if the reference associated with this node is a call reference type.
@return true if the reference associated with this node is a call reference type.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/calltree/CallNode.java