boolean isPasteAllowed(ProgramNode destNode, ProgramNode pasteNode, boolean isCutOperation) {
		if (destNode.getProgram() != pasteNode.getProgram() ||
			destNode.getRoot() != pasteNode.getRoot()) {
			return false;
		}

		if (destNode.getName().equals(pasteNode.getName())) {
			return false;
		}

		if (destNode.isNodeAncestor(pasteNode)) {
			return false;
		}

		if (destNode.isFragment() && pasteNode.isModule()) {
			if (isCutOperation && !pasteNode.getModule().isDescendant(destNode.getFragment())) {
				return true; // pasted module can be flattened onto destination fragment
			}
			return false;
		}

		if (destNode.isFragment() && pasteNode.isFragment()) {
			if (isCutOperation) {
				return true;
			}
			return false;
		}

		if (destNode.isModule()) {
			ProgramModule destModule = destNode.getModule();

			if (pasteNode.isModule()) {
				if (pasteNode.getModule().isDescendant(destModule)) {
					return false;
				}
				if (!isCutOperation && destModule.contains(pasteNode.getModule())) {
					return false;
				}
			}
			else if (!isCutOperation && destModule.contains(pasteNode.getFragment())) {
				return false;
			}
		}

		return true;
	}
Manage paste operations for the Program Tree.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/programtree/PasteManager.java