--- a/langtools/src/share/classes/com/sun/tools/javap/AnnotationWriter.java Wed Jan 23 20:57:40 2013 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javap/AnnotationWriter.java Wed Jan 23 13:27:24 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
package com.sun.tools.javap;
import com.sun.tools.classfile.Annotation;
+import com.sun.tools.classfile.TypeAnnotation;
import com.sun.tools.classfile.Annotation.Annotation_element_value;
import com.sun.tools.classfile.Annotation.Array_element_value;
import com.sun.tools.classfile.Annotation.Class_element_value;
@@ -76,6 +77,124 @@
print(")");
}
+ public void write(TypeAnnotation annot) {
+ write(annot, true, false);
+ }
+
+ public void write(TypeAnnotation annot, boolean showOffsets, boolean resolveIndices) {
+ write(annot.annotation, resolveIndices);
+ print(": ");
+ write(annot.position, showOffsets);
+ }
+
+ public void write(TypeAnnotation.Position pos, boolean showOffsets) {
+ print(pos.type);
+
+ switch (pos.type) {
+ // type cast
+ case CAST:
+ // instanceof
+ case INSTANCEOF:
+ // new expression
+ case NEW:
+ if (showOffsets) {
+ print(", offset=");
+ print(pos.offset);
+ }
+ break;
+ // local variable
+ case LOCAL_VARIABLE:
+ // resource variable
+ case RESOURCE_VARIABLE:
+ if (pos.lvarOffset == null) {
+ print(", lvarOffset is Null!");
+ break;
+ }
+ print(", {");
+ for (int i = 0; i < pos.lvarOffset.length; ++i) {
+ if (i != 0) print("; ");
+ if (showOffsets) {
+ print("start_pc=");
+ print(pos.lvarOffset[i]);
+ }
+ print(", length=");
+ print(pos.lvarLength[i]);
+ print(", index=");
+ print(pos.lvarIndex[i]);
+ }
+ print("}");
+ break;
+ // exception parameter
+ case EXCEPTION_PARAMETER:
+ print(", exception_index=");
+ print(pos.exception_index);
+ break;
+ // method receiver
+ case METHOD_RECEIVER:
+ // Do nothing
+ break;
+ // type parameter
+ case CLASS_TYPE_PARAMETER:
+ case METHOD_TYPE_PARAMETER:
+ print(", param_index=");
+ print(pos.parameter_index);
+ break;
+ // type parameter bound
+ case CLASS_TYPE_PARAMETER_BOUND:
+ case METHOD_TYPE_PARAMETER_BOUND:
+ print(", param_index=");
+ print(pos.parameter_index);
+ print(", bound_index=");
+ print(pos.bound_index);
+ break;
+ // class extends or implements clause
+ case CLASS_EXTENDS:
+ print(", type_index=");
+ print(pos.type_index);
+ break;
+ // throws
+ case THROWS:
+ print(", type_index=");
+ print(pos.type_index);
+ break;
+ // method parameter
+ case METHOD_FORMAL_PARAMETER:
+ print(", param_index=");
+ print(pos.parameter_index);
+ break;
+ // method/constructor/reference type argument
+ case CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT:
+ case METHOD_INVOCATION_TYPE_ARGUMENT:
+ case METHOD_REFERENCE_TYPE_ARGUMENT:
+ if (showOffsets) {
+ print(", offset=");
+ print(pos.offset);
+ }
+ print(", type_index=");
+ print(pos.type_index);
+ break;
+ // We don't need to worry about these
+ case METHOD_RETURN:
+ case FIELD:
+ break;
+ // lambda formal parameter
+ case LAMBDA_FORMAL_PARAMETER:
+ print(", param_index=");
+ print(pos.parameter_index);
+ break;
+ case UNKNOWN:
+ throw new AssertionError("AnnotationWriter: UNKNOWN target type should never occur!");
+ default:
+ throw new AssertionError("AnnotationWriter: Unknown target type for position: " + pos);
+ }
+
+ // Append location data for generics/arrays.
+ if (!pos.location.isEmpty()) {
+ print(", location=");
+ print(pos.location);
+ }
+ }
+
public void write(Annotation.element_value_pair pair) {
write(pair, false);
}