Index: dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/scope/EnclosedScope.java |
=================================================================== |
--- dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/scope/EnclosedScope.java (revision 30037) |
+++ dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/scope/EnclosedScope.java (working copy) |
@@ -20,8 +20,7 @@ |
import com.google.dart.engine.error.AnalysisErrorListener; |
import com.google.dart.engine.error.CompileTimeErrorCode; |
-import java.util.HashSet; |
-import java.util.Set; |
+import java.util.HashMap; |
/** |
* Instances of the class {@code EnclosedScope} implement a scope that is lexically enclosed in |
@@ -36,11 +35,11 @@ |
private Scope enclosingScope; |
/** |
- * A set of names that will be defined in this scope, but right now are not defined. However |
- * according to the scoping rules these names are hidden, even if they were defined in an outer |
+ * A table mapping names that will be defined in this scope, but right now are not initialized. |
+ * According to the scoping rules these names are hidden, even if they were defined in an outer |
* scope. |
*/ |
- private Set<String> hiddenNames = new HashSet<String>(); |
+ private HashMap<String, Element> hiddenElements = new HashMap<String, Element>(); |
/** |
* Initialize a newly created scope enclosed within another scope. |
@@ -62,16 +61,17 @@ |
} |
/** |
- * Hides the name of the given element in this scope. If there is already an element with the |
- * given name defined in an outer scope, then it will become unavailable. |
+ * Record that given element is declared in this scope, but hasn't been initialized yet, so it is |
+ * error to use. If there is already an element with the given name defined in an outer scope, |
+ * then it will become unavailable. |
* |
- * @param element the element to be hidden in this scope |
+ * @param element the element declared, but not initialized in this scope |
*/ |
public void hide(Element element) { |
if (element != null) { |
String name = element.getName(); |
if (name != null && !name.isEmpty()) { |
- hiddenNames.add(name); |
+ hiddenElements.put(name, element); |
} |
} |
} |
@@ -82,15 +82,18 @@ |
if (element != null) { |
return element; |
} |
- if (hiddenNames.contains(name)) { |
+ // May be there is a hidden Element. |
+ Element hiddenElement = hiddenElements.get(name); |
+ if (hiddenElement != null) { |
getErrorListener().onError( |
new AnalysisError( |
getSource(identifier), |
identifier.getOffset(), |
identifier.getLength(), |
CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION)); |
- //return null; |
+ return hiddenElement; |
} |
+ // Check enclosing scope. |
return enclosingScope.lookup(identifier, name, referencingLibrary); |
} |
} |