7036906: Scope: CompoundScope.getElements() doesn't pass scope filter to subscopes
authormcimadamore
Tue, 19 Apr 2011 13:57:25 +0100
changeset 9593 f917c044e651
parent 9592 82e14c156b3b
child 9594 7296a49d21e6
child 9884 6657e7d573e0
7036906: Scope: CompoundScope.getElements() doesn't pass scope filter to subscopes Summary: CompoundScope.getElements() is not filtering elements according to the ScopeFilter argument Reviewed-by: jjg
langtools/src/share/classes/com/sun/tools/javac/code/Scope.java
langtools/test/tools/javac/scope/7017664/CompoundScopeTest.java
--- a/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java	Mon Apr 18 15:39:16 2011 -0700
+++ b/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java	Tue Apr 19 13:57:25 2011 +0100
@@ -649,7 +649,7 @@
                 public Iterator<Symbol> iterator() {
                     return new CompoundScopeIterator(subScopes) {
                         Iterator<Symbol> nextIterator(Scope s) {
-                            return s.getElements().iterator();
+                            return s.getElements(sf).iterator();
                         }
                     };
                 }
--- a/langtools/test/tools/javac/scope/7017664/CompoundScopeTest.java	Mon Apr 18 15:39:16 2011 -0700
+++ b/langtools/test/tools/javac/scope/7017664/CompoundScopeTest.java	Tue Apr 19 13:57:25 2011 +0100
@@ -23,7 +23,7 @@
 
 /*
  * @test
- * @bug 7017664
+ * @bug 7017664 7036906
  * @summary Basher for CompoundScopes
  */
 
@@ -127,8 +127,17 @@
                     }
                 }
                 log("testing scope: " + root);
-                checkElems(root);
-                checkShadowed(root);
+                checkElems(root, null);
+                checkElems(root, new OddFilter());
+                checkShadowed(root, null);
+                checkShadowed(root, new OddFilter());
+            }
+        }
+
+        class OddFilter implements Filter<Symbol> {
+            public boolean accepts(Symbol s) {
+                Name numPart = s.name.subName(1, s.name.length());
+                return Integer.parseInt(numPart.toString()) % 2 != 0;
             }
         }
 
@@ -165,15 +174,20 @@
          * Check that CompoundScope.getElements() correctly visits all symbols
          * in all subscopes (in the correct order)
          */
-        void checkElems(CompoundScope cs) {
-            List<Symbol> allSymbols = elems;
+        void checkElems(CompoundScope cs, Filter<Symbol> sf) {
             int count = 0;
-            for (Symbol s : cs.getElements()) {
+            ListBuffer<Symbol> found = ListBuffer.lb();
+            List<Symbol> allSymbols = sf == null ?
+                    elems :
+                    filter(elems, sf);
+            int expectedCount = allSymbols.length();
+            for (Symbol s : sf == null ? cs.getElements() : cs.getElements(sf)) {
                 checkSameSymbols(s, allSymbols.head);
                 allSymbols = allSymbols.tail;
+                found.append(s);
                 count++;
             }
-            if (count != elems.size()) {
+            if (count != expectedCount) {
                 error("CompoundScope.getElements() did not returned enough symbols");
             }
         }
@@ -182,22 +196,35 @@
          * Check that CompoundScope.getElements() correctly visits all symbols
          * with a given name in all subscopes (in the correct order)
          */
-        void checkShadowed(CompoundScope cs) {
+        void checkShadowed(CompoundScope cs, Filter<Symbol> sf) {
             for (Map.Entry<Name, List<Symbol>> shadowedEntry : shadowedMap.entrySet()) {
                 int count = 0;
-                List<Symbol> shadowed = shadowedEntry.getValue();
+                List<Symbol> shadowed = sf == null ?
+                    shadowedEntry.getValue() :
+                    filter(shadowedEntry.getValue(), sf);
+                int expectedCount = shadowed.length();
                 Name name = shadowedEntry.getKey();
-                for (Symbol s : cs.getElementsByName(name)) {
+                for (Symbol s : sf == null ? cs.getElementsByName(name) : cs.getElementsByName(name, sf)) {
                     checkSameSymbols(s, shadowed.head);
                     shadowed = shadowed.tail;
                     count++;
                 }
-                if (count != shadowedEntry.getValue().size()) {
+                if (count != expectedCount) {
                     error("CompoundScope.lookup() did not returned enough symbols for name " + name);
                 }
             }
         }
 
+        List<Symbol> filter(List<Symbol> elems, Filter<Symbol> sf) {
+            ListBuffer<Symbol> res = ListBuffer.lb();
+            for (Symbol s : elems) {
+                if (sf.accepts(s)) {
+                    res.append(s);
+                }
+            }
+            return res.toList();
+        }
+
         void checkSameSymbols(Symbol found, Symbol req) {
             if (found != req) {
                 error("Symbol mismatch - found    : " + found + ":" + found.hashCode() + "\n" +