@Override
	public Object mapValue(Object value) {
		// We need to adapt the invoke-dynamic mapping call from the base implementation of ASM's remapper.
		// This is copied from the base implementation but adds the BSM + remapped args to the call so
		// that it points to our enhanced 'mapInvokeDynamicMethodName' method.
		if (value instanceof ConstantDynamic constantDynamic) {
			int bootstrapMethodArgumentCount = constantDynamic.getBootstrapMethodArgumentCount();
			Object[] remappedBootstrapMethodArguments = new Object[bootstrapMethodArgumentCount];
			for (int i = 0; i < bootstrapMethodArgumentCount; ++i) {
				remappedBootstrapMethodArguments[i] =
						mapValue(constantDynamic.getBootstrapMethodArgument(i));
			}

			String descriptor = constantDynamic.getDescriptor();
			return new ConstantDynamic(
					mapInvokeDynamicMethodName(constantDynamic.getName(), descriptor, constantDynamic.getBootstrapMethod(), remappedBootstrapMethodArguments),
					mapDesc(descriptor),
					(Handle) mapValue(constantDynamic.getBootstrapMethod()),
					remappedBootstrapMethodArguments);
		}

		// Other values can be handled by the base implementation
		return super.mapValue(value);
	}
@param workspace
		Workspace to pull class info from when additional context is needed.
@param mappings
		Mappings wrapper to pull values from.
recaf-core/src/main/java/software/coley/recaf/services/mapping/WorkspaceBackedRemapper.java