예제 #1
0
  protected void writeMethod(Method m) {
    if (!options.checkAccess(m.access_flags)) return;

    method = m;

    AccessFlags flags = m.access_flags;

    Descriptor d;
    Type.MethodType methodType;
    List<? extends Type> methodExceptions;

    Signature_attribute sigAttr = getSignature(m.attributes);
    if (sigAttr == null) {
      d = m.descriptor;
      methodType = null;
      methodExceptions = null;
    } else {
      Signature methodSig = sigAttr.getParsedSignature();
      d = methodSig;
      try {
        methodType = (Type.MethodType) methodSig.getType(constant_pool);
        methodExceptions = methodType.throwsTypes;
        if (methodExceptions != null && methodExceptions.size() == 0) methodExceptions = null;
      } catch (ConstantPoolException e) {
        // report error?
        // fall back on standard descriptor
        methodType = null;
        methodExceptions = null;
      }
    }

    writeModifiers(flags.getMethodModifiers());
    if (methodType != null) {
      writeListIfNotEmpty("<", methodType.typeParamTypes, "> ");
    }
    if (getName(m).equals("<init>")) {
      print(getJavaName(classFile));
      print(getParameterTypes(d, flags));
    } else if (getName(m).equals("<clinit>")) {
      print("{}");
    } else {
      print(getReturnType(d));
      print(" ");
      print(getName(m));
      print(getParameterTypes(d, flags));
    }

    Attribute e_attr = m.attributes.get(Attribute.Exceptions);
    if (e_attr != null) { // if there are generic exceptions, there must be erased exceptions
      if (e_attr instanceof Exceptions_attribute) {
        Exceptions_attribute exceptions = (Exceptions_attribute) e_attr;
        print(" throws ");
        if (methodExceptions != null) { // use generic list if available
          writeList("", methodExceptions, "");
        } else {
          for (int i = 0; i < exceptions.number_of_exceptions; i++) {
            if (i > 0) print(", ");
            print(getJavaException(exceptions, i));
          }
        }
      } else {
        report("Unexpected or invalid value for Exceptions attribute");
      }
    }

    println(";");

    indent(+1);

    if (options.showInternalSignatures) {
      println("Signature: " + getValue(m.descriptor));
    }

    if (options.verbose && !options.compat) {
      writeList("flags: ", flags.getMethodFlags(), NEWLINE);
    }

    Code_attribute code = null;
    Attribute c_attr = m.attributes.get(Attribute.Code);
    if (c_attr != null) {
      if (c_attr instanceof Code_attribute) code = (Code_attribute) c_attr;
      else report("Unexpected or invalid value for Code attribute");
    }

    if (options.showDisassembled && !options.showAllAttrs) {
      if (code != null) {
        println("Code:");
        codeWriter.writeInstrs(code);
        codeWriter.writeExceptionTable(code);
      }
    }

    if (options.showLineAndLocalVariableTables) {
      if (code != null) {
        attrWriter.write(code, code.attributes.get(Attribute.LineNumberTable), constant_pool);
        attrWriter.write(code, code.attributes.get(Attribute.LocalVariableTable), constant_pool);
      }
    }

    if (options.showAllAttrs) {
      Attribute[] attrs = m.attributes.attrs;
      for (Attribute attr : attrs) attrWriter.write(m, attr, constant_pool);
    }

    indent(-1);

    // set pendingNewline to write a newline before the next method (if any)
    // if a separator is desired
    setPendingNewline(
        options.showDisassembled
            || options.showAllAttrs
            || options.showInternalSignatures
            || options.showLineAndLocalVariableTables
            || options.verbose);
  }
예제 #2
0
 protected void writeMethods() {
   for (Method m : classFile.methods) writeMethod(m);
   setPendingNewline(false);
 }