/**
   * Generates a printable string that represents the given ActionScript 3 code.
   *
   * @param resolvedCode The ActionScript 3 code to turn into a string.
   * @param code The raw ActionScript 3 code.
   * @param prefix The prefix to write before every printed line.
   * @return The generated ActionScript 3 code string.
   */
  private static String getCodeText(
      final ResolvedCode resolvedCode, final AS3Code code, final String prefix) {

    if (code.getInstructions().size() == 0) {
      return "";
    }

    final StringBuilder sb = new StringBuilder();

    final AS3Instruction firstInstruction = code.getInstructions().get(0);

    final int firstOffset = firstInstruction.getBitPosition();

    for (final AS3Instruction instruction : code.getInstructions()) {

      final int absoluteOffset = instruction.getBitPosition() / 8;
      final int relativeOffset = absoluteOffset - firstOffset / 8;
      sb.append(prefix);
      sb.append(String.format("%08X %08X  ", absoluteOffset, relativeOffset));

      addInstructionText(sb, instruction, resolvedCode, firstOffset / 8);

      sb.append('\n');
    }

    return sb.toString();
  }
  /**
   * Generates a printable string that represents all code in a given resolved ActionScript 3 code
   * snippet.
   *
   * @param code The resolved code to display.
   * @return The generated ActionScript 3 code string.
   */
  public static String getCodeText(final ResolvedCode code) {
    final StringBuilder sb = new StringBuilder();

    for (final ResolvedClass resolvedClass : code.getClasses()) {

      // Start out with the class definition.
      addClassHeader(resolvedClass, sb);

      boolean hadCode = false;

      // Start preparing all the methods for printing. Add the instance
      // constructor and the class constructor for printing.
      final ResolvedMethod staticConstructor = resolvedClass.getStaticConstructor();
      final ResolvedMethod constructor = resolvedClass.getConstructor();

      final List<ResolvedMethod> resolvedMethods = resolvedClass.getMethods();

      resolvedMethods.add(0, constructor);

      if (staticConstructor.getCode() != null) {
        // Only add the static constructor if it actually has code.
        resolvedMethods.add(0, staticConstructor);
      }

      final String className = ActionScript3Helpers.flattenNamespaceName(resolvedClass.getName());

      // Print the individual methods now.
      for (final ResolvedMethod resolvedMethod : resolvedMethods) {

        if (resolvedMethod != resolvedMethods.get(0)) {
          if (hadCode || resolvedMethod.getCode() != null) {
            sb.append("\n");
          }
        }

        hadCode = addMethod(code, resolvedMethod, className, sb);
      }

      addClassFooter(sb);
    }

    return sb.toString();
  }