private <M extends MemberMapping> boolean updateMembers(@Nonnull Collection<List<M>> newMappings) {
		// With members, we need to take special care, for example:
		// 1. a --> b
		// 2. b.x --> b.y
		// Now we need to ensure the mapping "a.x --> b.y" exists.
		boolean bridged = false;
		for (List<M> members : newMappings) {
			for (MemberMapping newMemberMapping : members) {
				String bOwnerName = newMemberMapping.getOwnerName();
				String aOwnerName = reverseOrderClassMapping.get(bOwnerName);
				String oldMemberName = newMemberMapping.getOldName();
				String newMemberName = newMemberMapping.getNewName();
				String desc = newMemberMapping.getDesc();
				String owner = bOwnerName;
				if (aOwnerName != null) {
					// We need to map the member current mapped owner name to the
					// original owner's name.
					bridged = true;
					owner = aOwnerName;
					oldMemberName = findPriorMemberName(aOwnerName, newMemberMapping);
				}

				// Desc must always be checked for updates
				desc = applyReverseMappings(desc);

				// Add bridged entry
				if (newMemberMapping.isField()) {
					missingFieldDescriptors |= desc == null;
					addField(owner, desc, oldMemberName, newMemberName);
				} else if (desc != null) {
					addMethod(owner, desc, oldMemberName, newMemberName);
				}
			}
		}
		return bridged;
	}
Updates aggregated mappings with new values.

@param newMappings
		The additional mappings that were added. They will be in the form of {@code b -> c}.
		We need to make sure we map the key type {@code b} to {@code a}.

@return {@code true} when the mapping operation required bridging a current class name to its original name.
recaf-core/src/main/java/software/coley/recaf/services/mapping/aggregate/AggregatedMappings.java