changeset 231:1fbc1cc6e260

6498938: Faulty comparison of TypeMirror objects in getElementsAnnotatedWith implementation Reviewed-by: jjg
author darcy
date Tue, 24 Feb 2009 17:48:53 -0800
parents 435d5d9bb87d
children 5240b1120530
files src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java test/tools/javac/processing/environment/round/Foo.java test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java
diffstat 3 files changed, 77 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java	Tue Feb 24 17:16:18 2009 -0800
+++ b/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java	Tue Feb 24 17:48:53 2009 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005-2008 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2005-2009 Sun Microsystems, Inc.  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
@@ -111,6 +111,7 @@
      */
     public Set<? extends Element> getElementsAnnotatedWith(TypeElement a) {
         Set<Element> result = Collections.emptySet();
+        Types typeUtil = processingEnv.getTypeUtils();
         if (a.getKind() != ElementKind.ANNOTATION_TYPE)
             throw new IllegalArgumentException(NOT_AN_ANNOTATION_TYPE + a);
 
@@ -122,7 +123,7 @@
             throw new AssertionError("Bad implementation type for " + tm);
 
         ElementScanner6<Set<Element>, DeclaredType> scanner =
-            new AnnotationSetScanner(result);
+            new AnnotationSetScanner(result, typeUtil);
 
         for (Element element : rootElements)
             result = scanner.scan(element, annotationTypeElement);
@@ -135,9 +136,11 @@
         ElementScanner6<Set<Element>, DeclaredType> {
         // Insertion-order preserving set
         Set<Element> annotatedElements = new LinkedHashSet<Element>();
+        Types typeUtil;
 
-        AnnotationSetScanner(Set<Element> defaultSet) {
+        AnnotationSetScanner(Set<Element> defaultSet, Types typeUtil) {
             super(defaultSet);
+            this.typeUtil = typeUtil;
         }
 
         @Override
@@ -145,7 +148,7 @@
             java.util.List<? extends AnnotationMirror> annotationMirrors =
                 processingEnv.getElementUtils().getAllAnnotationMirrors(e);
             for (AnnotationMirror annotationMirror : annotationMirrors) {
-                if (annotationMirror.getAnnotationType().equals(p))
+                if (typeUtil.isSameType(annotationMirror.getAnnotationType(), p))
                     annotatedElements.add(e);
             }
             e.accept(this, p);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/tools/javac/processing/environment/round/Foo.java	Tue Feb 24 17:48:53 2009 -0800
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  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
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+@AnnotatedElementInfo(annotationName="AnnotatedElementInfo",
+                      expectedSize=1,
+                      names="Foo")
+public class Foo {}
--- a/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java	Tue Feb 24 17:16:18 2009 -0800
+++ b/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java	Tue Feb 24 17:48:53 2009 -0800
@@ -1,5 +1,5 @@
 /*
- * Copyright 2006-2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * Copyright 2006-2009 Sun Microsystems, Inc.  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
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 6397298 6400986 6425592 6449798 6453386 6508401
+ * @bug 6397298 6400986 6425592 6449798 6453386 6508401 6498938
  * @summary Tests that getElementsAnnotatedWith works properly.
  * @author  Joseph D. Darcy
  * @compile TestElementsAnnotatedWith.java
@@ -31,16 +31,22 @@
  * @compile -processor TestElementsAnnotatedWith -proc:only SurfaceAnnotations.java
  * @compile -processor TestElementsAnnotatedWith -proc:only BuriedAnnotations.java
  * @compile -processor TestElementsAnnotatedWith -proc:only Part1.java Part2.java
+ * @compile -processor TestElementsAnnotatedWith -proc:only C2.java
+ * @compile -processor TestElementsAnnotatedWith -proc:only Foo.java
+ * @compile -XD-d=. Foo.java
  * @compile -processor TestElementsAnnotatedWith -proc:only TestElementsAnnotatedWith.java
- * @compile -processor TestElementsAnnotatedWith -proc:only C2.java
  */
 
 import java.lang.annotation.Annotation;
+import java.io.*;
 import java.util.Collections;
 import java.util.Set;
 import java.util.HashSet;
+import java.util.List;
+import java.util.ArrayList;
 import java.util.Arrays;
 import javax.annotation.processing.*;
+import javax.tools.*;
 import javax.lang.model.SourceVersion;
 import javax.lang.model.element.*;
 import javax.lang.model.util.*;
@@ -120,6 +126,9 @@
                 System.err.println("AnnotatedElementInfo: " + annotatedElementInfo);
                 throw new RuntimeException();
             }
+
+            if("TestElementsAnnotatedWith".equals(firstType.getSimpleName().toString()))
+               writeClassFile(); // Start another round to test class file input
         } else {
             // If processing is over without an error, the specified
             // elements should be empty so an empty set should be returned.
@@ -161,6 +170,37 @@
         } catch(IllegalArgumentException iae) {}
     }
 
+    /*
+     * Hack alert!  The class file read below is generated by the
+     * "@compile -XD-d=. Foo.java" directive above.  This sneakily
+     * overrides the output location to the current directory where a
+     * subsequent @compile can read the file.  This could be improved
+     * if either a new directive like @process accepted class file
+     * arguments (the javac command accepts such arguments but
+     * @compile does not) or the test.src and test.classes properties
+     * were set to be read with @compile jobs.
+     */
+    private void writeClassFile() {
+        try {
+            Filer filer = processingEnv.getFiler();
+            JavaFileObject jfo = filer.createClassFile("Foo");
+            OutputStream os = jfo.openOutputStream();
+            // Copy the bytes over
+            System.out.println((new File(".")).getAbsolutePath());
+            InputStream io = new BufferedInputStream(new FileInputStream(new File(".", "Foo.class")));
+            int datum = io.read();
+            while(datum != -1) {
+                os.write(datum);
+                datum = io.read();
+            }
+            os.close();
+        } catch (IOException io) {
+            throw new RuntimeException(io);
+        }
+
+
+    }
+
     @Override
     public SourceVersion getSupportedSourceVersion() {
         return SourceVersion.latest();