test/tools/javac/tree/TreePosTest.java
Print this page
*** 335,345 ****
if (check(encl, self)) {
// Modifiers nodes are present throughout the tree even where
// there is no corresponding source text.
// Redundant semicolons in a class definition can cause empty
// initializer blocks with no positions.
! if ((self.tag == JCTree.MODIFIERS || self.tag == JCTree.BLOCK)
&& self.pos == NOPOS) {
// If pos is NOPOS, so should be the start and end positions
check("start == NOPOS", encl, self, self.start == NOPOS);
check("end == NOPOS", encl, self, self.end == NOPOS);
} else {
--- 335,345 ----
if (check(encl, self)) {
// Modifiers nodes are present throughout the tree even where
// there is no corresponding source text.
// Redundant semicolons in a class definition can cause empty
// initializer blocks with no positions.
! if ((self.tag == JCTree.Tag.MODIFIERS || self.tag == JCTree.Tag.BLOCK)
&& self.pos == NOPOS) {
// If pos is NOPOS, so should be the start and end positions
check("start == NOPOS", encl, self, self.start == NOPOS);
check("end == NOPOS", encl, self, self.end == NOPOS);
} else {
*** 357,375 ****
// and because of inconsistent nesting of left and right of
// array declarations:
// e.g. int[][] a = new int[2][];
check("encl.start <= start", encl, self, encl.start <= self.start);
check("start <= pos", encl, self, self.start <= self.pos);
! if (!(self.tag == JCTree.TYPEARRAY
! && (encl.tag == JCTree.VARDEF ||
! encl.tag == JCTree.METHODDEF ||
! encl.tag == JCTree.TYPEARRAY))) {
check("encl.pos <= start || end <= encl.pos",
encl, self, encl.pos <= self.start || self.end <= encl.pos);
}
check("pos <= end", encl, self, self.pos <= self.end);
! if (!(self.tag == JCTree.TYPEARRAY && encl.tag == JCTree.TYPEARRAY)) {
check("end <= encl.end", encl, self, self.end <= encl.end);
}
}
}
--- 357,375 ----
// and because of inconsistent nesting of left and right of
// array declarations:
// e.g. int[][] a = new int[2][];
check("encl.start <= start", encl, self, encl.start <= self.start);
check("start <= pos", encl, self, self.start <= self.pos);
! if (!(self.tag == JCTree.Tag.TYPEARRAY
! && (encl.tag == JCTree.Tag.VARDEF ||
! encl.tag == JCTree.Tag.METHODDEF ||
! encl.tag == JCTree.Tag.TYPEARRAY))) {
check("encl.pos <= start || end <= encl.pos",
encl, self, encl.pos <= self.start || self.end <= encl.pos);
}
check("pos <= end", encl, self, self.pos <= self.end);
! if (!(self.tag == JCTree.Tag.TYPEARRAY && encl.tag == JCTree.Tag.TYPEARRAY)) {
check("end <= encl.end", encl, self, self.end <= encl.end);
}
}
}
*** 386,396 ****
// skip the synthesized bits and just check parts which came from
// the original source text
if ((tree.mods.flags & Flags.ENUM) != 0) {
scan(tree.mods);
if (tree.init != null) {
! if (tree.init.getTag() == JCTree.NEWCLASS) {
JCNewClass init = (JCNewClass) tree.init;
if (init.args != null && init.args.nonEmpty()) {
scan(init.args);
}
if (init.def != null && init.def.defs != null) {
--- 386,396 ----
// skip the synthesized bits and just check parts which came from
// the original source text
if ((tree.mods.flags & Flags.ENUM) != 0) {
scan(tree.mods);
if (tree.init != null) {
! if (tree.init.getTag() == JCTree.Tag.NEWCLASS) {
JCNewClass init = (JCNewClass) tree.init;
if (init.args != null && init.args.nonEmpty()) {
scan(init.args);
}
if (init.def != null && init.def.defs != null) {
*** 437,447 ****
* Utility class providing easy access to position and other info for a tree node.
*/
private class Info {
Info() {
tree = null;
! tag = JCTree.ERRONEOUS;
start = 0;
pos = 0;
end = Integer.MAX_VALUE;
}
--- 437,447 ----
* Utility class providing easy access to position and other info for a tree node.
*/
private class Info {
Info() {
tree = null;
! tag = JCTree.Tag.ERRONEOUS;
start = 0;
pos = 0;
end = Integer.MAX_VALUE;
}
*** 457,499 ****
public String toString() {
return tagNames.get(tree.getTag()) + "[start:" + start + ",pos:" + pos + ",end:" + end + "]";
}
final JCTree tree;
! final int tag;
final int start;
final int pos;
final int end;
}
/**
* Names for tree tags.
- * javac does not provide an API to convert tag values to strings, so this class uses
- * reflection to determine names of public static final int values in JCTree.
*/
private static class TagNames {
! String get(int tag) {
! if (map == null) {
! map = new HashMap<Integer, String>();
! Class c = JCTree.class;
! for (Field f : c.getDeclaredFields()) {
! if (f.getType().equals(int.class)) {
! int mods = f.getModifiers();
! if (Modifier.isPublic(mods) && Modifier.isStatic(mods) && Modifier.isFinal(mods)) {
! try {
! map.put(f.getInt(null), f.getName());
! } catch (IllegalAccessException e) {
! }
! }
! }
! }
! }
! String name = map.get(tag);
return (name == null) ? "??" : name;
}
-
- private Map<Integer, String> map;
}
/**
* Thrown when errors are found parsing a java file.
*/
--- 457,480 ----
public String toString() {
return tagNames.get(tree.getTag()) + "[start:" + start + ",pos:" + pos + ",end:" + end + "]";
}
final JCTree tree;
! final JCTree.Tag tag;
final int start;
final int pos;
final int end;
}
/**
* Names for tree tags.
*/
private static class TagNames {
! String get(JCTree.Tag tag) {
! String name = tag.name();
return (name == null) ? "??" : name;
}
}
/**
* Thrown when errors are found parsing a java file.
*/