langtools/test/tools/javac/treepostests/TreePosTest.java
changeset 4933 57f71400ba29
parent 4874 67e82eb7b395
equal deleted inserted replaced
4877:b642d21c9f74 4933:57f71400ba29
    96 
    96 
    97 /*
    97 /*
    98  * @test
    98  * @test
    99  * @bug 6919889
    99  * @bug 6919889
   100  * @summary assorted position errors in compiler syntax trees
   100  * @summary assorted position errors in compiler syntax trees
   101  * @run main TreePosTest -q -r -ef ./tools/javac/typeAnnotations -ef ./tools/javap/typeAnnotations  .
   101  * @run main TreePosTest -q -r -ef ./tools/javac/typeAnnotations -ef ./tools/javap/typeAnnotations -et ANNOTATED_TYPE .
   102  */
   102  */
   103 public class TreePosTest {
   103 public class TreePosTest {
   104     /**
   104     /**
   105      * Main entry point.
   105      * Main entry point.
   106      * If test.src is set, program runs in jtreg mode, and will throw an Error
   106      * If test.src is set, program runs in jtreg mode, and will throw an Error
   148                 verbose = true;
   148                 verbose = true;
   149             else if (arg.equals("-t") && i + 1 < args.length)
   149             else if (arg.equals("-t") && i + 1 < args.length)
   150                 tags.add(args[++i]);
   150                 tags.add(args[++i]);
   151             else if (arg.equals("-ef") && i + 1 < args.length)
   151             else if (arg.equals("-ef") && i + 1 < args.length)
   152                 excludeFiles.add(new File(baseDir, args[++i]));
   152                 excludeFiles.add(new File(baseDir, args[++i]));
       
   153             else if (arg.equals("-et") && i + 1 < args.length)
       
   154                 excludeTags.add(args[++i]);
   153             else if (arg.equals("-r")) {
   155             else if (arg.equals("-r")) {
   154                 if (excludeFiles.size() > 0)
   156                 if (excludeFiles.size() > 0)
   155                     throw new Error("-r must be used before -ef");
   157                     throw new Error("-r must be used before -ef");
   156                 File d = baseDir;
   158                 File d = baseDir;
   157                 while (!new File(d, "TEST.ROOT").exists()) {
   159                 while (!new File(d, "TEST.ROOT").exists()) {
   197         out.println("-q        Quiet: don't report on inapplicable files");
   199         out.println("-q        Quiet: don't report on inapplicable files");
   198         out.println("-v        Verbose: report on files as they are being read");
   200         out.println("-v        Verbose: report on files as they are being read");
   199         out.println("-t tag    Limit checks to tree nodes with this tag");
   201         out.println("-t tag    Limit checks to tree nodes with this tag");
   200         out.println("          Can be repeated if desired");
   202         out.println("          Can be repeated if desired");
   201         out.println("-ef file  Exclude file or directory");
   203         out.println("-ef file  Exclude file or directory");
       
   204         out.println("-et tag   Exclude tree nodes with given tag name");
   202         out.println("");
   205         out.println("");
   203         out.println("files may be directories or files");
   206         out.println("files may be directories or files");
   204         out.println("directories will be scanned recursively");
   207         out.println("directories will be scanned recursively");
   205         out.println("non java files, or java files which cannot be parsed, will be ignored");
   208         out.println("non java files, or java files which cannot be parsed, will be ignored");
   206         out.println("");
   209         out.println("");
   302     /** The set of tags for tree nodes to be analyzed; if empty, all tree nodes
   305     /** The set of tags for tree nodes to be analyzed; if empty, all tree nodes
   303      * are analyzed. */
   306      * are analyzed. */
   304     Set<String> tags = new HashSet<String>();
   307     Set<String> tags = new HashSet<String>();
   305     /** Set of files and directories to be excluded from analysis. */
   308     /** Set of files and directories to be excluded from analysis. */
   306     Set<File> excludeFiles = new HashSet<File>();
   309     Set<File> excludeFiles = new HashSet<File>();
       
   310     /** Set of tag names to be excluded from analysis. */
       
   311     Set<String> excludeTags = new HashSet<String>();
   307     /** Table of printable names for tree tag values. */
   312     /** Table of printable names for tree tag values. */
   308     TagNames tagNames = new TagNames();
   313     TagNames tagNames = new TagNames();
   309 
   314 
   310     /**
   315     /**
   311      * Main class for testing assertions concerning tree positions for tree nodes.
   316      * Main class for testing assertions concerning tree positions for tree nodes.
   322         public void scan(JCTree tree) {
   327         public void scan(JCTree tree) {
   323             if (tree == null)
   328             if (tree == null)
   324                 return;
   329                 return;
   325 
   330 
   326             Info self = new Info(tree, endPosTable);
   331             Info self = new Info(tree, endPosTable);
   327             if (check(self)) {
   332             if (check(encl, self)) {
   328                 // Modifiers nodes are present throughout the tree even where
   333                 // Modifiers nodes are present throughout the tree even where
   329                 // there is no corresponding source text.
   334                 // there is no corresponding source text.
   330                 // Redundant semicolons in a class definition can cause empty
   335                 // Redundant semicolons in a class definition can cause empty
   331                 // initializer blocks with no positions.
   336                 // initializer blocks with no positions.
   332                 if ((self.tag == JCTree.MODIFIERS || self.tag == JCTree.BLOCK)
   337                 if ((self.tag == JCTree.MODIFIERS || self.tag == JCTree.BLOCK)
   390                 }
   395                 }
   391             } else
   396             } else
   392                 super.visitVarDef(tree);
   397                 super.visitVarDef(tree);
   393         }
   398         }
   394 
   399 
   395         boolean check(Info x) {
   400         boolean check(Info encl, Info self) {
   396             return tags.size() == 0 || tags.contains(tagNames.get(x.tag));
   401             if (excludeTags.size() > 0) {
       
   402                 if (encl != null && excludeTags.contains(tagNames.get(encl.tag))
       
   403                         || excludeTags.contains(tagNames.get(self.tag)))
       
   404                     return false;
       
   405             }
       
   406             return tags.size() == 0 || tags.contains(tagNames.get(self.tag));
   397         }
   407         }
   398 
   408 
   399         void check(String label, Info encl, Info self, boolean ok) {
   409         void check(String label, Info encl, Info self, boolean ok) {
   400             if (!ok) {
   410             if (!ok) {
   401                 if (gui) {
   411                 if (gui) {