1 /*
   2  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 6380016
  27  * @summary Test that the constraints guaranteed by the Filer and maintained
  28  * @author  Joseph D. Darcy
  29  * @library ../../../lib
  30  * @build   JavacTestingAbstractProcessor
  31  * @build TestNames
  32  * @compile -processor TestNames -proc:only TestNames.java
  33  */
  34 
  35 import java.util.Set;
  36 import javax.annotation.processing.*;
  37 import javax.lang.model.SourceVersion;
  38 import static javax.lang.model.SourceVersion.*;
  39 import javax.lang.model.element.*;
  40 import javax.lang.model.util.*;
  41 import static javax.lang.model.util.ElementFilter.*;
  42 import static javax.tools.Diagnostic.Kind.*;
  43 import static javax.tools.StandardLocation.*;
  44 
  45 import java.io.*;
  46 
  47 /**
  48  * Basic tests of semantics of javax.lang.model.element.Name
  49  */
  50 public class TestNames extends JavacTestingAbstractProcessor {
  51     private int round = 0;
  52 
  53     String stringStringName = "java.lang.String";
  54     Name stringName = null;
  55 
  56     public boolean process(Set<? extends TypeElement> annotations,
  57                            RoundEnvironment roundEnv) {
  58         round++;
  59         if (!roundEnv.processingOver()) {
  60             boolean failed = false;
  61 
  62             switch(round) {
  63             case 1:
  64 
  65             TypeElement stringMirror = eltUtils.getTypeElement(stringStringName);
  66             stringName = stringMirror.getQualifiedName();
  67             Name stringPseudoName = Pseudonym.getName(stringName.toString());
  68 
  69 
  70             if (stringName.equals(stringPseudoName))
  71                 failed = true;
  72             if (!stringName.contentEquals(stringStringName))
  73                 failed = true;
  74             if (!stringName.contentEquals(stringPseudoName))
  75                 failed = true;
  76 
  77 
  78             try {
  79                 // Force another round with a new context
  80                 PrintWriter pw = new PrintWriter(filer.createSourceFile("Foo").openWriter());
  81                 pw.println("public class Foo {}");
  82                 pw.close();
  83             } catch (IOException ioe) {
  84                 throw new RuntimeException();
  85             }
  86             break;
  87 
  88             case 2:
  89                 Name stringStringAsName = eltUtils.getName(stringStringName);
  90                 TypeElement stringMirror2 = eltUtils.getTypeElement(stringStringName);
  91                 Name stringName2 = stringMirror2.getQualifiedName();
  92 
  93                 if (stringStringAsName != stringName ||
  94                     stringName != stringName2)
  95                     failed = true;
  96                 break;
  97 
  98             default:
  99                 throw new RuntimeException("Unexpected round " + round);
 100             }
 101 
 102             if (failed)
 103                 throw new RuntimeException("Invalid name equality checks.");
 104         }
 105         return true;
 106     }
 107 
 108     private static class Pseudonym implements Name {
 109         private String name;
 110 
 111         private Pseudonym(String name) {
 112             this.name = name;
 113         }
 114 
 115         public static Pseudonym getName(String name) {
 116             return new Pseudonym(name);
 117         }
 118 
 119         public boolean contentEquals(CharSequence cs) {
 120             return name.contentEquals(cs);
 121         }
 122 
 123         public char charAt(int index) {
 124             return name.charAt(index);
 125         }
 126 
 127         public int length() {
 128             return name.length();
 129         }
 130 
 131         public CharSequence subSequence(int start, int end) {
 132             return name.subSequence(start, end);
 133         }
 134 
 135         public String toString() {
 136             return name;
 137         }
 138     }
 139 }