private void generateStringToJavaScript(GeneratorContext context, SourceWriter writer)
     throws IOException {
   FieldReference charsField = new FieldReference("java.lang.String", "characters");
   writer.append("var result = \"\";").softNewLine();
   writer
       .append("var data = ")
       .append(context.getParameterName(1))
       .append('.')
       .appendField(charsField)
       .append(".data;")
       .softNewLine();
   writer.append("for (var i = 0; i < data.length; i = (i + 1) | 0) {").indent().softNewLine();
   writer.append("result += String.fromCharCode(data[i]);").softNewLine();
   writer.outdent().append("}").softNewLine();
   writer.append("return result;").softNewLine();
 }
  private void generateToJavaScript(GeneratorContext context, SourceWriter writer)
      throws IOException {
    String obj = context.getParameterName(1);
    writer
        .append("if (" + obj + " === null || " + obj + " === undefined) {")
        .softNewLine()
        .indent();
    writer.append("return " + obj + ";").softNewLine();

    writer.outdent().append("} else if (typeof " + obj + " === 'number') {").indent().softNewLine();
    writer.append("return " + obj + ";").softNewLine();

    writer
        .outdent()
        .append("} else if (" + obj + ".constructor.$meta && " + obj + ".constructor.$meta.item) {")
        .indent()
        .softNewLine();
    writer.append("var arr = new Array(" + obj + ".data.length);").softNewLine();
    writer.append("for (var i = 0; i < arr.length; ++i) {").indent().softNewLine();
    writer
        .append("arr[i] = ")
        .appendMethodBody(toJsMethod)
        .append("(" + obj + ".data[i]);")
        .softNewLine();
    writer.outdent().append("}").softNewLine();
    writer.append("return arr;").softNewLine();

    writer
        .outdent()
        .append("} else if (" + obj + ".constructor === ")
        .appendClass("java.lang.String")
        .append(") {")
        .indent()
        .softNewLine();
    generateStringToJavaScript(context, writer);

    writer
        .outdent()
        .append("} else if (" + obj + ".constructor === ")
        .appendClass("java.lang.Byte")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(byteValueMethod)
        .append("(" + obj + ")|0;")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + obj + ".constructor === ")
        .appendClass("java.lang.Short")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(shortValueMethod)
        .append("(" + obj + ")|0;")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + obj + ".constructor === ")
        .appendClass("java.lang.Integer")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(intValueMethod)
        .append("(" + obj + ")|0;")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + obj + ".constructor === ")
        .appendClass("java.lang.Boolean")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(booleanValueMethod)
        .append("(" + obj + ")!==0;")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + obj + ".constructor === ")
        .appendClass("java.lang.Double")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(doubleValueMethod)
        .append("(" + obj + ");")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + obj + ".constructor === ")
        .appendClass("java.lang.Character")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(charValueMethod)
        .append("(" + obj + ");")
        .softNewLine();

    writer.outdent().append("} else {").indent().softNewLine();
    writer.append("return " + obj + ";").softNewLine();

    writer.outdent().append("}").softNewLine();
  }
  private void generateFromJavaScript(GeneratorContext context, SourceWriter writer)
      throws IOException {
    String obj = context.getParameterName(1);
    String type = context.getParameterName(2);
    writer
        .append("if (" + obj + " === null || " + obj + " === undefined)")
        .ws()
        .append("{")
        .softNewLine()
        .indent();
    writer.append("return " + obj + ";").softNewLine();
    writer.outdent().append("} else if (" + type + ".$meta.item) {").indent().softNewLine();
    writer
        .append("var arr = $rt_createArray(" + type + ".$meta.item, " + obj + ".length);")
        .softNewLine();
    writer.append("for (var i = 0; i < arr.data.length; ++i) {").indent().softNewLine();
    writer
        .append("arr.data[i] = ")
        .appendMethodBody(fromJsMethod)
        .append("(" + obj + "[i], " + type + ".$meta.item);")
        .softNewLine();
    writer.outdent().append("}").softNewLine();
    writer.append("return arr;").softNewLine();

    writer
        .outdent()
        .append("} else if (" + type + " === ")
        .appendClass("java.lang.String")
        .append(") {")
        .indent()
        .softNewLine();
    writer.append("return $rt_str(" + obj + ");").softNewLine();

    writer
        .outdent()
        .append("} else if (" + type + " === ")
        .appendClass("java.lang.Boolean")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfBooleanMethod)
        .append("(" + obj + "?1:0);")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + type + " === ")
        .appendClass("java.lang.Character")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfCharMethod)
        .append(
            "(typeof " + obj + " === 'number' ? " + obj + " & 0xFFFF : " + obj + ".charCodeAt(0));")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + type + " === ")
        .appendClass("java.lang.Byte")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfByteMethod)
        .append("(" + obj + "|0);")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + type + " === ")
        .appendClass("java.lang.Short")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfShortMethod)
        .append("(" + obj + "|0);")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + type + " === ")
        .appendClass("java.lang.Integer")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfIntMethod)
        .append("(" + obj + "|0);")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + type + " === ")
        .appendClass("java.lang.Long")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfLongMethod)
        .append("(Long_fromInt(" + obj + "|0));")
        .softNewLine();

    writer
        .outdent()
        .append("} else if (" + type + " === ")
        .appendClass("java.lang.Double")
        .append(") {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfDoubleMethod)
        .append("(" + obj + ");")
        .softNewLine();

    writer
        .outdent()
        .append(
            "} else if ("
                + type
                + " === $rt_intcls() || "
                + type
                + " === $rt_bytecls() || "
                + type
                + " === $rt_shortcls() ||"
                + type
                + " == $rt_charcls()) {")
        .indent()
        .softNewLine();
    writer.append("return " + obj + "|0;").softNewLine();

    writer.outdent().append("} else if (" + type + " === $rt_longcls()) {").indent().softNewLine();
    writer.append("return Long_fromInt(" + obj + "|0);").softNewLine();

    writer
        .outdent()
        .append("} else if (" + type + " === $rt_doublecls() || " + type + " == $rt_floatcls()) {")
        .indent()
        .softNewLine();
    writer.append("return " + obj + ";").softNewLine();
    writer
        .outdent()
        .append("} else if (" + type + " === $rt_booleancls()) {")
        .indent()
        .softNewLine();
    writer.append("return " + obj + "?1:0;").softNewLine();

    writer.outdent().append("} else if (" + obj + " instanceof Array) {").indent().softNewLine();
    writer.append("var arr = $rt_createArray($rt_objcls(), " + obj + ".length);").softNewLine();
    writer.append("for (var i = 0; i < arr.data.length; ++i) {").indent().softNewLine();
    writer
        .append("arr.data[i] = ")
        .appendMethodBody(fromJsMethod)
        .append("(" + obj + "[i], $rt_objcls());")
        .softNewLine();
    writer.outdent().append("}").softNewLine();
    writer.append("return arr;").softNewLine();

    writer.outdent().append("} else if (typeof " + obj + " === 'string') {").indent().softNewLine();
    writer.append("return $rt_str(" + obj + ");").softNewLine();

    writer.outdent().append("} else if (typeof " + obj + " === 'number') {").indent().softNewLine();
    writer.append("if ((" + obj + "|0) === " + obj + ") {").indent().softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfIntMethod)
        .append("(" + obj + ");")
        .softNewLine();
    writer.outdent().append("} else {").indent().softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfDoubleMethod)
        .append("(" + obj + ");")
        .softNewLine();
    writer.outdent().append("}").softNewLine();

    writer
        .outdent()
        .append("} else if (typeof " + obj + " === 'boolean') {")
        .indent()
        .softNewLine();
    writer
        .append("return ")
        .appendMethodBody(valueOfBooleanMethod)
        .append("(" + obj + "?1:0);")
        .softNewLine();
    writer.outdent().append("} else {").indent().softNewLine();
    writer.append("return ").append(obj).append(";").softNewLine();
    writer.outdent().append("}").softNewLine();
  }