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
--- 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" +