< prev index next >

src/java.base/share/classes/sun/reflect/annotation/TypeAnnotation.java

Print this page

        

@@ -185,10 +185,32 @@
             System.arraycopy(this.locations, 0, res, 0, depth);
             res[newDepth - 1] = new Location(tag, (short)(index & 0xFF));
             return new LocationInfo(newDepth, res);
         }
 
+        public LocationInfo popLocation(byte tag) {
+            if (locations[depth-1].tag != tag)
+                throw new IllegalStateException("Tags not matching");
+            return popLocation();
+        }
+
+        public LocationInfo popLocation() {
+            int newDepth = this.depth - 1;
+            Location[] res = new Location[newDepth];
+            System.arraycopy(this.locations, 0, res, 0, newDepth);
+            return new LocationInfo(newDepth, res);
+        }
+
+        /** Pop a series of locations matching {@code tag}. Stop poping as soon as a non-matching tag is found. */
+        public LocationInfo popAllLocations(byte tag) {
+            LocationInfo l = this;
+            while(l.depth > 0 && l.locations[l.depth - 1].tag == tag) {
+                l = l.popLocation();
+            }
+            return l;
+        }
+
         public TypeAnnotation[] filter(TypeAnnotation[] ta) {
             ArrayList<TypeAnnotation> l = new ArrayList<>(ta.length);
             for (TypeAnnotation t : ta) {
                 if (isSameLocationInfo(t.getLocationInfo()))
                     l.add(t);
< prev index next >