private void createFragment(ProgramModule parent, String name, ProgramFragment sourceFrag,
			ArrayList<String> fragmentNameList) {

		if (!fragmentNameList.contains(name)) {
			fragmentNameList.add(name);
		}
		ProgramFragment newFrag = null;
		try {
			newFrag = parent.createFragment(name);
			newFrag.setComment(sourceFrag.getComment());
		}
		catch (DuplicateNameException e) {
			newFrag = resultProgram.getListing().getFragment(parent.getTreeName(), name);
			try {
				parent.add(newFrag);
			}
			catch (DuplicateGroupException e1) {
				// ok - already has the fragment
			}
		}
		if (!sourceFrag.isEmpty()) {
			ArrayList<AddressRange> list = new ArrayList<AddressRange>();
			AddressRangeIterator iter = sourceFrag.getAddressRanges();
			while (iter.hasNext()) {
				list.add(iter.next());
			}
			for (AddressRange range : list) {
				try {
					newFrag.move(range.getMinAddress(), range.getMaxAddress());
				}
				catch (NotFoundException e1) {
					throw new AssertException("Address range " + range.getMinAddress() + " to " +
						range.getMaxAddress() + " not found!");
				}
			}
		}
	}
Called when we need to know which tree changed (not enough to know
that the structures are different).
@param root1 root of the original program 
@param root2 root for either the source tree or the destination tree
@return true if there was no original root, OR the modification
numbers for the original tree and tree containing root do not match
Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/ProgramTreeMergeManager.java