Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(435)

Side by Side Diff: dart/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/scope/EnclosedScope.java

Issue 64033002: Version 0.8.10.8 (Closed) Base URL: http://dart.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012, the Dart project authors. 2 * Copyright (c) 2012, the Dart project authors.
3 * 3 *
4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u se this file except 4 * Licensed under the Eclipse Public License v1.0 (the "License"); you may not u se this file except
5 * in compliance with the License. You may obtain a copy of the License at 5 * in compliance with the License. You may obtain a copy of the License at
6 * 6 *
7 * http://www.eclipse.org/legal/epl-v10.html 7 * http://www.eclipse.org/legal/epl-v10.html
8 * 8 *
9 * Unless required by applicable law or agreed to in writing, software distribut ed under the License 9 * Unless required by applicable law or agreed to in writing, software distribut ed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K IND, either express 10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY K IND, either express
11 * or implied. See the License for the specific language governing permissions a nd limitations under 11 * or implied. See the License for the specific language governing permissions a nd limitations under
12 * the License. 12 * the License.
13 */ 13 */
14 package com.google.dart.engine.internal.scope; 14 package com.google.dart.engine.internal.scope;
15 15
16 import com.google.dart.engine.ast.Identifier; 16 import com.google.dart.engine.ast.Identifier;
17 import com.google.dart.engine.element.Element; 17 import com.google.dart.engine.element.Element;
18 import com.google.dart.engine.element.LibraryElement; 18 import com.google.dart.engine.element.LibraryElement;
19 import com.google.dart.engine.error.AnalysisError; 19 import com.google.dart.engine.error.AnalysisError;
20 import com.google.dart.engine.error.AnalysisErrorListener; 20 import com.google.dart.engine.error.AnalysisErrorListener;
21 import com.google.dart.engine.error.CompileTimeErrorCode; 21 import com.google.dart.engine.error.CompileTimeErrorCode;
22 22
23 import java.util.HashSet; 23 import java.util.HashMap;
24 import java.util.Set;
25 24
26 /** 25 /**
27 * Instances of the class {@code EnclosedScope} implement a scope that is lexica lly enclosed in 26 * Instances of the class {@code EnclosedScope} implement a scope that is lexica lly enclosed in
28 * another scope. 27 * another scope.
29 * 28 *
30 * @coverage dart.engine.resolver 29 * @coverage dart.engine.resolver
31 */ 30 */
32 public class EnclosedScope extends Scope { 31 public class EnclosedScope extends Scope {
33 /** 32 /**
34 * The scope in which this scope is lexically enclosed. 33 * The scope in which this scope is lexically enclosed.
35 */ 34 */
36 private Scope enclosingScope; 35 private Scope enclosingScope;
37 36
38 /** 37 /**
39 * A set of names that will be defined in this scope, but right now are not de fined. However 38 * A table mapping names that will be defined in this scope, but right now are not initialized.
40 * according to the scoping rules these names are hidden, even if they were de fined in an outer 39 * According to the scoping rules these names are hidden, even if they were de fined in an outer
41 * scope. 40 * scope.
42 */ 41 */
43 private Set<String> hiddenNames = new HashSet<String>(); 42 private HashMap<String, Element> hiddenElements = new HashMap<String, Element> ();
44 43
45 /** 44 /**
46 * Initialize a newly created scope enclosed within another scope. 45 * Initialize a newly created scope enclosed within another scope.
47 * 46 *
48 * @param enclosingScope the scope in which this scope is lexically enclosed 47 * @param enclosingScope the scope in which this scope is lexically enclosed
49 */ 48 */
50 public EnclosedScope(Scope enclosingScope) { 49 public EnclosedScope(Scope enclosingScope) {
51 this.enclosingScope = enclosingScope; 50 this.enclosingScope = enclosingScope;
52 } 51 }
53 52
54 @Override 53 @Override
55 public Scope getEnclosingScope() { 54 public Scope getEnclosingScope() {
56 return enclosingScope; 55 return enclosingScope;
57 } 56 }
58 57
59 @Override 58 @Override
60 public AnalysisErrorListener getErrorListener() { 59 public AnalysisErrorListener getErrorListener() {
61 return enclosingScope.getErrorListener(); 60 return enclosingScope.getErrorListener();
62 } 61 }
63 62
64 /** 63 /**
65 * Hides the name of the given element in this scope. If there is already an e lement with the 64 * Record that given element is declared in this scope, but hasn't been initia lized yet, so it is
66 * given name defined in an outer scope, then it will become unavailable. 65 * error to use. If there is already an element with the given name defined in an outer scope,
66 * then it will become unavailable.
67 * 67 *
68 * @param element the element to be hidden in this scope 68 * @param element the element declared, but not initialized in this scope
69 */ 69 */
70 public void hide(Element element) { 70 public void hide(Element element) {
71 if (element != null) { 71 if (element != null) {
72 String name = element.getName(); 72 String name = element.getName();
73 if (name != null && !name.isEmpty()) { 73 if (name != null && !name.isEmpty()) {
74 hiddenNames.add(name); 74 hiddenElements.put(name, element);
75 } 75 }
76 } 76 }
77 } 77 }
78 78
79 @Override 79 @Override
80 protected Element lookup(Identifier identifier, String name, LibraryElement re ferencingLibrary) { 80 protected Element lookup(Identifier identifier, String name, LibraryElement re ferencingLibrary) {
81 Element element = localLookup(name, referencingLibrary); 81 Element element = localLookup(name, referencingLibrary);
82 if (element != null) { 82 if (element != null) {
83 return element; 83 return element;
84 } 84 }
85 if (hiddenNames.contains(name)) { 85 // May be there is a hidden Element.
86 Element hiddenElement = hiddenElements.get(name);
87 if (hiddenElement != null) {
86 getErrorListener().onError( 88 getErrorListener().onError(
87 new AnalysisError( 89 new AnalysisError(
88 getSource(identifier), 90 getSource(identifier),
89 identifier.getOffset(), 91 identifier.getOffset(),
90 identifier.getLength(), 92 identifier.getLength(),
91 CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION)); 93 CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION));
92 //return null; 94 return hiddenElement;
93 } 95 }
96 // Check enclosing scope.
94 return enclosingScope.lookup(identifier, name, referencingLibrary); 97 return enclosingScope.lookup(identifier, name, referencingLibrary);
95 } 98 }
96 } 99 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698