United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: JDK-6498938 Faulty comparison of TypeMirror objects in RoundEnvironment.getElementsAnnotatedWith implementation
JDK-6498938 : Faulty comparison of TypeMirror objects in RoundEnvironment.getElementsAnnotatedWith implementation

Details
Type:
Bug
Submit Date:
2006-11-30
Status:
Closed
Updated Date:
2014-01-06
Project Name:
JDK
Resolved Date:
2011-07-15
Component:
core-libs
OS:
generic
Sub-Component:
javax.annotation.processing
CPU:
generic
Priority:
P3
Resolution:
Fixed
Affected Versions:
6
Fixed Versions:

Related Reports
Relates:
Relates:
Relates:
Relates:
Relates:

Sub Tasks

Description
javax.lang.model.TypeMirror objects should be compared for semantic equality using javax.lang.model.util.Types.isSameType rather than TypeMirror.equals.  Code used to implement RoundEnvironment.getElementsAnnotatedWith uses equals for this purpose.

                                    

Comments
EVALUATION

Should be fixed.
                                     
2006-11-30
PUBLIC COMMENTS

See forum thread
http://forums.sun.com/thread.jspa?forumID=514&threadID=790568
                                     
2009-01-30
SUGGESTED FIX

--- old/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java	Tue Feb 24 17:49:21 2009
+++ new/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java	Tue Feb 24 17:49:21 2009
@@ -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);
--- old/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java	Tue Feb 24 17:49:24 2009
+++ new/test/tools/javac/processing/environment/round/TestElementsAnnotatedWith.java	Tue Feb 24 17:49:24 2009
@@ -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 TestElementsAnnotatedWith.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
  */
 
 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();
--- /dev/null	Tue Feb 24 17:49:27 2009
+++ new/test/tools/javac/processing/environment/round/Foo.java	Tue Feb 24 17:49:26 2009
@@ -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 {}
                                     
2009-02-25



Hardware and Software, Engineered to Work Together