@Nonnull
	protected Map<ClassPathNode, JvmClassInfo> buildChangeMap(@Nonnull InheritanceGraph inheritanceGraph) throws TransformationException {
		ResourcePathNode resourcePath = PathNodes.resourcePath(workspace, resource);
		Map<ClassPathNode, JvmClassInfo> map = new IdentityHashMap<>();
		for (JvmClassData data : classData.values()) {
			if (data.isDirty()) {
				if (data.node != null) {
					// Emit bytecode from the current node
					boolean recompute = recomputeFrameClasses.contains(data.node.name);
					int flags = recompute ? ClassWriter.COMPUTE_FRAMES : 0;
					ClassReader reader = data.initialClass.getClassReader();
					ClassWriter writer = new WorkspaceClassWriter(inheritanceGraph, reader, flags);
					try {
						if (recompute)
							data.node.accept(new FrameSkippingVisitor(writer));
						else
							data.node.accept(writer);

						// Update output map
						byte[] modifiedBytes = writer.toByteArray();
						JvmClassInfo modifiedClass = data.initialClass.toJvmClassBuilder()
								.adaptFrom(modifiedBytes)
								.build();
						ClassPathNode classPath = resourcePath.child(data.bundle)
								.child(modifiedClass.getPackageName())
								.child(modifiedClass);
						map.put(classPath, modifiedClass);
					} catch (Throwable t) {
						throw new TransformationException("ClassNode --> byte[] failed for class '" + data.node.name + "'", t);
					}
				} else {
					// Update output map if the bytecode is not the same as the initial state
					byte[] bytecode = data.getBytecode();
					if (!Arrays.equals(bytecode, data.initialClass.getBytecode())) {
						JvmClassInfo modifiedClass = data.initialClass.toJvmClassBuilder()
								.adaptFrom(bytecode)
								.build();
						ClassPathNode classPath = resourcePath.child(data.bundle)
								.child(modifiedClass.getPackageName())
								.child(modifiedClass);
						map.put(classPath, modifiedClass);
					}
				}
			}
		}
		return map;
	}
Builds the map of initial transformed class paths to their final transformed states.
<br>
The map keys are existing workspace paths the respective classes.
<br>
The map values are classes post-transformation, without any mappings applied.

@param inheritanceGraph
		Inheritance graph tied to the workspace the transformed classes belong to.

@throws TransformationException
		When the classes cannot be written back to {@code byte[]} likely due to frame computation problems.
recaf-core/src/main/java/software/coley/recaf/services/transform/JvmTransformerContext.java