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

Side by Side Diff: pkg/analyzer_experimental/lib/src/generated/engine.dart

Issue 16337007: Version 0.5.13.1 . (Closed) Base URL: http://dart.googlecode.com/svn/trunk/dart/
Patch Set: Created 7 years, 6 months 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 // This code was auto-generated, is not intended to be edited, and is subject to 1 // This code was auto-generated, is not intended to be edited, and is subject to
2 // significant change. Please see the README file for more information. 2 // significant change. Please see the README file for more information.
3 3
4 library engine; 4 library engine;
5 5
6 import 'dart:collection' show HasNextIterator; 6 import 'dart:collection' show HasNextIterator;
7 import 'java_core.dart'; 7 import 'java_core.dart';
8 import 'java_engine.dart'; 8 import 'java_engine.dart';
9 import 'instrumentation.dart'; 9 import 'instrumentation.dart';
10 import 'error.dart'; 10 import 'error.dart';
11 import 'source.dart'; 11 import 'source.dart';
12 import 'scanner.dart' show Token, CharBufferScanner, StringScanner; 12 import 'scanner.dart' show Token, CharBufferScanner, StringScanner;
13 import 'ast.dart'; 13 import 'ast.dart';
14 import 'parser.dart' show Parser; 14 import 'parser.dart' show Parser;
15 import 'sdk.dart' show DartSdk; 15 import 'sdk.dart' show DartSdk;
16 import 'element.dart'; 16 import 'element.dart';
17 import 'resolver.dart'; 17 import 'resolver.dart';
18 import 'html.dart' show XmlTagNode, XmlAttributeNode, RecursiveXmlVisitor, HtmlS canner, HtmlScanResult, HtmlParser, HtmlParseResult, HtmlUnit; 18 import 'html.dart' show XmlTagNode, XmlAttributeNode, RecursiveXmlVisitor, HtmlS canner, HtmlScanResult, HtmlParser, HtmlParseResult, HtmlUnit;
19 19
20
20 /** 21 /**
21 * The unique instance of the class {@code AnalysisEngine} serves as the entry p oint for the 22 * The unique instance of the class {@code AnalysisEngine} serves as the entry p oint for the
22 * functionality provided by the analysis engine. 23 * functionality provided by the analysis engine.
23 * @coverage dart.engine 24 * @coverage dart.engine
24 */ 25 */
25 class AnalysisEngine { 26 class AnalysisEngine {
27
26 /** 28 /**
27 * The suffix used for Dart source files. 29 * The suffix used for Dart source files.
28 */ 30 */
29 static String SUFFIX_DART = "dart"; 31 static String SUFFIX_DART = "dart";
32
30 /** 33 /**
31 * The short suffix used for HTML files. 34 * The short suffix used for HTML files.
32 */ 35 */
33 static String SUFFIX_HTM = "htm"; 36 static String SUFFIX_HTM = "htm";
37
34 /** 38 /**
35 * The long suffix used for HTML files. 39 * The long suffix used for HTML files.
36 */ 40 */
37 static String SUFFIX_HTML = "html"; 41 static String SUFFIX_HTML = "html";
42
38 /** 43 /**
39 * The unique instance of this class. 44 * The unique instance of this class.
40 */ 45 */
41 static AnalysisEngine _UniqueInstance = new AnalysisEngine(); 46 static AnalysisEngine _UniqueInstance = new AnalysisEngine();
47
42 /** 48 /**
43 * Return the unique instance of this class. 49 * Return the unique instance of this class.
44 * @return the unique instance of this class 50 * @return the unique instance of this class
45 */ 51 */
46 static AnalysisEngine get instance => _UniqueInstance; 52 static AnalysisEngine get instance => _UniqueInstance;
53
47 /** 54 /**
48 * Return {@code true} if the given file name is assumed to contain Dart sourc e code. 55 * Return {@code true} if the given file name is assumed to contain Dart sourc e code.
49 * @param fileName the name of the file being tested 56 * @param fileName the name of the file being tested
50 * @return {@code true} if the given file name is assumed to contain Dart sour ce code 57 * @return {@code true} if the given file name is assumed to contain Dart sour ce code
51 */ 58 */
52 static bool isDartFileName(String fileName) { 59 static bool isDartFileName(String fileName) {
53 if (fileName == null) { 60 if (fileName == null) {
54 return false; 61 return false;
55 } 62 }
56 return javaStringEqualsIgnoreCase(FileNameUtilities.getExtension(fileName), SUFFIX_DART); 63 return javaStringEqualsIgnoreCase(FileNameUtilities.getExtension(fileName), SUFFIX_DART);
57 } 64 }
65
58 /** 66 /**
59 * Return {@code true} if the given file name is assumed to contain HTML. 67 * Return {@code true} if the given file name is assumed to contain HTML.
60 * @param fileName the name of the file being tested 68 * @param fileName the name of the file being tested
61 * @return {@code true} if the given file name is assumed to contain HTML 69 * @return {@code true} if the given file name is assumed to contain HTML
62 */ 70 */
63 static bool isHtmlFileName(String fileName) { 71 static bool isHtmlFileName(String fileName) {
64 if (fileName == null) { 72 if (fileName == null) {
65 return false; 73 return false;
66 } 74 }
67 String extension = FileNameUtilities.getExtension(fileName); 75 String extension = FileNameUtilities.getExtension(fileName);
68 return javaStringEqualsIgnoreCase(extension, SUFFIX_HTML) || javaStringEqual sIgnoreCase(extension, SUFFIX_HTM); 76 return javaStringEqualsIgnoreCase(extension, SUFFIX_HTML) || javaStringEqual sIgnoreCase(extension, SUFFIX_HTM);
69 } 77 }
78
70 /** 79 /**
71 * The logger that should receive information about errors within the analysis engine. 80 * The logger that should receive information about errors within the analysis engine.
72 */ 81 */
73 Logger _logger = Logger.NULL; 82 Logger _logger = Logger.NULL;
74 /** 83
75 * Prevent the creation of instances of this class.
76 */
77 AnalysisEngine() : super() {
78 }
79 /** 84 /**
80 * Create a new context in which analysis can be performed. 85 * Create a new context in which analysis can be performed.
81 * @return the analysis context that was created 86 * @return the analysis context that was created
82 */ 87 */
83 AnalysisContext createAnalysisContext() { 88 AnalysisContext createAnalysisContext() {
84 if (Instrumentation.isNullLogger()) { 89 if (Instrumentation.isNullLogger()) {
85 return new DelegatingAnalysisContextImpl(); 90 return new DelegatingAnalysisContextImpl();
86 } else { 91 } else {
87 return new InstrumentedAnalysisContextImpl.con1(new DelegatingAnalysisCont extImpl()); 92 return new InstrumentedAnalysisContextImpl.con1(new DelegatingAnalysisCont extImpl());
88 } 93 }
89 } 94 }
95
90 /** 96 /**
91 * Return the logger that should receive information about errors within the a nalysis engine. 97 * Return the logger that should receive information about errors within the a nalysis engine.
92 * @return the logger that should receive information about errors within the analysis engine 98 * @return the logger that should receive information about errors within the analysis engine
93 */ 99 */
94 Logger get logger => _logger; 100 Logger get logger => _logger;
101
95 /** 102 /**
96 * Set the logger that should receive information about errors within the anal ysis engine to the 103 * Set the logger that should receive information about errors within the anal ysis engine to the
97 * given logger. 104 * given logger.
98 * @param logger the logger that should receive information about errors withi n the analysis 105 * @param logger the logger that should receive information about errors withi n the analysis
99 * engine 106 * engine
100 */ 107 */
101 void set logger(Logger logger2) { 108 void set logger(Logger logger2) {
102 this._logger = logger2 == null ? Logger.NULL : logger2; 109 this._logger = logger2 == null ? Logger.NULL : logger2;
103 } 110 }
104 } 111 }
112
105 /** 113 /**
106 * The interface {@code AnalysisContext} defines the behavior of objects that re present a context in 114 * The interface {@code AnalysisContext} defines the behavior of objects that re present a context in
107 * which a single analysis can be performed and incrementally maintained. The co ntext includes such 115 * which a single analysis can be performed and incrementally maintained. The co ntext includes such
108 * information as the version of the SDK being analyzed against as well as the p ackage-root used to 116 * information as the version of the SDK being analyzed against as well as the p ackage-root used to
109 * resolve 'package:' URI's. (Both of which are known indirectly through the {@l ink SourceFactorysource factory}.) 117 * resolve 'package:' URI's. (Both of which are known indirectly through the {@l ink SourceFactorysource factory}.)
110 * <p> 118 * <p>
111 * An analysis context also represents the state of the analysis, which includes knowing which 119 * An analysis context also represents the state of the analysis, which includes knowing which
112 * sources have been included in the analysis (either directly or indirectly) an d the results of the 120 * sources have been included in the analysis (either directly or indirectly) an d the results of the
113 * analysis. Sources must be added and removed from the context using the method {@link #applyChanges(ChangeSet)}, which is also used to notify the context when sources have been 121 * analysis. Sources must be added and removed from the context using the method {@link #applyChanges(ChangeSet)}, which is also used to notify the context when sources have been
114 * modified and, consequently, previously known results might have been invalida ted. 122 * modified and, consequently, previously known results might have been invalida ted.
(...skipping 13 matching lines...) Expand all
128 * up-to-date. For such clients there is a mechanism that allows them to increme ntally perform 136 * up-to-date. For such clients there is a mechanism that allows them to increme ntally perform
129 * needed analysis and get notified of the consequent changes to the analysis re sults. This 137 * needed analysis and get notified of the consequent changes to the analysis re sults. This
130 * mechanism is realized by the method {@link #performAnalysisTask()}. 138 * mechanism is realized by the method {@link #performAnalysisTask()}.
131 * <p> 139 * <p>
132 * Analysis engine allows for having more than one context. This can be used, fo r example, to 140 * Analysis engine allows for having more than one context. This can be used, fo r example, to
133 * perform one analysis based on the state of files on disk and a separate analy sis based on the 141 * perform one analysis based on the state of files on disk and a separate analy sis based on the
134 * state of those files in open editors. It can also be used to perform an analy sis based on a 142 * state of those files in open editors. It can also be used to perform an analy sis based on a
135 * proposed future state, such as the state after a refactoring. 143 * proposed future state, such as the state after a refactoring.
136 */ 144 */
137 abstract class AnalysisContext { 145 abstract class AnalysisContext {
146
138 /** 147 /**
139 * Apply the changes specified by the given change set to this context. Any an alysis results that 148 * Apply the changes specified by the given change set to this context. Any an alysis results that
140 * have been invalidated by these changes will be removed. 149 * have been invalidated by these changes will be removed.
141 * @param changeSet a description of the changes that are to be applied 150 * @param changeSet a description of the changes that are to be applied
142 */ 151 */
143 void applyChanges(ChangeSet changeSet); 152 void applyChanges(ChangeSet changeSet);
153
144 /** 154 /**
145 * Return the documentation comment for the given element as it appears in the original source 155 * Return the documentation comment for the given element as it appears in the original source
146 * (complete with the beginning and ending delimiters), or {@code null} if the element does not 156 * (complete with the beginning and ending delimiters), or {@code null} if the element does not
147 * have a documentation comment associated with it. This can be a long-running operation if the 157 * have a documentation comment associated with it. This can be a long-running operation if the
148 * information needed to access the comment is not cached. 158 * information needed to access the comment is not cached.
149 * @param element the element whose documentation comment is to be returned 159 * @param element the element whose documentation comment is to be returned
150 * @return the element's documentation comment 160 * @return the element's documentation comment
151 * @throws AnalysisException if the documentation comment could not be determi ned because the 161 * @throws AnalysisException if the documentation comment could not be determi ned because the
152 * analysis could not be performed 162 * analysis could not be performed
153 */ 163 */
154 String computeDocumentationComment(Element element); 164 String computeDocumentationComment(Element element);
165
155 /** 166 /**
156 * Return an array containing all of the errors associated with the given sour ce. If the errors 167 * Return an array containing all of the errors associated with the given sour ce. If the errors
157 * are not already known then the source will be analyzed in order to determin e the errors 168 * are not already known then the source will be analyzed in order to determin e the errors
158 * associated with it. 169 * associated with it.
159 * @param source the source whose errors are to be returned 170 * @param source the source whose errors are to be returned
160 * @return all of the errors associated with the given source 171 * @return all of the errors associated with the given source
161 * @throws AnalysisException if the errors could not be determined because the analysis could not 172 * @throws AnalysisException if the errors could not be determined because the analysis could not
162 * be performed 173 * be performed
163 * @see #getErrors(Source) 174 * @see #getErrors(Source)
164 */ 175 */
165 List<AnalysisError> computeErrors(Source source); 176 List<AnalysisError> computeErrors(Source source);
177
166 /** 178 /**
167 * Return the element model corresponding to the HTML file defined by the give n source. If the 179 * Return the element model corresponding to the HTML file defined by the give n source. If the
168 * element model does not yet exist it will be created. The process of creatin g an element model 180 * element model does not yet exist it will be created. The process of creatin g an element model
169 * for an HTML file can long-running, depending on the size of the file and th e number of 181 * for an HTML file can long-running, depending on the size of the file and th e number of
170 * libraries that are defined in it (via script tags) that also need to have a model built for 182 * libraries that are defined in it (via script tags) that also need to have a model built for
171 * them. 183 * them.
172 * @param source the source defining the HTML file whose element model is to b e returned 184 * @param source the source defining the HTML file whose element model is to b e returned
173 * @return the element model corresponding to the HTML file defined by the giv en source 185 * @return the element model corresponding to the HTML file defined by the giv en source
174 * @throws AnalysisException if the element model could not be determined beca use the analysis 186 * @throws AnalysisException if the element model could not be determined beca use the analysis
175 * could not be performed 187 * could not be performed
176 * @see #getHtmlElement(Source) 188 * @see #getHtmlElement(Source)
177 */ 189 */
178 HtmlElement computeHtmlElement(Source source); 190 HtmlElement computeHtmlElement(Source source);
191
179 /** 192 /**
180 * Return the kind of the given source, computing it's kind if it is not alrea dy known. Return{@link SourceKind#UNKNOWN} if the source is not contained in thi s context. 193 * Return the kind of the given source, computing it's kind if it is not alrea dy known. Return{@link SourceKind#UNKNOWN} if the source is not contained in thi s context.
181 * @param source the source whose kind is to be returned 194 * @param source the source whose kind is to be returned
182 * @return the kind of the given source 195 * @return the kind of the given source
183 * @see #getKindOf(Source) 196 * @see #getKindOf(Source)
184 */ 197 */
185 SourceKind computeKindOf(Source source); 198 SourceKind computeKindOf(Source source);
199
186 /** 200 /**
187 * Return the element model corresponding to the library defined by the given source. If the 201 * Return the element model corresponding to the library defined by the given source. If the
188 * element model does not yet exist it will be created. The process of creatin g an element model 202 * element model does not yet exist it will be created. The process of creatin g an element model
189 * for a library can long-running, depending on the size of the library and th e number of 203 * for a library can long-running, depending on the size of the library and th e number of
190 * libraries that are imported into it that also need to have a model built fo r them. 204 * libraries that are imported into it that also need to have a model built fo r them.
191 * @param source the source defining the library whose element model is to be returned 205 * @param source the source defining the library whose element model is to be returned
192 * @return the element model corresponding to the library defined by the given source 206 * @return the element model corresponding to the library defined by the given source
193 * @throws AnalysisException if the element model could not be determined beca use the analysis 207 * @throws AnalysisException if the element model could not be determined beca use the analysis
194 * could not be performed 208 * could not be performed
195 * @see #getLibraryElement(Source) 209 * @see #getLibraryElement(Source)
196 */ 210 */
197 LibraryElement computeLibraryElement(Source source); 211 LibraryElement computeLibraryElement(Source source);
212
198 /** 213 /**
199 * Return the line information for the given source, or {@code null} if the so urce is not of a 214 * Return the line information for the given source, or {@code null} if the so urce is not of a
200 * recognized kind (neither a Dart nor HTML file). If the line information was not previously 215 * recognized kind (neither a Dart nor HTML file). If the line information was not previously
201 * known it will be created. The line information is used to map offsets from the beginning of the 216 * known it will be created. The line information is used to map offsets from the beginning of the
202 * source to line and column pairs. 217 * source to line and column pairs.
203 * @param source the source whose line information is to be returned 218 * @param source the source whose line information is to be returned
204 * @return the line information for the given source 219 * @return the line information for the given source
205 * @throws AnalysisException if the line information could not be determined b ecause the analysis 220 * @throws AnalysisException if the line information could not be determined b ecause the analysis
206 * could not be performed 221 * could not be performed
207 * @see #getLineInfo(Source) 222 * @see #getLineInfo(Source)
208 */ 223 */
209 LineInfo computeLineInfo(Source source); 224 LineInfo computeLineInfo(Source source);
225
210 /** 226 /**
211 * Create a new context in which analysis can be performed. Any sources in the specified container 227 * Create a new context in which analysis can be performed. Any sources in the specified container
212 * will be removed from this context and added to the newly created context. 228 * will be removed from this context and added to the newly created context.
213 * @param container the container containing sources that should be removed fr om this context and 229 * @param container the container containing sources that should be removed fr om this context and
214 * added to the returned context 230 * added to the returned context
215 * @return the analysis context that was created 231 * @return the analysis context that was created
216 */ 232 */
217 AnalysisContext extractContext(SourceContainer container); 233 AnalysisContext extractContext(SourceContainer container);
234
235 /**
236 * Return the set of analysis options controlling the behavior of this context .
237 * @return the set of analysis options controlling the behavior of this contex t
238 */
239 AnalysisOptions get analysisOptions;
240
218 /** 241 /**
219 * Return the element referenced by the given location, or {@code null} if the element is not 242 * Return the element referenced by the given location, or {@code null} if the element is not
220 * immediately available or if there is no element with the given location. Th e latter condition 243 * immediately available or if there is no element with the given location. Th e latter condition
221 * can occur, for example, if the location describes an element from a differe nt context or if the 244 * can occur, for example, if the location describes an element from a differe nt context or if the
222 * element has been removed from this context as a result of some change since it was originally 245 * element has been removed from this context as a result of some change since it was originally
223 * obtained. 246 * obtained.
224 * @param location the reference describing the element to be returned 247 * @param location the reference describing the element to be returned
225 * @return the element referenced by the given location 248 * @return the element referenced by the given location
226 */ 249 */
227 Element getElement(ElementLocation location); 250 Element getElement(ElementLocation location);
251
228 /** 252 /**
229 * Return an analysis error info containing the array of all of the errors and the line info 253 * Return an analysis error info containing the array of all of the errors and the line info
230 * associated with the given source. The array of errors will be empty if the source is not known 254 * associated with the given source. The array of errors will be empty if the source is not known
231 * to this context or if there are no errors in the source. The errors contain ed in the array can 255 * to this context or if there are no errors in the source. The errors contain ed in the array can
232 * be incomplete. 256 * be incomplete.
233 * @param source the source whose errors are to be returned 257 * @param source the source whose errors are to be returned
234 * @return all of the errors associated with the given source and the line inf o 258 * @return all of the errors associated with the given source and the line inf o
235 * @see #computeErrors(Source) 259 * @see #computeErrors(Source)
236 */ 260 */
237 AnalysisErrorInfo getErrors(Source source); 261 AnalysisErrorInfo getErrors(Source source);
262
238 /** 263 /**
239 * Return the element model corresponding to the HTML file defined by the give n source, or{@code null} if the source does not represent an HTML file, the elem ent representing the file 264 * Return the element model corresponding to the HTML file defined by the give n source, or{@code null} if the source does not represent an HTML file, the elem ent representing the file
240 * has not yet been created, or the analysis of the HTML file failed for some reason. 265 * has not yet been created, or the analysis of the HTML file failed for some reason.
241 * @param source the source defining the HTML file whose element model is to b e returned 266 * @param source the source defining the HTML file whose element model is to b e returned
242 * @return the element model corresponding to the HTML file defined by the giv en source 267 * @return the element model corresponding to the HTML file defined by the giv en source
243 * @see #computeHtmlElement(Source) 268 * @see #computeHtmlElement(Source)
244 */ 269 */
245 HtmlElement getHtmlElement(Source source); 270 HtmlElement getHtmlElement(Source source);
271
246 /** 272 /**
247 * Return the sources for the HTML files that reference the given compilation unit. If the source 273 * Return the sources for the HTML files that reference the given compilation unit. If the source
248 * does not represent a Dart source or is not known to this context, the retur ned array will be 274 * does not represent a Dart source or is not known to this context, the retur ned array will be
249 * empty. The contents of the array can be incomplete. 275 * empty. The contents of the array can be incomplete.
250 * @param source the source referenced by the returned HTML files 276 * @param source the source referenced by the returned HTML files
251 * @return the sources for the HTML files that reference the given compilation unit 277 * @return the sources for the HTML files that reference the given compilation unit
252 */ 278 */
253 List<Source> getHtmlFilesReferencing(Source source); 279 List<Source> getHtmlFilesReferencing(Source source);
280
254 /** 281 /**
255 * Return an array containing all of the sources known to this context that re present HTML files. 282 * Return an array containing all of the sources known to this context that re present HTML files.
256 * The contents of the array can be incomplete. 283 * The contents of the array can be incomplete.
257 * @return the sources known to this context that represent HTML files 284 * @return the sources known to this context that represent HTML files
258 */ 285 */
259 List<Source> get htmlSources; 286 List<Source> get htmlSources;
287
260 /** 288 /**
261 * Return the kind of the given source, or {@code null} if the kind is not kno wn to this context. 289 * Return the kind of the given source, or {@code null} if the kind is not kno wn to this context.
262 * @param source the source whose kind is to be returned 290 * @param source the source whose kind is to be returned
263 * @return the kind of the given source 291 * @return the kind of the given source
264 * @see #computeKindOf(Source) 292 * @see #computeKindOf(Source)
265 */ 293 */
266 SourceKind getKindOf(Source source); 294 SourceKind getKindOf(Source source);
295
267 /** 296 /**
268 * Return an array containing all of the sources known to this context that re present the defining 297 * Return an array containing all of the sources known to this context that re present the defining
269 * compilation unit of a library that can be run within a browser. The sources that are returned 298 * compilation unit of a library that can be run within a browser. The sources that are returned
270 * represent libraries that have a 'main' method and are either referenced by an HTML file or 299 * represent libraries that have a 'main' method and are either referenced by an HTML file or
271 * import, directly or indirectly, a client-only library. The contents of the array can be 300 * import, directly or indirectly, a client-only library. The contents of the array can be
272 * incomplete. 301 * incomplete.
273 * @return the sources known to this context that represent the defining compi lation unit of a 302 * @return the sources known to this context that represent the defining compi lation unit of a
274 * library that can be run within a browser 303 * library that can be run within a browser
275 */ 304 */
276 List<Source> get launchableClientLibrarySources; 305 List<Source> get launchableClientLibrarySources;
306
277 /** 307 /**
278 * Return an array containing all of the sources known to this context that re present the defining 308 * Return an array containing all of the sources known to this context that re present the defining
279 * compilation unit of a library that can be run outside of a browser. The con tents of the array 309 * compilation unit of a library that can be run outside of a browser. The con tents of the array
280 * can be incomplete. 310 * can be incomplete.
281 * @return the sources known to this context that represent the defining compi lation unit of a 311 * @return the sources known to this context that represent the defining compi lation unit of a
282 * library that can be run outside of a browser 312 * library that can be run outside of a browser
283 */ 313 */
284 List<Source> get launchableServerLibrarySources; 314 List<Source> get launchableServerLibrarySources;
315
285 /** 316 /**
286 * Return the sources for the defining compilation units of any libraries of w hich the given 317 * Return the sources for the defining compilation units of any libraries of w hich the given
287 * source is a part. The array will normally contain a single library because most Dart sources 318 * source is a part. The array will normally contain a single library because most Dart sources
288 * are only included in a single library, but it is possible to have a part th at is contained in 319 * are only included in a single library, but it is possible to have a part th at is contained in
289 * multiple identically named libraries. If the source represents the defining compilation unit of 320 * multiple identically named libraries. If the source represents the defining compilation unit of
290 * a library, then the returned array will contain the given source as its onl y element. If the 321 * a library, then the returned array will contain the given source as its onl y element. If the
291 * source does not represent a Dart source or is not known to this context, th e returned array 322 * source does not represent a Dart source or is not known to this context, th e returned array
292 * will be empty. The contents of the array can be incomplete. 323 * will be empty. The contents of the array can be incomplete.
293 * @param source the source contained in the returned libraries 324 * @param source the source contained in the returned libraries
294 * @return the sources for the libraries containing the given source 325 * @return the sources for the libraries containing the given source
295 */ 326 */
296 List<Source> getLibrariesContaining(Source source); 327 List<Source> getLibrariesContaining(Source source);
328
329 /**
330 * Return the sources for the defining compilation units of any libraries that depend on the given
331 * library. One library depends on another if it either imports or exports tha t library.
332 * @param librarySource the source for the defining compilation unit of the li brary being depended
333 * on
334 * @return the sources for the libraries that depend on the given library
335 */
336 List<Source> getLibrariesDependingOn(Source librarySource);
337
297 /** 338 /**
298 * Return the element model corresponding to the library defined by the given source, or{@code null} if the element model does not currently exist or if the l ibrary cannot be analyzed 339 * Return the element model corresponding to the library defined by the given source, or{@code null} if the element model does not currently exist or if the l ibrary cannot be analyzed
299 * for some reason. 340 * for some reason.
300 * @param source the source defining the library whose element model is to be returned 341 * @param source the source defining the library whose element model is to be returned
301 * @return the element model corresponding to the library defined by the given source 342 * @return the element model corresponding to the library defined by the given source
302 */ 343 */
303 LibraryElement getLibraryElement(Source source); 344 LibraryElement getLibraryElement(Source source);
345
304 /** 346 /**
305 * Return an array containing all of the sources known to this context that re present the defining 347 * Return an array containing all of the sources known to this context that re present the defining
306 * compilation unit of a library. The contents of the array can be incomplete. 348 * compilation unit of a library. The contents of the array can be incomplete.
307 * @return the sources known to this context that represent the defining compi lation unit of a 349 * @return the sources known to this context that represent the defining compi lation unit of a
308 * library 350 * library
309 */ 351 */
310 List<Source> get librarySources; 352 List<Source> get librarySources;
353
311 /** 354 /**
312 * Return the line information for the given source, or {@code null} if the li ne information is 355 * Return the line information for the given source, or {@code null} if the li ne information is
313 * not known. The line information is used to map offsets from the beginning o f the source to line 356 * not known. The line information is used to map offsets from the beginning o f the source to line
314 * and column pairs. 357 * and column pairs.
315 * @param source the source whose line information is to be returned 358 * @param source the source whose line information is to be returned
316 * @return the line information for the given source 359 * @return the line information for the given source
317 * @see #computeLineInfo(Source) 360 * @see #computeLineInfo(Source)
318 */ 361 */
319 LineInfo getLineInfo(Source source); 362 LineInfo getLineInfo(Source source);
363
320 /** 364 /**
321 * Return a fully resolved AST for a single compilation unit within the given library, or{@code null} if the resolved AST is not already computed. 365 * Return a fully resolved AST for a single compilation unit within the given library, or{@code null} if the resolved AST is not already computed.
322 * @param unitSource the source of the compilation unit 366 * @param unitSource the source of the compilation unit
323 * @param library the library containing the compilation unit 367 * @param library the library containing the compilation unit
324 * @return a fully resolved AST for the compilation unit 368 * @return a fully resolved AST for the compilation unit
325 * @see #resolveCompilationUnit(Source,LibraryElement) 369 * @see #resolveCompilationUnit(Source,LibraryElement)
326 */ 370 */
327 CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement l ibrary); 371 CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement l ibrary);
372
328 /** 373 /**
329 * Return a fully resolved AST for a single compilation unit within the given library, or{@code null} if the resolved AST is not already computed. 374 * Return a fully resolved AST for a single compilation unit within the given library, or{@code null} if the resolved AST is not already computed.
330 * @param unitSource the source of the compilation unit 375 * @param unitSource the source of the compilation unit
331 * @param librarySource the source of the defining compilation unit of the lib rary containing the 376 * @param librarySource the source of the defining compilation unit of the lib rary containing the
332 * compilation unit 377 * compilation unit
333 * @return a fully resolved AST for the compilation unit 378 * @return a fully resolved AST for the compilation unit
334 * @see #resolveCompilationUnit(Source,Source) 379 * @see #resolveCompilationUnit(Source,Source)
335 */ 380 */
336 CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source libraryS ource); 381 CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source libraryS ource);
382
337 /** 383 /**
338 * Return the source factory used to create the sources that can be analyzed i n this context. 384 * Return the source factory used to create the sources that can be analyzed i n this context.
339 * @return the source factory used to create the sources that can be analyzed in this context 385 * @return the source factory used to create the sources that can be analyzed in this context
340 */ 386 */
341 SourceFactory get sourceFactory; 387 SourceFactory get sourceFactory;
388
342 /** 389 /**
343 * Return {@code true} if the given source is known to be the defining compila tion unit of a 390 * Return {@code true} if the given source is known to be the defining compila tion unit of a
344 * library that can be run on a client (references 'dart:html', either directl y or indirectly). 391 * library that can be run on a client (references 'dart:html', either directl y or indirectly).
345 * <p> 392 * <p>
346 * <b>Note:</b> In addition to the expected case of returning {@code false} if the source is known 393 * <b>Note:</b> In addition to the expected case of returning {@code false} if the source is known
347 * to be a library that cannot be run on a client, this method will also retur n {@code false} if 394 * to be a library that cannot be run on a client, this method will also retur n {@code false} if
348 * the source is not known to be a library or if we do not know whether it can be run on a client. 395 * the source is not known to be a library or if we do not know whether it can be run on a client.
349 * @param librarySource the source being tested 396 * @param librarySource the source being tested
350 * @return {@code true} if the given source is known to be a library that can be run on a client 397 * @return {@code true} if the given source is known to be a library that can be run on a client
351 */ 398 */
352 bool isClientLibrary(Source librarySource); 399 bool isClientLibrary(Source librarySource);
400
353 /** 401 /**
354 * Return {@code true} if the given source is known to be the defining compila tion unit of a 402 * Return {@code true} if the given source is known to be the defining compila tion unit of a
355 * library that can be run on the server (does not reference 'dart:html', eith er directly or 403 * library that can be run on the server (does not reference 'dart:html', eith er directly or
356 * indirectly). 404 * indirectly).
357 * <p> 405 * <p>
358 * <b>Note:</b> In addition to the expected case of returning {@code false} if the source is known 406 * <b>Note:</b> In addition to the expected case of returning {@code false} if the source is known
359 * to be a library that cannot be run on the server, this method will also ret urn {@code false} if 407 * to be a library that cannot be run on the server, this method will also ret urn {@code false} if
360 * the source is not known to be a library or if we do not know whether it can be run on the 408 * the source is not known to be a library or if we do not know whether it can be run on the
361 * server. 409 * server.
362 * @param librarySource the source being tested 410 * @param librarySource the source being tested
363 * @return {@code true} if the given source is known to be a library that can be run on the server 411 * @return {@code true} if the given source is known to be a library that can be run on the server
364 */ 412 */
365 bool isServerLibrary(Source librarySource); 413 bool isServerLibrary(Source librarySource);
414
366 /** 415 /**
367 * Add the sources contained in the specified context to this context's collec tion of sources. 416 * Add the sources contained in the specified context to this context's collec tion of sources.
368 * This method is called when an existing context's pubspec has been removed, and the contained 417 * This method is called when an existing context's pubspec has been removed, and the contained
369 * sources should be reanalyzed as part of this context. 418 * sources should be reanalyzed as part of this context.
370 * @param context the context being merged 419 * @param context the context being merged
371 */ 420 */
372 void mergeContext(AnalysisContext context); 421 void mergeContext(AnalysisContext context);
422
373 /** 423 /**
374 * Parse a single source to produce an AST structure. The resulting AST struct ure may or may not 424 * Parse a single source to produce an AST structure. The resulting AST struct ure may or may not
375 * be resolved, and may have a slightly different structure depending upon whe ther it is resolved. 425 * be resolved, and may have a slightly different structure depending upon whe ther it is resolved.
376 * @param source the source to be parsed 426 * @param source the source to be parsed
377 * @return the AST structure representing the content of the source 427 * @return the AST structure representing the content of the source
378 * @throws AnalysisException if the analysis could not be performed 428 * @throws AnalysisException if the analysis could not be performed
379 */ 429 */
380 CompilationUnit parseCompilationUnit(Source source); 430 CompilationUnit parseCompilationUnit(Source source);
431
381 /** 432 /**
382 * Parse a single HTML source to produce an AST structure. The resulting HTML AST structure may or 433 * Parse a single HTML source to produce an AST structure. The resulting HTML AST structure may or
383 * may not be resolved, and may have a slightly different structure depending upon whether it is 434 * may not be resolved, and may have a slightly different structure depending upon whether it is
384 * resolved. 435 * resolved.
385 * @param source the HTML source to be parsed 436 * @param source the HTML source to be parsed
386 * @return the parse result (not {@code null}) 437 * @return the parse result (not {@code null})
387 * @throws AnalysisException if the analysis could not be performed 438 * @throws AnalysisException if the analysis could not be performed
388 */ 439 */
389 HtmlUnit parseHtmlUnit(Source source); 440 HtmlUnit parseHtmlUnit(Source source);
441
390 /** 442 /**
391 * Perform the next unit of work required to keep the analysis results up-to-d ate and return 443 * Perform the next unit of work required to keep the analysis results up-to-d ate and return
392 * information about the consequent changes to the analysis results. If there were no results the 444 * information about the consequent changes to the analysis results. If there were no results the
393 * returned array will be empty. If there are no more units of work required, then this method 445 * returned array will be empty. If there are no more units of work required, then this method
394 * returns {@code null}. This method can be long running. 446 * returns {@code null}. This method can be long running.
395 * @return an array containing notices of changes to the analysis results 447 * @return an array containing notices of changes to the analysis results
396 */ 448 */
397 List<ChangeNotice> performAnalysisTask(); 449 List<ChangeNotice> performAnalysisTask();
450
398 /** 451 /**
399 * Parse and resolve a single source within the given context to produce a ful ly resolved AST. 452 * Parse and resolve a single source within the given context to produce a ful ly resolved AST.
400 * @param unitSource the source to be parsed and resolved 453 * @param unitSource the source to be parsed and resolved
401 * @param library the library containing the source to be resolved 454 * @param library the library containing the source to be resolved
402 * @return the result of resolving the AST structure representing the content of the source in the 455 * @return the result of resolving the AST structure representing the content of the source in the
403 * context of the given library 456 * context of the given library
404 * @throws AnalysisException if the analysis could not be performed 457 * @throws AnalysisException if the analysis could not be performed
405 * @see #getResolvedCompilationUnit(Source,LibraryElement) 458 * @see #getResolvedCompilationUnit(Source,LibraryElement)
406 */ 459 */
407 CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement libra ry); 460 CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement libra ry);
461
408 /** 462 /**
409 * Parse and resolve a single source within the given context to produce a ful ly resolved AST. 463 * Parse and resolve a single source within the given context to produce a ful ly resolved AST.
410 * @param unitSource the source to be parsed and resolved 464 * @param unitSource the source to be parsed and resolved
411 * @param librarySource the source of the defining compilation unit of the lib rary containing the 465 * @param librarySource the source of the defining compilation unit of the lib rary containing the
412 * source to be resolved 466 * source to be resolved
413 * @return the result of resolving the AST structure representing the content of the source in the 467 * @return the result of resolving the AST structure representing the content of the source in the
414 * context of the given library 468 * context of the given library
415 * @throws AnalysisException if the analysis could not be performed 469 * @throws AnalysisException if the analysis could not be performed
416 * @see #getResolvedCompilationUnit(Source,Source) 470 * @see #getResolvedCompilationUnit(Source,Source)
417 */ 471 */
418 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e); 472 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e);
473
419 /** 474 /**
420 * Parse and resolve a single source within the given context to produce a ful ly resolved AST. 475 * Parse and resolve a single source within the given context to produce a ful ly resolved AST.
421 * @param htmlSource the source to be parsed and resolved 476 * @param htmlSource the source to be parsed and resolved
422 * @return the result of resolving the AST structure representing the content of the source 477 * @return the result of resolving the AST structure representing the content of the source
423 * @throws AnalysisException if the analysis could not be performed 478 * @throws AnalysisException if the analysis could not be performed
424 */ 479 */
425 HtmlUnit resolveHtmlUnit(Source htmlSource); 480 HtmlUnit resolveHtmlUnit(Source htmlSource);
481
482 /**
483 * Set the set of analysis options controlling the behavior of this context to the given options.
484 * Clients can safely assume that all necessary analysis results have been inv alidated.
485 * @param options the set of analysis options that will control the behavior o f this context
486 */
487 void set analysisOptions(AnalysisOptions options);
488
426 /** 489 /**
427 * Set the contents of the given source to the given contents and mark the sou rce as having 490 * Set the contents of the given source to the given contents and mark the sou rce as having
428 * changed. This has the effect of overriding the default contents of the sour ce. If the contents 491 * changed. This has the effect of overriding the default contents of the sour ce. If the contents
429 * are {@code null} the override is removed so that the default contents will be returned. 492 * are {@code null} the override is removed so that the default contents will be returned.
430 * @param source the source whose contents are being overridden 493 * @param source the source whose contents are being overridden
431 * @param contents the new contents of the source 494 * @param contents the new contents of the source
432 */ 495 */
433 void setContents(Source source, String contents); 496 void setContents(Source source, String contents);
497
434 /** 498 /**
435 * Set the source factory used to create the sources that can be analyzed in t his context to the 499 * Set the source factory used to create the sources that can be analyzed in t his context to the
436 * given source factory. Clients can safely assume that all analysis results h ave been 500 * given source factory. Clients can safely assume that all analysis results h ave been
437 * invalidated. 501 * invalidated.
438 * @param factory the source factory used to create the sources that can be an alyzed in this 502 * @param factory the source factory used to create the sources that can be an alyzed in this
439 * context 503 * context
440 */ 504 */
441 void set sourceFactory(SourceFactory factory); 505 void set sourceFactory(SourceFactory factory);
506
442 /** 507 /**
443 * Given a collection of sources with content that has changed, return an {@li nk Iterable}identifying the sources that need to be resolved. 508 * Given a collection of sources with content that has changed, return an {@li nk Iterable}identifying the sources that need to be resolved.
444 * @param changedSources an array of sources (not {@code null}, contains no {@ code null}s) 509 * @param changedSources an array of sources (not {@code null}, contains no {@ code null}s)
445 * @return An iterable returning the sources to be resolved 510 * @return An iterable returning the sources to be resolved
446 */ 511 */
447 Iterable<Source> sourcesToResolve(List<Source> changedSources); 512 Iterable<Source> sourcesToResolve(List<Source> changedSources);
448 } 513 }
514
449 /** 515 /**
450 * The interface {@code AnalysisErrorInfo} contains the analysis errors and line information for the 516 * The interface {@code AnalysisErrorInfo} contains the analysis errors and line information for the
451 * errors. 517 * errors.
452 */ 518 */
453 abstract class AnalysisErrorInfo { 519 abstract class AnalysisErrorInfo {
520
454 /** 521 /**
455 * Return the errors that as a result of the analysis, or {@code null} if ther e were no errors. 522 * Return the errors that as a result of the analysis, or {@code null} if ther e were no errors.
456 * @return the errors as a result of the analysis 523 * @return the errors as a result of the analysis
457 */ 524 */
458 List<AnalysisError> get errors; 525 List<AnalysisError> get errors;
526
459 /** 527 /**
460 * Return the line information associated with the errors, or {@code null} if there were no 528 * Return the line information associated with the errors, or {@code null} if there were no
461 * errors. 529 * errors.
462 * @return the line information associated with the errors 530 * @return the line information associated with the errors
463 */ 531 */
464 LineInfo get lineInfo; 532 LineInfo get lineInfo;
465 } 533 }
534
466 /** 535 /**
467 * Instances of the class {@code AnalysisException} represent an exception that occurred during the 536 * Instances of the class {@code AnalysisException} represent an exception that occurred during the
468 * analysis of one or more sources. 537 * analysis of one or more sources.
469 * @coverage dart.engine 538 * @coverage dart.engine
470 */ 539 */
471 class AnalysisException extends JavaException { 540 class AnalysisException extends JavaException {
541
472 /** 542 /**
473 * Initialize a newly created exception. 543 * Initialize a newly created exception.
474 */ 544 */
475 AnalysisException() : super() { 545 AnalysisException() : super() {
476 _jtd_constructor_125_impl(); 546 _jtd_constructor_125_impl();
477 } 547 }
478 _jtd_constructor_125_impl() { 548 _jtd_constructor_125_impl() {
479 } 549 }
550
480 /** 551 /**
481 * Initialize a newly created exception to have the given message. 552 * Initialize a newly created exception to have the given message.
482 * @param message the message associated with the exception 553 * @param message the message associated with the exception
483 */ 554 */
484 AnalysisException.con1(String message) : super(message) { 555 AnalysisException.con1(String message) : super(message) {
485 _jtd_constructor_126_impl(message); 556 _jtd_constructor_126_impl(message);
486 } 557 }
487 _jtd_constructor_126_impl(String message) { 558 _jtd_constructor_126_impl(String message) {
488 } 559 }
560
489 /** 561 /**
490 * Initialize a newly created exception to have the given message and cause. 562 * Initialize a newly created exception to have the given message and cause.
491 * @param message the message associated with the exception 563 * @param message the message associated with the exception
492 * @param cause the underlying exception that caused this exception 564 * @param cause the underlying exception that caused this exception
493 */ 565 */
494 AnalysisException.con2(String message, Exception cause) : super(message, cause ) { 566 AnalysisException.con2(String message, Exception cause) : super(message, cause ) {
495 _jtd_constructor_127_impl(message, cause); 567 _jtd_constructor_127_impl(message, cause);
496 } 568 }
497 _jtd_constructor_127_impl(String message, Exception cause) { 569 _jtd_constructor_127_impl(String message, Exception cause) {
498 } 570 }
571
499 /** 572 /**
500 * Initialize a newly created exception to have the given cause. 573 * Initialize a newly created exception to have the given cause.
501 * @param cause the underlying exception that caused this exception 574 * @param cause the underlying exception that caused this exception
502 */ 575 */
503 AnalysisException.con3(Exception cause) : super.withCause(cause) { 576 AnalysisException.con3(Exception cause) : super.withCause(cause) {
504 _jtd_constructor_128_impl(cause); 577 _jtd_constructor_128_impl(cause);
505 } 578 }
506 _jtd_constructor_128_impl(Exception cause) { 579 _jtd_constructor_128_impl(Exception cause) {
507 } 580 }
508 } 581 }
582
583 /**
584 * The interface {@code AnalysisOptions} defines the behavior of objects that pr ovide access to a
585 * set of analysis options used to control the behavior of an analysis context.
586 */
587 abstract class AnalysisOptions {
588
589 /**
590 * Return {@code true} if analysis is to use strict mode. In strict mode, erro r reporting is based
591 * exclusively on the static type information.
592 * @return {@code true} if analysis is to use strict mode
593 */
594 bool get strictMode;
595 }
596
509 /** 597 /**
510 * The interface {@code ChangeNotice} defines the behavior of objects that repre sent a change to the 598 * The interface {@code ChangeNotice} defines the behavior of objects that repre sent a change to the
511 * analysis results associated with a given source. 599 * analysis results associated with a given source.
512 * @coverage dart.engine 600 * @coverage dart.engine
513 */ 601 */
514 abstract class ChangeNotice implements AnalysisErrorInfo { 602 abstract class ChangeNotice implements AnalysisErrorInfo {
603
515 /** 604 /**
516 * Return the fully resolved AST that changed as a result of the analysis, or {@code null} if the 605 * Return the fully resolved AST that changed as a result of the analysis, or {@code null} if the
517 * AST was not changed. 606 * AST was not changed.
518 * @return the fully resolved AST that changed as a result of the analysis 607 * @return the fully resolved AST that changed as a result of the analysis
519 */ 608 */
520 CompilationUnit get compilationUnit; 609 CompilationUnit get compilationUnit;
610
521 /** 611 /**
522 * Return the source for which the result is being reported. 612 * Return the source for which the result is being reported.
523 * @return the source for which the result is being reported 613 * @return the source for which the result is being reported
524 */ 614 */
525 Source get source; 615 Source get source;
526 } 616 }
617
527 /** 618 /**
528 * Instances of the class {@code ChangeSet} indicate what sources have been adde d, changed, or 619 * Instances of the class {@code ChangeSet} indicate what sources have been adde d, changed, or
529 * removed. 620 * removed.
530 * @coverage dart.engine 621 * @coverage dart.engine
531 */ 622 */
532 class ChangeSet { 623 class ChangeSet {
624
533 /** 625 /**
534 * A list containing the sources that have been added. 626 * A list containing the sources that have been added.
535 */ 627 */
536 List<Source> _added2 = new List<Source>(); 628 List<Source> _added2 = new List<Source>();
629
537 /** 630 /**
538 * A list containing the sources that have been changed. 631 * A list containing the sources that have been changed.
539 */ 632 */
540 List<Source> _changed2 = new List<Source>(); 633 List<Source> _changed2 = new List<Source>();
634
541 /** 635 /**
542 * A list containing the sources that have been removed. 636 * A list containing the sources that have been removed.
543 */ 637 */
544 List<Source> _removed2 = new List<Source>(); 638 List<Source> _removed2 = new List<Source>();
639
545 /** 640 /**
546 * A list containing the source containers specifying additional sources that have been removed. 641 * A list containing the source containers specifying additional sources that have been removed.
547 */ 642 */
548 List<SourceContainer> _removedContainers = new List<SourceContainer>(); 643 List<SourceContainer> _removedContainers = new List<SourceContainer>();
549 /** 644
550 * Initialize a newly created change set to be empty.
551 */
552 ChangeSet() : super() {
553 }
554 /** 645 /**
555 * Record that the specified source has been added and that it's content is th e default contents 646 * Record that the specified source has been added and that it's content is th e default contents
556 * of the source. 647 * of the source.
557 * @param source the source that was added 648 * @param source the source that was added
558 */ 649 */
559 void added(Source source) { 650 void added(Source source) {
560 _added2.add(source); 651 _added2.add(source);
561 } 652 }
653
562 /** 654 /**
563 * Record that the specified source has been changed and that it's content is the default contents 655 * Record that the specified source has been changed and that it's content is the default contents
564 * of the source. 656 * of the source.
565 * @param source the source that was changed 657 * @param source the source that was changed
566 */ 658 */
567 void changed(Source source) { 659 void changed(Source source) {
568 _changed2.add(source); 660 _changed2.add(source);
569 } 661 }
662
570 /** 663 /**
571 * Return a collection of the sources that have been added. 664 * Return a collection of the sources that have been added.
572 * @return a collection of the sources that have been added 665 * @return a collection of the sources that have been added
573 */ 666 */
574 List<Source> get added3 => _added2; 667 List<Source> get added3 => _added2;
668
575 /** 669 /**
576 * Return a collection of sources that have been changed. 670 * Return a collection of sources that have been changed.
577 * @return a collection of sources that have been changed 671 * @return a collection of sources that have been changed
578 */ 672 */
579 List<Source> get changed3 => _changed2; 673 List<Source> get changed3 => _changed2;
674
580 /** 675 /**
581 * Return a list containing the sources that were removed. 676 * Return a list containing the sources that were removed.
582 * @return a list containing the sources that were removed 677 * @return a list containing the sources that were removed
583 */ 678 */
584 List<Source> get removed => _removed2; 679 List<Source> get removed => _removed2;
680
585 /** 681 /**
586 * Return a list containing the source containers that were removed. 682 * Return a list containing the source containers that were removed.
587 * @return a list containing the source containers that were removed 683 * @return a list containing the source containers that were removed
588 */ 684 */
589 List<SourceContainer> get removedContainers => _removedContainers; 685 List<SourceContainer> get removedContainers => _removedContainers;
686
590 /** 687 /**
591 * Return {@code true} if this change set does not contain any changes. 688 * Return {@code true} if this change set does not contain any changes.
592 * @return {@code true} if this change set does not contain any changes 689 * @return {@code true} if this change set does not contain any changes
593 */ 690 */
594 bool isEmpty() => _added2.isEmpty && _changed2.isEmpty && _removed2.isEmpty && _removedContainers.isEmpty; 691 bool isEmpty() => _added2.isEmpty && _changed2.isEmpty && _removed2.isEmpty && _removedContainers.isEmpty;
692
595 /** 693 /**
596 * Record that the specified source has been removed. 694 * Record that the specified source has been removed.
597 * @param source the source that was removed 695 * @param source the source that was removed
598 */ 696 */
599 void removed3(Source source) { 697 void removed3(Source source) {
600 if (source != null) { 698 if (source != null) {
601 _removed2.add(source); 699 _removed2.add(source);
602 } 700 }
603 } 701 }
702
604 /** 703 /**
605 * Record that the specified source container has been removed. 704 * Record that the specified source container has been removed.
606 * @param container the source container that was removed 705 * @param container the source container that was removed
607 */ 706 */
608 void removedContainer(SourceContainer container) { 707 void removedContainer(SourceContainer container) {
609 if (container != null) { 708 if (container != null) {
610 _removedContainers.add(container); 709 _removedContainers.add(container);
611 } 710 }
612 } 711 }
613 } 712 }
713
614 /** 714 /**
615 * The interface {@code DartEntry} defines the behavior of objects that maintain the information 715 * The interface {@code DartEntry} defines the behavior of objects that maintain the information
616 * cached by an analysis context about an individual Dart file. 716 * cached by an analysis context about an individual Dart file.
617 * @coverage dart.engine 717 * @coverage dart.engine
618 */ 718 */
619 abstract class DartEntry implements SourceEntry { 719 abstract class DartEntry implements SourceEntry {
720
620 /** 721 /**
621 * The data descriptor representing the library element for the library. This data is only 722 * The data descriptor representing the library element for the library. This data is only
622 * available for Dart files that are the defining compilation unit of a librar y. 723 * available for Dart files that are the defining compilation unit of a librar y.
623 */ 724 */
624 static DataDescriptor<LibraryElement> ELEMENT = new DataDescriptor<LibraryElem ent>("DartEntry.ELEMENT"); 725 static DataDescriptor<LibraryElement> ELEMENT = new DataDescriptor<LibraryElem ent>("DartEntry.ELEMENT");
726
727 /**
728 * The data descriptor representing the list of referenced libraries. This dat a is only available
729 * for Dart files that are the defining compilation unit of a library.
730 */
731 static DataDescriptor<List<Source>> REFERENCED_LIBRARIES = new DataDescriptor< List<Source>>("DartEntry.REFERENCED_LIBRARIES");
732
625 /** 733 /**
626 * The data descriptor representing the list of included parts. This data is o nly available for 734 * The data descriptor representing the list of included parts. This data is o nly available for
627 * Dart files that are the defining compilation unit of a library. 735 * Dart files that are the defining compilation unit of a library.
628 */ 736 */
629 static DataDescriptor<List<Source>> INCLUDED_PARTS = new DataDescriptor<List<S ource>>("DartEntry.INCLUDED_PARTS"); 737 static DataDescriptor<List<Source>> INCLUDED_PARTS = new DataDescriptor<List<S ource>>("DartEntry.INCLUDED_PARTS");
738
630 /** 739 /**
631 * The data descriptor representing the client flag. This data is only availab le for Dart files 740 * The data descriptor representing the client flag. This data is only availab le for Dart files
632 * that are the defining compilation unit of a library. 741 * that are the defining compilation unit of a library.
633 */ 742 */
634 static DataDescriptor<bool> IS_CLIENT = new DataDescriptor<bool>("DartEntry.IS _CLIENT"); 743 static DataDescriptor<bool> IS_CLIENT = new DataDescriptor<bool>("DartEntry.IS _CLIENT");
744
635 /** 745 /**
636 * The data descriptor representing the launchable flag. This data is only ava ilable for Dart 746 * The data descriptor representing the launchable flag. This data is only ava ilable for Dart
637 * files that are the defining compilation unit of a library. 747 * files that are the defining compilation unit of a library.
638 */ 748 */
639 static DataDescriptor<bool> IS_LAUNCHABLE = new DataDescriptor<bool>("DartEntr y.IS_LAUNCHABLE"); 749 static DataDescriptor<bool> IS_LAUNCHABLE = new DataDescriptor<bool>("DartEntr y.IS_LAUNCHABLE");
750
640 /** 751 /**
641 * The data descriptor representing the errors resulting from parsing the sour ce. 752 * The data descriptor representing the errors resulting from parsing the sour ce.
642 */ 753 */
643 static DataDescriptor<List<AnalysisError>> PARSE_ERRORS = new DataDescriptor<L ist<AnalysisError>>("DartEntry.PARSE_ERRORS"); 754 static DataDescriptor<List<AnalysisError>> PARSE_ERRORS = new DataDescriptor<L ist<AnalysisError>>("DartEntry.PARSE_ERRORS");
755
644 /** 756 /**
645 * The data descriptor representing the parsed AST structure. 757 * The data descriptor representing the parsed AST structure.
646 */ 758 */
647 static DataDescriptor<CompilationUnit> PARSED_UNIT = new DataDescriptor<Compil ationUnit>("DartEntry.PARSED_UNIT"); 759 static DataDescriptor<CompilationUnit> PARSED_UNIT = new DataDescriptor<Compil ationUnit>("DartEntry.PARSED_UNIT");
760
648 /** 761 /**
649 * The data descriptor representing the public namespace of the library. This data is only 762 * The data descriptor representing the public namespace of the library. This data is only
650 * available for Dart files that are the defining compilation unit of a librar y. 763 * available for Dart files that are the defining compilation unit of a librar y.
651 */ 764 */
652 static DataDescriptor<Namespace> PUBLIC_NAMESPACE = new DataDescriptor<Namespa ce>("DartEntry.PUBLIC_NAMESPACE"); 765 static DataDescriptor<Namespace> PUBLIC_NAMESPACE = new DataDescriptor<Namespa ce>("DartEntry.PUBLIC_NAMESPACE");
766
653 /** 767 /**
654 * The data descriptor representing the errors resulting from resolving the so urce. 768 * The data descriptor representing the errors resulting from resolving the so urce.
655 */ 769 */
656 static DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescrip tor<List<AnalysisError>>("DartEntry.RESOLUTION_ERRORS"); 770 static DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescrip tor<List<AnalysisError>>("DartEntry.RESOLUTION_ERRORS");
771
657 /** 772 /**
658 * The data descriptor representing the resolved AST structure. 773 * The data descriptor representing the resolved AST structure.
659 */ 774 */
660 static DataDescriptor<CompilationUnit> RESOLVED_UNIT = new DataDescriptor<Comp ilationUnit>("DartEntry.RESOLVED_UNIT"); 775 static DataDescriptor<CompilationUnit> RESOLVED_UNIT = new DataDescriptor<Comp ilationUnit>("DartEntry.RESOLVED_UNIT");
776
661 /** 777 /**
662 * The data descriptor representing the source kind. 778 * The data descriptor representing the source kind.
663 */ 779 */
664 static DataDescriptor<SourceKind> SOURCE_KIND = new DataDescriptor<SourceKind> ("DartEntry.SOURCE_KIND"); 780 static DataDescriptor<SourceKind> SOURCE_KIND = new DataDescriptor<SourceKind> ("DartEntry.SOURCE_KIND");
781
665 /** 782 /**
666 * Return all of the errors associated with the compilation unit that are curr ently cached. 783 * Return all of the errors associated with the compilation unit that are curr ently cached.
667 * @return all of the errors associated with the compilation unit 784 * @return all of the errors associated with the compilation unit
668 */ 785 */
669 List<AnalysisError> get allErrors; 786 List<AnalysisError> get allErrors;
787
670 /** 788 /**
671 * Return a valid parsed compilation unit, either an unresolved AST structure or the result of 789 * Return a valid parsed compilation unit, either an unresolved AST structure or the result of
672 * resolving the AST structure in the context of some library, or {@code null} if there is no 790 * resolving the AST structure in the context of some library, or {@code null} if there is no
673 * parsed compilation unit available. 791 * parsed compilation unit available.
674 * @return a valid parsed compilation unit 792 * @return a valid parsed compilation unit
675 */ 793 */
676 CompilationUnit get anyParsedCompilationUnit; 794 CompilationUnit get anyParsedCompilationUnit;
795
677 /** 796 /**
678 * Return the result of resolving the compilation unit as part of any library, or {@code null} if 797 * Return the result of resolving the compilation unit as part of any library, or {@code null} if
679 * there is no cached resolved compilation unit. 798 * there is no cached resolved compilation unit.
680 * @return any resolved compilation unit 799 * @return any resolved compilation unit
681 */ 800 */
682 CompilationUnit get anyResolvedCompilationUnit; 801 CompilationUnit get anyResolvedCompilationUnit;
802
683 /** 803 /**
684 * Return the state of the data represented by the given descriptor in the con text of the given 804 * Return the state of the data represented by the given descriptor in the con text of the given
685 * library. 805 * library.
686 * @param descriptor the descriptor representing the data whose state is to be returned 806 * @param descriptor the descriptor representing the data whose state is to be returned
687 * @param librarySource the source of the defining compilation unit of the lib rary that is the 807 * @param librarySource the source of the defining compilation unit of the lib rary that is the
688 * context for the data 808 * context for the data
689 * @return the value of the data represented by the given descriptor and libra ry 809 * @return the value of the data represented by the given descriptor and libra ry
690 */ 810 */
691 CacheState getState2(DataDescriptor<Object> descriptor, Source librarySource); 811 CacheState getState2(DataDescriptor<Object> descriptor, Source librarySource);
812
692 /** 813 /**
693 * Return the value of the data represented by the given descriptor in the con text of the given 814 * Return the value of the data represented by the given descriptor in the con text of the given
694 * library, or {@code null} if the data represented by the descriptor is not i n the cache. 815 * library, or {@code null} if the data represented by the descriptor is not i n the cache.
695 * @param descriptor the descriptor representing which data is to be returned 816 * @param descriptor the descriptor representing which data is to be returned
696 * @param librarySource the source of the defining compilation unit of the lib rary that is the 817 * @param librarySource the source of the defining compilation unit of the lib rary that is the
697 * context for the data 818 * context for the data
698 * @return the value of the data represented by the given descriptor and libra ry 819 * @return the value of the data represented by the given descriptor and libra ry
699 */ 820 */
700 Object getValue2(DataDescriptor descriptor, Source librarySource); 821 Object getValue2(DataDescriptor descriptor, Source librarySource);
701 DartEntryImpl get writableCopy; 822 DartEntryImpl get writableCopy;
702 } 823 }
824
703 /** 825 /**
704 * Instances of the class {@code DartEntryImpl} implement a {@link DartEntry}. 826 * Instances of the class {@code DartEntryImpl} implement a {@link DartEntry}.
705 * @coverage dart.engine 827 * @coverage dart.engine
706 */ 828 */
707 class DartEntryImpl extends SourceEntryImpl implements DartEntry { 829 class DartEntryImpl extends SourceEntryImpl implements DartEntry {
830
708 /** 831 /**
709 * The state of the cached source kind. 832 * The state of the cached source kind.
710 */ 833 */
711 CacheState _sourceKindState = CacheState.INVALID; 834 CacheState _sourceKindState = CacheState.INVALID;
835
712 /** 836 /**
713 * The kind of this source. 837 * The kind of this source.
714 */ 838 */
715 SourceKind _sourceKind = SourceKind.UNKNOWN; 839 SourceKind _sourceKind = SourceKind.UNKNOWN;
840
716 /** 841 /**
717 * The state of the cached parsed compilation unit. 842 * The state of the cached parsed compilation unit.
718 */ 843 */
719 CacheState _parsedUnitState = CacheState.INVALID; 844 CacheState _parsedUnitState = CacheState.INVALID;
845
720 /** 846 /**
721 * The parsed compilation unit, or {@code null} if the parsed compilation unit is not currently 847 * The parsed compilation unit, or {@code null} if the parsed compilation unit is not currently
722 * cached. 848 * cached.
723 */ 849 */
724 CompilationUnit _parsedUnit; 850 CompilationUnit _parsedUnit;
851
725 /** 852 /**
726 * The state of the cached parse errors. 853 * The state of the cached parse errors.
727 */ 854 */
728 CacheState _parseErrorsState = CacheState.INVALID; 855 CacheState _parseErrorsState = CacheState.INVALID;
856
729 /** 857 /**
730 * The errors produced while scanning and parsing the compilation unit, or {@c ode null} if the 858 * The errors produced while scanning and parsing the compilation unit, or {@c ode null} if the
731 * errors are not currently cached. 859 * errors are not currently cached.
732 */ 860 */
733 List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS; 861 List<AnalysisError> _parseErrors = AnalysisError.NO_ERRORS;
862
734 /** 863 /**
735 * The state of the cached list of included parts. 864 * The state of the cached list of included parts.
736 */ 865 */
737 CacheState _includedPartsState = CacheState.INVALID; 866 CacheState _includedPartsState = CacheState.INVALID;
867
738 /** 868 /**
739 * The list of parts included in the library, or {@code null} if the list is n ot currently cached. 869 * The list of parts included in the library, or an empty array if the list is not currently
740 * The list will be empty if the Dart file is a part rather than a library. 870 * cached. The list will be empty if the Dart file is a part rather than a lib rary.
741 */ 871 */
742 List<Source> _includedParts = Source.EMPTY_ARRAY; 872 List<Source> _includedParts = Source.EMPTY_ARRAY;
873
743 /** 874 /**
744 * The source for the defining compilation unit of the library that contains t his unit, or{@code null} if this unit is contained in multiple libraries. (If th is unit is the defining 875 * The state of the cached list of referenced libraries.
745 * compilation unit for it's library, then this will be the source for this un it.)
746 */ 876 */
747 Source _librarySource; 877 CacheState _referencedLibrariesState = CacheState.INVALID;
878
879 /**
880 * The list of libraries referenced (imported or exported) by the library, or an empty array if
881 * the list is not currently cached. The list will be empty if the Dart file i s a part rather than
882 * a library.
883 */
884 List<Source> _referencedLibraries = Source.EMPTY_ARRAY;
885
748 /** 886 /**
749 * The information known as a result of resolving this compilation unit as par t of the library 887 * The information known as a result of resolving this compilation unit as par t of the library
750 * that contains this unit, or {@code null} if this unit is contained in multi ple libraries. 888 * that contains this unit. This field will never be {@code null}.
751 */ 889 */
752 DartEntryImpl_ResolutionState _resolutionState = new DartEntryImpl_ResolutionS tate(); 890 DartEntryImpl_ResolutionState _resolutionState = new DartEntryImpl_ResolutionS tate();
753 /** 891
754 * A table mapping the sources of the libraries containing this compilation un it to the
755 * information known as a result of resolving this compilation unit as part of the library, or{@code null} if this unit is contained in a single library.
756 */
757 Map<Source, DartEntryImpl_ResolutionState> _resolutionMap;
758 /** 892 /**
759 * The state of the cached library element. 893 * The state of the cached library element.
760 */ 894 */
761 CacheState _elementState = CacheState.INVALID; 895 CacheState _elementState = CacheState.INVALID;
896
762 /** 897 /**
763 * The element representing the library, or {@code null} if the element is not currently cached. 898 * The element representing the library, or {@code null} if the element is not currently cached.
764 */ 899 */
765 LibraryElement _element; 900 LibraryElement _element;
901
766 /** 902 /**
767 * The state of the cached public namespace. 903 * The state of the cached public namespace.
768 */ 904 */
769 CacheState _publicNamespaceState = CacheState.INVALID; 905 CacheState _publicNamespaceState = CacheState.INVALID;
906
770 /** 907 /**
771 * The public namespace of the library, or {@code null} if the namespace is no t currently cached. 908 * The public namespace of the library, or {@code null} if the namespace is no t currently cached.
772 */ 909 */
773 Namespace _publicNamespace; 910 Namespace _publicNamespace;
911
774 /** 912 /**
775 * The state of the cached client/ server flag. 913 * The state of the cached client/ server flag.
776 */ 914 */
777 CacheState _clientServerState = CacheState.INVALID; 915 CacheState _clientServerState = CacheState.INVALID;
916
778 /** 917 /**
779 * The state of the cached launchable flag. 918 * The state of the cached launchable flag.
780 */ 919 */
781 CacheState _launchableState = CacheState.INVALID; 920 CacheState _launchableState = CacheState.INVALID;
921
782 /** 922 /**
783 * An integer holding bit masks such as {@link #LAUNCHABLE} and {@link #CLIENT _CODE}. 923 * An integer holding bit masks such as {@link #LAUNCHABLE} and {@link #CLIENT _CODE}.
784 */ 924 */
785 int _bitmask = 0; 925 int _bitmask = 0;
926
786 /** 927 /**
787 * Mask indicating that this library is launchable: that the file has a main m ethod. 928 * Mask indicating that this library is launchable: that the file has a main m ethod.
788 */ 929 */
789 static int _LAUNCHABLE = 1 << 1; 930 static int _LAUNCHABLE = 1 << 1;
931
790 /** 932 /**
791 * Mask indicating that the library is client code: that the library depends o n the html library. 933 * Mask indicating that the library is client code: that the library depends o n the html library.
792 * If the library is not "client code", then it is referenced as "server code" . 934 * If the library is not "client code", then it is referenced as "server code" .
793 */ 935 */
794 static int _CLIENT_CODE = 1 << 2; 936 static int _CLIENT_CODE = 1 << 2;
795 /**
796 * Initialize a newly created cache entry to be empty.
797 */
798 DartEntryImpl() : super() {
799 }
800 /**
801 * Record the fact that we are about to parse the compilation unit by marking the results of
802 * parsing as being in progress.
803 */
804 void aboutToParse() {
805 setState(SourceEntry.LINE_INFO, CacheState.IN_PROCESS);
806 _parsedUnitState = CacheState.IN_PROCESS;
807 _parseErrorsState = CacheState.IN_PROCESS;
808 }
809 List<AnalysisError> get allErrors { 937 List<AnalysisError> get allErrors {
810 List<AnalysisError> errors = new List<AnalysisError>(); 938 List<AnalysisError> errors = new List<AnalysisError>();
811 for (AnalysisError error in _parseErrors) { 939 for (AnalysisError error in _parseErrors) {
812 errors.add(error); 940 errors.add(error);
813 } 941 }
814 if (_resolutionMap == null) { 942 DartEntryImpl_ResolutionState state = _resolutionState;
815 for (AnalysisError error in _resolutionState._resolutionErrors) { 943 while (state != null) {
944 for (AnalysisError error in state._resolutionErrors) {
816 errors.add(error); 945 errors.add(error);
817 } 946 }
818 } else { 947 state = state._nextState;
819 for (DartEntryImpl_ResolutionState state in _resolutionMap.values) {
820 for (AnalysisError error in state._resolutionErrors) {
821 errors.add(error);
822 }
823 }
824 } 948 }
949 ;
825 if (errors.length == 0) { 950 if (errors.length == 0) {
826 return AnalysisError.NO_ERRORS; 951 return AnalysisError.NO_ERRORS;
827 } 952 }
828 return new List.from(errors); 953 return new List.from(errors);
829 } 954 }
830 CompilationUnit get anyParsedCompilationUnit { 955 CompilationUnit get anyParsedCompilationUnit {
831 if (identical(_parsedUnitState, CacheState.VALID)) { 956 if (identical(_parsedUnitState, CacheState.VALID)) {
832 return _parsedUnit; 957 return _parsedUnit;
833 } 958 }
834 if (_resolutionMap == null) { 959 return anyResolvedCompilationUnit;
835 return _resolutionState._resolvedUnit;
836 } else {
837 for (DartEntryImpl_ResolutionState state in _resolutionMap.values) {
838 if (identical(state._resolvedUnitState, CacheState.VALID)) {
839 return state._resolvedUnit;
840 }
841 }
842 }
843 return null;
844 } 960 }
845 CompilationUnit get anyResolvedCompilationUnit { 961 CompilationUnit get anyResolvedCompilationUnit {
846 for (DartEntryImpl_ResolutionState state in _resolutionMap.values) { 962 DartEntryImpl_ResolutionState state = _resolutionState;
963 while (state != null) {
847 if (identical(state._resolvedUnitState, CacheState.VALID)) { 964 if (identical(state._resolvedUnitState, CacheState.VALID)) {
848 return state._resolvedUnit; 965 return state._resolvedUnit;
849 } 966 }
967 state = state._nextState;
850 } 968 }
969 ;
851 return null; 970 return null;
852 } 971 }
853 SourceKind get kind => _sourceKind; 972 SourceKind get kind => _sourceKind;
854 CacheState getState(DataDescriptor<Object> descriptor) { 973 CacheState getState(DataDescriptor<Object> descriptor) {
855 if (identical(descriptor, DartEntry.ELEMENT)) { 974 if (identical(descriptor, DartEntry.ELEMENT)) {
856 return _elementState; 975 return _elementState;
857 } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) { 976 } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
858 return _includedPartsState; 977 return _includedPartsState;
859 } else if (identical(descriptor, DartEntry.IS_CLIENT)) { 978 } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
860 return _clientServerState; 979 return _clientServerState;
861 } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) { 980 } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
862 return _launchableState; 981 return _launchableState;
863 } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) { 982 } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
864 return _parseErrorsState; 983 return _parseErrorsState;
865 } else if (identical(descriptor, DartEntry.PARSED_UNIT)) { 984 } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
866 return _parsedUnitState; 985 return _parsedUnitState;
867 } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) { 986 } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
868 return _publicNamespaceState; 987 return _publicNamespaceState;
988 } else if (identical(descriptor, DartEntry.REFERENCED_LIBRARIES)) {
989 return _referencedLibrariesState;
869 } else if (identical(descriptor, DartEntry.SOURCE_KIND)) { 990 } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
870 return _sourceKindState; 991 return _sourceKindState;
871 } else { 992 } else {
872 return super.getState(descriptor); 993 return super.getState(descriptor);
873 } 994 }
874 } 995 }
875 CacheState getState2(DataDescriptor<Object> descriptor, Source librarySource) { 996 CacheState getState2(DataDescriptor<Object> descriptor, Source librarySource2) {
876 if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) { 997 DartEntryImpl_ResolutionState state = _resolutionState;
877 if (_resolutionMap == null) { 998 while (state != null) {
878 return _resolutionState._resolutionErrorsState; 999 if (librarySource2 == state._librarySource) {
879 } else { 1000 if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
880 DartEntryImpl_ResolutionState state = _resolutionMap[librarySource]; 1001 return _resolutionState._resolutionErrorsState;
881 if (state != null) { 1002 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
882 return state._resolutionErrorsState; 1003 return _resolutionState._resolvedUnitState;
1004 } else {
1005 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}" );
883 } 1006 }
884 } 1007 }
885 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) { 1008 state = state._nextState;
886 if (_resolutionMap == null) {
887 return _resolutionState._resolvedUnitState;
888 } else {
889 DartEntryImpl_ResolutionState state = _resolutionMap[librarySource];
890 if (state != null) {
891 return state._resolvedUnitState;
892 }
893 }
894 } else {
895 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
896 } 1009 }
1010 ;
897 return CacheState.INVALID; 1011 return CacheState.INVALID;
898 } 1012 }
899 Object getValue(DataDescriptor descriptor) { 1013 Object getValue(DataDescriptor descriptor) {
900 if (identical(descriptor, DartEntry.ELEMENT)) { 1014 if (identical(descriptor, DartEntry.ELEMENT)) {
901 return _element as Object; 1015 return _element as Object;
902 } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) { 1016 } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
903 return _includedParts as Object; 1017 return _includedParts as Object;
904 } else if (identical(descriptor, DartEntry.IS_CLIENT)) { 1018 } else if (identical(descriptor, DartEntry.IS_CLIENT)) {
905 return ((_bitmask & _CLIENT_CODE) != 0 ? true : false) as Object; 1019 return ((_bitmask & _CLIENT_CODE) != 0 ? true : false) as Object;
906 } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) { 1020 } else if (identical(descriptor, DartEntry.IS_LAUNCHABLE)) {
907 return ((_bitmask & _LAUNCHABLE) != 0 ? true : false) as Object; 1021 return ((_bitmask & _LAUNCHABLE) != 0 ? true : false) as Object;
908 } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) { 1022 } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
909 return _parseErrors as Object; 1023 return _parseErrors as Object;
910 } else if (identical(descriptor, DartEntry.PARSED_UNIT)) { 1024 } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
911 return _parsedUnit as Object; 1025 return _parsedUnit as Object;
912 } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) { 1026 } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
913 return _publicNamespace as Object; 1027 return _publicNamespace as Object;
1028 } else if (identical(descriptor, DartEntry.REFERENCED_LIBRARIES)) {
1029 return _referencedLibraries as Object;
914 } else if (identical(descriptor, DartEntry.SOURCE_KIND)) { 1030 } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
915 return _sourceKind as Object; 1031 return _sourceKind as Object;
916 } 1032 }
917 return super.getValue(descriptor); 1033 return super.getValue(descriptor);
918 } 1034 }
919 Object getValue2(DataDescriptor descriptor, Source librarySource2) { 1035 Object getValue2(DataDescriptor descriptor, Source librarySource2) {
920 if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) { 1036 DartEntryImpl_ResolutionState state = _resolutionState;
921 if (_resolutionMap == null) { 1037 while (state != null) {
922 if (librarySource2 == this._librarySource) { 1038 if (librarySource2 == state._librarySource) {
923 return _resolutionState._resolutionErrors as Object; 1039 if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
1040 return state._resolutionErrors as Object;
1041 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
1042 return state._resolvedUnit as Object;
924 } else { 1043 } else {
925 return AnalysisError.NO_ERRORS as Object; 1044 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}" );
926 }
927 } else {
928 DartEntryImpl_ResolutionState state = _resolutionMap[librarySource2];
929 if (state != null) {
930 return state._resolutionErrors as Object;
931 } 1045 }
932 } 1046 }
1047 state = state._nextState;
1048 }
1049 ;
1050 if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
1051 return AnalysisError.NO_ERRORS as Object;
933 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) { 1052 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
934 if (_resolutionMap == null) { 1053 return null;
935 if (librarySource2 == this._librarySource) {
936 return _resolutionState._resolvedUnit as Object;
937 } else {
938 return null;
939 }
940 } else {
941 DartEntryImpl_ResolutionState state = _resolutionMap[librarySource2];
942 if (state != null) {
943 return state._resolvedUnit as Object;
944 }
945 }
946 } else { 1054 } else {
947 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}"); 1055 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
948 } 1056 }
949 return null;
950 } 1057 }
951 DartEntryImpl get writableCopy { 1058 DartEntryImpl get writableCopy {
952 DartEntryImpl copy = new DartEntryImpl(); 1059 DartEntryImpl copy = new DartEntryImpl();
953 copy.copyFrom(this); 1060 copy.copyFrom(this);
954 return copy; 1061 return copy;
955 } 1062 }
1063
1064 /**
1065 * Invalidate all of the information associated with the compilation unit.
1066 */
1067 void invalidateAllInformation() {
1068 setState(SourceEntry.LINE_INFO, CacheState.INVALID);
1069 _sourceKind = SourceKind.UNKNOWN;
1070 _sourceKindState = CacheState.INVALID;
1071 _parseErrors = AnalysisError.NO_ERRORS;
1072 _parseErrorsState = CacheState.INVALID;
1073 _parsedUnit = null;
1074 _parsedUnitState = CacheState.INVALID;
1075 invalidateAllResolutionInformation();
1076 }
1077
956 /** 1078 /**
957 * Invalidate all of the resolution information associated with the compilatio n unit. 1079 * Invalidate all of the resolution information associated with the compilatio n unit.
958 */ 1080 */
959 void invalidateAllResolutionInformation() { 1081 void invalidateAllResolutionInformation() {
960 if (_resolutionMap == null) { 1082 _element = null;
961 _resolutionState.invalidateAllResolutionInformation(); 1083 _elementState = CacheState.INVALID;
962 } else { 1084 _includedParts = Source.EMPTY_ARRAY;
963 for (DartEntryImpl_ResolutionState state in _resolutionMap.values) { 1085 _includedPartsState = CacheState.INVALID;
964 state.invalidateAllResolutionInformation(); 1086 _referencedLibraries = Source.EMPTY_ARRAY;
965 } 1087 _referencedLibrariesState = CacheState.INVALID;
1088 _bitmask = 0;
1089 _clientServerState = CacheState.INVALID;
1090 _launchableState = CacheState.INVALID;
1091 _publicNamespace = null;
1092 _publicNamespaceState = CacheState.INVALID;
1093 _resolutionState.invalidateAllResolutionInformation();
1094 }
1095
1096 /**
1097 * Record that an error occurred while attempting to scan or parse the entry r epresented by this
1098 * entry. This will set the state of all information, including any resolution -based information,
1099 * as being in error.
1100 */
1101 void recordParseError() {
1102 setState(SourceEntry.LINE_INFO, CacheState.ERROR);
1103 _sourceKind = SourceKind.UNKNOWN;
1104 _sourceKindState = CacheState.ERROR;
1105 _parseErrors = AnalysisError.NO_ERRORS;
1106 _parseErrorsState = CacheState.ERROR;
1107 _parsedUnit = null;
1108 _parsedUnitState = CacheState.ERROR;
1109 recordResolutionError();
1110 }
1111
1112 /**
1113 * Record that the parse-related information for the associated source is abou t to be computed by
1114 * the current thread.
1115 */
1116 void recordParseInProcess() {
1117 if (getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
1118 setState(SourceEntry.LINE_INFO, CacheState.IN_PROCESS);
966 } 1119 }
967 _elementState = CacheState.INVALID; 1120 if (_sourceKindState != CacheState.VALID) {
1121 _sourceKindState = CacheState.IN_PROCESS;
1122 }
1123 if (_parseErrorsState != CacheState.VALID) {
1124 _parseErrorsState = CacheState.IN_PROCESS;
1125 }
1126 if (_parsedUnitState != CacheState.VALID) {
1127 _parsedUnitState = CacheState.IN_PROCESS;
1128 }
1129 }
1130
1131 /**
1132 * Record that an error occurred while attempting to scan or parse the entry r epresented by this
1133 * entry. This will set the state of all resolution-based information as being in error, but will
1134 * not change the state of any parse results.
1135 */
1136 void recordResolutionError() {
968 _element = null; 1137 _element = null;
969 _publicNamespaceState = CacheState.INVALID; 1138 _elementState = CacheState.ERROR;
1139 _includedParts = Source.EMPTY_ARRAY;
1140 _includedPartsState = CacheState.ERROR;
1141 _referencedLibraries = Source.EMPTY_ARRAY;
1142 _referencedLibrariesState = CacheState.ERROR;
1143 _bitmask = 0;
1144 _clientServerState = CacheState.ERROR;
1145 _launchableState = CacheState.ERROR;
970 _publicNamespace = null; 1146 _publicNamespace = null;
971 _launchableState = CacheState.INVALID; 1147 _publicNamespaceState = CacheState.ERROR;
972 _clientServerState = CacheState.INVALID; 1148 _resolutionState.recordResolutionError();
973 _bitmask = 0;
974 } 1149 }
1150
975 /** 1151 /**
976 * Remove any resolution information associated with this compilation unit bei ng part of the given 1152 * Remove any resolution information associated with this compilation unit bei ng part of the given
977 * library, presumably because it is no longer part of the library. 1153 * library, presumably because it is no longer part of the library.
978 * @param librarySource the source of the defining compilation unit of the lib rary that used to 1154 * @param librarySource the source of the defining compilation unit of the lib rary that used to
979 * contain this part but no longer does 1155 * contain this part but no longer does
980 */ 1156 */
981 void removeResolution(Source librarySource2) { 1157 void removeResolution(Source librarySource2) {
982 if (_resolutionMap == null) { 1158 if (librarySource2 != null) {
983 if (librarySource2 == this._librarySource) { 1159 if (librarySource2 == _resolutionState._librarySource) {
984 _resolutionState.invalidateAllResolutionInformation(); 1160 if (_resolutionState._nextState == null) {
985 this._librarySource = null; 1161 _resolutionState.invalidateAllResolutionInformation();
986 } 1162 } else {
987 } else { 1163 _resolutionState = _resolutionState._nextState;
988 _resolutionMap.remove(librarySource2); 1164 }
989 if (_resolutionMap.length == 1) { 1165 } else {
990 MapEntry<Source, DartEntryImpl_ResolutionState> entry = new JavaIterator (getMapEntrySet(_resolutionMap)).next(); 1166 DartEntryImpl_ResolutionState priorState = _resolutionState;
991 this._librarySource = entry.getKey(); 1167 DartEntryImpl_ResolutionState state = _resolutionState._nextState;
992 _resolutionState = entry.getValue(); 1168 while (state != null) {
993 _resolutionMap = null; 1169 if (librarySource2 == state._librarySource) {
1170 priorState._nextState = state._nextState;
1171 break;
1172 }
1173 priorState = state;
1174 state = state._nextState;
1175 }
994 } 1176 }
995 } 1177 }
996 } 1178 }
1179
997 /** 1180 /**
998 * Set the results of parsing the compilation unit at the given time to the gi ven values. 1181 * Set the results of parsing the compilation unit at the given time to the gi ven values.
999 * @param modificationStamp the earliest time at which the source was last mod ified before the 1182 * @param modificationStamp the earliest time at which the source was last mod ified before the
1000 * parsing was started 1183 * parsing was started
1001 * @param lineInfo the line information resulting from parsing the compilation unit 1184 * @param lineInfo the line information resulting from parsing the compilation unit
1002 * @param unit the AST structure resulting from parsing the compilation unit 1185 * @param unit the AST structure resulting from parsing the compilation unit
1003 * @param errors the parse errors resulting from parsing the compilation unit 1186 * @param errors the parse errors resulting from parsing the compilation unit
1004 */ 1187 */
1005 void setParseResults(int modificationStamp, LineInfo lineInfo, CompilationUnit unit, List<AnalysisError> errors) { 1188 void setParseResults(int modificationStamp, LineInfo lineInfo, CompilationUnit unit, List<AnalysisError> errors) {
1006 if (getState(SourceEntry.LINE_INFO) != CacheState.VALID) { 1189 if (getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
(...skipping 21 matching lines...) Expand all
1028 _launchableState = state; 1211 _launchableState = state;
1029 } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) { 1212 } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
1030 _parseErrors = updatedValue(state, _parseErrors, AnalysisError.NO_ERRORS); 1213 _parseErrors = updatedValue(state, _parseErrors, AnalysisError.NO_ERRORS);
1031 _parseErrorsState = state; 1214 _parseErrorsState = state;
1032 } else if (identical(descriptor, DartEntry.PARSED_UNIT)) { 1215 } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
1033 _parsedUnit = updatedValue(state, _parsedUnit, null); 1216 _parsedUnit = updatedValue(state, _parsedUnit, null);
1034 _parsedUnitState = state; 1217 _parsedUnitState = state;
1035 } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) { 1218 } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
1036 _publicNamespace = updatedValue(state, _publicNamespace, null); 1219 _publicNamespace = updatedValue(state, _publicNamespace, null);
1037 _publicNamespaceState = state; 1220 _publicNamespaceState = state;
1221 } else if (identical(descriptor, DartEntry.REFERENCED_LIBRARIES)) {
1222 _referencedLibraries = updatedValue(state, _referencedLibraries, Source.EM PTY_ARRAY);
1223 _referencedLibrariesState = state;
1038 } else if (identical(descriptor, DartEntry.SOURCE_KIND)) { 1224 } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
1039 _sourceKind = updatedValue(state, _sourceKind, SourceKind.UNKNOWN); 1225 _sourceKind = updatedValue(state, _sourceKind, SourceKind.UNKNOWN);
1040 _sourceKindState = state; 1226 _sourceKindState = state;
1041 } else { 1227 } else {
1042 super.setState(descriptor, state); 1228 super.setState(descriptor, state);
1043 } 1229 }
1044 } 1230 }
1231
1045 /** 1232 /**
1046 * Set the state of the data represented by the given descriptor in the contex t of the given 1233 * Set the state of the data represented by the given descriptor in the contex t of the given
1047 * library to the given state. 1234 * library to the given state.
1048 * @param descriptor the descriptor representing the data whose state is to be set 1235 * @param descriptor the descriptor representing the data whose state is to be set
1049 * @param librarySource the source of the defining compilation unit of the lib rary that is the 1236 * @param librarySource the source of the defining compilation unit of the lib rary that is the
1050 * context for the data 1237 * context for the data
1051 * @param state the new state of the data represented by the given descriptor 1238 * @param cacheState the new state of the data represented by the given descri ptor
1052 */ 1239 */
1053 void setState2(DataDescriptor<Object> descriptor, Source librarySource2, Cache State state) { 1240 void setState2(DataDescriptor<Object> descriptor, Source librarySource, CacheS tate cacheState) {
1054 if (_resolutionMap == null && this._librarySource != librarySource2) { 1241 DartEntryImpl_ResolutionState state = getOrCreateResolutionState(librarySour ce);
1055 _resolutionMap = new Map<Source, DartEntryImpl_ResolutionState>();
1056 _resolutionMap[this._librarySource] = _resolutionState;
1057 this._librarySource = null;
1058 _resolutionState = null;
1059 }
1060 if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) { 1242 if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
1061 if (_resolutionMap == null) { 1243 state._resolutionErrors = updatedValue(cacheState, state._resolutionErrors , AnalysisError.NO_ERRORS);
1062 _resolutionState._resolutionErrors = updatedValue(state, _resolutionStat e._resolutionErrors, AnalysisError.NO_ERRORS); 1244 state._resolutionErrorsState = cacheState;
1063 _resolutionState._resolutionErrorsState = state;
1064 } else {
1065 DartEntryImpl_ResolutionState resolutionState = _resolutionMap[librarySo urce2];
1066 if (resolutionState == null) {
1067 resolutionState = new DartEntryImpl_ResolutionState();
1068 _resolutionMap[librarySource2] = resolutionState;
1069 }
1070 resolutionState._resolutionErrors = updatedValue(state, resolutionState. _resolutionErrors, AnalysisError.NO_ERRORS);
1071 resolutionState._resolutionErrorsState = state;
1072 }
1073 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) { 1245 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
1074 if (_resolutionMap == null) { 1246 state._resolvedUnit = updatedValue(cacheState, state._resolvedUnit, null);
1075 _resolutionState._resolvedUnit = updatedValue(state, _resolutionState._r esolvedUnit, null); 1247 state._resolvedUnitState = cacheState;
1076 _resolutionState._resolvedUnitState = state;
1077 } else {
1078 DartEntryImpl_ResolutionState resolutionState = _resolutionMap[librarySo urce2];
1079 if (resolutionState == null) {
1080 resolutionState = new DartEntryImpl_ResolutionState();
1081 _resolutionMap[librarySource2] = resolutionState;
1082 }
1083 resolutionState._resolvedUnit = updatedValue(state, resolutionState._res olvedUnit, null);
1084 resolutionState._resolvedUnitState = state;
1085 }
1086 } else { 1248 } else {
1087 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}"); 1249 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
1088 } 1250 }
1089 } 1251 }
1090 void setValue(DataDescriptor descriptor, Object value) { 1252 void setValue(DataDescriptor descriptor, Object value) {
1091 if (identical(descriptor, DartEntry.ELEMENT)) { 1253 if (identical(descriptor, DartEntry.ELEMENT)) {
1092 _element = value as LibraryElement; 1254 _element = value as LibraryElement;
1093 _elementState = CacheState.VALID; 1255 _elementState = CacheState.VALID;
1094 } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) { 1256 } else if (identical(descriptor, DartEntry.INCLUDED_PARTS)) {
1095 _includedParts = value == null ? Source.EMPTY_ARRAY : (value as List<Sourc e>); 1257 _includedParts = value == null ? Source.EMPTY_ARRAY : (value as List<Sourc e>);
(...skipping 14 matching lines...) Expand all
1110 _launchableState = CacheState.VALID; 1272 _launchableState = CacheState.VALID;
1111 } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) { 1273 } else if (identical(descriptor, DartEntry.PARSE_ERRORS)) {
1112 _parseErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<An alysisError>); 1274 _parseErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<An alysisError>);
1113 _parseErrorsState = CacheState.VALID; 1275 _parseErrorsState = CacheState.VALID;
1114 } else if (identical(descriptor, DartEntry.PARSED_UNIT)) { 1276 } else if (identical(descriptor, DartEntry.PARSED_UNIT)) {
1115 _parsedUnit = value as CompilationUnit; 1277 _parsedUnit = value as CompilationUnit;
1116 _parsedUnitState = CacheState.VALID; 1278 _parsedUnitState = CacheState.VALID;
1117 } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) { 1279 } else if (identical(descriptor, DartEntry.PUBLIC_NAMESPACE)) {
1118 _publicNamespace = value as Namespace; 1280 _publicNamespace = value as Namespace;
1119 _publicNamespaceState = CacheState.VALID; 1281 _publicNamespaceState = CacheState.VALID;
1282 } else if (identical(descriptor, DartEntry.REFERENCED_LIBRARIES)) {
1283 _referencedLibraries = value == null ? Source.EMPTY_ARRAY : (value as List <Source>);
1284 _referencedLibrariesState = CacheState.VALID;
1120 } else if (identical(descriptor, DartEntry.SOURCE_KIND)) { 1285 } else if (identical(descriptor, DartEntry.SOURCE_KIND)) {
1121 _sourceKind = value as SourceKind; 1286 _sourceKind = value as SourceKind;
1122 _sourceKindState = CacheState.VALID; 1287 _sourceKindState = CacheState.VALID;
1123 } else { 1288 } else {
1124 super.setValue(descriptor, value); 1289 super.setValue(descriptor, value);
1125 } 1290 }
1126 } 1291 }
1292
1127 /** 1293 /**
1128 * Set the value of the data represented by the given descriptor in the contex t of the given 1294 * Set the value of the data represented by the given descriptor in the contex t of the given
1129 * library to the given value, and set the state of that data to {@link CacheS tate#VALID}. 1295 * library to the given value, and set the state of that data to {@link CacheS tate#VALID}.
1130 * @param descriptor the descriptor representing which data is to have its val ue set 1296 * @param descriptor the descriptor representing which data is to have its val ue set
1131 * @param librarySource the source of the defining compilation unit of the lib rary that is the 1297 * @param librarySource the source of the defining compilation unit of the lib rary that is the
1132 * context for the data 1298 * context for the data
1133 * @param value the new value of the data represented by the given descriptor and library 1299 * @param value the new value of the data represented by the given descriptor and library
1134 */ 1300 */
1135 void setValue2(DataDescriptor descriptor, Source librarySource2, Object value) { 1301 void setValue2(DataDescriptor descriptor, Source librarySource, Object value) {
1136 if (_resolutionMap == null) { 1302 DartEntryImpl_ResolutionState state = getOrCreateResolutionState(librarySour ce);
1137 if (this._librarySource == null) {
1138 this._librarySource = librarySource2;
1139 } else if (librarySource2 != this._librarySource) {
1140 _resolutionMap = new Map<Source, DartEntryImpl_ResolutionState>();
1141 _resolutionMap[this._librarySource] = _resolutionState;
1142 this._librarySource = null;
1143 _resolutionState = null;
1144 }
1145 }
1146 if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) { 1303 if (identical(descriptor, DartEntry.RESOLUTION_ERRORS)) {
1147 if (_resolutionMap == null) { 1304 state._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
1148 _resolutionState._resolutionErrors = value == null ? AnalysisError.NO_ER RORS : (value as List<AnalysisError>); 1305 state._resolutionErrorsState = CacheState.VALID;
1149 _resolutionState._resolutionErrorsState = CacheState.VALID;
1150 } else {
1151 DartEntryImpl_ResolutionState state = _resolutionMap[librarySource2];
1152 if (state != null) {
1153 state._resolutionErrors = value == null ? AnalysisError.NO_ERRORS : (v alue as List<AnalysisError>);
1154 state._resolutionErrorsState = CacheState.VALID;
1155 }
1156 }
1157 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) { 1306 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
1158 if (_resolutionMap == null) { 1307 state._resolvedUnit = value as CompilationUnit;
1159 _resolutionState._resolvedUnit = value as CompilationUnit; 1308 state._resolvedUnitState = CacheState.VALID;
1160 _resolutionState._resolvedUnitState = CacheState.VALID;
1161 } else {
1162 DartEntryImpl_ResolutionState state = _resolutionMap[librarySource2];
1163 if (state != null) {
1164 state._resolvedUnit = value as CompilationUnit;
1165 state._resolvedUnitState = CacheState.VALID;
1166 }
1167 }
1168 } 1309 }
1169 } 1310 }
1170 void copyFrom(SourceEntryImpl entry) { 1311 void copyFrom(SourceEntryImpl entry) {
1171 super.copyFrom(entry); 1312 super.copyFrom(entry);
1172 DartEntryImpl other = entry as DartEntryImpl; 1313 DartEntryImpl other = entry as DartEntryImpl;
1173 _sourceKindState = other._sourceKindState; 1314 _sourceKindState = other._sourceKindState;
1174 _sourceKind = other._sourceKind; 1315 _sourceKind = other._sourceKind;
1175 _parsedUnitState = other._parsedUnitState; 1316 _parsedUnitState = other._parsedUnitState;
1176 _parsedUnit = other._parsedUnit; 1317 _parsedUnit = other._parsedUnit;
1177 _parseErrorsState = other._parseErrorsState; 1318 _parseErrorsState = other._parseErrorsState;
1178 _parseErrors = other._parseErrors; 1319 _parseErrors = other._parseErrors;
1179 _includedPartsState = other._includedPartsState; 1320 _includedPartsState = other._includedPartsState;
1180 _includedParts = other._includedParts; 1321 _includedParts = other._includedParts;
1181 if (other._resolutionMap == null) { 1322 _referencedLibrariesState = other._referencedLibrariesState;
1182 _librarySource = other._librarySource; 1323 _referencedLibraries = other._referencedLibraries;
1183 DartEntryImpl_ResolutionState newState = new DartEntryImpl_ResolutionState (); 1324 _resolutionState.copyFrom(other._resolutionState);
1184 newState.copyFrom(_resolutionState);
1185 _resolutionState = newState;
1186 } else {
1187 _resolutionMap = new Map<Source, DartEntryImpl_ResolutionState>();
1188 for (MapEntry<Source, DartEntryImpl_ResolutionState> mapEntry in getMapEnt rySet(other._resolutionMap)) {
1189 DartEntryImpl_ResolutionState newState = new DartEntryImpl_ResolutionSta te();
1190 newState.copyFrom(mapEntry.getValue());
1191 _resolutionMap[mapEntry.getKey()] = newState;
1192 }
1193 }
1194 _elementState = other._elementState; 1325 _elementState = other._elementState;
1195 _element = other._element; 1326 _element = other._element;
1196 _publicNamespaceState = other._publicNamespaceState; 1327 _publicNamespaceState = other._publicNamespaceState;
1197 _publicNamespace = other._publicNamespace; 1328 _publicNamespace = other._publicNamespace;
1198 _clientServerState = other._clientServerState; 1329 _clientServerState = other._clientServerState;
1199 _launchableState = other._launchableState; 1330 _launchableState = other._launchableState;
1200 _bitmask = other._bitmask; 1331 _bitmask = other._bitmask;
1201 } 1332 }
1333
1334 /**
1335 * Return a resolution state for the specified library, creating one as necess ary.
1336 * @param librarySource the library source (not {@code null})
1337 * @return the resolution state (not {@code null})
1338 */
1339 DartEntryImpl_ResolutionState getOrCreateResolutionState(Source librarySource2 ) {
1340 DartEntryImpl_ResolutionState state = _resolutionState;
1341 if (state._librarySource == null) {
1342 state._librarySource = librarySource2;
1343 return state;
1344 }
1345 while (state._librarySource != librarySource2) {
1346 if (state._nextState == null) {
1347 DartEntryImpl_ResolutionState newState = new DartEntryImpl_ResolutionSta te();
1348 newState._librarySource = librarySource2;
1349 state._nextState = newState;
1350 return newState;
1351 }
1352 state = state._nextState;
1353 }
1354 return state;
1355 }
1356
1202 /** 1357 /**
1203 * Given that one of the flags is being transitioned to the given state, retur n the value of the 1358 * Given that one of the flags is being transitioned to the given state, retur n the value of the
1204 * flags that should be kept in the cache. 1359 * flags that should be kept in the cache.
1205 * @param state the state to which the data is being transitioned 1360 * @param state the state to which the data is being transitioned
1206 * @param currentValue the value of the flags before the transition 1361 * @param currentValue the value of the flags before the transition
1207 * @param bitMask the mask used to access the bit whose state is being set 1362 * @param bitMask the mask used to access the bit whose state is being set
1208 * @return the value of the data that should be kept in the cache 1363 * @return the value of the data that should be kept in the cache
1209 */ 1364 */
1210 int updatedValue2(CacheState state, int currentValue, int bitMask) { 1365 int updatedValue2(CacheState state, int currentValue, int bitMask) {
1211 if (identical(state, CacheState.VALID)) { 1366 if (identical(state, CacheState.VALID)) {
1212 throw new IllegalArgumentException("Use setValue() to set the state to VAL ID"); 1367 throw new IllegalArgumentException("Use setValue() to set the state to VAL ID");
1213 } else if (identical(state, CacheState.IN_PROCESS)) { 1368 } else if (identical(state, CacheState.IN_PROCESS)) {
1214 return currentValue; 1369 return currentValue;
1215 } 1370 }
1216 return currentValue &= ~bitMask; 1371 return currentValue &= ~bitMask;
1217 } 1372 }
1218 } 1373 }
1374
1219 /** 1375 /**
1220 * Instances of the class {@code ResolutionState} represent the information prod uced by resolving 1376 * Instances of the class {@code ResolutionState} represent the information prod uced by resolving
1221 * a compilation unit as part of a specific library. 1377 * a compilation unit as part of a specific library.
1222 */ 1378 */
1223 class DartEntryImpl_ResolutionState { 1379 class DartEntryImpl_ResolutionState {
1380
1381 /**
1382 * The next resolution state or {@code null} if none.
1383 */
1384 DartEntryImpl_ResolutionState _nextState;
1385
1386 /**
1387 * The source for the defining compilation unit of the library that contains t his unit. If this
1388 * unit is the defining compilation unit for it's library, then this will be t he source for this
1389 * unit.
1390 */
1391 Source _librarySource;
1392
1224 /** 1393 /**
1225 * The state of the cached resolved compilation unit. 1394 * The state of the cached resolved compilation unit.
1226 */ 1395 */
1227 CacheState _resolvedUnitState = CacheState.INVALID; 1396 CacheState _resolvedUnitState = CacheState.INVALID;
1397
1228 /** 1398 /**
1229 * The resolved compilation unit, or {@code null} if the resolved compilation unit is not 1399 * The resolved compilation unit, or {@code null} if the resolved compilation unit is not
1230 * currently cached. 1400 * currently cached.
1231 */ 1401 */
1232 CompilationUnit _resolvedUnit; 1402 CompilationUnit _resolvedUnit;
1403
1233 /** 1404 /**
1234 * The state of the cached resolution errors. 1405 * The state of the cached resolution errors.
1235 */ 1406 */
1236 CacheState _resolutionErrorsState = CacheState.INVALID; 1407 CacheState _resolutionErrorsState = CacheState.INVALID;
1408
1237 /** 1409 /**
1238 * The errors produced while resolving the compilation unit, or {@code null} i f the errors are 1410 * The errors produced while resolving the compilation unit, or {@code null} i f the errors are
1239 * not currently cached. 1411 * not currently cached.
1240 */ 1412 */
1241 List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS; 1413 List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
1414
1242 /** 1415 /**
1243 * Initialize a newly created resolution state. 1416 * Set this state to be exactly like the given state, recursively copying the next state as
1244 */ 1417 * necessary.
1245 DartEntryImpl_ResolutionState() : super() {
1246 }
1247 /**
1248 * Set this state to be exactly like the given state.
1249 * @param other the state to be copied 1418 * @param other the state to be copied
1250 */ 1419 */
1251 void copyFrom(DartEntryImpl_ResolutionState other) { 1420 void copyFrom(DartEntryImpl_ResolutionState other) {
1421 _librarySource = other._librarySource;
1252 _resolvedUnitState = other._resolvedUnitState; 1422 _resolvedUnitState = other._resolvedUnitState;
1253 _resolvedUnit = other._resolvedUnit; 1423 _resolvedUnit = other._resolvedUnit;
1254 _resolutionErrorsState = other._resolutionErrorsState; 1424 _resolutionErrorsState = other._resolutionErrorsState;
1255 _resolutionErrors = other._resolutionErrors; 1425 _resolutionErrors = other._resolutionErrors;
1426 if (other._nextState != null) {
1427 _nextState = new DartEntryImpl_ResolutionState();
1428 _nextState.copyFrom(other._nextState);
1429 }
1256 } 1430 }
1431
1257 /** 1432 /**
1258 * Invalidate all of the resolution information associated with the compilatio n unit. 1433 * Invalidate all of the resolution information associated with the compilatio n unit.
1259 */ 1434 */
1260 void invalidateAllResolutionInformation() { 1435 void invalidateAllResolutionInformation() {
1436 _nextState = null;
1437 _librarySource = null;
1261 _resolvedUnitState = CacheState.INVALID; 1438 _resolvedUnitState = CacheState.INVALID;
1262 _resolvedUnit = null; 1439 _resolvedUnit = null;
1263 _resolutionErrorsState = CacheState.INVALID; 1440 _resolutionErrorsState = CacheState.INVALID;
1264 _resolutionErrors = AnalysisError.NO_ERRORS; 1441 _resolutionErrors = AnalysisError.NO_ERRORS;
1265 } 1442 }
1443
1444 /**
1445 * Record that an error occurred while attempting to scan or parse the entry r epresented by this
1446 * entry. This will set the state of all resolution-based information as being in error, but
1447 * will not change the state of any parse results.
1448 */
1449 void recordResolutionError() {
1450 _nextState = null;
1451 _librarySource = null;
1452 _resolvedUnitState = CacheState.ERROR;
1453 _resolvedUnit = null;
1454 _resolutionErrorsState = CacheState.ERROR;
1455 _resolutionErrors = AnalysisError.NO_ERRORS;
1456 }
1266 } 1457 }
1458
1267 /** 1459 /**
1268 * Instances of the class {@code DataDescriptor} are immutable constants represe nting data that can 1460 * Instances of the class {@code DataDescriptor} are immutable constants represe nting data that can
1269 * be stored in the cache. 1461 * be stored in the cache.
1270 */ 1462 */
1271 class DataDescriptor<E> { 1463 class DataDescriptor<E> {
1464
1272 /** 1465 /**
1273 * The name of the descriptor, used for debugging purposes. 1466 * The name of the descriptor, used for debugging purposes.
1274 */ 1467 */
1275 String _name; 1468 String _name;
1469
1276 /** 1470 /**
1277 * Initialize a newly created descriptor to have the given name. 1471 * Initialize a newly created descriptor to have the given name.
1278 * @param name the name of the descriptor 1472 * @param name the name of the descriptor
1279 */ 1473 */
1280 DataDescriptor(String name) { 1474 DataDescriptor(String name) {
1281 this._name = name; 1475 this._name = name;
1282 } 1476 }
1283 String toString() => _name; 1477 String toString() => _name;
1284 } 1478 }
1479
1285 /** 1480 /**
1286 * The interface {@code HtmlEntry} defines the behavior of objects that maintain the information 1481 * The interface {@code HtmlEntry} defines the behavior of objects that maintain the information
1287 * cached by an analysis context about an individual HTML file. 1482 * cached by an analysis context about an individual HTML file.
1288 * @coverage dart.engine 1483 * @coverage dart.engine
1289 */ 1484 */
1290 abstract class HtmlEntry implements SourceEntry { 1485 abstract class HtmlEntry implements SourceEntry {
1486
1291 /** 1487 /**
1292 * The data descriptor representing the HTML element. 1488 * The data descriptor representing the HTML element.
1293 */ 1489 */
1294 static DataDescriptor<HtmlElement> ELEMENT = new DataDescriptor<HtmlElement>(" HtmlEntry.ELEMENT"); 1490 static DataDescriptor<HtmlElement> ELEMENT = new DataDescriptor<HtmlElement>(" HtmlEntry.ELEMENT");
1491
1295 /** 1492 /**
1296 * The data descriptor representing the parsed AST structure. 1493 * The data descriptor representing the parsed AST structure.
1297 */ 1494 */
1298 static DataDescriptor<HtmlUnit> PARSED_UNIT = new DataDescriptor<HtmlUnit>("Ht mlEntry.PARSED_UNIT"); 1495 static DataDescriptor<HtmlUnit> PARSED_UNIT = new DataDescriptor<HtmlUnit>("Ht mlEntry.PARSED_UNIT");
1496
1299 /** 1497 /**
1300 * The data descriptor representing the list of referenced libraries. 1498 * The data descriptor representing the list of referenced libraries.
1301 */ 1499 */
1302 static DataDescriptor<List<Source>> REFERENCED_LIBRARIES = new DataDescriptor< List<Source>>("HtmlEntry.REFERENCED_LIBRARIES"); 1500 static DataDescriptor<List<Source>> REFERENCED_LIBRARIES = new DataDescriptor< List<Source>>("HtmlEntry.REFERENCED_LIBRARIES");
1501
1303 /** 1502 /**
1304 * The data descriptor representing the errors resulting from resolving the so urce. 1503 * The data descriptor representing the errors resulting from resolving the so urce.
1305 */ 1504 */
1306 static DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescrip tor<List<AnalysisError>>("HtmlEntry.RESOLUTION_ERRORS"); 1505 static DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = new DataDescrip tor<List<AnalysisError>>("HtmlEntry.RESOLUTION_ERRORS");
1506
1307 /** 1507 /**
1308 * The data descriptor representing the resolved AST structure. 1508 * The data descriptor representing the resolved AST structure.
1309 */ 1509 */
1310 static DataDescriptor<HtmlUnit> RESOLVED_UNIT = new DataDescriptor<HtmlUnit>(" HtmlEntry.RESOLVED_UNIT"); 1510 static DataDescriptor<HtmlUnit> RESOLVED_UNIT = new DataDescriptor<HtmlUnit>(" HtmlEntry.RESOLVED_UNIT");
1511
1512 /**
1513 * Return all of the errors associated with the compilation unit that are curr ently cached.
1514 * @return all of the errors associated with the compilation unit
1515 */
1516 List<AnalysisError> get allErrors;
1311 HtmlEntryImpl get writableCopy; 1517 HtmlEntryImpl get writableCopy;
1312 } 1518 }
1519
1313 /** 1520 /**
1314 * Instances of the class {@code HtmlEntryImpl} implement an {@link HtmlEntry}. 1521 * Instances of the class {@code HtmlEntryImpl} implement an {@link HtmlEntry}.
1315 * @coverage dart.engine 1522 * @coverage dart.engine
1316 */ 1523 */
1317 class HtmlEntryImpl extends SourceEntryImpl implements HtmlEntry { 1524 class HtmlEntryImpl extends SourceEntryImpl implements HtmlEntry {
1525
1318 /** 1526 /**
1319 * The state of the cached parsed (but not resolved) HTML unit. 1527 * The state of the cached parsed (but not resolved) HTML unit.
1320 */ 1528 */
1321 CacheState _parsedUnitState = CacheState.INVALID; 1529 CacheState _parsedUnitState = CacheState.INVALID;
1530
1322 /** 1531 /**
1323 * The parsed HTML unit, or {@code null} if the parsed HTML unit is not curren tly cached. 1532 * The parsed HTML unit, or {@code null} if the parsed HTML unit is not curren tly cached.
1324 */ 1533 */
1325 HtmlUnit _parsedUnit; 1534 HtmlUnit _parsedUnit;
1535
1326 /** 1536 /**
1327 * The state of the cached resolution errors. 1537 * The state of the cached resolution errors.
1328 */ 1538 */
1329 CacheState _resolutionErrorsState = CacheState.INVALID; 1539 CacheState _resolutionErrorsState = CacheState.INVALID;
1540
1330 /** 1541 /**
1331 * The errors produced while resolving the compilation unit, or {@code null} i f the errors are not 1542 * The errors produced while resolving the compilation unit, or {@code null} i f the errors are not
1332 * currently cached. 1543 * currently cached.
1333 */ 1544 */
1334 List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS; 1545 List<AnalysisError> _resolutionErrors = AnalysisError.NO_ERRORS;
1546
1335 /** 1547 /**
1336 * The state of the cached parsed and resolved HTML unit. 1548 * The state of the cached parsed and resolved HTML unit.
1337 */ 1549 */
1338 CacheState _resolvedUnitState = CacheState.INVALID; 1550 CacheState _resolvedUnitState = CacheState.INVALID;
1551
1339 /** 1552 /**
1340 * The resolved HTML unit, or {@code null} if the resolved HTML unit is not cu rrently cached. 1553 * The resolved HTML unit, or {@code null} if the resolved HTML unit is not cu rrently cached.
1341 */ 1554 */
1342 HtmlUnit _resolvedUnit; 1555 HtmlUnit _resolvedUnit;
1556
1343 /** 1557 /**
1344 * The state of the cached list of referenced libraries. 1558 * The state of the cached list of referenced libraries.
1345 */ 1559 */
1346 CacheState _referencedLibrariesState = CacheState.INVALID; 1560 CacheState _referencedLibrariesState = CacheState.INVALID;
1561
1347 /** 1562 /**
1348 * The list of libraries referenced in the HTML, or {@code null} if the list i s not currently 1563 * The list of libraries referenced in the HTML, or {@code null} if the list i s not currently
1349 * cached. Note that this list does not include libraries defined directly wit hin the HTML file. 1564 * cached. Note that this list does not include libraries defined directly wit hin the HTML file.
1350 */ 1565 */
1351 List<Source> _referencedLibraries = Source.EMPTY_ARRAY; 1566 List<Source> _referencedLibraries = Source.EMPTY_ARRAY;
1567
1352 /** 1568 /**
1353 * The state of the cached HTML element. 1569 * The state of the cached HTML element.
1354 */ 1570 */
1355 CacheState _elementState = CacheState.INVALID; 1571 CacheState _elementState = CacheState.INVALID;
1572
1356 /** 1573 /**
1357 * The element representing the HTML file, or {@code null} if the element is n ot currently cached. 1574 * The element representing the HTML file, or {@code null} if the element is n ot currently cached.
1358 */ 1575 */
1359 HtmlElement _element; 1576 HtmlElement _element;
1360 /** 1577 List<AnalysisError> get allErrors {
1361 * Initialize a newly created cache entry to be empty. 1578 List<AnalysisError> errors = new List<AnalysisError>();
1362 */ 1579 for (AnalysisError error in _resolutionErrors) {
1363 HtmlEntryImpl() : super() { 1580 errors.add(error);
1581 }
1582 if (errors.length == 0) {
1583 return AnalysisError.NO_ERRORS;
1584 }
1585 return new List.from(errors);
1364 } 1586 }
1365 SourceKind get kind => SourceKind.HTML; 1587 SourceKind get kind => SourceKind.HTML;
1366 CacheState getState(DataDescriptor<Object> descriptor) { 1588 CacheState getState(DataDescriptor<Object> descriptor) {
1367 if (identical(descriptor, HtmlEntry.ELEMENT)) { 1589 if (identical(descriptor, HtmlEntry.ELEMENT)) {
1368 return _elementState; 1590 return _elementState;
1369 } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) { 1591 } else if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
1370 return _parsedUnitState; 1592 return _parsedUnitState;
1371 } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) { 1593 } else if (identical(descriptor, HtmlEntry.REFERENCED_LIBRARIES)) {
1372 return _referencedLibrariesState; 1594 return _referencedLibrariesState;
1373 } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) { 1595 } else if (identical(descriptor, HtmlEntry.RESOLUTION_ERRORS)) {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1444 _referencedLibrariesState = other._referencedLibrariesState; 1666 _referencedLibrariesState = other._referencedLibrariesState;
1445 _referencedLibraries = other._referencedLibraries; 1667 _referencedLibraries = other._referencedLibraries;
1446 _resolutionErrors = other._resolutionErrors; 1668 _resolutionErrors = other._resolutionErrors;
1447 _resolutionErrorsState = other._resolutionErrorsState; 1669 _resolutionErrorsState = other._resolutionErrorsState;
1448 _resolvedUnitState = other._resolvedUnitState; 1670 _resolvedUnitState = other._resolvedUnitState;
1449 _resolvedUnit = other._resolvedUnit; 1671 _resolvedUnit = other._resolvedUnit;
1450 _elementState = other._elementState; 1672 _elementState = other._elementState;
1451 _element = other._element; 1673 _element = other._element;
1452 } 1674 }
1453 } 1675 }
1676
1454 /** 1677 /**
1455 * The interface {@code SourceEntry} defines the behavior of objects that mainta in the information 1678 * The interface {@code SourceEntry} defines the behavior of objects that mainta in the information
1456 * cached by an analysis context about an individual source, no matter what kind of source it is. 1679 * cached by an analysis context about an individual source, no matter what kind of source it is.
1457 * <p> 1680 * <p>
1458 * Source entries should be treated as if they were immutable unless a writable copy of the entry 1681 * Source entries should be treated as if they were immutable unless a writable copy of the entry
1459 * has been obtained and has not yet been made visible to other threads. 1682 * has been obtained and has not yet been made visible to other threads.
1460 * @coverage dart.engine 1683 * @coverage dart.engine
1461 */ 1684 */
1462 abstract class SourceEntry { 1685 abstract class SourceEntry {
1686
1463 /** 1687 /**
1464 * The data descriptor representing the line information. 1688 * The data descriptor representing the line information.
1465 */ 1689 */
1466 static DataDescriptor<LineInfo> LINE_INFO = new DataDescriptor<LineInfo>("Sour ceEntry.LINE_INFO"); 1690 static DataDescriptor<LineInfo> LINE_INFO = new DataDescriptor<LineInfo>("Sour ceEntry.LINE_INFO");
1691
1467 /** 1692 /**
1468 * Return the kind of the source, or {@code null} if the kind is not currently cached. 1693 * Return the kind of the source, or {@code null} if the kind is not currently cached.
1469 * @return the kind of the source 1694 * @return the kind of the source
1470 */ 1695 */
1471 SourceKind get kind; 1696 SourceKind get kind;
1697
1472 /** 1698 /**
1473 * Return the most recent time at which the state of the source matched the st ate represented by 1699 * Return the most recent time at which the state of the source matched the st ate represented by
1474 * this entry. 1700 * this entry.
1475 * @return the modification time of this entry 1701 * @return the modification time of this entry
1476 */ 1702 */
1477 int get modificationTime; 1703 int get modificationTime;
1704
1478 /** 1705 /**
1479 * Return the state of the data represented by the given descriptor. 1706 * Return the state of the data represented by the given descriptor.
1480 * @param descriptor the descriptor representing the data whose state is to be returned 1707 * @param descriptor the descriptor representing the data whose state is to be returned
1481 * @return the state of the data represented by the given descriptor 1708 * @return the state of the data represented by the given descriptor
1482 */ 1709 */
1483 CacheState getState(DataDescriptor<Object> descriptor); 1710 CacheState getState(DataDescriptor<Object> descriptor);
1711
1484 /** 1712 /**
1485 * Return the value of the data represented by the given descriptor, or {@code null} if the data 1713 * Return the value of the data represented by the given descriptor, or {@code null} if the data
1486 * represented by the descriptor is not in the cache. 1714 * represented by the descriptor is not in the cache.
1487 * @param descriptor the descriptor representing which data is to be returned 1715 * @param descriptor the descriptor representing which data is to be returned
1488 * @return the value of the data represented by the given descriptor 1716 * @return the value of the data represented by the given descriptor
1489 */ 1717 */
1490 Object getValue(DataDescriptor descriptor); 1718 Object getValue(DataDescriptor descriptor);
1719
1491 /** 1720 /**
1492 * Return a new entry that is initialized to the same state as this entry but that can be 1721 * Return a new entry that is initialized to the same state as this entry but that can be
1493 * modified. 1722 * modified.
1494 * @return a writable copy of this entry 1723 * @return a writable copy of this entry
1495 */ 1724 */
1496 SourceEntryImpl get writableCopy; 1725 SourceEntryImpl get writableCopy;
1497 } 1726 }
1727
1498 /** 1728 /**
1499 * Instances of the abstract class {@code SourceEntryImpl} implement the behavio r common to all{@link SourceEntry source entries}. 1729 * Instances of the abstract class {@code SourceEntryImpl} implement the behavio r common to all{@link SourceEntry source entries}.
1500 * @coverage dart.engine 1730 * @coverage dart.engine
1501 */ 1731 */
1502 abstract class SourceEntryImpl implements SourceEntry { 1732 abstract class SourceEntryImpl implements SourceEntry {
1733
1503 /** 1734 /**
1504 * The most recent time at which the state of the source matched the state rep resented by this 1735 * The most recent time at which the state of the source matched the state rep resented by this
1505 * entry. 1736 * entry.
1506 */ 1737 */
1507 int _modificationTime = 0; 1738 int _modificationTime = 0;
1739
1508 /** 1740 /**
1509 * The state of the cached line information. 1741 * The state of the cached line information.
1510 */ 1742 */
1511 CacheState _lineInfoState = CacheState.INVALID; 1743 CacheState _lineInfoState = CacheState.INVALID;
1744
1512 /** 1745 /**
1513 * The line information computed for the source, or {@code null} if the line i nformation is not 1746 * The line information computed for the source, or {@code null} if the line i nformation is not
1514 * currently cached. 1747 * currently cached.
1515 */ 1748 */
1516 LineInfo _lineInfo; 1749 LineInfo _lineInfo;
1517 /**
1518 * Initialize a newly created cache entry to be empty.
1519 */
1520 SourceEntryImpl() : super() {
1521 }
1522 int get modificationTime => _modificationTime; 1750 int get modificationTime => _modificationTime;
1523 CacheState getState(DataDescriptor<Object> descriptor) { 1751 CacheState getState(DataDescriptor<Object> descriptor) {
1524 if (identical(descriptor, SourceEntry.LINE_INFO)) { 1752 if (identical(descriptor, SourceEntry.LINE_INFO)) {
1525 return _lineInfoState; 1753 return _lineInfoState;
1526 } else { 1754 } else {
1527 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}"); 1755 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
1528 } 1756 }
1529 } 1757 }
1530 Object getValue(DataDescriptor descriptor) { 1758 Object getValue(DataDescriptor descriptor) {
1531 if (identical(descriptor, SourceEntry.LINE_INFO)) { 1759 if (identical(descriptor, SourceEntry.LINE_INFO)) {
1532 return _lineInfo as Object; 1760 return _lineInfo as Object;
1533 } else { 1761 } else {
1534 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}"); 1762 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
1535 } 1763 }
1536 } 1764 }
1765
1537 /** 1766 /**
1538 * Set the most recent time at which the state of the source matched the state represented by this 1767 * Set the most recent time at which the state of the source matched the state represented by this
1539 * entry to the given time. 1768 * entry to the given time.
1540 * @param time the new modification time of this entry 1769 * @param time the new modification time of this entry
1541 */ 1770 */
1542 void set modificationTime(int time) { 1771 void set modificationTime(int time) {
1543 _modificationTime = time; 1772 _modificationTime = time;
1544 } 1773 }
1774
1545 /** 1775 /**
1546 * Set the state of the data represented by the given descriptor to the given state. 1776 * Set the state of the data represented by the given descriptor to the given state.
1547 * @param descriptor the descriptor representing the data whose state is to be set 1777 * @param descriptor the descriptor representing the data whose state is to be set
1548 * @param the new state of the data represented by the given descriptor 1778 * @param the new state of the data represented by the given descriptor
1549 */ 1779 */
1550 void setState(DataDescriptor<Object> descriptor, CacheState state) { 1780 void setState(DataDescriptor<Object> descriptor, CacheState state) {
1551 if (identical(descriptor, SourceEntry.LINE_INFO)) { 1781 if (identical(descriptor, SourceEntry.LINE_INFO)) {
1552 _lineInfo = updatedValue(state, _lineInfo, null); 1782 _lineInfo = updatedValue(state, _lineInfo, null);
1553 _lineInfoState = state; 1783 _lineInfoState = state;
1554 } else { 1784 } else {
1555 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}"); 1785 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
1556 } 1786 }
1557 } 1787 }
1788
1558 /** 1789 /**
1559 * Set the value of the data represented by the given descriptor to the given value. 1790 * Set the value of the data represented by the given descriptor to the given value.
1560 * @param descriptor the descriptor representing the data whose value is to be set 1791 * @param descriptor the descriptor representing the data whose value is to be set
1561 * @param value the new value of the data represented by the given descriptor 1792 * @param value the new value of the data represented by the given descriptor
1562 */ 1793 */
1563 void setValue(DataDescriptor descriptor, Object value) { 1794 void setValue(DataDescriptor descriptor, Object value) {
1564 if (identical(descriptor, SourceEntry.LINE_INFO)) { 1795 if (identical(descriptor, SourceEntry.LINE_INFO)) {
1565 _lineInfo = value as LineInfo; 1796 _lineInfo = value as LineInfo;
1566 _lineInfoState = CacheState.VALID; 1797 _lineInfoState = CacheState.VALID;
1567 } else { 1798 } else {
1568 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}"); 1799 throw new IllegalArgumentException("Invalid descriptor: ${descriptor}");
1569 } 1800 }
1570 } 1801 }
1802
1571 /** 1803 /**
1572 * Copy the information from the given cache entry. 1804 * Copy the information from the given cache entry.
1573 * @param entry the cache entry from which information will be copied 1805 * @param entry the cache entry from which information will be copied
1574 */ 1806 */
1575 void copyFrom(SourceEntryImpl entry) { 1807 void copyFrom(SourceEntryImpl entry) {
1576 _modificationTime = entry._modificationTime; 1808 _modificationTime = entry._modificationTime;
1577 _lineInfoState = entry._lineInfoState; 1809 _lineInfoState = entry._lineInfoState;
1578 _lineInfo = entry._lineInfo; 1810 _lineInfo = entry._lineInfo;
1579 } 1811 }
1812
1580 /** 1813 /**
1581 * Given that some data is being transitioned to the given state, return the v alue that should be 1814 * Given that some data is being transitioned to the given state, return the v alue that should be
1582 * kept in the cache. 1815 * kept in the cache.
1583 * @param state the state to which the data is being transitioned 1816 * @param state the state to which the data is being transitioned
1584 * @param currentValue the value of the data before the transition 1817 * @param currentValue the value of the data before the transition
1585 * @param defaultValue the value to be used if the current value is to be remo ved from the cache 1818 * @param defaultValue the value to be used if the current value is to be remo ved from the cache
1586 * @return the value of the data that should be kept in the cache 1819 * @return the value of the data that should be kept in the cache
1587 */ 1820 */
1588 Object updatedValue(CacheState state, Object currentValue, Object defaultValue ) { 1821 Object updatedValue(CacheState state, Object currentValue, Object defaultValue ) {
1589 if (identical(state, CacheState.VALID)) { 1822 if (identical(state, CacheState.VALID)) {
1590 throw new IllegalArgumentException("Use setValue() to set the state to VAL ID"); 1823 throw new IllegalArgumentException("Use setValue() to set the state to VAL ID");
1591 } else if (identical(state, CacheState.IN_PROCESS)) { 1824 } else if (identical(state, CacheState.IN_PROCESS)) {
1592 return currentValue; 1825 return currentValue;
1593 } 1826 }
1594 return defaultValue; 1827 return defaultValue;
1595 } 1828 }
1596 } 1829 }
1830
1597 /** 1831 /**
1598 * Instances of the class {@code AnalysisContextImpl} implement an {@link Analys isContext analysis 1832 * Instances of the class {@code AnalysisContextImpl} implement an {@link Analys isContext analysis
1599 * context}. 1833 * context}.
1600 * @coverage dart.engine 1834 * @coverage dart.engine
1601 */ 1835 */
1602 class AnalysisContextImpl implements InternalAnalysisContext { 1836 class AnalysisContextImpl implements InternalAnalysisContext {
1837
1838 /**
1839 * The set of analysis options controlling the behavior of this context.
1840 */
1841 AnalysisOptions _options = new AnalysisOptionsImpl();
1842
1603 /** 1843 /**
1604 * The source factory used to create the sources that can be analyzed in this context. 1844 * The source factory used to create the sources that can be analyzed in this context.
1605 */ 1845 */
1606 SourceFactory _sourceFactory; 1846 SourceFactory _sourceFactory;
1847
1607 /** 1848 /**
1608 * A table mapping the sources known to the context to the information known a bout the source. 1849 * A table mapping the sources known to the context to the information known a bout the source.
1609 */ 1850 */
1610 Map<Source, SourceEntry> _sourceMap = new Map<Source, SourceEntry>(); 1851 Map<Source, SourceEntry> _sourceMap = new Map<Source, SourceEntry>();
1852
1611 /** 1853 /**
1612 * A table mapping sources to the change notices that are waiting to be return ed related to that 1854 * A table mapping sources to the change notices that are waiting to be return ed related to that
1613 * source. 1855 * source.
1614 */ 1856 */
1615 Map<Source, ChangeNoticeImpl> _pendingNotices = new Map<Source, ChangeNoticeIm pl>(); 1857 Map<Source, ChangeNoticeImpl> _pendingNotices = new Map<Source, ChangeNoticeIm pl>();
1858
1616 /** 1859 /**
1617 * A list containing the most recently accessed sources with the most recently used at the end of 1860 * A list containing the most recently accessed sources with the most recently used at the end of
1618 * the list. When more sources are added than the maximum allowed then the lea st recently used 1861 * the list. When more sources are added than the maximum allowed then the lea st recently used
1619 * source will be removed and will have it's cached AST structure flushed. 1862 * source will be removed and will have it's cached AST structure flushed.
1620 */ 1863 */
1621 List<Source> _recentlyUsed = new List<Source>(); 1864 List<Source> _recentlyUsed = new List<Source>();
1865
1622 /** 1866 /**
1623 * The object used to synchronize access to all of the caches. 1867 * The object used to synchronize access to all of the caches.
1624 */ 1868 */
1625 Object _cacheLock = new Object(); 1869 Object _cacheLock = new Object();
1870
1626 /** 1871 /**
1627 * The maximum number of sources for which data should be kept in the cache. 1872 * The maximum number of sources for which data should be kept in the cache.
1628 */ 1873 */
1629 static int _MAX_CACHE_SIZE = 64; 1874 static int _MAX_CACHE_SIZE = 64;
1875
1630 /** 1876 /**
1631 * The name of the 'src' attribute in a HTML tag. 1877 * The name of the 'src' attribute in a HTML tag.
1632 */ 1878 */
1633 static String _ATTRIBUTE_SRC = "src"; 1879 static String _ATTRIBUTE_SRC = "src";
1880
1634 /** 1881 /**
1635 * The name of the 'script' tag in an HTML file. 1882 * The name of the 'script' tag in an HTML file.
1636 */ 1883 */
1637 static String _TAG_SCRIPT = "script"; 1884 static String _TAG_SCRIPT = "script";
1885
1638 /** 1886 /**
1639 * The number of times that the flushing of information from the cache has bee n disabled without 1887 * The number of times that the flushing of information from the cache has bee n disabled without
1640 * being re-enabled. 1888 * being re-enabled.
1641 */ 1889 */
1642 int _cacheRemovalCount = 0; 1890 int _cacheRemovalCount = 0;
1643 /**
1644 * Initialize a newly created analysis context.
1645 */
1646 AnalysisContextImpl() : super() {
1647 }
1648 void addSourceInfo(Source source, SourceEntry info) { 1891 void addSourceInfo(Source source, SourceEntry info) {
1649 _sourceMap[source] = info; 1892 _sourceMap[source] = info;
1650 } 1893 }
1651 void applyChanges(ChangeSet changeSet) { 1894 void applyChanges(ChangeSet changeSet) {
1652 if (changeSet.isEmpty()) { 1895 if (changeSet.isEmpty()) {
1653 return; 1896 return;
1654 } 1897 }
1655 { 1898 {
1656 List<Source> removedSources = new List<Source>.from(changeSet.removed); 1899 List<Source> removedSources = new List<Source>.from(changeSet.removed);
1657 for (SourceContainer container in changeSet.removedContainers) { 1900 for (SourceContainer container in changeSet.removedContainers) {
1658 addSourcesInContainer(removedSources, container); 1901 addSourcesInContainer(removedSources, container);
1659 } 1902 }
1660 bool addedDartSource = false; 1903 bool addedDartSource = false;
1661 for (Source source in changeSet.added3) { 1904 for (Source source in changeSet.added3) {
1662 if (sourceAvailable(source)) { 1905 if (sourceAvailable(source)) {
1663 addedDartSource = true; 1906 addedDartSource = true;
1664 } 1907 }
1665 } 1908 }
1666 for (Source source in changeSet.changed3) { 1909 for (Source source in changeSet.changed3) {
1667 sourceChanged(source); 1910 sourceChanged(source);
1668 } 1911 }
1669 for (Source source in removedSources) { 1912 for (Source source in removedSources) {
1670 sourceRemoved(source); 1913 sourceRemoved(source);
1671 } 1914 }
1672 if (addedDartSource) { 1915 if (addedDartSource) {
1673 for (MapEntry<Source, SourceEntry> mapEntry in getMapEntrySet(_sourceMap )) { 1916 for (MapEntry<Source, SourceEntry> mapEntry in getMapEntrySet(_sourceMap )) {
1674 if (!mapEntry.getKey().isInSystemLibrary() && mapEntry.getValue() is D artEntry) { 1917 if (!mapEntry.getKey().isInSystemLibrary() && mapEntry.getValue() is D artEntry) {
1675 ((mapEntry.getValue() as DartEntryImpl)).invalidateAllResolutionInfo rmation(); 1918 DartEntryImpl dartCopy = ((mapEntry.getValue() as DartEntry)).writab leCopy;
1919 dartCopy.invalidateAllResolutionInformation();
1920 mapEntry.setValue(dartCopy);
1676 } 1921 }
1677 } 1922 }
1678 } 1923 }
1679 } 1924 }
1680 } 1925 }
1681 String computeDocumentationComment(Element element) { 1926 String computeDocumentationComment(Element element) {
1682 if (element == null) { 1927 if (element == null) {
1683 return null; 1928 return null;
1684 } 1929 }
1685 Source source2 = element.source; 1930 Source source2 = element.source;
1686 if (source2 == null) { 1931 if (source2 == null) {
1687 return null; 1932 return null;
1688 } 1933 }
1689 List<CharSequence> contentHolder = new List<CharSequence>(1); 1934 List<CharSequence> contentHolder = new List<CharSequence>(1);
1690 try { 1935 try {
1691 source2.getContents(new Source_ContentReceiver_5(contentHolder)); 1936 source2.getContents(new Source_ContentReceiver_6(contentHolder));
1692 } catch (exception) { 1937 } catch (exception) {
1693 throw new AnalysisException.con2("Could not get contents of ${source2.full Name}", exception); 1938 throw new AnalysisException.con2("Could not get contents of ${source2.full Name}", exception);
1694 } 1939 }
1695 if (contentHolder[0] == null) { 1940 if (contentHolder[0] == null) {
1696 return null; 1941 return null;
1697 } 1942 }
1698 CompilationUnit unit = parseCompilationUnit(source2); 1943 CompilationUnit unit = parseCompilationUnit(source2);
1699 if (unit == null) { 1944 if (unit == null) {
1700 return null; 1945 return null;
1701 } 1946 }
(...skipping 13 matching lines...) Expand all
1715 return null; 1960 return null;
1716 } 1961 }
1717 List<AnalysisError> computeErrors(Source source) { 1962 List<AnalysisError> computeErrors(Source source) {
1718 { 1963 {
1719 SourceEntry sourceEntry = getSourceEntry(source); 1964 SourceEntry sourceEntry = getSourceEntry(source);
1720 if (sourceEntry is DartEntry) { 1965 if (sourceEntry is DartEntry) {
1721 DartEntry dartEntry = sourceEntry as DartEntry; 1966 DartEntry dartEntry = sourceEntry as DartEntry;
1722 CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS) ; 1967 CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS) ;
1723 if (parseErrorsState != CacheState.VALID && parseErrorsState != CacheSta te.ERROR) { 1968 if (parseErrorsState != CacheState.VALID && parseErrorsState != CacheSta te.ERROR) {
1724 parseCompilationUnit(source); 1969 parseCompilationUnit(source);
1970 dartEntry = getSourceEntry(source) as DartEntry;
1725 } 1971 }
1726 List<Source> libraries = getLibrariesContaining(source); 1972 List<Source> libraries = getLibrariesContaining(source);
1727 for (Source librarySource in libraries) { 1973 for (Source librarySource in libraries) {
1728 CacheState resolutionErrorsState = dartEntry.getState2(DartEntry.RESOL UTION_ERRORS, librarySource); 1974 CacheState resolutionErrorsState = dartEntry.getState2(DartEntry.RESOL UTION_ERRORS, librarySource);
1729 if (resolutionErrorsState != CacheState.VALID && resolutionErrorsState != CacheState.ERROR) { 1975 if (resolutionErrorsState != CacheState.VALID && resolutionErrorsState != CacheState.ERROR) {
1730 } 1976 }
1731 } 1977 }
1732 return dartEntry.allErrors; 1978 return dartEntry.allErrors;
1733 } else if (sourceEntry is HtmlEntry) { 1979 } else if (sourceEntry is HtmlEntry) {
1734 HtmlEntry htmlEntry = sourceEntry as HtmlEntry; 1980 HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
1735 CacheState resolutionErrorsState = htmlEntry.getState(HtmlEntry.RESOLUTI ON_ERRORS); 1981 CacheState resolutionErrorsState = htmlEntry.getState(HtmlEntry.RESOLUTI ON_ERRORS);
1736 if (resolutionErrorsState != CacheState.VALID && resolutionErrorsState ! = CacheState.ERROR) { 1982 if (resolutionErrorsState != CacheState.VALID && resolutionErrorsState ! = CacheState.ERROR) {
1737 computeHtmlElement(source); 1983 computeHtmlElement(source);
1984 htmlEntry = getSourceEntry(source) as HtmlEntry;
1738 } 1985 }
1739 return htmlEntry.getValue(HtmlEntry.RESOLUTION_ERRORS); 1986 return htmlEntry.getValue(HtmlEntry.RESOLUTION_ERRORS);
1740 } 1987 }
1741 return AnalysisError.NO_ERRORS; 1988 return AnalysisError.NO_ERRORS;
1742 } 1989 }
1743 } 1990 }
1744 HtmlElement computeHtmlElement(Source source) { 1991 HtmlElement computeHtmlElement(Source source) {
1745 if (!AnalysisEngine.isHtmlFileName(source.shortName)) { 1992 if (!AnalysisEngine.isHtmlFileName(source.shortName)) {
1746 return null; 1993 return null;
1747 } 1994 }
1748 { 1995 {
1749 HtmlEntry htmlEntry = getHtmlEntry(source); 1996 HtmlEntry htmlEntry = getHtmlEntry(source);
1750 if (htmlEntry == null) { 1997 if (htmlEntry == null) {
1751 return null; 1998 return null;
1752 } 1999 }
1753 HtmlElement element = htmlEntry.getValue(HtmlEntry.ELEMENT); 2000 HtmlElement element = htmlEntry.getValue(HtmlEntry.ELEMENT);
1754 if (element == null) { 2001 if (element == null) {
1755 HtmlUnit unit = htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT); 2002 HtmlUnit unit = htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT);
1756 if (unit == null) { 2003 if (unit == null) {
1757 unit = htmlEntry.getValue(HtmlEntry.PARSED_UNIT); 2004 unit = htmlEntry.getValue(HtmlEntry.PARSED_UNIT);
1758 if (unit == null) { 2005 if (unit == null) {
1759 unit = parseHtmlUnit(source); 2006 unit = parseHtmlUnit(source);
1760 } 2007 }
1761 } 2008 }
1762 RecordingErrorListener listener = new RecordingErrorListener(); 2009 HtmlUnitBuilder builder = new HtmlUnitBuilder(this);
1763 HtmlUnitBuilder builder = new HtmlUnitBuilder(this, listener);
1764 element = builder.buildHtmlElement2(source, unit); 2010 element = builder.buildHtmlElement2(source, unit);
1765 List<AnalysisError> resolutionErrors = listener.getErrors2(source); 2011 List<AnalysisError> resolutionErrors = builder.errorListener.getErrors2( source);
1766 HtmlEntryImpl htmlCopy = (htmlEntry as HtmlEntryImpl); 2012 HtmlEntryImpl htmlCopy = getHtmlEntry(source).writableCopy;
1767 htmlCopy.setValue(HtmlEntry.RESOLVED_UNIT, unit); 2013 htmlCopy.setValue(HtmlEntry.RESOLVED_UNIT, unit);
1768 htmlCopy.setValue(HtmlEntry.RESOLUTION_ERRORS, resolutionErrors); 2014 htmlCopy.setValue(HtmlEntry.RESOLUTION_ERRORS, resolutionErrors);
1769 htmlCopy.setValue(HtmlEntry.ELEMENT, element); 2015 htmlCopy.setValue(HtmlEntry.ELEMENT, element);
1770 getNotice(source).setErrors(resolutionErrors, htmlCopy.getValue(SourceEn try.LINE_INFO)); 2016 _sourceMap[source] = htmlCopy;
2017 getNotice(source).setErrors(htmlCopy.allErrors, htmlCopy.getValue(Source Entry.LINE_INFO));
1771 } 2018 }
1772 return element; 2019 return element;
1773 } 2020 }
1774 } 2021 }
1775 SourceKind computeKindOf(Source source) { 2022 SourceKind computeKindOf(Source source) {
1776 { 2023 {
1777 SourceEntry sourceEntry = getSourceEntry(source); 2024 SourceEntry sourceEntry = getSourceEntry(source);
1778 if (sourceEntry == null) { 2025 if (sourceEntry == null) {
1779 return SourceKind.UNKNOWN; 2026 return SourceKind.UNKNOWN;
1780 } else if (sourceEntry is DartEntry) { 2027 } else if (sourceEntry is DartEntry) {
1781 DartEntry dartEntry = sourceEntry as DartEntry; 2028 DartEntry dartEntry = sourceEntry as DartEntry;
1782 CacheState sourceKindState = dartEntry.getState(DartEntry.SOURCE_KIND); 2029 CacheState sourceKindState = dartEntry.getState(DartEntry.SOURCE_KIND);
1783 if (sourceKindState != CacheState.VALID && sourceKindState != CacheState .ERROR) { 2030 if (sourceKindState != CacheState.VALID && sourceKindState != CacheState .ERROR) {
1784 internalComputeKindOf(source); 2031 internalComputeKindOf(source);
2032 sourceEntry = getSourceEntry(source);
1785 } 2033 }
1786 } 2034 }
1787 return sourceEntry.kind; 2035 return sourceEntry.kind;
1788 } 2036 }
1789 } 2037 }
1790 LibraryElement computeLibraryElement(Source source) { 2038 LibraryElement computeLibraryElement(Source source) {
1791 if (!AnalysisEngine.isDartFileName(source.shortName)) { 2039 if (!AnalysisEngine.isDartFileName(source.shortName)) {
1792 return null; 2040 return null;
1793 } 2041 }
1794 { 2042 {
1795 DartEntry dartEntry = getDartEntry(source); 2043 DartEntry dartEntry = getDartEntry(source);
1796 if (dartEntry == null) { 2044 if (dartEntry == null) {
1797 return null; 2045 return null;
1798 } 2046 }
1799 LibraryElement element = dartEntry.getValue(DartEntry.ELEMENT); 2047 LibraryElement element = dartEntry.getValue(DartEntry.ELEMENT);
1800 if (element == null) { 2048 if (element == null) {
1801 if (computeKindOf(source) != SourceKind.LIBRARY) { 2049 LibraryResolver resolver = new LibraryResolver(this);
1802 throw new AnalysisException.con1("Cannot compute library element for n on-library: ${source.fullName}");
1803 }
1804 LibraryResolver resolver = new LibraryResolver.con1(this);
1805 try { 2050 try {
1806 element = resolver.resolveLibrary(source, true); 2051 element = resolver.resolveLibrary(source, true);
1807 if (element != null) { 2052 recordResolutionResults(resolver);
1808 ((dartEntry as DartEntryImpl)).setValue(DartEntry.ELEMENT, element);
1809 }
1810 } on AnalysisException catch (exception) { 2053 } on AnalysisException catch (exception) {
2054 DartEntryImpl dartCopy = getDartEntry(source).writableCopy;
2055 dartCopy.setState(DartEntry.ELEMENT, CacheState.ERROR);
2056 _sourceMap[source] = dartCopy;
1811 AnalysisEngine.instance.logger.logError2("Could not resolve the librar y ${source.fullName}", exception); 2057 AnalysisEngine.instance.logger.logError2("Could not resolve the librar y ${source.fullName}", exception);
1812 } 2058 }
1813 } 2059 }
1814 return element; 2060 return element;
1815 } 2061 }
1816 } 2062 }
1817 LineInfo computeLineInfo(Source source) { 2063 LineInfo computeLineInfo(Source source) {
1818 { 2064 {
1819 SourceEntry sourceEntry = getSourceEntry(source); 2065 SourceEntry sourceEntry = getSourceEntry(source);
1820 if (sourceEntry == null) { 2066 if (sourceEntry == null) {
1821 return null; 2067 return null;
1822 } 2068 }
1823 LineInfo lineInfo = sourceEntry.getValue(SourceEntry.LINE_INFO); 2069 LineInfo lineInfo = sourceEntry.getValue(SourceEntry.LINE_INFO);
1824 if (lineInfo == null) { 2070 if (lineInfo == null) {
1825 if (sourceEntry is HtmlEntry) { 2071 if (sourceEntry is HtmlEntry) {
1826 parseHtmlUnit(source); 2072 parseHtmlUnit(source);
1827 lineInfo = sourceEntry.getValue(SourceEntry.LINE_INFO); 2073 lineInfo = getSourceEntry(source).getValue(SourceEntry.LINE_INFO);
1828 } else if (sourceEntry is DartEntry) { 2074 } else if (sourceEntry is DartEntry) {
1829 parseCompilationUnit(source); 2075 parseCompilationUnit(source);
1830 lineInfo = sourceEntry.getValue(SourceEntry.LINE_INFO); 2076 lineInfo = getSourceEntry(source).getValue(SourceEntry.LINE_INFO);
1831 } 2077 }
1832 } 2078 }
1833 return lineInfo; 2079 return lineInfo;
1834 } 2080 }
1835 } 2081 }
1836 CompilationUnit computeResolvableCompilationUnit(Source source) { 2082 CompilationUnit computeResolvableCompilationUnit(Source source) {
1837 { 2083 {
1838 DartEntry dartEntry = getDartEntry(source); 2084 DartEntry dartEntry = getDartEntry(source);
1839 if (dartEntry == null) { 2085 if (dartEntry == null) {
1840 return null; 2086 return null;
1841 } 2087 }
1842 CompilationUnit unit = dartEntry.anyParsedCompilationUnit; 2088 CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
1843 if (unit != null) { 2089 if (unit != null) {
1844 return unit.accept(new ASTCloner()) as CompilationUnit; 2090 return unit.accept(new ASTCloner()) as CompilationUnit;
1845 } 2091 }
1846 unit = internalParseCompilationUnit(((dartEntry as DartEntryImpl)), source ); 2092 DartEntryImpl dartCopy = dartEntry.writableCopy;
1847 ((dartEntry as DartEntryImpl)).setState(DartEntry.PARSED_UNIT, CacheState. FLUSHED); 2093 unit = internalParseCompilationUnit(dartCopy, source);
2094 dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
2095 _sourceMap[source] = dartCopy;
1848 return unit; 2096 return unit;
1849 } 2097 }
1850 } 2098 }
1851 AnalysisContext extractContext(SourceContainer container) => extractContextInt o(container, (AnalysisEngine.instance.createAnalysisContext() as AnalysisContext Impl)); 2099 AnalysisContext extractContext(SourceContainer container) => extractContextInt o(container, (AnalysisEngine.instance.createAnalysisContext() as InternalAnalysi sContext));
1852 InternalAnalysisContext extractContextInto(SourceContainer container, Internal AnalysisContext newContext) { 2100 InternalAnalysisContext extractContextInto(SourceContainer container, Internal AnalysisContext newContext) {
1853 List<Source> sourcesToRemove = new List<Source>(); 2101 List<Source> sourcesToRemove = new List<Source>();
1854 { 2102 {
1855 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) { 2103 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
1856 Source source = entry.getKey(); 2104 Source source = entry.getKey();
1857 if (container.contains(source)) { 2105 if (container.contains(source)) {
1858 sourcesToRemove.add(source); 2106 sourcesToRemove.add(source);
1859 newContext.addSourceInfo(source, entry.getValue().writableCopy); 2107 newContext.addSourceInfo(source, entry.getValue().writableCopy);
1860 } 2108 }
1861 } 2109 }
1862 } 2110 }
1863 return newContext; 2111 return newContext;
1864 } 2112 }
2113 AnalysisOptions get analysisOptions => _options;
1865 Element getElement(ElementLocation location) { 2114 Element getElement(ElementLocation location) {
1866 List<String> components2 = ((location as ElementLocationImpl)).components; 2115 List<String> components2 = ((location as ElementLocationImpl)).components;
1867 ElementImpl element; 2116 ElementImpl element;
1868 { 2117 {
1869 Source librarySource = _sourceFactory.fromEncoding(components2[0]); 2118 Source librarySource = _sourceFactory.fromEncoding(components2[0]);
1870 try { 2119 try {
1871 element = computeLibraryElement(librarySource) as ElementImpl; 2120 element = computeLibraryElement(librarySource) as ElementImpl;
1872 } on AnalysisException catch (exception) { 2121 } on AnalysisException catch (exception) {
1873 return null; 2122 return null;
1874 } 2123 }
1875 } 2124 }
1876 for (int i = 1; i < components2.length; i++) { 2125 for (int i = 1; i < components2.length; i++) {
1877 if (element == null) { 2126 if (element == null) {
1878 return null; 2127 return null;
1879 } 2128 }
1880 element = element.getChild(components2[i]); 2129 element = element.getChild(components2[i]);
1881 } 2130 }
1882 return element; 2131 return element;
1883 } 2132 }
1884 AnalysisErrorInfo getErrors(Source source) { 2133 AnalysisErrorInfo getErrors(Source source) {
1885 { 2134 SourceEntry sourceEntry = getReadableSourceEntry(source);
1886 SourceEntry sourceEntry = getSourceEntry(source); 2135 if (sourceEntry is DartEntry) {
1887 if (sourceEntry is DartEntry) { 2136 DartEntry dartEntry = sourceEntry as DartEntry;
1888 DartEntry dartEntry = sourceEntry as DartEntry; 2137 return new AnalysisErrorInfoImpl(dartEntry.allErrors, dartEntry.getValue(S ourceEntry.LINE_INFO));
1889 return new AnalysisErrorInfoImpl(dartEntry.allErrors, dartEntry.getValue (SourceEntry.LINE_INFO)); 2138 } else if (sourceEntry is HtmlEntry) {
1890 } else if (sourceEntry is HtmlEntry) { 2139 HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
1891 HtmlEntry htmlEntry = sourceEntry as HtmlEntry; 2140 return new AnalysisErrorInfoImpl(htmlEntry.allErrors, htmlEntry.getValue(S ourceEntry.LINE_INFO));
1892 return new AnalysisErrorInfoImpl(htmlEntry.getValue(HtmlEntry.RESOLUTION _ERRORS), htmlEntry.getValue(SourceEntry.LINE_INFO));
1893 }
1894 return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, sourceEntry.getV alue(SourceEntry.LINE_INFO));
1895 } 2141 }
2142 return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null);
1896 } 2143 }
1897 HtmlElement getHtmlElement(Source source) { 2144 HtmlElement getHtmlElement(Source source) {
1898 { 2145 SourceEntry sourceEntry = getReadableSourceEntry(source);
1899 SourceEntry sourceEntry = getSourceEntry(source); 2146 if (sourceEntry is HtmlEntry) {
1900 if (sourceEntry is HtmlEntry) { 2147 return ((sourceEntry as HtmlEntry)).getValue(HtmlEntry.ELEMENT);
1901 return ((sourceEntry as HtmlEntry)).getValue(HtmlEntry.ELEMENT);
1902 }
1903 return null;
1904 } 2148 }
2149 return null;
1905 } 2150 }
1906 List<Source> getHtmlFilesReferencing(Source source) { 2151 List<Source> getHtmlFilesReferencing(Source source) {
1907 { 2152 {
1908 List<Source> htmlSources = new List<Source>(); 2153 List<Source> htmlSources = new List<Source>();
1909 while (true) { 2154 while (true) {
1910 if (getKindOf(source) == SourceKind.LIBRARY) { 2155 if (getKindOf(source) == SourceKind.LIBRARY) {
1911 } else if (getKindOf(source) == SourceKind.PART) { 2156 } else if (getKindOf(source) == SourceKind.PART) {
1912 List<Source> librarySources = getLibrariesContaining(source); 2157 List<Source> librarySources = getLibrariesContaining(source);
1913 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap) ) { 2158 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap) ) {
1914 if (identical(entry.getValue().kind, SourceKind.HTML)) { 2159 if (identical(entry.getValue().kind, SourceKind.HTML)) {
1915 List<Source> referencedLibraries = ((entry.getValue() as HtmlEntry )).getValue(HtmlEntry.REFERENCED_LIBRARIES); 2160 List<Source> referencedLibraries = ((entry.getValue() as HtmlEntry )).getValue(HtmlEntry.REFERENCED_LIBRARIES);
1916 if (containsAny(referencedLibraries, librarySources)) { 2161 if (containsAny(referencedLibraries, librarySources)) {
1917 htmlSources.add(entry.getKey()); 2162 htmlSources.add(entry.getKey());
1918 } 2163 }
1919 } 2164 }
1920 } 2165 }
1921 } 2166 }
1922 break; 2167 break;
1923 } 2168 }
1924 if (htmlSources.isEmpty) { 2169 if (htmlSources.isEmpty) {
1925 return Source.EMPTY_ARRAY; 2170 return Source.EMPTY_ARRAY;
1926 } 2171 }
1927 return new List.from(htmlSources); 2172 return new List.from(htmlSources);
1928 } 2173 }
1929 } 2174 }
1930 List<Source> get htmlSources => getSources(SourceKind.HTML); 2175 List<Source> get htmlSources => getSources(SourceKind.HTML);
1931 SourceKind getKindOf(Source source) { 2176 SourceKind getKindOf(Source source) {
1932 { 2177 SourceEntry sourceEntry = getReadableSourceEntry(source);
1933 SourceEntry sourceEntry = getSourceEntry(source); 2178 if (sourceEntry == null) {
1934 if (sourceEntry == null) { 2179 if (AnalysisEngine.isHtmlFileName(source.shortName)) {
1935 return SourceKind.UNKNOWN; 2180 return SourceKind.HTML;
1936 } 2181 }
1937 return sourceEntry.kind; 2182 return SourceKind.UNKNOWN;
1938 } 2183 }
2184 return sourceEntry.kind;
1939 } 2185 }
1940 List<Source> get launchableClientLibrarySources { 2186 List<Source> get launchableClientLibrarySources {
1941 List<Source> sources = new List<Source>(); 2187 List<Source> sources = new List<Source>();
1942 { 2188 {
1943 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) { 2189 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
1944 Source source = entry.getKey(); 2190 Source source = entry.getKey();
1945 SourceEntry sourceEntry = entry.getValue(); 2191 SourceEntry sourceEntry = entry.getValue();
1946 if (identical(sourceEntry.kind, SourceKind.LIBRARY) && !source.isInSyste mLibrary()) { 2192 if (identical(sourceEntry.kind, SourceKind.LIBRARY) && !source.isInSyste mLibrary()) {
1947 sources.add(source); 2193 sources.add(source);
1948 } 2194 }
(...skipping 23 matching lines...) Expand all
1972 librarySources.add(entry.getKey()); 2218 librarySources.add(entry.getKey());
1973 } 2219 }
1974 } 2220 }
1975 } 2221 }
1976 if (librarySources.isEmpty) { 2222 if (librarySources.isEmpty) {
1977 return Source.EMPTY_ARRAY; 2223 return Source.EMPTY_ARRAY;
1978 } 2224 }
1979 return new List.from(librarySources); 2225 return new List.from(librarySources);
1980 } 2226 }
1981 } 2227 }
2228 List<Source> getLibrariesDependingOn(Source librarySource) {
2229 {
2230 List<Source> dependentLibraries = new List<Source>();
2231 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
2232 if (identical(entry.getValue().kind, SourceKind.LIBRARY)) {
2233 if (contains(((entry.getValue() as DartEntry)).getValue(DartEntry.REFE RENCED_LIBRARIES), librarySource)) {
2234 dependentLibraries.add(entry.getKey());
2235 }
2236 }
2237 }
2238 if (dependentLibraries.isEmpty) {
2239 return Source.EMPTY_ARRAY;
2240 }
2241 return new List.from(dependentLibraries);
2242 }
2243 }
1982 LibraryElement getLibraryElement(Source source) { 2244 LibraryElement getLibraryElement(Source source) {
1983 { 2245 SourceEntry sourceEntry = getReadableSourceEntry(source);
1984 SourceEntry sourceEntry = getSourceEntry(source); 2246 if (sourceEntry is DartEntry) {
1985 if (sourceEntry is DartEntry) { 2247 return ((sourceEntry as DartEntry)).getValue(DartEntry.ELEMENT);
1986 return ((sourceEntry as DartEntry)).getValue(DartEntry.ELEMENT);
1987 }
1988 return null;
1989 } 2248 }
2249 return null;
1990 } 2250 }
1991 List<Source> get librarySources => getSources(SourceKind.LIBRARY); 2251 List<Source> get librarySources => getSources(SourceKind.LIBRARY);
1992 LineInfo getLineInfo(Source source) { 2252 LineInfo getLineInfo(Source source) {
1993 { 2253 SourceEntry sourceEntry = getReadableSourceEntry(source);
1994 SourceEntry sourceEntry = getSourceEntry(source); 2254 if (sourceEntry != null) {
1995 if (sourceEntry != null) { 2255 return sourceEntry.getValue(SourceEntry.LINE_INFO);
1996 return sourceEntry.getValue(SourceEntry.LINE_INFO);
1997 }
1998 return null;
1999 } 2256 }
2257 return null;
2000 } 2258 }
2001 Namespace getPublicNamespace(LibraryElement library) { 2259 Namespace getPublicNamespace(LibraryElement library) {
2002 Source source2 = library.definingCompilationUnit.source; 2260 Source source2 = library.definingCompilationUnit.source;
2003 { 2261 {
2004 DartEntry dartEntry = getDartEntry(source2); 2262 DartEntry dartEntry = getDartEntry(source2);
2005 if (dartEntry == null) { 2263 if (dartEntry == null) {
2006 return null; 2264 return null;
2007 } 2265 }
2008 Namespace namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE); 2266 Namespace namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE);
2009 if (namespace == null) { 2267 if (namespace == null) {
2010 NamespaceBuilder builder = new NamespaceBuilder(); 2268 NamespaceBuilder builder = new NamespaceBuilder();
2011 namespace = builder.createPublicNamespace(library); 2269 namespace = builder.createPublicNamespace(library);
2012 ((dartEntry as DartEntryImpl)).setValue(DartEntry.PUBLIC_NAMESPACE, name space); 2270 DartEntryImpl dartCopy = dartEntry.writableCopy;
2271 dartCopy.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
2272 _sourceMap[source2] = dartCopy;
2013 } 2273 }
2014 return namespace; 2274 return namespace;
2015 } 2275 }
2016 } 2276 }
2017 Namespace getPublicNamespace2(Source source) { 2277 Namespace getPublicNamespace2(Source source) {
2018 { 2278 {
2019 DartEntry dartEntry = getDartEntry(source); 2279 DartEntry dartEntry = getDartEntry(source);
2020 if (dartEntry == null) { 2280 if (dartEntry == null) {
2021 return null; 2281 return null;
2022 } 2282 }
2023 Namespace namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE); 2283 Namespace namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE);
2024 if (namespace == null) { 2284 if (namespace == null) {
2025 LibraryElement library = computeLibraryElement(source); 2285 LibraryElement library = computeLibraryElement(source);
2026 if (library == null) { 2286 if (library == null) {
2027 return null; 2287 return null;
2028 } 2288 }
2029 NamespaceBuilder builder = new NamespaceBuilder(); 2289 NamespaceBuilder builder = new NamespaceBuilder();
2030 namespace = builder.createPublicNamespace(library); 2290 namespace = builder.createPublicNamespace(library);
2031 ((dartEntry as DartEntryImpl)).setValue(DartEntry.PUBLIC_NAMESPACE, name space); 2291 DartEntryImpl dartCopy = dartEntry.writableCopy;
2292 dartCopy.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
2293 _sourceMap[source] = dartCopy;
2032 } 2294 }
2033 return namespace; 2295 return namespace;
2034 } 2296 }
2035 } 2297 }
2036 CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement l ibrary) { 2298 CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement l ibrary) {
2037 if (library == null) { 2299 if (library == null) {
2038 return null; 2300 return null;
2039 } 2301 }
2040 return getResolvedCompilationUnit2(unitSource, library.source); 2302 return getResolvedCompilationUnit2(unitSource, library.source);
2041 } 2303 }
2042 CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source libraryS ource) { 2304 CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source libraryS ource) {
2043 { 2305 SourceEntry sourceEntry = getReadableSourceEntry(unitSource);
2044 accessed(unitSource); 2306 if (sourceEntry is DartEntry) {
2045 DartEntry dartEntry = getDartEntry(unitSource); 2307 return ((sourceEntry as DartEntry)).getValue2(DartEntry.RESOLVED_UNIT, lib rarySource);
2046 if (dartEntry == null) {
2047 return null;
2048 }
2049 return dartEntry.getValue2(DartEntry.RESOLVED_UNIT, librarySource);
2050 } 2308 }
2309 return null;
2051 } 2310 }
2052 SourceFactory get sourceFactory => _sourceFactory; 2311 SourceFactory get sourceFactory => _sourceFactory;
2053 bool isClientLibrary(Source librarySource) { 2312 bool isClientLibrary(Source librarySource) {
2054 SourceEntry sourceEntry = getSourceEntry(librarySource); 2313 SourceEntry sourceEntry = getReadableSourceEntry(librarySource);
2055 if (sourceEntry is DartEntry) { 2314 if (sourceEntry is DartEntry) {
2056 DartEntry dartEntry = sourceEntry as DartEntry; 2315 DartEntry dartEntry = sourceEntry as DartEntry;
2057 CacheState isClientState = dartEntry.getState(DartEntry.IS_CLIENT);
2058 CacheState isLaunchableState = dartEntry.getState(DartEntry.IS_LAUNCHABLE) ;
2059 if (identical(isClientState, CacheState.INVALID) || identical(isClientStat e, CacheState.ERROR) || identical(isLaunchableState, CacheState.INVALID) || iden tical(isLaunchableState, CacheState.ERROR)) {
2060 return false;
2061 }
2062 return dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartE ntry.IS_LAUNCHABLE); 2316 return dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartE ntry.IS_LAUNCHABLE);
2063 } 2317 }
2064 return false; 2318 return false;
2065 } 2319 }
2066 bool isServerLibrary(Source librarySource) { 2320 bool isServerLibrary(Source librarySource) {
2067 SourceEntry sourceEntry = getSourceEntry(librarySource); 2321 SourceEntry sourceEntry = getReadableSourceEntry(librarySource);
2068 if (sourceEntry is DartEntry) { 2322 if (sourceEntry is DartEntry) {
2069 DartEntry dartEntry = sourceEntry as DartEntry; 2323 DartEntry dartEntry = sourceEntry as DartEntry;
2070 CacheState isClientState = dartEntry.getState(DartEntry.IS_CLIENT);
2071 CacheState isLaunchableState = dartEntry.getState(DartEntry.IS_LAUNCHABLE) ;
2072 if (identical(isClientState, CacheState.INVALID) || identical(isClientStat e, CacheState.ERROR) || identical(isLaunchableState, CacheState.INVALID) || iden tical(isLaunchableState, CacheState.ERROR)) {
2073 return false;
2074 }
2075 return !dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(Dart Entry.IS_LAUNCHABLE); 2324 return !dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(Dart Entry.IS_LAUNCHABLE);
2076 } 2325 }
2077 return false; 2326 return false;
2078 } 2327 }
2079 void mergeContext(AnalysisContext context) { 2328 void mergeContext(AnalysisContext context) {
2080 { 2329 {
2081 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(((context as An alysisContextImpl))._sourceMap)) { 2330 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(((context as An alysisContextImpl))._sourceMap)) {
2082 Source newSource = entry.getKey(); 2331 Source newSource = entry.getKey();
2083 SourceEntry existingEntry = getSourceEntry(newSource); 2332 SourceEntry existingEntry = getSourceEntry(newSource);
2084 if (existingEntry == null) { 2333 if (existingEntry == null) {
2085 _sourceMap[newSource] = entry.getValue().writableCopy; 2334 _sourceMap[newSource] = entry.getValue().writableCopy;
2086 } else { 2335 } else {
2087 } 2336 }
2088 } 2337 }
2089 } 2338 }
2090 } 2339 }
2091 CompilationUnit parseCompilationUnit(Source source) { 2340 CompilationUnit parseCompilationUnit(Source source) {
2092 { 2341 {
2093 accessed(source); 2342 accessed(source);
2094 DartEntry dartEntry = getDartEntry(source); 2343 DartEntry dartEntry = getDartEntry(source);
2095 if (dartEntry == null) { 2344 if (dartEntry == null) {
2096 return null; 2345 return null;
2097 } 2346 }
2098 CompilationUnit unit = dartEntry.anyParsedCompilationUnit; 2347 CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
2099 if (unit == null) { 2348 if (unit == null) {
2100 unit = internalParseCompilationUnit((dartEntry as DartEntryImpl), source ); 2349 DartEntryImpl dartCopy = dartEntry.writableCopy;
2350 unit = internalParseCompilationUnit(dartCopy, source);
2351 _sourceMap[source] = dartCopy;
2101 } 2352 }
2102 return unit; 2353 return unit;
2103 } 2354 }
2104 } 2355 }
2105 HtmlUnit parseHtmlUnit(Source source) { 2356 HtmlUnit parseHtmlUnit(Source source) {
2106 { 2357 {
2107 accessed(source); 2358 accessed(source);
2108 HtmlEntry htmlEntry = getHtmlEntry(source); 2359 HtmlEntry htmlEntry = getHtmlEntry(source);
2109 if (htmlEntry == null) { 2360 if (htmlEntry == null) {
2110 return null; 2361 return null;
2111 } 2362 }
2112 HtmlUnit unit = htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT); 2363 HtmlUnit unit = htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT);
2113 if (unit == null) { 2364 if (unit == null) {
2114 unit = htmlEntry.getValue(HtmlEntry.PARSED_UNIT); 2365 unit = htmlEntry.getValue(HtmlEntry.PARSED_UNIT);
2115 if (unit == null) { 2366 if (unit == null) {
2116 HtmlParseResult result = new HtmlParser(source).parse(scanHtml(source) ); 2367 HtmlParseResult result = new HtmlParser(source).parse(scanHtml(source) );
2117 unit = result.htmlUnit; 2368 unit = result.htmlUnit;
2118 ((htmlEntry as HtmlEntryImpl)).setValue(SourceEntry.LINE_INFO, new Lin eInfo(result.lineStarts)); 2369 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
2119 ((htmlEntry as HtmlEntryImpl)).setValue(HtmlEntry.PARSED_UNIT, unit); 2370 htmlCopy.setValue(SourceEntry.LINE_INFO, new LineInfo(result.lineStart s));
2120 ((htmlEntry as HtmlEntryImpl)).setValue(HtmlEntry.REFERENCED_LIBRARIES , getLibrarySources2(source, unit)); 2371 htmlCopy.setValue(HtmlEntry.PARSED_UNIT, unit);
2372 htmlCopy.setValue(HtmlEntry.REFERENCED_LIBRARIES, getLibrarySources2(s ource, unit));
2373 _sourceMap[source] = htmlCopy;
2121 } 2374 }
2122 } 2375 }
2123 return unit; 2376 return unit;
2124 } 2377 }
2125 } 2378 }
2126 List<ChangeNotice> performAnalysisTask() { 2379 List<ChangeNotice> performAnalysisTask() {
2127 { 2380 {
2128 if (!performSingleAnalysisTask() && _pendingNotices.isEmpty) { 2381 if (!performSingleAnalysisTask() && _pendingNotices.isEmpty) {
2129 return null; 2382 return null;
2130 } 2383 }
2131 if (_pendingNotices.isEmpty) { 2384 if (_pendingNotices.isEmpty) {
2132 return ChangeNoticeImpl.EMPTY_ARRAY; 2385 return ChangeNoticeImpl.EMPTY_ARRAY;
2133 } 2386 }
2134 List<ChangeNotice> notices = new List.from(_pendingNotices.values); 2387 List<ChangeNotice> notices = new List.from(_pendingNotices.values);
2135 _pendingNotices.clear(); 2388 _pendingNotices.clear();
2136 return notices; 2389 return notices;
2137 } 2390 }
2138 } 2391 }
2139 void recordLibraryElements(Map<Source, LibraryElement> elementMap) { 2392 void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
2140 Source htmlSource = _sourceFactory.forUri("dart:html"); 2393 Source htmlSource = _sourceFactory.forUri(DartSdk.DART_HTML);
2141 { 2394 {
2142 for (MapEntry<Source, LibraryElement> entry in getMapEntrySet(elementMap)) { 2395 for (MapEntry<Source, LibraryElement> entry in getMapEntrySet(elementMap)) {
2143 Source librarySource = entry.getKey(); 2396 Source librarySource = entry.getKey();
2144 LibraryElement library = entry.getValue(); 2397 LibraryElement library = entry.getValue();
2145 DartEntryImpl dartEntry = getDartEntry(librarySource) as DartEntryImpl; 2398 DartEntry dartEntry = getDartEntry(librarySource);
2146 if (dartEntry != null) { 2399 if (dartEntry != null) {
2147 dartEntry.setValue(DartEntry.ELEMENT, library); 2400 DartEntryImpl dartCopy = dartEntry.writableCopy;
2148 dartEntry.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null ); 2401 recordElementData(dartCopy, library, htmlSource);
2149 dartEntry.setValue(DartEntry.IS_CLIENT, isClient(library, htmlSource, new Set<LibraryElement>())); 2402 _sourceMap[librarySource] = dartCopy;
2150 List<Source> unitSources = new List<Source>();
2151 unitSources.add(librarySource);
2152 for (CompilationUnitElement part in library.parts) {
2153 Source partSource = part.source;
2154 unitSources.add(partSource);
2155 }
2156 dartEntry.setValue(DartEntry.INCLUDED_PARTS, new List.from(unitSources ));
2157 } 2403 }
2158 } 2404 }
2159 } 2405 }
2160 } 2406 }
2161 void recordResolutionErrors(Source source, Source librarySource, List<Analysis Error> errors, LineInfo lineInfo) {
2162 {
2163 DartEntryImpl dartEntry = getDartEntry(source) as DartEntryImpl;
2164 if (dartEntry != null) {
2165 dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
2166 dartEntry.setValue2(DartEntry.RESOLUTION_ERRORS, librarySource, errors);
2167 }
2168 getNotice(source).setErrors(dartEntry.allErrors, lineInfo);
2169 }
2170 }
2171 void recordResolvedCompilationUnit(Source source, Source librarySource, Compil ationUnit unit) {
2172 {
2173 DartEntryImpl dartEntry = getDartEntry(source) as DartEntryImpl;
2174 if (dartEntry != null) {
2175 dartEntry.setValue2(DartEntry.RESOLVED_UNIT, librarySource, unit);
2176 dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
2177 getNotice(source).compilationUnit = unit;
2178 }
2179 }
2180 }
2181 CompilationUnit resolveCompilationUnit(Source source2, LibraryElement library) { 2407 CompilationUnit resolveCompilationUnit(Source source2, LibraryElement library) {
2182 if (library == null) { 2408 if (library == null) {
2183 return null; 2409 return null;
2184 } 2410 }
2185 return resolveCompilationUnit2(source2, library.source); 2411 return resolveCompilationUnit2(source2, library.source);
2186 } 2412 }
2187 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e) { 2413 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e) {
2188 { 2414 {
2189 accessed(unitSource); 2415 accessed(unitSource);
2190 DartEntry dartEntry = getDartEntry(unitSource); 2416 DartEntry dartEntry = getDartEntry(unitSource);
(...skipping 11 matching lines...) Expand all
2202 LibraryElement coreElement = computeLibraryElement(coreLibrarySource ); 2428 LibraryElement coreElement = computeLibraryElement(coreLibrarySource );
2203 TypeProvider typeProvider = new TypeProviderImpl(coreElement); 2429 TypeProvider typeProvider = new TypeProviderImpl(coreElement);
2204 CompilationUnit unitAST = computeResolvableCompilationUnit(unitSourc e); 2430 CompilationUnit unitAST = computeResolvableCompilationUnit(unitSourc e);
2205 new DeclarationResolver().resolve(unitAST, find(libraryElement, unit Source)); 2431 new DeclarationResolver().resolve(unitAST, find(libraryElement, unit Source));
2206 RecordingErrorListener errorListener = new RecordingErrorListener(); 2432 RecordingErrorListener errorListener = new RecordingErrorListener();
2207 TypeResolverVisitor typeResolverVisitor = new TypeResolverVisitor.co n2(libraryElement, unitSource, typeProvider, errorListener); 2433 TypeResolverVisitor typeResolverVisitor = new TypeResolverVisitor.co n2(libraryElement, unitSource, typeProvider, errorListener);
2208 unitAST.accept(typeResolverVisitor); 2434 unitAST.accept(typeResolverVisitor);
2209 ResolverVisitor resolverVisitor = new ResolverVisitor.con2(libraryEl ement, unitSource, typeProvider, errorListener); 2435 ResolverVisitor resolverVisitor = new ResolverVisitor.con2(libraryEl ement, unitSource, typeProvider, errorListener);
2210 unitAST.accept(resolverVisitor); 2436 unitAST.accept(resolverVisitor);
2211 ErrorReporter errorReporter = new ErrorReporter(errorListener, unitS ource); 2437 ErrorReporter errorReporter = new ErrorReporter(errorListener, unitS ource);
2212 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libra ryElement, typeProvider); 2438 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libra ryElement, typeProvider, new InheritanceManager(libraryElement));
2213 unitAST.accept(errorVerifier); 2439 unitAST.accept(errorVerifier);
2214 ConstantVerifier constantVerifier = new ConstantVerifier(errorReport er); 2440 ConstantVerifier constantVerifier = new ConstantVerifier(errorReport er, typeProvider);
2215 unitAST.accept(constantVerifier); 2441 unitAST.accept(constantVerifier);
2216 unitAST.resolutionErrors = errorListener.errors; 2442 unitAST.resolutionErrors = errorListener.errors;
2217 ((dartEntry as DartEntryImpl)).setValue2(DartEntry.RESOLVED_UNIT, li brarySource, unitAST); 2443 DartEntryImpl dartCopy = getDartEntry(unitSource).writableCopy;
2444 dartCopy.setValue2(DartEntry.RESOLVED_UNIT, librarySource, unitAST);
2445 _sourceMap[unitSource] = dartCopy;
2218 unit = unitAST; 2446 unit = unitAST;
2219 } 2447 }
2220 } finally { 2448 } finally {
2221 enableCacheRemoval(); 2449 enableCacheRemoval();
2222 } 2450 }
2223 } 2451 }
2224 return unit; 2452 return unit;
2225 } 2453 }
2226 } 2454 }
2227 HtmlUnit resolveHtmlUnit(Source unitSource) { 2455 HtmlUnit resolveHtmlUnit(Source unitSource) {
(...skipping 12 matching lines...) Expand all
2240 if (unit == null) { 2468 if (unit == null) {
2241 unit = parseHtmlUnit(unitSource); 2469 unit = parseHtmlUnit(unitSource);
2242 } 2470 }
2243 } finally { 2471 } finally {
2244 enableCacheRemoval(); 2472 enableCacheRemoval();
2245 } 2473 }
2246 } 2474 }
2247 return unit; 2475 return unit;
2248 } 2476 }
2249 } 2477 }
2478 void set analysisOptions(AnalysisOptions options2) {
2479 {
2480 this._options = options2;
2481 invalidateAllResults();
2482 }
2483 }
2250 void setContents(Source source, String contents) { 2484 void setContents(Source source, String contents) {
2251 { 2485 {
2252 _sourceFactory.setContents(source, contents); 2486 _sourceFactory.setContents(source, contents);
2253 sourceChanged(source); 2487 sourceChanged(source);
2254 } 2488 }
2255 } 2489 }
2256 void set sourceFactory(SourceFactory factory) { 2490 void set sourceFactory(SourceFactory factory) {
2257 if (identical(_sourceFactory, factory)) { 2491 if (identical(_sourceFactory, factory)) {
2258 return; 2492 return;
2259 } else if (factory.context != null) { 2493 } else if (factory.context != null) {
2260 throw new IllegalStateException("Source factories cannot be shared between contexts"); 2494 throw new IllegalStateException("Source factories cannot be shared between contexts");
2261 } 2495 }
2262 { 2496 {
2263 if (_sourceFactory != null) { 2497 if (_sourceFactory != null) {
2264 _sourceFactory.context = null; 2498 _sourceFactory.context = null;
2265 } 2499 }
2266 factory.context = this; 2500 factory.context = this;
2267 _sourceFactory = factory; 2501 _sourceFactory = factory;
2268 for (SourceEntry sourceEntry in _sourceMap.values) { 2502 invalidateAllResults();
2269 if (sourceEntry is HtmlEntry) {
2270 ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.RESOLVED_UNIT, Cac heState.INVALID);
2271 } else if (sourceEntry is DartEntry) {
2272 ((sourceEntry as DartEntryImpl)).invalidateAllResolutionInformation();
2273 }
2274 }
2275 } 2503 }
2276 } 2504 }
2277 Iterable<Source> sourcesToResolve(List<Source> changedSources) { 2505 Iterable<Source> sourcesToResolve(List<Source> changedSources) {
2278 List<Source> librarySources = new List<Source>(); 2506 List<Source> librarySources = new List<Source>();
2279 for (Source source in changedSources) { 2507 for (Source source in changedSources) {
2280 if (identical(computeKindOf(source), SourceKind.LIBRARY)) { 2508 if (identical(computeKindOf(source), SourceKind.LIBRARY)) {
2281 librarySources.add(source); 2509 librarySources.add(source);
2282 } 2510 }
2283 } 2511 }
2284 return librarySources; 2512 return librarySources;
2285 } 2513 }
2514
2515 /**
2516 * Return a list of the sources that would be processed by {@link #performAnal ysisTask()}. This
2517 * method is intended to be used for testing purposes only.
2518 * @return a list of the sources that would be processed by {@link #performAna lysisTask()}
2519 */
2520 List<Source> get sourcesNeedingProcessing {
2521 List<Source> sources = new List<Source>();
2522 {
2523 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
2524 SourceEntry sourceEntry = entry.getValue();
2525 if (sourceEntry is DartEntry) {
2526 DartEntry dartEntry = sourceEntry as DartEntry;
2527 CacheState parsedUnitState = dartEntry.getState(DartEntry.PARSED_UNIT) ;
2528 CacheState elementState = dartEntry.getState(DartEntry.ELEMENT);
2529 if (identical(parsedUnitState, CacheState.INVALID) || identical(elemen tState, CacheState.INVALID)) {
2530 sources.add(entry.getKey());
2531 }
2532 } else if (sourceEntry is HtmlEntry) {
2533 HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
2534 CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT) ;
2535 CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_U NIT);
2536 if (identical(parsedUnitState, CacheState.INVALID) || identical(resolv edUnitState, CacheState.INVALID)) {
2537 sources.add(entry.getKey());
2538 }
2539 }
2540 }
2541 }
2542 return sources;
2543 }
2544
2286 /** 2545 /**
2287 * Record that the given source was just accessed for some unspecified purpose . 2546 * Record that the given source was just accessed for some unspecified purpose .
2288 * <p> 2547 * <p>
2289 * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}. 2548 * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}.
2290 * @param source the source that was accessed 2549 * @param source the source that was accessed
2291 */ 2550 */
2292 void accessed(Source source) { 2551 void accessed(Source source) {
2293 if (_recentlyUsed.contains(source)) { 2552 if (_recentlyUsed.contains(source)) {
2294 _recentlyUsed.remove(source); 2553 _recentlyUsed.remove(source);
2295 _recentlyUsed.add(source); 2554 _recentlyUsed.add(source);
2296 return; 2555 return;
2297 } 2556 }
2298 if (_cacheRemovalCount == 0 && _recentlyUsed.length >= _MAX_CACHE_SIZE) { 2557 if (_cacheRemovalCount == 0 && _recentlyUsed.length >= _MAX_CACHE_SIZE) {
2299 Source removedSource = _recentlyUsed.removeAt(0); 2558 Source removedSource = _recentlyUsed.removeAt(0);
2300 SourceEntry sourceEntry = _sourceMap[removedSource]; 2559 SourceEntry sourceEntry = _sourceMap[removedSource];
2301 if (sourceEntry is HtmlEntry) { 2560 if (sourceEntry is HtmlEntry) {
2302 ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.PARSED_UNIT, CacheSt ate.FLUSHED); 2561 HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
2303 ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.RESOLVED_UNIT, Cache State.FLUSHED); 2562 htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
2563 htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.FLUSHED);
2564 _sourceMap[removedSource] = htmlCopy;
2304 } else if (sourceEntry is DartEntry) { 2565 } else if (sourceEntry is DartEntry) {
2305 ((sourceEntry as DartEntryImpl)).setState(DartEntry.PARSED_UNIT, CacheSt ate.FLUSHED); 2566 DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
2567 dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
2306 for (Source librarySource in getLibrariesContaining(source)) { 2568 for (Source librarySource in getLibrariesContaining(source)) {
2307 ((sourceEntry as DartEntryImpl)).setState2(DartEntry.RESOLVED_UNIT, li brarySource, CacheState.FLUSHED); 2569 dartCopy.setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState. FLUSHED);
2308 } 2570 }
2571 _sourceMap[removedSource] = dartCopy;
2309 } 2572 }
2310 } 2573 }
2311 _recentlyUsed.add(source); 2574 _recentlyUsed.add(source);
2312 } 2575 }
2576
2313 /** 2577 /**
2314 * Add all of the sources contained in the given source container to the given list of sources. 2578 * Add all of the sources contained in the given source container to the given list of sources.
2315 * <p> 2579 * <p>
2316 * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}. 2580 * Note: This method must only be invoked while we are synchronized on {@link #cacheLock}.
2317 * @param sources the list to which sources are to be added 2581 * @param sources the list to which sources are to be added
2318 * @param container the source container containing the sources to be added to the list 2582 * @param container the source container containing the sources to be added to the list
2319 */ 2583 */
2320 void addSourcesInContainer(List<Source> sources, SourceContainer container) { 2584 void addSourcesInContainer(List<Source> sources, SourceContainer container) {
2321 for (Source source in _sourceMap.keys.toSet()) { 2585 for (Source source in _sourceMap.keys.toSet()) {
2322 if (container.contains(source)) { 2586 if (container.contains(source)) {
2323 sources.add(source); 2587 sources.add(source);
2324 } 2588 }
2325 } 2589 }
2326 } 2590 }
2591
2327 /** 2592 /**
2328 * Return {@code true} if the given array of sources contains the given source . 2593 * Return {@code true} if the given array of sources contains the given source .
2329 * @param sources the sources being searched 2594 * @param sources the sources being searched
2330 * @param targetSource the source being searched for 2595 * @param targetSource the source being searched for
2331 * @return {@code true} if the given source is in the array 2596 * @return {@code true} if the given source is in the array
2332 */ 2597 */
2333 bool contains(List<Source> sources, Source targetSource) { 2598 bool contains(List<Source> sources, Source targetSource) {
2334 for (Source source in sources) { 2599 for (Source source in sources) {
2335 if (source == targetSource) { 2600 if (source == targetSource) {
2336 return true; 2601 return true;
2337 } 2602 }
2338 } 2603 }
2339 return false; 2604 return false;
2340 } 2605 }
2606
2341 /** 2607 /**
2342 * Return {@code true} if the given array of sources contains any of the given target sources. 2608 * Return {@code true} if the given array of sources contains any of the given target sources.
2343 * @param sources the sources being searched 2609 * @param sources the sources being searched
2344 * @param targetSources the sources being searched for 2610 * @param targetSources the sources being searched for
2345 * @return {@code true} if any of the given target sources are in the array 2611 * @return {@code true} if any of the given target sources are in the array
2346 */ 2612 */
2347 bool containsAny(List<Source> sources, List<Source> targetSources) { 2613 bool containsAny(List<Source> sources, List<Source> targetSources) {
2348 for (Source targetSource in targetSources) { 2614 for (Source targetSource in targetSources) {
2349 if (contains(sources, targetSource)) { 2615 if (contains(sources, targetSource)) {
2350 return true; 2616 return true;
2351 } 2617 }
2352 } 2618 }
2353 return false; 2619 return false;
2354 } 2620 }
2621
2355 /** 2622 /**
2356 * Create a source information object suitable for the given source. Return th e source information 2623 * Create a source information object suitable for the given source. Return th e source information
2357 * object that was created, or {@code null} if the source should not be tracke d by this context. 2624 * object that was created, or {@code null} if the source should not be tracke d by this context.
2358 * @param source the source for which an information object is being created 2625 * @param source the source for which an information object is being created
2359 * @return the source information object that was created 2626 * @return the source information object that was created
2360 */ 2627 */
2361 SourceEntry createSourceEntry(Source source) { 2628 SourceEntry createSourceEntry(Source source) {
2362 String name = source.shortName; 2629 String name = source.shortName;
2363 if (AnalysisEngine.isHtmlFileName(name)) { 2630 if (AnalysisEngine.isHtmlFileName(name)) {
2364 HtmlEntry htmlEntry = new HtmlEntryImpl(); 2631 HtmlEntry htmlEntry = new HtmlEntryImpl();
2365 _sourceMap[source] = htmlEntry; 2632 _sourceMap[source] = htmlEntry;
2366 return htmlEntry; 2633 return htmlEntry;
2367 } else if (AnalysisEngine.isDartFileName(name)) { 2634 } else if (AnalysisEngine.isDartFileName(name)) {
2368 DartEntry dartEntry = new DartEntryImpl(); 2635 DartEntry dartEntry = new DartEntryImpl();
2369 _sourceMap[source] = dartEntry; 2636 _sourceMap[source] = dartEntry;
2370 return dartEntry; 2637 return dartEntry;
2371 } 2638 }
2372 return null; 2639 return null;
2373 } 2640 }
2641
2374 /** 2642 /**
2375 * Disable flushing information from the cache until {@link #enableCacheRemova l()} has been 2643 * Disable flushing information from the cache until {@link #enableCacheRemova l()} has been
2376 * called. 2644 * called.
2377 */ 2645 */
2378 void disableCacheRemoval() { 2646 void disableCacheRemoval() {
2379 _cacheRemovalCount++; 2647 _cacheRemovalCount++;
2380 } 2648 }
2649
2381 /** 2650 /**
2382 * Re-enable flushing information from the cache. 2651 * Re-enable flushing information from the cache.
2383 */ 2652 */
2384 void enableCacheRemoval() { 2653 void enableCacheRemoval() {
2385 if (_cacheRemovalCount > 0) { 2654 if (_cacheRemovalCount > 0) {
2386 _cacheRemovalCount--; 2655 _cacheRemovalCount--;
2387 } 2656 }
2388 if (_cacheRemovalCount == 0) { 2657 if (_cacheRemovalCount == 0) {
2389 while (_recentlyUsed.length >= _MAX_CACHE_SIZE) { 2658 while (_recentlyUsed.length >= _MAX_CACHE_SIZE) {
2390 Source removedSource = _recentlyUsed.removeAt(0); 2659 Source removedSource = _recentlyUsed.removeAt(0);
2391 SourceEntry sourceEntry = _sourceMap[removedSource]; 2660 SourceEntry sourceEntry = _sourceMap[removedSource];
2392 if (sourceEntry is HtmlEntry) { 2661 if (sourceEntry is HtmlEntry) {
2393 ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.PARSED_UNIT, Cache State.FLUSHED); 2662 HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
2394 ((sourceEntry as HtmlEntryImpl)).setState(HtmlEntry.RESOLVED_UNIT, Cac heState.FLUSHED); 2663 htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
2664 htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.FLUSHED);
2665 _sourceMap[removedSource] = htmlCopy;
2395 } else if (sourceEntry is DartEntry) { 2666 } else if (sourceEntry is DartEntry) {
2396 ((sourceEntry as DartEntryImpl)).setState(DartEntry.PARSED_UNIT, Cache State.FLUSHED); 2667 DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
2668 dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
2397 for (Source librarySource in getLibrariesContaining(removedSource)) { 2669 for (Source librarySource in getLibrariesContaining(removedSource)) {
2398 ((sourceEntry as DartEntryImpl)).setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheState.FLUSHED); 2670 dartCopy.setState2(DartEntry.RESOLVED_UNIT, librarySource, CacheStat e.FLUSHED);
2399 } 2671 }
2672 _sourceMap[removedSource] = dartCopy;
2400 } 2673 }
2401 } 2674 }
2402 } 2675 }
2403 } 2676 }
2677
2404 /** 2678 /**
2405 * Search the compilation units that are part of the given library and return the element 2679 * Search the compilation units that are part of the given library and return the element
2406 * representing the compilation unit with the given source. Return {@code null } if there is no 2680 * representing the compilation unit with the given source. Return {@code null } if there is no
2407 * such compilation unit. 2681 * such compilation unit.
2408 * @param libraryElement the element representing the library being searched t hrough 2682 * @param libraryElement the element representing the library being searched t hrough
2409 * @param unitSource the source for the compilation unit whose element is to b e returned 2683 * @param unitSource the source for the compilation unit whose element is to b e returned
2410 * @return the element representing the compilation unit 2684 * @return the element representing the compilation unit
2411 */ 2685 */
2412 CompilationUnitElement find(LibraryElement libraryElement, Source unitSource) { 2686 CompilationUnitElement find(LibraryElement libraryElement, Source unitSource) {
2413 CompilationUnitElement element = libraryElement.definingCompilationUnit; 2687 CompilationUnitElement element = libraryElement.definingCompilationUnit;
2414 if (element.source == unitSource) { 2688 if (element.source == unitSource) {
2415 return element; 2689 return element;
2416 } 2690 }
2417 for (CompilationUnitElement partElement in libraryElement.parts) { 2691 for (CompilationUnitElement partElement in libraryElement.parts) {
2418 if (partElement.source == unitSource) { 2692 if (partElement.source == unitSource) {
2419 return partElement; 2693 return partElement;
2420 } 2694 }
2421 } 2695 }
2422 return null; 2696 return null;
2423 } 2697 }
2698
2424 /** 2699 /**
2425 * Return the compilation unit information associated with the given source, o r {@code null} if 2700 * Return the compilation unit information associated with the given source, o r {@code null} if
2426 * the source is not known to this context. This method should be used to acce ss the compilation 2701 * the source is not known to this context. This method should be used to acce ss the compilation
2427 * unit information rather than accessing the compilation unit map directly be cause sources in the 2702 * unit information rather than accessing the compilation unit map directly be cause sources in the
2428 * SDK are implicitly part of every analysis context and are therefore only ad ded to the map when 2703 * SDK are implicitly part of every analysis context and are therefore only ad ded to the map when
2429 * first accessed. 2704 * first accessed.
2430 * <p> 2705 * <p>
2431 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}. 2706 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
2432 * @param source the source for which information is being sought 2707 * @param source the source for which information is being sought
2433 * @return the compilation unit information associated with the given source 2708 * @return the compilation unit information associated with the given source
2434 */ 2709 */
2435 DartEntry getDartEntry(Source source) { 2710 DartEntry getDartEntry(Source source) {
2436 SourceEntry sourceEntry = getSourceEntry(source); 2711 SourceEntry sourceEntry = getSourceEntry(source);
2437 if (sourceEntry == null) { 2712 if (sourceEntry == null) {
2438 sourceEntry = new DartEntryImpl(); 2713 sourceEntry = new DartEntryImpl();
2439 _sourceMap[source] = sourceEntry; 2714 _sourceMap[source] = sourceEntry;
2440 return sourceEntry as DartEntry; 2715 return sourceEntry as DartEntry;
2441 } else if (sourceEntry is DartEntry) { 2716 } else if (sourceEntry is DartEntry) {
2442 return sourceEntry as DartEntry; 2717 return sourceEntry as DartEntry;
2443 } 2718 }
2444 return null; 2719 return null;
2445 } 2720 }
2721
2446 /** 2722 /**
2447 * Return the HTML unit information associated with the given source, or {@cod e null} if the 2723 * Return the HTML unit information associated with the given source, or {@cod e null} if the
2448 * source is not known to this context. This method should be used to access t he HTML unit 2724 * source is not known to this context. This method should be used to access t he HTML unit
2449 * information rather than accessing the HTML unit map directly because source s in the SDK are 2725 * information rather than accessing the HTML unit map directly because source s in the SDK are
2450 * implicitly part of every analysis context and are therefore only added to t he map when first 2726 * implicitly part of every analysis context and are therefore only added to t he map when first
2451 * accessed. 2727 * accessed.
2452 * <p> 2728 * <p>
2453 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}. 2729 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
2454 * @param source the source for which information is being sought 2730 * @param source the source for which information is being sought
2455 * @return the HTML unit information associated with the given source 2731 * @return the HTML unit information associated with the given source
2456 */ 2732 */
2457 HtmlEntry getHtmlEntry(Source source) { 2733 HtmlEntry getHtmlEntry(Source source) {
2458 SourceEntry sourceEntry = getSourceEntry(source); 2734 SourceEntry sourceEntry = getSourceEntry(source);
2459 if (sourceEntry == null) { 2735 if (sourceEntry == null) {
2460 sourceEntry = new HtmlEntryImpl(); 2736 sourceEntry = new HtmlEntryImpl();
2461 _sourceMap[source] = sourceEntry; 2737 _sourceMap[source] = sourceEntry;
2462 return sourceEntry as HtmlEntry; 2738 return sourceEntry as HtmlEntry;
2463 } else if (sourceEntry is HtmlEntry) { 2739 } else if (sourceEntry is HtmlEntry) {
2464 return sourceEntry as HtmlEntry; 2740 return sourceEntry as HtmlEntry;
2465 } 2741 }
2466 return null; 2742 return null;
2467 } 2743 }
2744
2468 /** 2745 /**
2469 * Return the sources of libraries that are referenced in the specified HTML f ile. 2746 * Return the sources of libraries that are referenced in the specified HTML f ile.
2470 * @param htmlSource the source of the HTML file being analyzed 2747 * @param htmlSource the source of the HTML file being analyzed
2471 * @param htmlUnit the AST for the HTML file being analyzed 2748 * @param htmlUnit the AST for the HTML file being analyzed
2472 * @return the sources of libraries that are referenced in the HTML file 2749 * @return the sources of libraries that are referenced in the HTML file
2473 */ 2750 */
2474 List<Source> getLibrarySources2(Source htmlSource, HtmlUnit htmlUnit) { 2751 List<Source> getLibrarySources2(Source htmlSource, HtmlUnit htmlUnit) {
2475 List<Source> libraries = new List<Source>(); 2752 List<Source> libraries = new List<Source>();
2476 htmlUnit.accept(new RecursiveXmlVisitor_6(this, htmlSource, libraries)); 2753 htmlUnit.accept(new RecursiveXmlVisitor_7(this, htmlSource, libraries));
2477 if (libraries.isEmpty) { 2754 if (libraries.isEmpty) {
2478 return Source.EMPTY_ARRAY; 2755 return Source.EMPTY_ARRAY;
2479 } 2756 }
2480 return new List.from(libraries); 2757 return new List.from(libraries);
2481 } 2758 }
2759
2482 /** 2760 /**
2483 * Return a change notice for the given source, creating one if one does not a lready exist. 2761 * Return a change notice for the given source, creating one if one does not a lready exist.
2484 * @param source the source for which changes are being reported 2762 * @param source the source for which changes are being reported
2485 * @return a change notice for the given source 2763 * @return a change notice for the given source
2486 */ 2764 */
2487 ChangeNoticeImpl getNotice(Source source) { 2765 ChangeNoticeImpl getNotice(Source source) {
2488 ChangeNoticeImpl notice = _pendingNotices[source]; 2766 ChangeNoticeImpl notice = _pendingNotices[source];
2489 if (notice == null) { 2767 if (notice == null) {
2490 notice = new ChangeNoticeImpl(source); 2768 notice = new ChangeNoticeImpl(source);
2491 _pendingNotices[source] = notice; 2769 _pendingNotices[source] = notice;
2492 } 2770 }
2493 return notice; 2771 return notice;
2494 } 2772 }
2773
2774 /**
2775 * Return the cache entry associated with the given source, or {@code null} if there is no entry
2776 * associated with the source.
2777 * @param source the source for which a cache entry is being sought
2778 * @return the source cache entry associated with the given source
2779 */
2780 SourceEntry getReadableSourceEntry(Source source) {
2781 {
2782 return _sourceMap[source];
2783 }
2784 }
2785
2495 /** 2786 /**
2496 * Return the source information associated with the given source, or {@code n ull} if the source 2787 * Return the source information associated with the given source, or {@code n ull} if the source
2497 * is not known to this context. This method should be used to access the sour ce information 2788 * is not known to this context. This method should be used to access the sour ce information
2498 * rather than accessing the source map directly because sources in the SDK ar e implicitly part of 2789 * rather than accessing the source map directly because sources in the SDK ar e implicitly part of
2499 * every analysis context and are therefore only added to the map when first a ccessed. 2790 * every analysis context and are therefore only added to the map when first a ccessed.
2500 * <p> 2791 * <p>
2501 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}. 2792 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
2502 * @param source the source for which information is being sought 2793 * @param source the source for which information is being sought
2503 * @return the source information associated with the given source 2794 * @return the source information associated with the given source
2504 */ 2795 */
2505 SourceEntry getSourceEntry(Source source) { 2796 SourceEntry getSourceEntry(Source source) {
2506 SourceEntry sourceEntry = _sourceMap[source]; 2797 SourceEntry sourceEntry = _sourceMap[source];
2507 if (sourceEntry == null) { 2798 if (sourceEntry == null) {
2508 sourceEntry = createSourceEntry(source); 2799 sourceEntry = createSourceEntry(source);
2509 } 2800 }
2510 return sourceEntry; 2801 return sourceEntry;
2511 } 2802 }
2803
2512 /** 2804 /**
2513 * Return an array containing all of the sources known to this context that ha ve the given kind. 2805 * Return an array containing all of the sources known to this context that ha ve the given kind.
2514 * @param kind the kind of sources to be returned 2806 * @param kind the kind of sources to be returned
2515 * @return all of the sources known to this context that have the given kind 2807 * @return all of the sources known to this context that have the given kind
2516 */ 2808 */
2517 List<Source> getSources(SourceKind kind2) { 2809 List<Source> getSources(SourceKind kind2) {
2518 List<Source> sources = new List<Source>(); 2810 List<Source> sources = new List<Source>();
2519 { 2811 {
2520 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) { 2812 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
2521 if (identical(entry.getValue().kind, kind2)) { 2813 if (identical(entry.getValue().kind, kind2)) {
2522 sources.add(entry.getKey()); 2814 sources.add(entry.getKey());
2523 } 2815 }
2524 } 2816 }
2525 } 2817 }
2526 return new List.from(sources); 2818 return new List.from(sources);
2527 } 2819 }
2820
2528 /** 2821 /**
2529 * Return {@code true} if the given compilation unit has a part-of directive b ut no library 2822 * Return {@code true} if the given compilation unit has a part-of directive b ut no library
2530 * directive. 2823 * directive.
2531 * @param unit the compilation unit being tested 2824 * @param unit the compilation unit being tested
2532 * @return {@code true} if the compilation unit has a part-of directive 2825 * @return {@code true} if the compilation unit has a part-of directive
2533 */ 2826 */
2534 bool hasPartOfDirective(CompilationUnit unit) { 2827 bool hasPartOfDirective(CompilationUnit unit) {
2535 bool hasPartOf = false; 2828 bool hasPartOf = false;
2536 for (Directive directive in unit.directives) { 2829 for (Directive directive in unit.directives) {
2537 if (directive is PartOfDirective) { 2830 if (directive is PartOfDirective) {
2538 hasPartOf = true; 2831 hasPartOf = true;
2539 } else if (directive is LibraryDirective) { 2832 } else if (directive is LibraryDirective) {
2540 return false; 2833 return false;
2541 } 2834 }
2542 } 2835 }
2543 return hasPartOf; 2836 return hasPartOf;
2544 } 2837 }
2838
2545 /** 2839 /**
2546 * Compute the kind of the given source. This method should only be invoked wh en the kind is not 2840 * Compute the kind of the given source. This method should only be invoked wh en the kind is not
2547 * already known. 2841 * already known.
2548 * @param source the source for which a kind is to be computed 2842 * @param source the source for which a kind is to be computed
2549 * @return the new source info that was created to represent the source 2843 * @return the new source info that was created to represent the source
2550 */ 2844 */
2551 DartEntry internalComputeKindOf(Source source) { 2845 DartEntry internalComputeKindOf(Source source) {
2552 try { 2846 try {
2553 accessed(source); 2847 accessed(source);
2554 RecordingErrorListener errorListener = new RecordingErrorListener(); 2848 RecordingErrorListener errorListener = new RecordingErrorListener();
2555 AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorList ener); 2849 AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorList ener);
2556 Parser parser = new Parser(source, errorListener); 2850 Parser parser = new Parser(source, errorListener);
2557 CompilationUnit unit = parser.parseCompilationUnit(scanResult._token); 2851 CompilationUnit unit = parser.parseCompilationUnit(scanResult._token);
2558 LineInfo lineInfo = new LineInfo(scanResult._lineStarts); 2852 LineInfo lineInfo = new LineInfo(scanResult._lineStarts);
2559 List<AnalysisError> errors = errorListener.getErrors2(source); 2853 List<AnalysisError> errors = errorListener.getErrors2(source);
2560 unit.parsingErrors = errors; 2854 unit.parsingErrors = errors;
2561 unit.lineInfo = lineInfo; 2855 unit.lineInfo = lineInfo;
2562 DartEntryImpl dartEntry = _sourceMap[source] as DartEntryImpl; 2856 DartEntryImpl dartCopy = ((_sourceMap[source] as DartEntry)).writableCopy;
2563 if (hasPartOfDirective(unit)) { 2857 if (hasPartOfDirective(unit)) {
2564 dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.PART); 2858 dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
2565 } else { 2859 } else {
2566 dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY); 2860 dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
2567 } 2861 }
2568 dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo); 2862 dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
2569 dartEntry.setValue(DartEntry.PARSED_UNIT, unit); 2863 dartCopy.setValue(DartEntry.PARSED_UNIT, unit);
2570 dartEntry.setValue(DartEntry.PARSE_ERRORS, errors); 2864 dartCopy.setValue(DartEntry.PARSE_ERRORS, errors);
2571 return dartEntry; 2865 _sourceMap[source] = dartCopy;
2866 return dartCopy;
2572 } on AnalysisException catch (exception) { 2867 } on AnalysisException catch (exception) {
2573 DartEntryImpl dartEntry = _sourceMap[source] as DartEntryImpl; 2868 DartEntryImpl dartCopy = ((_sourceMap[source] as DartEntry)).writableCopy;
2574 dartEntry.setState(DartEntry.SOURCE_KIND, CacheState.ERROR); 2869 dartCopy.setState(DartEntry.SOURCE_KIND, CacheState.ERROR);
2575 dartEntry.setState(SourceEntry.LINE_INFO, CacheState.ERROR); 2870 dartCopy.setState(SourceEntry.LINE_INFO, CacheState.ERROR);
2576 dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.ERROR); 2871 dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.ERROR);
2577 dartEntry.setState(DartEntry.PARSE_ERRORS, CacheState.ERROR); 2872 dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.ERROR);
2578 return dartEntry; 2873 _sourceMap[source] = dartCopy;
2874 return dartCopy;
2579 } 2875 }
2580 } 2876 }
2581 CompilationUnit internalParseCompilationUnit(DartEntryImpl dartEntry, Source s ource) { 2877 CompilationUnit internalParseCompilationUnit(DartEntryImpl dartCopy, Source so urce) {
2582 accessed(source); 2878 accessed(source);
2583 RecordingErrorListener errorListener = new RecordingErrorListener(); 2879 try {
2584 AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorListen er); 2880 RecordingErrorListener errorListener = new RecordingErrorListener();
2585 Parser parser = new Parser(source, errorListener); 2881 AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorList ener);
2586 CompilationUnit unit = parser.parseCompilationUnit(scanResult._token); 2882 Parser parser = new Parser(source, errorListener);
2587 LineInfo lineInfo = new LineInfo(scanResult._lineStarts); 2883 CompilationUnit unit = parser.parseCompilationUnit(scanResult._token);
2588 List<AnalysisError> errors = errorListener.getErrors2(source); 2884 LineInfo lineInfo = new LineInfo(scanResult._lineStarts);
2589 unit.parsingErrors = errors; 2885 List<AnalysisError> errors = errorListener.getErrors2(source);
2590 unit.lineInfo = lineInfo; 2886 unit.parsingErrors = errors;
2591 if (identical(dartEntry.getState(DartEntry.SOURCE_KIND), CacheState.INVALID) ) { 2887 unit.lineInfo = lineInfo;
2592 if (hasPartOfDirective(unit)) { 2888 if (identical(dartCopy.getState(DartEntry.SOURCE_KIND), CacheState.INVALID )) {
2593 dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.PART); 2889 if (hasPartOfDirective(unit)) {
2594 } else { 2890 dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.PART);
2595 dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY); 2891 } else {
2892 dartCopy.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY);
2893 }
2596 } 2894 }
2895 dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
2896 dartCopy.setValue(DartEntry.PARSED_UNIT, unit);
2897 dartCopy.setValue(DartEntry.PARSE_ERRORS, errors);
2898 return unit;
2899 } on AnalysisException catch (exception) {
2900 dartCopy.setState(SourceEntry.LINE_INFO, CacheState.ERROR);
2901 dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.ERROR);
2902 dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.ERROR);
2903 throw exception;
2597 } 2904 }
2598 dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
2599 dartEntry.setValue(DartEntry.PARSED_UNIT, unit);
2600 dartEntry.setValue(DartEntry.PARSE_ERRORS, errors);
2601 return unit;
2602 } 2905 }
2603 AnalysisContextImpl_ScanResult internalScan(Source source, AnalysisErrorListen er errorListener) { 2906 AnalysisContextImpl_ScanResult internalScan(Source source, AnalysisErrorListen er errorListener) {
2604 AnalysisContextImpl_ScanResult result = new AnalysisContextImpl_ScanResult() ; 2907 AnalysisContextImpl_ScanResult result = new AnalysisContextImpl_ScanResult() ;
2605 Source_ContentReceiver receiver = new Source_ContentReceiver_7(source, error Listener, result); 2908 Source_ContentReceiver receiver = new Source_ContentReceiver_8(source, error Listener, result);
2606 try { 2909 try {
2607 source.getContents(receiver); 2910 source.getContents(receiver);
2608 } catch (exception) { 2911 } catch (exception) {
2609 throw new AnalysisException.con3(exception); 2912 throw new AnalysisException.con3(exception);
2610 } 2913 }
2611 return result; 2914 return result;
2612 } 2915 }
2916
2917 /**
2918 * Invalidate all of the results computed by this context.
2919 * <p>
2920 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
2921 */
2922 void invalidateAllResults() {
2923 for (MapEntry<Source, SourceEntry> mapEntry in getMapEntrySet(_sourceMap)) {
2924 SourceEntry sourceEntry = mapEntry.getValue();
2925 if (sourceEntry is HtmlEntry) {
2926 HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
2927 htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.INVALID);
2928 mapEntry.setValue(htmlCopy);
2929 } else if (sourceEntry is DartEntry) {
2930 DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
2931 dartCopy.invalidateAllResolutionInformation();
2932 mapEntry.setValue(dartCopy);
2933 }
2934 }
2935 }
2936
2613 /** 2937 /**
2614 * In response to a change to at least one of the compilation units in the giv en library, 2938 * In response to a change to at least one of the compilation units in the giv en library,
2615 * invalidate any results that are dependent on the result of resolving that l ibrary. 2939 * invalidate any results that are dependent on the result of resolving that l ibrary.
2616 * @param librarySource the source of the library being invalidated 2940 * @param librarySource the source of the library being invalidated
2617 * @param libraryEntry the cache entry for the library being invalidated
2618 */ 2941 */
2619 void invalidateLibraryResolution(Source librarySource, DartEntryImpl libraryEn try) { 2942 void invalidateLibraryResolution(Source librarySource) {
2943 DartEntry libraryEntry = getDartEntry(librarySource);
2620 if (libraryEntry != null) { 2944 if (libraryEntry != null) {
2621 for (Source unitSource in libraryEntry.getValue(DartEntry.INCLUDED_PARTS)) { 2945 List<Source> includedParts = libraryEntry.getValue(DartEntry.INCLUDED_PART S);
2622 DartEntryImpl partEntry = getDartEntry(unitSource) as DartEntryImpl; 2946 DartEntryImpl libraryCopy = libraryEntry.writableCopy;
2623 partEntry.invalidateAllResolutionInformation(); 2947 libraryCopy.invalidateAllResolutionInformation();
2948 libraryCopy.setState(DartEntry.INCLUDED_PARTS, CacheState.INVALID);
2949 _sourceMap[librarySource] = libraryCopy;
2950 for (Source unitSource in includedParts) {
2951 DartEntry partEntry = getDartEntry(unitSource);
2952 if (partEntry != null) {
2953 DartEntryImpl dartCopy = partEntry.writableCopy;
2954 dartCopy.invalidateAllResolutionInformation();
2955 _sourceMap[unitSource] = dartCopy;
2956 }
2624 } 2957 }
2625 libraryEntry.invalidateAllResolutionInformation();
2626 libraryEntry.setState(DartEntry.INCLUDED_PARTS, CacheState.INVALID);
2627 } 2958 }
2628 } 2959 }
2960
2629 /** 2961 /**
2630 * Return {@code true} if this library is, or depends on, dart:html. 2962 * Return {@code true} if this library is, or depends on, dart:html.
2631 * @param library the library being tested 2963 * @param library the library being tested
2632 * @param visitedLibraries a collection of the libraries that have been visite d, used to prevent 2964 * @param visitedLibraries a collection of the libraries that have been visite d, used to prevent
2633 * infinite recursion 2965 * infinite recursion
2634 * @return {@code true} if this library is, or depends on, dart:html 2966 * @return {@code true} if this library is, or depends on, dart:html
2635 */ 2967 */
2636 bool isClient(LibraryElement library, Source htmlSource, Set<LibraryElement> v isitedLibraries) { 2968 bool isClient(LibraryElement library, Source htmlSource, Set<LibraryElement> v isitedLibraries) {
2637 if (visitedLibraries.contains(library)) { 2969 if (visitedLibraries.contains(library)) {
2638 return false; 2970 return false;
2639 } 2971 }
2640 if (library.source == htmlSource) { 2972 if (library.source == htmlSource) {
2641 return true; 2973 return true;
2642 } 2974 }
2643 javaSetAdd(visitedLibraries, library); 2975 javaSetAdd(visitedLibraries, library);
2644 for (LibraryElement imported in library.importedLibraries) { 2976 for (LibraryElement imported in library.importedLibraries) {
2645 if (isClient(imported, htmlSource, visitedLibraries)) { 2977 if (isClient(imported, htmlSource, visitedLibraries)) {
2646 return true; 2978 return true;
2647 } 2979 }
2648 } 2980 }
2649 for (LibraryElement exported in library.exportedLibraries) { 2981 for (LibraryElement exported in library.exportedLibraries) {
2650 if (isClient(exported, htmlSource, visitedLibraries)) { 2982 if (isClient(exported, htmlSource, visitedLibraries)) {
2651 return true; 2983 return true;
2652 } 2984 }
2653 } 2985 }
2654 return false; 2986 return false;
2655 } 2987 }
2988
2656 /** 2989 /**
2657 * Perform a single analysis task. 2990 * Perform a single analysis task.
2658 * <p> 2991 * <p>
2659 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}. 2992 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
2660 * @return {@code true} if work was done, implying that there might be more wo rk to be done 2993 * @return {@code true} if work was done, implying that there might be more wo rk to be done
2661 */ 2994 */
2662 bool performSingleAnalysisTask() { 2995 bool performSingleAnalysisTask() {
2663 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) { 2996 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
2664 SourceEntry sourceEntry = entry.getValue(); 2997 SourceEntry sourceEntry = entry.getValue();
2665 if (sourceEntry is DartEntry) { 2998 if (sourceEntry is DartEntry) {
2666 DartEntry dartEntry = sourceEntry as DartEntry; 2999 DartEntry dartEntry = sourceEntry as DartEntry;
2667 CacheState parsedUnitState = dartEntry.getState(DartEntry.PARSED_UNIT); 3000 CacheState parsedUnitState = dartEntry.getState(DartEntry.PARSED_UNIT);
2668 if (identical(parsedUnitState, CacheState.INVALID)) { 3001 if (identical(parsedUnitState, CacheState.INVALID)) {
2669 try { 3002 try {
2670 parseCompilationUnit(entry.getKey()); 3003 parseCompilationUnit(entry.getKey());
2671 } on AnalysisException catch (exception) { 3004 } on AnalysisException catch (exception) {
2672 ((dartEntry as DartEntryImpl)).setState(DartEntry.PARSED_UNIT, Cache State.ERROR); 3005 DartEntryImpl dartCopy = ((entry.getValue() as DartEntry)).writableC opy;
3006 dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.ERROR);
3007 entry.setValue(dartCopy);
2673 AnalysisEngine.instance.logger.logError2("Could not parse ${entry.ge tKey().fullName}", exception); 3008 AnalysisEngine.instance.logger.logError2("Could not parse ${entry.ge tKey().fullName}", exception);
2674 } 3009 }
2675 return true; 3010 return true;
2676 } 3011 }
2677 } else if (sourceEntry is HtmlEntry) { 3012 } else if (sourceEntry is HtmlEntry) {
2678 HtmlEntry htmlEntry = sourceEntry as HtmlEntry; 3013 HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
2679 CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT); 3014 CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT);
2680 if (identical(parsedUnitState, CacheState.INVALID)) { 3015 if (identical(parsedUnitState, CacheState.INVALID)) {
2681 try { 3016 try {
2682 parseHtmlUnit(entry.getKey()); 3017 parseHtmlUnit(entry.getKey());
2683 } on AnalysisException catch (exception) { 3018 } on AnalysisException catch (exception) {
2684 ((htmlEntry as HtmlEntryImpl)).setState(HtmlEntry.PARSED_UNIT, Cache State.ERROR); 3019 HtmlEntryImpl htmlCopy = ((entry.getValue() as HtmlEntry)).writableC opy;
3020 htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.ERROR);
3021 entry.setValue(htmlCopy);
2685 AnalysisEngine.instance.logger.logError2("Could not parse ${entry.ge tKey().fullName}", exception); 3022 AnalysisEngine.instance.logger.logError2("Could not parse ${entry.ge tKey().fullName}", exception);
2686 } 3023 }
2687 return true; 3024 return true;
2688 } 3025 }
2689 } 3026 }
2690 } 3027 }
2691 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) { 3028 for (MapEntry<Source, SourceEntry> entry in getMapEntrySet(_sourceMap)) {
2692 SourceEntry sourceEntry = entry.getValue(); 3029 SourceEntry sourceEntry = entry.getValue();
2693 if (sourceEntry is DartEntry && identical(sourceEntry.kind, SourceKind.LIB RARY)) { 3030 if (sourceEntry is DartEntry && identical(sourceEntry.kind, SourceKind.LIB RARY)) {
2694 DartEntry dartEntry = sourceEntry as DartEntry; 3031 DartEntry dartEntry = sourceEntry as DartEntry;
2695 CacheState elementState = dartEntry.getState(DartEntry.ELEMENT); 3032 CacheState elementState = dartEntry.getState(DartEntry.ELEMENT);
2696 if (identical(elementState, CacheState.INVALID)) { 3033 if (identical(elementState, CacheState.INVALID)) {
2697 try { 3034 try {
2698 computeLibraryElement(entry.getKey()); 3035 computeLibraryElement(entry.getKey());
2699 } on AnalysisException catch (exception) { 3036 } on AnalysisException catch (exception) {
2700 ((dartEntry as DartEntryImpl)).setState(DartEntry.ELEMENT, CacheStat e.ERROR); 3037 DartEntryImpl dartCopy = ((entry.getValue() as DartEntry)).writableC opy;
3038 dartCopy.setState(DartEntry.ELEMENT, CacheState.ERROR);
3039 entry.setValue(dartCopy);
2701 AnalysisEngine.instance.logger.logError2("Could not resolve ${entry. getKey().fullName}", exception); 3040 AnalysisEngine.instance.logger.logError2("Could not resolve ${entry. getKey().fullName}", exception);
2702 } 3041 }
2703 return true; 3042 return true;
2704 } 3043 }
2705 } else if (sourceEntry is HtmlEntry) { 3044 } else if (sourceEntry is HtmlEntry) {
2706 HtmlEntry htmlEntry = sourceEntry as HtmlEntry; 3045 HtmlEntry htmlEntry = sourceEntry as HtmlEntry;
2707 CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNI T); 3046 CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNI T);
2708 if (identical(resolvedUnitState, CacheState.INVALID)) { 3047 if (identical(resolvedUnitState, CacheState.INVALID)) {
2709 try { 3048 try {
2710 resolveHtmlUnit(entry.getKey()); 3049 resolveHtmlUnit(entry.getKey());
2711 } on AnalysisException catch (exception) { 3050 } on AnalysisException catch (exception) {
2712 ((htmlEntry as HtmlEntryImpl)).setState(HtmlEntry.RESOLVED_UNIT, Cac heState.ERROR); 3051 HtmlEntryImpl htmlCopy = ((entry.getValue() as HtmlEntry)).writableC opy;
3052 htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.ERROR);
3053 entry.setValue(htmlCopy);
2713 AnalysisEngine.instance.logger.logError2("Could not resolve ${entry. getKey().fullName}", exception); 3054 AnalysisEngine.instance.logger.logError2("Could not resolve ${entry. getKey().fullName}", exception);
2714 } 3055 }
2715 return true; 3056 return true;
2716 } 3057 }
2717 } 3058 }
2718 } 3059 }
2719 return false; 3060 return false;
2720 } 3061 }
3062
3063 /**
3064 * Given a cache entry and a library element, record the library element and o ther information
3065 * gleaned from the element in the cache entry.
3066 * @param dartCopy the cache entry in which data is to be recorded
3067 * @param library the library element used to record information
3068 * @param htmlSource the source for the HTML library
3069 */
3070 void recordElementData(DartEntryImpl dartCopy, LibraryElement library, Source htmlSource) {
3071 dartCopy.setValue(DartEntry.ELEMENT, library);
3072 dartCopy.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null);
3073 dartCopy.setValue(DartEntry.IS_CLIENT, isClient(library, htmlSource, new Set <LibraryElement>()));
3074 List<Source> unitSources = new List<Source>();
3075 unitSources.add(library.definingCompilationUnit.source);
3076 for (CompilationUnitElement part in library.parts) {
3077 Source partSource = part.source;
3078 unitSources.add(partSource);
3079 }
3080 dartCopy.setValue(DartEntry.INCLUDED_PARTS, new List.from(unitSources));
3081 }
3082
3083 /**
3084 * Record the result of using the given resolver to resolve one or more librar ies.
3085 * @param resolver the resolver that has the needed results
3086 * @throws AnalysisException if the results cannot be retrieved for some reaso n
3087 */
3088 void recordResolutionResults(LibraryResolver resolver) {
3089 Source htmlSource = _sourceFactory.forUri(DartSdk.DART_HTML);
3090 RecordingErrorListener errorListener2 = resolver.errorListener;
3091 for (Library library in resolver.resolvedLibraries) {
3092 Source librarySource2 = library.librarySource;
3093 Set<Source> referencedLibraries = new Set<Source>();
3094 for (Library referencedLibrary in library.exports) {
3095 javaSetAdd(referencedLibraries, referencedLibrary.librarySource);
3096 }
3097 for (Library referencedLibrary in library.imports) {
3098 javaSetAdd(referencedLibraries, referencedLibrary.librarySource);
3099 }
3100 for (Source source in library.compilationUnitSources) {
3101 CompilationUnit unit = library.getAST(source);
3102 List<AnalysisError> errors = errorListener2.getErrors2(source);
3103 unit.resolutionErrors = errors;
3104 LineInfo lineInfo2 = unit.lineInfo;
3105 {
3106 DartEntry dartEntry = getDartEntry(source);
3107 if (dartEntry != null) {
3108 DartEntryImpl dartCopy = dartEntry.writableCopy;
3109 dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo2);
3110 dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
3111 dartCopy.setValue2(DartEntry.RESOLVED_UNIT, librarySource2, unit);
3112 dartCopy.setValue2(DartEntry.RESOLUTION_ERRORS, librarySource2, erro rs);
3113 if (identical(source, librarySource2)) {
3114 recordElementData(dartCopy, library.libraryElement, htmlSource);
3115 List<Source> libraries;
3116 if (referencedLibraries.isEmpty) {
3117 libraries = Source.EMPTY_ARRAY;
3118 } else {
3119 libraries = new List.from(referencedLibraries);
3120 }
3121 dartCopy.setValue(DartEntry.REFERENCED_LIBRARIES, libraries);
3122 }
3123 _sourceMap[source] = dartCopy;
3124 ChangeNoticeImpl notice = getNotice(source);
3125 notice.compilationUnit = unit;
3126 notice.setErrors(dartCopy.allErrors, lineInfo2);
3127 }
3128 }
3129 }
3130 }
3131 }
2721 HtmlScanResult scanHtml(Source source) { 3132 HtmlScanResult scanHtml(Source source) {
2722 HtmlScanner scanner = new HtmlScanner(source); 3133 HtmlScanner scanner = new HtmlScanner(source);
2723 try { 3134 try {
2724 source.getContents(scanner); 3135 source.getContents(scanner);
2725 } catch (exception) { 3136 } catch (exception) {
2726 throw new AnalysisException.con3(exception); 3137 throw new AnalysisException.con3(exception);
2727 } 3138 }
2728 return scanner.result; 3139 return scanner.result;
2729 } 3140 }
3141
2730 /** 3142 /**
2731 * Create an entry for the newly added source. Return {@code true} if the new source is a Dart 3143 * Create an entry for the newly added source. Return {@code true} if the new source is a Dart
2732 * file. 3144 * file.
2733 * <p> 3145 * <p>
2734 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}. 3146 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
2735 * @param source the source that has been added 3147 * @param source the source that has been added
2736 * @return {@code true} if the new source is a Dart file 3148 * @return {@code true} if the new source is a Dart file
2737 */ 3149 */
2738 bool sourceAvailable(Source source) { 3150 bool sourceAvailable(Source source) {
2739 SourceEntry sourceEntry = _sourceMap[source]; 3151 SourceEntry sourceEntry = _sourceMap[source];
2740 if (sourceEntry == null) { 3152 if (sourceEntry == null) {
2741 sourceEntry = createSourceEntry(source); 3153 sourceEntry = createSourceEntry(source);
2742 } 3154 }
2743 return sourceEntry is DartEntry; 3155 return sourceEntry is DartEntry;
2744 } 3156 }
3157
2745 /** 3158 /**
2746 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}. 3159 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
2747 * @param source the source that has been changed 3160 * @param source the source that has been changed
2748 */ 3161 */
2749 void sourceChanged(Source source) { 3162 void sourceChanged(Source source) {
2750 SourceEntry sourceEntry = _sourceMap[source]; 3163 SourceEntry sourceEntry = _sourceMap[source];
2751 if (sourceEntry is HtmlEntry) { 3164 if (sourceEntry is HtmlEntry) {
2752 HtmlEntryImpl htmlEntry = sourceEntry as HtmlEntryImpl; 3165 HtmlEntryImpl htmlCopy = ((sourceEntry as HtmlEntry)).writableCopy;
2753 htmlEntry.setState(HtmlEntry.ELEMENT, CacheState.INVALID); 3166 htmlCopy.setState(HtmlEntry.ELEMENT, CacheState.INVALID);
2754 htmlEntry.setState(SourceEntry.LINE_INFO, CacheState.INVALID); 3167 htmlCopy.setState(SourceEntry.LINE_INFO, CacheState.INVALID);
2755 htmlEntry.setState(HtmlEntry.PARSED_UNIT, CacheState.INVALID); 3168 htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.INVALID);
2756 htmlEntry.setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.INVALID); 3169 htmlCopy.setState(HtmlEntry.REFERENCED_LIBRARIES, CacheState.INVALID);
2757 htmlEntry.setState(HtmlEntry.RESOLVED_UNIT, CacheState.INVALID); 3170 htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.INVALID);
3171 _sourceMap[source] = htmlCopy;
2758 } else if (sourceEntry is DartEntry) { 3172 } else if (sourceEntry is DartEntry) {
2759 DartEntryImpl dartEntry = sourceEntry as DartEntryImpl;
2760 List<Source> containingLibraries = getLibrariesContaining(source); 3173 List<Source> containingLibraries = getLibrariesContaining(source);
2761 invalidateLibraryResolution(source, dartEntry); 3174 DartEntryImpl dartCopy = ((sourceEntry as DartEntry)).writableCopy;
2762 dartEntry.setState(DartEntry.INCLUDED_PARTS, CacheState.INVALID); 3175 dartCopy.setState(SourceEntry.LINE_INFO, CacheState.INVALID);
2763 dartEntry.setState(SourceEntry.LINE_INFO, CacheState.INVALID); 3176 dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.INVALID);
2764 dartEntry.setState(DartEntry.PARSE_ERRORS, CacheState.INVALID); 3177 dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.INVALID);
2765 dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.INVALID); 3178 dartCopy.setState(DartEntry.SOURCE_KIND, CacheState.INVALID);
2766 dartEntry.setState(DartEntry.SOURCE_KIND, CacheState.INVALID); 3179 _sourceMap[source] = dartCopy;
3180 invalidateLibraryResolution(source);
2767 for (Source librarySource in containingLibraries) { 3181 for (Source librarySource in containingLibraries) {
2768 DartEntryImpl libraryEntry = getDartEntry(librarySource) as DartEntryImp l; 3182 invalidateLibraryResolution(librarySource);
2769 invalidateLibraryResolution(librarySource, libraryEntry);
2770 } 3183 }
2771 } 3184 }
2772 } 3185 }
3186
2773 /** 3187 /**
2774 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}. 3188 * <b>Note:</b> This method must only be invoked while we are synchronized on {@link #cacheLock}.
2775 * @param source the source that has been deleted 3189 * @param source the source that has been deleted
2776 */ 3190 */
2777 void sourceRemoved(Source source) { 3191 void sourceRemoved(Source source) {
2778 DartEntry dartEntry = getDartEntry(source); 3192 DartEntry dartEntry = getDartEntry(source);
2779 if (dartEntry != null) { 3193 if (dartEntry != null) {
3194 Set<Source> libraries = new Set<Source>();
2780 for (Source librarySource in getLibrariesContaining(source)) { 3195 for (Source librarySource in getLibrariesContaining(source)) {
2781 DartEntryImpl libraryEntry = getDartEntry(librarySource) as DartEntryImp l; 3196 javaSetAdd(libraries, librarySource);
2782 invalidateLibraryResolution(librarySource, libraryEntry); 3197 for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) {
3198 javaSetAdd(libraries, dependentLibrary);
3199 }
3200 }
3201 for (Source librarySource in libraries) {
3202 invalidateLibraryResolution(librarySource);
2783 } 3203 }
2784 } 3204 }
2785 _sourceMap.remove(source); 3205 _sourceMap.remove(source);
2786 } 3206 }
2787 } 3207 }
3208
2788 /** 3209 /**
2789 * Instances of the class {@code ScanResult} represent the results of scanning a source. 3210 * Instances of the class {@code ScanResult} represent the results of scanning a source.
2790 */ 3211 */
2791 class AnalysisContextImpl_ScanResult { 3212 class AnalysisContextImpl_ScanResult {
3213
2792 /** 3214 /**
2793 * The time at which the contents of the source were last set. 3215 * The time at which the contents of the source were last set.
2794 */ 3216 */
2795 int _modificationTime = 0; 3217 int _modificationTime = 0;
3218
2796 /** 3219 /**
2797 * The first token in the token stream. 3220 * The first token in the token stream.
2798 */ 3221 */
2799 Token _token; 3222 Token _token;
3223
2800 /** 3224 /**
2801 * The line start information that was produced. 3225 * The line start information that was produced.
2802 */ 3226 */
2803 List<int> _lineStarts; 3227 List<int> _lineStarts;
2804 /**
2805 * Initialize a newly created result object to be empty.
2806 */
2807 AnalysisContextImpl_ScanResult() : super() {
2808 }
2809 } 3228 }
2810 class Source_ContentReceiver_5 implements Source_ContentReceiver { 3229 class Source_ContentReceiver_6 implements Source_ContentReceiver {
2811 List<CharSequence> contentHolder; 3230 List<CharSequence> contentHolder;
2812 Source_ContentReceiver_5(this.contentHolder); 3231 Source_ContentReceiver_6(this.contentHolder);
2813 void accept(CharBuffer contents, int modificationTime) { 3232 void accept(CharBuffer contents, int modificationTime) {
2814 contentHolder[0] = contents; 3233 contentHolder[0] = contents;
2815 } 3234 }
2816 void accept2(String contents, int modificationTime) { 3235 void accept2(String contents, int modificationTime) {
2817 contentHolder[0] = new CharSequence(contents); 3236 contentHolder[0] = new CharSequence(contents);
2818 } 3237 }
2819 } 3238 }
2820 class RecursiveXmlVisitor_6 extends RecursiveXmlVisitor<Object> { 3239 class RecursiveXmlVisitor_7 extends RecursiveXmlVisitor<Object> {
2821 final AnalysisContextImpl AnalysisContextImpl_this; 3240 final AnalysisContextImpl AnalysisContextImpl_this;
2822 Source htmlSource; 3241 Source htmlSource;
2823 List<Source> libraries; 3242 List<Source> libraries;
2824 RecursiveXmlVisitor_6(this.AnalysisContextImpl_this, this.htmlSource, this.lib raries) : super(); 3243 RecursiveXmlVisitor_7(this.AnalysisContextImpl_this, this.htmlSource, this.lib raries) : super();
2825 Object visitXmlTagNode(XmlTagNode node) { 3244 Object visitXmlTagNode(XmlTagNode node) {
2826 if (javaStringEqualsIgnoreCase(node.tag.lexeme, AnalysisContextImpl._TAG_SCR IPT)) { 3245 if (javaStringEqualsIgnoreCase(node.tag.lexeme, AnalysisContextImpl._TAG_SCR IPT)) {
2827 for (XmlAttributeNode attribute in node.attributes) { 3246 for (XmlAttributeNode attribute in node.attributes) {
2828 if (javaStringEqualsIgnoreCase(attribute.name.lexeme, AnalysisContextImp l._ATTRIBUTE_SRC)) { 3247 if (javaStringEqualsIgnoreCase(attribute.name.lexeme, AnalysisContextImp l._ATTRIBUTE_SRC)) {
2829 try { 3248 try {
2830 Uri uri = new Uri(path: attribute.text); 3249 Uri uri = new Uri(path: attribute.text);
2831 String fileName = uri.path; 3250 String fileName = uri.path;
2832 if (AnalysisEngine.isDartFileName(fileName)) { 3251 if (AnalysisEngine.isDartFileName(fileName)) {
2833 Source librarySource = AnalysisContextImpl_this._sourceFactory.res olveUri(htmlSource, fileName); 3252 Source librarySource = AnalysisContextImpl_this._sourceFactory.res olveUri(htmlSource, fileName);
2834 if (librarySource.exists()) { 3253 if (librarySource.exists()) {
2835 libraries.add(librarySource); 3254 libraries.add(librarySource);
2836 } 3255 }
2837 } 3256 }
2838 } catch (exception) { 3257 } catch (exception) {
2839 AnalysisEngine.instance.logger.logError2("Invalid URL ('${attribute. text}') in script tag in '${htmlSource.fullName}'", exception); 3258 AnalysisEngine.instance.logger.logError2("Invalid URL ('${attribute. text}') in script tag in '${htmlSource.fullName}'", exception);
2840 } 3259 }
2841 } 3260 }
2842 } 3261 }
2843 } 3262 }
2844 return super.visitXmlTagNode(node); 3263 return super.visitXmlTagNode(node);
2845 } 3264 }
2846 } 3265 }
2847 class Source_ContentReceiver_7 implements Source_ContentReceiver { 3266 class Source_ContentReceiver_8 implements Source_ContentReceiver {
2848 Source source; 3267 Source source;
2849 AnalysisErrorListener errorListener; 3268 AnalysisErrorListener errorListener;
2850 AnalysisContextImpl_ScanResult result; 3269 AnalysisContextImpl_ScanResult result;
2851 Source_ContentReceiver_7(this.source, this.errorListener, this.result); 3270 Source_ContentReceiver_8(this.source, this.errorListener, this.result);
2852 void accept(CharBuffer contents, int modificationTime2) { 3271 void accept(CharBuffer contents, int modificationTime2) {
2853 CharBufferScanner scanner = new CharBufferScanner(source, contents, errorLis tener); 3272 CharBufferScanner scanner = new CharBufferScanner(source, contents, errorLis tener);
2854 result._modificationTime = modificationTime2; 3273 result._modificationTime = modificationTime2;
2855 result._token = scanner.tokenize(); 3274 result._token = scanner.tokenize();
2856 result._lineStarts = scanner.lineStarts; 3275 result._lineStarts = scanner.lineStarts;
2857 } 3276 }
2858 void accept2(String contents, int modificationTime2) { 3277 void accept2(String contents, int modificationTime2) {
2859 StringScanner scanner = new StringScanner(source, contents, errorListener); 3278 StringScanner scanner = new StringScanner(source, contents, errorListener);
2860 result._modificationTime = modificationTime2; 3279 result._modificationTime = modificationTime2;
2861 result._token = scanner.tokenize(); 3280 result._token = scanner.tokenize();
2862 result._lineStarts = scanner.lineStarts; 3281 result._lineStarts = scanner.lineStarts;
2863 } 3282 }
2864 } 3283 }
3284
2865 /** 3285 /**
2866 * Instances of the class {@code AnalysisErrorInfoImpl} represent the analysis e rrors and line info 3286 * Instances of the class {@code AnalysisErrorInfoImpl} represent the analysis e rrors and line info
2867 * associated with a source. 3287 * associated with a source.
2868 */ 3288 */
2869 class AnalysisErrorInfoImpl implements AnalysisErrorInfo { 3289 class AnalysisErrorInfoImpl implements AnalysisErrorInfo {
3290
2870 /** 3291 /**
2871 * The analysis errors associated with a source, or {@code null} if there are no errors. 3292 * The analysis errors associated with a source, or {@code null} if there are no errors.
2872 */ 3293 */
2873 List<AnalysisError> _errors; 3294 List<AnalysisError> _errors;
3295
2874 /** 3296 /**
2875 * The line information associated with the errors, or {@code null} if there a re no errors. 3297 * The line information associated with the errors, or {@code null} if there a re no errors.
2876 */ 3298 */
2877 LineInfo _lineInfo; 3299 LineInfo _lineInfo;
3300
2878 /** 3301 /**
2879 * Initialize an newly created error info with the errors and line information 3302 * Initialize an newly created error info with the errors and line information
2880 * @param errors the errors as a result of analysis 3303 * @param errors the errors as a result of analysis
2881 * @param lineinfo the line info for the errors 3304 * @param lineinfo the line info for the errors
2882 */ 3305 */
2883 AnalysisErrorInfoImpl(List<AnalysisError> errors, LineInfo lineInfo) { 3306 AnalysisErrorInfoImpl(List<AnalysisError> errors, LineInfo lineInfo) {
2884 this._errors = errors; 3307 this._errors = errors;
2885 this._lineInfo = lineInfo; 3308 this._lineInfo = lineInfo;
2886 } 3309 }
3310
2887 /** 3311 /**
2888 * Return the errors of analysis, or {@code null} if there were no errors. 3312 * Return the errors of analysis, or {@code null} if there were no errors.
2889 * @return the errors as a result of the analysis 3313 * @return the errors as a result of the analysis
2890 */ 3314 */
2891 List<AnalysisError> get errors => _errors; 3315 List<AnalysisError> get errors => _errors;
3316
2892 /** 3317 /**
2893 * Return the line information associated with the errors, or {@code null} if there were no 3318 * Return the line information associated with the errors, or {@code null} if there were no
2894 * errors. 3319 * errors.
2895 * @return the line information associated with the errors 3320 * @return the line information associated with the errors
2896 */ 3321 */
2897 LineInfo get lineInfo => _lineInfo; 3322 LineInfo get lineInfo => _lineInfo;
2898 } 3323 }
3324
3325 /**
3326 * Instances of the class {@code AnalysisOptions} represent a set of analysis op tions used to
3327 * control the behavior of an analysis context.
3328 */
3329 class AnalysisOptionsImpl implements AnalysisOptions {
3330
3331 /**
3332 * A flag indicating whether analysis is to use strict mode. In strict mode, e rror reporting is
3333 * based exclusively on the static type information.
3334 */
3335 bool _strictMode = false;
3336
3337 /**
3338 * Return {@code true} if analysis is to use strict mode. In strict mode, erro r reporting is based
3339 * exclusively on the static type information.
3340 * @return {@code true} if analysis is to use strict mode
3341 */
3342 bool get strictMode => _strictMode;
3343
3344 /**
3345 * Set whether analysis is to use strict mode to the given value. In strict mo de, error reporting
3346 * is based exclusively on the static type information.
3347 * @param isStrict {@code true} if analysis is to use strict mode
3348 */
3349 void set strictMode(bool isStrict) {
3350 _strictMode = isStrict;
3351 }
3352 }
3353
2899 /** 3354 /**
2900 * The enumeration {@code CacheState} defines the possible states of cached data . 3355 * The enumeration {@code CacheState} defines the possible states of cached data .
2901 */ 3356 */
2902 class CacheState implements Comparable<CacheState> { 3357 class CacheState implements Comparable<CacheState> {
3358
2903 /** 3359 /**
2904 * The data is not in the cache and the last time an attempt was made to compu te the data an 3360 * The data is not in the cache and the last time an attempt was made to compu te the data an
2905 * exception occurred, making it pointless to attempt. 3361 * exception occurred, making it pointless to attempt.
2906 * <p> 3362 * <p>
2907 * Valid Transitions: 3363 * Valid Transitions:
2908 * <ul> 3364 * <ul>
2909 * <li>{@link #INVALID} if a source was modified that might cause the data to be computable</li> 3365 * <li>{@link #INVALID} if a source was modified that might cause the data to be computable</li>
2910 * </ul> 3366 * </ul>
2911 */ 3367 */
2912 static final CacheState ERROR = new CacheState('ERROR', 0); 3368 static final CacheState ERROR = new CacheState('ERROR', 0);
3369
2913 /** 3370 /**
2914 * The data is not in the cache because it was flushed from the cache in order to control memory 3371 * The data is not in the cache because it was flushed from the cache in order to control memory
2915 * usage. If the data is recomputed, results do not need to be reported. 3372 * usage. If the data is recomputed, results do not need to be reported.
2916 * <p> 3373 * <p>
2917 * Valid Transitions: 3374 * Valid Transitions:
2918 * <ul> 3375 * <ul>
2919 * <li>{@link #IN_PROCESS} if the data is being recomputed</li> 3376 * <li>{@link #IN_PROCESS} if the data is being recomputed</li>
2920 * <li>{@link #INVALID} if a source was modified that causes the data to need to be recomputed</li> 3377 * <li>{@link #INVALID} if a source was modified that causes the data to need to be recomputed</li>
2921 * </ul> 3378 * </ul>
2922 */ 3379 */
2923 static final CacheState FLUSHED = new CacheState('FLUSHED', 1); 3380 static final CacheState FLUSHED = new CacheState('FLUSHED', 1);
3381
2924 /** 3382 /**
2925 * The data might or might not be in the cache but is in the process of being recomputed. 3383 * The data might or might not be in the cache but is in the process of being recomputed.
2926 * <p> 3384 * <p>
2927 * Valid Transitions: 3385 * Valid Transitions:
2928 * <ul> 3386 * <ul>
2929 * <li>{@link #ERROR} if an exception occurred while trying to compute the dat a</li> 3387 * <li>{@link #ERROR} if an exception occurred while trying to compute the dat a</li>
2930 * <li>{@link #VALID} if the data was successfully computed and stored in the cache</li> 3388 * <li>{@link #VALID} if the data was successfully computed and stored in the cache</li>
2931 * </ul> 3389 * </ul>
2932 */ 3390 */
2933 static final CacheState IN_PROCESS = new CacheState('IN_PROCESS', 2); 3391 static final CacheState IN_PROCESS = new CacheState('IN_PROCESS', 2);
3392
2934 /** 3393 /**
2935 * The data is not in the cache and needs to be recomputed so that results can be reported. 3394 * The data is not in the cache and needs to be recomputed so that results can be reported.
2936 * <p> 3395 * <p>
2937 * Valid Transitions: 3396 * Valid Transitions:
2938 * <ul> 3397 * <ul>
2939 * <li>{@link #IN_PROCESS} if an attempt is being made to recompute the data</ li> 3398 * <li>{@link #IN_PROCESS} if an attempt is being made to recompute the data</ li>
2940 * </ul> 3399 * </ul>
2941 */ 3400 */
2942 static final CacheState INVALID = new CacheState('INVALID', 3); 3401 static final CacheState INVALID = new CacheState('INVALID', 3);
3402
2943 /** 3403 /**
2944 * The data is in the cache and up-to-date. 3404 * The data is in the cache and up-to-date.
2945 * <p> 3405 * <p>
2946 * Valid Transitions: 3406 * Valid Transitions:
2947 * <ul> 3407 * <ul>
2948 * <li>{@link #FLUSHED} if the data is removed in order to manage memory usage </li> 3408 * <li>{@link #FLUSHED} if the data is removed in order to manage memory usage </li>
2949 * <li>{@link #INVALID} if a source was modified in such a way as to invalidat e the previous data</li> 3409 * <li>{@link #INVALID} if a source was modified in such a way as to invalidat e the previous data</li>
2950 * </ul> 3410 * </ul>
2951 */ 3411 */
2952 static final CacheState VALID = new CacheState('VALID', 4); 3412 static final CacheState VALID = new CacheState('VALID', 4);
2953 static final List<CacheState> values = [ERROR, FLUSHED, IN_PROCESS, INVALID, V ALID]; 3413 static final List<CacheState> values = [ERROR, FLUSHED, IN_PROCESS, INVALID, V ALID];
2954 final String __name; 3414
2955 final int __ordinal; 3415 /// The name of this enum constant, as declared in the enum declaration.
2956 int get ordinal => __ordinal; 3416 final String name;
2957 CacheState(this.__name, this.__ordinal) { 3417
3418 /// The position in the enum declaration.
3419 final int ordinal;
3420 CacheState(this.name, this.ordinal) {
2958 } 3421 }
2959 int compareTo(CacheState other) => __ordinal - other.__ordinal; 3422 int compareTo(CacheState other) => ordinal - other.ordinal;
2960 String toString() => __name; 3423 String toString() => name;
2961 } 3424 }
3425
2962 /** 3426 /**
2963 * Instances of the class {@code ChangeNoticeImpl} represent a change to the ana lysis results 3427 * Instances of the class {@code ChangeNoticeImpl} represent a change to the ana lysis results
2964 * associated with a given source. 3428 * associated with a given source.
2965 * @coverage dart.engine 3429 * @coverage dart.engine
2966 */ 3430 */
2967 class ChangeNoticeImpl implements ChangeNotice { 3431 class ChangeNoticeImpl implements ChangeNotice {
3432
2968 /** 3433 /**
2969 * The source for which the result is being reported. 3434 * The source for which the result is being reported.
2970 */ 3435 */
2971 Source _source; 3436 Source _source;
3437
2972 /** 3438 /**
2973 * The fully resolved AST that changed as a result of the analysis, or {@code null} if the AST was 3439 * The fully resolved AST that changed as a result of the analysis, or {@code null} if the AST was
2974 * not changed. 3440 * not changed.
2975 */ 3441 */
2976 CompilationUnit _compilationUnit; 3442 CompilationUnit _compilationUnit;
3443
2977 /** 3444 /**
2978 * The errors that changed as a result of the analysis, or {@code null} if err ors were not 3445 * The errors that changed as a result of the analysis, or {@code null} if err ors were not
2979 * changed. 3446 * changed.
2980 */ 3447 */
2981 List<AnalysisError> _errors; 3448 List<AnalysisError> _errors;
3449
2982 /** 3450 /**
2983 * The line information associated with the source, or {@code null} if errors were not changed. 3451 * The line information associated with the source, or {@code null} if errors were not changed.
2984 */ 3452 */
2985 LineInfo _lineInfo; 3453 LineInfo _lineInfo;
3454
2986 /** 3455 /**
2987 * An empty array of change notices. 3456 * An empty array of change notices.
2988 */ 3457 */
2989 static List<ChangeNoticeImpl> EMPTY_ARRAY = new List<ChangeNoticeImpl>(0); 3458 static List<ChangeNoticeImpl> EMPTY_ARRAY = new List<ChangeNoticeImpl>(0);
3459
2990 /** 3460 /**
2991 * Initialize a newly created notice associated with the given source. 3461 * Initialize a newly created notice associated with the given source.
2992 * @param source the source for which the change is being reported 3462 * @param source the source for which the change is being reported
2993 */ 3463 */
2994 ChangeNoticeImpl(Source source) { 3464 ChangeNoticeImpl(Source source) {
2995 this._source = source; 3465 this._source = source;
2996 } 3466 }
3467
2997 /** 3468 /**
2998 * Return the fully resolved AST that changed as a result of the analysis, or {@code null} if the 3469 * Return the fully resolved AST that changed as a result of the analysis, or {@code null} if the
2999 * AST was not changed. 3470 * AST was not changed.
3000 * @return the fully resolved AST that changed as a result of the analysis 3471 * @return the fully resolved AST that changed as a result of the analysis
3001 */ 3472 */
3002 CompilationUnit get compilationUnit => _compilationUnit; 3473 CompilationUnit get compilationUnit => _compilationUnit;
3474
3003 /** 3475 /**
3004 * Return the errors that changed as a result of the analysis, or {@code null} if errors were not 3476 * Return the errors that changed as a result of the analysis, or {@code null} if errors were not
3005 * changed. 3477 * changed.
3006 * @return the errors that changed as a result of the analysis 3478 * @return the errors that changed as a result of the analysis
3007 */ 3479 */
3008 List<AnalysisError> get errors => _errors; 3480 List<AnalysisError> get errors => _errors;
3481
3009 /** 3482 /**
3010 * Return the line information associated with the source, or {@code null} if errors were not 3483 * Return the line information associated with the source, or {@code null} if errors were not
3011 * changed. 3484 * changed.
3012 * @return the line information associated with the source 3485 * @return the line information associated with the source
3013 */ 3486 */
3014 LineInfo get lineInfo => _lineInfo; 3487 LineInfo get lineInfo => _lineInfo;
3488
3015 /** 3489 /**
3016 * Return the source for which the result is being reported. 3490 * Return the source for which the result is being reported.
3017 * @return the source for which the result is being reported 3491 * @return the source for which the result is being reported
3018 */ 3492 */
3019 Source get source => _source; 3493 Source get source => _source;
3494
3020 /** 3495 /**
3021 * Set the fully resolved AST that changed as a result of the analysis to the given AST. 3496 * Set the fully resolved AST that changed as a result of the analysis to the given AST.
3022 * @param compilationUnit the fully resolved AST that changed as a result of t he analysis 3497 * @param compilationUnit the fully resolved AST that changed as a result of t he analysis
3023 */ 3498 */
3024 void set compilationUnit(CompilationUnit compilationUnit2) { 3499 void set compilationUnit(CompilationUnit compilationUnit2) {
3025 this._compilationUnit = compilationUnit2; 3500 this._compilationUnit = compilationUnit2;
3026 } 3501 }
3502
3027 /** 3503 /**
3028 * Set the errors that changed as a result of the analysis to the given errors and set the line 3504 * Set the errors that changed as a result of the analysis to the given errors and set the line
3029 * information to the given line information. 3505 * information to the given line information.
3030 * @param errors the errors that changed as a result of the analysis 3506 * @param errors the errors that changed as a result of the analysis
3031 * @param lineInfo the line information associated with the source 3507 * @param lineInfo the line information associated with the source
3032 */ 3508 */
3033 void setErrors(List<AnalysisError> errors2, LineInfo lineInfo2) { 3509 void setErrors(List<AnalysisError> errors2, LineInfo lineInfo2) {
3034 this._errors = errors2; 3510 this._errors = errors2;
3035 this._lineInfo = lineInfo2; 3511 this._lineInfo = lineInfo2;
3036 } 3512 }
3037 } 3513 }
3514
3038 /** 3515 /**
3039 * Instances of the class {@code DelegatingAnalysisContextImpl} extend {@link An alysisContextImplanalysis context} to delegate sources to the appropriate analys is context. For instance, if the 3516 * Instances of the class {@code DelegatingAnalysisContextImpl} extend {@link An alysisContextImplanalysis context} to delegate sources to the appropriate analys is context. For instance, if the
3040 * source is in a system library then the analysis context from the {@link DartS dk} is used. 3517 * source is in a system library then the analysis context from the {@link DartS dk} is used.
3041 * @coverage dart.engine 3518 * @coverage dart.engine
3042 */ 3519 */
3043 class DelegatingAnalysisContextImpl extends AnalysisContextImpl { 3520 class DelegatingAnalysisContextImpl extends AnalysisContextImpl {
3521
3044 /** 3522 /**
3045 * This references the {@link InternalAnalysisContext} held onto by the {@link DartSdk} which is 3523 * This references the {@link InternalAnalysisContext} held onto by the {@link DartSdk} which is
3046 * used (instead of this {@link AnalysisContext}) for SDK sources. This field is set when 3524 * used (instead of this {@link AnalysisContext}) for SDK sources. This field is set when
3047 * #setSourceFactory(SourceFactory) is called, and references the analysis con text in the{@link DartUriResolver} in the {@link SourceFactory}, this analysis c ontext assumes that there 3525 * #setSourceFactory(SourceFactory) is called, and references the analysis con text in the{@link DartUriResolver} in the {@link SourceFactory}, this analysis c ontext assumes that there
3048 * will be such a resolver. 3526 * will be such a resolver.
3049 */ 3527 */
3050 InternalAnalysisContext _sdkAnalysisContext; 3528 InternalAnalysisContext _sdkAnalysisContext;
3051 /**
3052 * Initialize a newly created delegating analysis context.
3053 */
3054 DelegatingAnalysisContextImpl() : super() {
3055 }
3056 void addSourceInfo(Source source, SourceEntry info) { 3529 void addSourceInfo(Source source, SourceEntry info) {
3057 if (source.isInSystemLibrary()) { 3530 if (source.isInSystemLibrary()) {
3058 _sdkAnalysisContext.addSourceInfo(source, info); 3531 _sdkAnalysisContext.addSourceInfo(source, info);
3059 } else { 3532 } else {
3060 super.addSourceInfo(source, info); 3533 super.addSourceInfo(source, info);
3061 } 3534 }
3062 } 3535 }
3063 List<AnalysisError> computeErrors(Source source) { 3536 List<AnalysisError> computeErrors(Source source) {
3064 if (source.isInSystemLibrary()) { 3537 if (source.isInSystemLibrary()) {
3065 return _sdkAnalysisContext.computeErrors(source); 3538 return _sdkAnalysisContext.computeErrors(source);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
3130 return super.getKindOf(source); 3603 return super.getKindOf(source);
3131 } 3604 }
3132 } 3605 }
3133 List<Source> getLibrariesContaining(Source source) { 3606 List<Source> getLibrariesContaining(Source source) {
3134 if (source.isInSystemLibrary()) { 3607 if (source.isInSystemLibrary()) {
3135 return _sdkAnalysisContext.getLibrariesContaining(source); 3608 return _sdkAnalysisContext.getLibrariesContaining(source);
3136 } else { 3609 } else {
3137 return super.getLibrariesContaining(source); 3610 return super.getLibrariesContaining(source);
3138 } 3611 }
3139 } 3612 }
3613 List<Source> getLibrariesDependingOn(Source librarySource) {
3614 if (librarySource.isInSystemLibrary()) {
3615 return _sdkAnalysisContext.getLibrariesDependingOn(librarySource);
3616 } else {
3617 return super.getLibrariesDependingOn(librarySource);
3618 }
3619 }
3140 LibraryElement getLibraryElement(Source source) { 3620 LibraryElement getLibraryElement(Source source) {
3141 if (source.isInSystemLibrary()) { 3621 if (source.isInSystemLibrary()) {
3142 return _sdkAnalysisContext.getLibraryElement(source); 3622 return _sdkAnalysisContext.getLibraryElement(source);
3143 } else { 3623 } else {
3144 return super.getLibraryElement(source); 3624 return super.getLibraryElement(source);
3145 } 3625 }
3146 } 3626 }
3147 List<Source> get librarySources => ArrayUtils.addAll(super.librarySources, _sd kAnalysisContext.librarySources); 3627 List<Source> get librarySources => ArrayUtils.addAll(super.librarySources, _sd kAnalysisContext.librarySources);
3148 LineInfo getLineInfo(Source source) { 3628 LineInfo getLineInfo(Source source) {
3149 if (source.isInSystemLibrary()) { 3629 if (source.isInSystemLibrary()) {
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
3213 if (elementMap.isEmpty) { 3693 if (elementMap.isEmpty) {
3214 return; 3694 return;
3215 } 3695 }
3216 Source source = new JavaIterator(elementMap.keys.toSet()).next(); 3696 Source source = new JavaIterator(elementMap.keys.toSet()).next();
3217 if (source.isInSystemLibrary()) { 3697 if (source.isInSystemLibrary()) {
3218 _sdkAnalysisContext.recordLibraryElements(elementMap); 3698 _sdkAnalysisContext.recordLibraryElements(elementMap);
3219 } else { 3699 } else {
3220 super.recordLibraryElements(elementMap); 3700 super.recordLibraryElements(elementMap);
3221 } 3701 }
3222 } 3702 }
3223 void recordResolutionErrors(Source source, Source librarySource, List<Analysis Error> errors, LineInfo lineInfo) {
3224 if (source.isInSystemLibrary()) {
3225 _sdkAnalysisContext.recordResolutionErrors(source, librarySource, errors, lineInfo);
3226 } else {
3227 super.recordResolutionErrors(source, librarySource, errors, lineInfo);
3228 }
3229 }
3230 void recordResolvedCompilationUnit(Source source, Source librarySource, Compil ationUnit unit) {
3231 if (source.isInSystemLibrary()) {
3232 _sdkAnalysisContext.recordResolvedCompilationUnit(source, librarySource, u nit);
3233 } else {
3234 super.recordResolvedCompilationUnit(source, librarySource, unit);
3235 }
3236 }
3237 CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) { 3703 CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) {
3238 if (source.isInSystemLibrary()) { 3704 if (source.isInSystemLibrary()) {
3239 return _sdkAnalysisContext.resolveCompilationUnit(source, library); 3705 return _sdkAnalysisContext.resolveCompilationUnit(source, library);
3240 } else { 3706 } else {
3241 return super.resolveCompilationUnit(source, library); 3707 return super.resolveCompilationUnit(source, library);
3242 } 3708 }
3243 } 3709 }
3244 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e) { 3710 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e) {
3245 if (unitSource.isInSystemLibrary()) { 3711 if (unitSource.isInSystemLibrary()) {
3246 return _sdkAnalysisContext.resolveCompilationUnit2(unitSource, librarySour ce); 3712 return _sdkAnalysisContext.resolveCompilationUnit2(unitSource, librarySour ce);
(...skipping 22 matching lines...) Expand all
3269 _sdkAnalysisContext = sdk.context as InternalAnalysisContext; 3735 _sdkAnalysisContext = sdk.context as InternalAnalysisContext;
3270 if (_sdkAnalysisContext is DelegatingAnalysisContextImpl) { 3736 if (_sdkAnalysisContext is DelegatingAnalysisContextImpl) {
3271 _sdkAnalysisContext = null; 3737 _sdkAnalysisContext = null;
3272 throw new IllegalStateException("The context provided by an SDK cannot i tself be a delegating analysis context"); 3738 throw new IllegalStateException("The context provided by an SDK cannot i tself be a delegating analysis context");
3273 } 3739 }
3274 } else { 3740 } else {
3275 throw new IllegalStateException("SourceFactorys provided to DelegatingAnal ysisContextImpls must have a DartSdk associated with the provided SourceFactory. "); 3741 throw new IllegalStateException("SourceFactorys provided to DelegatingAnal ysisContextImpls must have a DartSdk associated with the provided SourceFactory. ");
3276 } 3742 }
3277 } 3743 }
3278 } 3744 }
3745
3279 /** 3746 /**
3280 * Instances of the class {@code InstrumentedAnalysisContextImpl} implement an{@ link AnalysisContext analysis context} by recording instrumentation data and del egating to 3747 * Instances of the class {@code InstrumentedAnalysisContextImpl} implement an{@ link AnalysisContext analysis context} by recording instrumentation data and del egating to
3281 * another analysis context to do the non-instrumentation work. 3748 * another analysis context to do the non-instrumentation work.
3282 * @coverage dart.engine 3749 * @coverage dart.engine
3283 */ 3750 */
3284 class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { 3751 class InstrumentedAnalysisContextImpl implements InternalAnalysisContext {
3752
3285 /** 3753 /**
3286 * Record an exception that was thrown during analysis. 3754 * Record an exception that was thrown during analysis.
3287 * @param instrumentation the instrumentation builder being used to record the exception 3755 * @param instrumentation the instrumentation builder being used to record the exception
3288 * @param exception the exception being reported 3756 * @param exception the exception being reported
3289 */ 3757 */
3290 static void recordAnalysisException(InstrumentationBuilder instrumentation, An alysisException exception) { 3758 static void recordAnalysisException(InstrumentationBuilder instrumentation, An alysisException exception) {
3291 instrumentation.record(exception); 3759 instrumentation.record(exception);
3292 } 3760 }
3761
3293 /** 3762 /**
3294 * The unique identifier used to identify this analysis context in the instrum entation data. 3763 * The unique identifier used to identify this analysis context in the instrum entation data.
3295 */ 3764 */
3296 String _contextId = UUID.randomUUID().toString(); 3765 String _contextId = UUID.randomUUID().toString();
3766
3297 /** 3767 /**
3298 * The analysis context to which all of the non-instrumentation work is delega ted. 3768 * The analysis context to which all of the non-instrumentation work is delega ted.
3299 */ 3769 */
3300 InternalAnalysisContext _basis; 3770 InternalAnalysisContext _basis;
3771
3301 /** 3772 /**
3302 * Create a new {@link InstrumentedAnalysisContextImpl} which wraps a new{@lin k AnalysisContextImpl} as the basis context. 3773 * Create a new {@link InstrumentedAnalysisContextImpl} which wraps a new{@lin k AnalysisContextImpl} as the basis context.
3303 */ 3774 */
3304 InstrumentedAnalysisContextImpl() { 3775 InstrumentedAnalysisContextImpl() {
3305 _jtd_constructor_178_impl(); 3776 _jtd_constructor_182_impl();
3306 } 3777 }
3307 _jtd_constructor_178_impl() { 3778 _jtd_constructor_182_impl() {
3308 _jtd_constructor_179_impl(new AnalysisContextImpl()); 3779 _jtd_constructor_183_impl(new AnalysisContextImpl());
3309 } 3780 }
3781
3310 /** 3782 /**
3311 * Create a new {@link InstrumentedAnalysisContextImpl} with a specified basis context, aka the 3783 * Create a new {@link InstrumentedAnalysisContextImpl} with a specified basis context, aka the
3312 * context to wrap and instrument. 3784 * context to wrap and instrument.
3313 * @param context some {@link InstrumentedAnalysisContext} to wrap and instrum ent 3785 * @param context some {@link InstrumentedAnalysisContext} to wrap and instrum ent
3314 */ 3786 */
3315 InstrumentedAnalysisContextImpl.con1(InternalAnalysisContext context) { 3787 InstrumentedAnalysisContextImpl.con1(InternalAnalysisContext context) {
3316 _jtd_constructor_179_impl(context); 3788 _jtd_constructor_183_impl(context);
3317 } 3789 }
3318 _jtd_constructor_179_impl(InternalAnalysisContext context) { 3790 _jtd_constructor_183_impl(InternalAnalysisContext context) {
3319 _basis = context; 3791 _basis = context;
3320 } 3792 }
3321 void addSourceInfo(Source source, SourceEntry info) { 3793 void addSourceInfo(Source source, SourceEntry info) {
3322 _basis.addSourceInfo(source, info); 3794 _basis.addSourceInfo(source, info);
3323 } 3795 }
3324 void applyChanges(ChangeSet changeSet) { 3796 void applyChanges(ChangeSet changeSet) {
3325 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- applyChanges"); 3797 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- applyChanges");
3326 try { 3798 try {
3327 instrumentation.metric3("contextId", _contextId); 3799 instrumentation.metric3("contextId", _contextId);
3328 _basis.applyChanges(changeSet); 3800 _basis.applyChanges(changeSet);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3401 try { 3873 try {
3402 instrumentation.metric3("contextId", _contextId); 3874 instrumentation.metric3("contextId", _contextId);
3403 InstrumentedAnalysisContextImpl newContext = new InstrumentedAnalysisConte xtImpl(); 3875 InstrumentedAnalysisContextImpl newContext = new InstrumentedAnalysisConte xtImpl();
3404 _basis.extractContextInto(container, newContext._basis); 3876 _basis.extractContextInto(container, newContext._basis);
3405 return newContext; 3877 return newContext;
3406 } finally { 3878 } finally {
3407 instrumentation.log(); 3879 instrumentation.log();
3408 } 3880 }
3409 } 3881 }
3410 InternalAnalysisContext extractContextInto(SourceContainer container, Internal AnalysisContext newContext) => _basis.extractContextInto(container, newContext); 3882 InternalAnalysisContext extractContextInto(SourceContainer container, Internal AnalysisContext newContext) => _basis.extractContextInto(container, newContext);
3883 AnalysisOptions get analysisOptions {
3884 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getAnalysisOptions");
3885 try {
3886 instrumentation.metric3("contextId", _contextId);
3887 return _basis.analysisOptions;
3888 } finally {
3889 instrumentation.log();
3890 }
3891 }
3892
3411 /** 3893 /**
3412 * @return the underlying {@link AnalysisContext}. 3894 * @return the underlying {@link AnalysisContext}.
3413 */ 3895 */
3414 AnalysisContext get basis => _basis; 3896 AnalysisContext get basis => _basis;
3415 Element getElement(ElementLocation location) { 3897 Element getElement(ElementLocation location) {
3416 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getElement"); 3898 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getElement");
3417 try { 3899 try {
3418 instrumentation.metric3("contextId", _contextId); 3900 instrumentation.metric3("contextId", _contextId);
3419 return _basis.getElement(location); 3901 return _basis.getElement(location);
3420 } finally { 3902 } finally {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
3510 instrumentation.metric3("contextId", _contextId); 3992 instrumentation.metric3("contextId", _contextId);
3511 List<Source> ret = _basis.getLibrariesContaining(source); 3993 List<Source> ret = _basis.getLibrariesContaining(source);
3512 if (ret != null) { 3994 if (ret != null) {
3513 instrumentation.metric2("Source-count", ret.length); 3995 instrumentation.metric2("Source-count", ret.length);
3514 } 3996 }
3515 return ret; 3997 return ret;
3516 } finally { 3998 } finally {
3517 instrumentation.log(); 3999 instrumentation.log();
3518 } 4000 }
3519 } 4001 }
4002 List<Source> getLibrariesDependingOn(Source librarySource) {
4003 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getLibrariesDependingOn");
4004 try {
4005 instrumentation.metric3("contextId", _contextId);
4006 List<Source> ret = _basis.getLibrariesDependingOn(librarySource);
4007 if (ret != null) {
4008 instrumentation.metric2("Source-count", ret.length);
4009 }
4010 return ret;
4011 } finally {
4012 instrumentation.log();
4013 }
4014 }
3520 LibraryElement getLibraryElement(Source source) { 4015 LibraryElement getLibraryElement(Source source) {
3521 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getLibraryElement"); 4016 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getLibraryElement");
3522 try { 4017 try {
3523 instrumentation.metric3("contextId", _contextId); 4018 instrumentation.metric3("contextId", _contextId);
3524 return _basis.getLibraryElement(source); 4019 return _basis.getLibraryElement(source);
3525 } finally { 4020 } finally {
3526 instrumentation.log(); 4021 instrumentation.log();
3527 } 4022 }
3528 } 4023 }
3529 List<Source> get librarySources { 4024 List<Source> get librarySources {
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
3640 instrumentation.metric2("ChangeNotice-count", ret.length); 4135 instrumentation.metric2("ChangeNotice-count", ret.length);
3641 } 4136 }
3642 return ret; 4137 return ret;
3643 } finally { 4138 } finally {
3644 instrumentation.log(); 4139 instrumentation.log();
3645 } 4140 }
3646 } 4141 }
3647 void recordLibraryElements(Map<Source, LibraryElement> elementMap) { 4142 void recordLibraryElements(Map<Source, LibraryElement> elementMap) {
3648 _basis.recordLibraryElements(elementMap); 4143 _basis.recordLibraryElements(elementMap);
3649 } 4144 }
3650 void recordResolutionErrors(Source source, Source librarySource, List<Analysis Error> errors, LineInfo lineInfo) {
3651 _basis.recordResolutionErrors(source, librarySource, errors, lineInfo);
3652 }
3653 void recordResolvedCompilationUnit(Source source, Source librarySource, Compil ationUnit unit) {
3654 _basis.recordResolvedCompilationUnit(source, librarySource, unit);
3655 }
3656 CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement libra ry) { 4145 CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement libra ry) {
3657 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- resolveCompilationUnit"); 4146 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- resolveCompilationUnit");
3658 try { 4147 try {
3659 instrumentation.metric3("contextId", _contextId); 4148 instrumentation.metric3("contextId", _contextId);
3660 return _basis.resolveCompilationUnit(unitSource, library); 4149 return _basis.resolveCompilationUnit(unitSource, library);
3661 } on AnalysisException catch (e) { 4150 } on AnalysisException catch (e) {
3662 recordAnalysisException(instrumentation, e); 4151 recordAnalysisException(instrumentation, e);
3663 throw e; 4152 throw e;
3664 } finally { 4153 } finally {
3665 instrumentation.log(); 4154 instrumentation.log();
(...skipping 16 matching lines...) Expand all
3682 try { 4171 try {
3683 instrumentation.metric3("contextId", _contextId); 4172 instrumentation.metric3("contextId", _contextId);
3684 return _basis.resolveHtmlUnit(htmlSource); 4173 return _basis.resolveHtmlUnit(htmlSource);
3685 } on AnalysisException catch (e) { 4174 } on AnalysisException catch (e) {
3686 recordAnalysisException(instrumentation, e); 4175 recordAnalysisException(instrumentation, e);
3687 throw e; 4176 throw e;
3688 } finally { 4177 } finally {
3689 instrumentation.log(); 4178 instrumentation.log();
3690 } 4179 }
3691 } 4180 }
4181 void set analysisOptions(AnalysisOptions options) {
4182 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- setAnalysisOptions");
4183 try {
4184 instrumentation.metric3("contextId", _contextId);
4185 _basis.analysisOptions = options;
4186 } finally {
4187 instrumentation.log();
4188 }
4189 }
3692 void setContents(Source source, String contents) { 4190 void setContents(Source source, String contents) {
3693 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- setContents"); 4191 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- setContents");
3694 try { 4192 try {
3695 instrumentation.metric3("contextId", _contextId); 4193 instrumentation.metric3("contextId", _contextId);
3696 _basis.setContents(source, contents); 4194 _basis.setContents(source, contents);
3697 } finally { 4195 } finally {
3698 instrumentation.log(); 4196 instrumentation.log();
3699 } 4197 }
3700 } 4198 }
3701 void set sourceFactory(SourceFactory factory) { 4199 void set sourceFactory(SourceFactory factory) {
3702 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- setSourceFactory"); 4200 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- setSourceFactory");
3703 try { 4201 try {
3704 instrumentation.metric3("contextId", _contextId); 4202 instrumentation.metric3("contextId", _contextId);
3705 _basis.sourceFactory = factory; 4203 _basis.sourceFactory = factory;
3706 } finally { 4204 } finally {
3707 instrumentation.log(); 4205 instrumentation.log();
3708 } 4206 }
3709 } 4207 }
3710 Iterable<Source> sourcesToResolve(List<Source> changedSources) { 4208 Iterable<Source> sourcesToResolve(List<Source> changedSources) {
3711 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- sourcesToResolve"); 4209 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- sourcesToResolve");
3712 try { 4210 try {
3713 instrumentation.metric3("contextId", _contextId); 4211 instrumentation.metric3("contextId", _contextId);
3714 return _basis.sourcesToResolve(changedSources); 4212 return _basis.sourcesToResolve(changedSources);
3715 } finally { 4213 } finally {
3716 instrumentation.log(); 4214 instrumentation.log();
3717 } 4215 }
3718 } 4216 }
3719 } 4217 }
4218
3720 /** 4219 /**
3721 * The interface {@code InternalAnalysisContext} defines additional behavior for an analysis context 4220 * The interface {@code InternalAnalysisContext} defines additional behavior for an analysis context
3722 * that is required by internal users of the context. 4221 * that is required by internal users of the context.
3723 */ 4222 */
3724 abstract class InternalAnalysisContext implements AnalysisContext { 4223 abstract class InternalAnalysisContext implements AnalysisContext {
4224
3725 /** 4225 /**
3726 * Add the given source with the given information to this context. 4226 * Add the given source with the given information to this context.
3727 * @param source the source to be added 4227 * @param source the source to be added
3728 * @param info the information about the source 4228 * @param info the information about the source
3729 */ 4229 */
3730 void addSourceInfo(Source source, SourceEntry info); 4230 void addSourceInfo(Source source, SourceEntry info);
4231
3731 /** 4232 /**
3732 * Return an AST structure corresponding to the given source, but ensure that the structure has 4233 * Return an AST structure corresponding to the given source, but ensure that the structure has
3733 * not already been resolved and will not be resolved by any other threads or in any other 4234 * not already been resolved and will not be resolved by any other threads or in any other
3734 * library. 4235 * library.
3735 * @param source the compilation unit for which an AST structure should be ret urned 4236 * @param source the compilation unit for which an AST structure should be ret urned
3736 * @return the AST structure representing the content of the source 4237 * @return the AST structure representing the content of the source
3737 * @throws AnalysisException if the analysis could not be performed 4238 * @throws AnalysisException if the analysis could not be performed
3738 */ 4239 */
3739 CompilationUnit computeResolvableCompilationUnit(Source source); 4240 CompilationUnit computeResolvableCompilationUnit(Source source);
4241
3740 /** 4242 /**
3741 * Initialize the specified context by removing the specified sources from the receiver and adding 4243 * Initialize the specified context by removing the specified sources from the receiver and adding
3742 * them to the specified context. 4244 * them to the specified context.
3743 * @param container the container containing sources that should be removed fr om this context and 4245 * @param container the container containing sources that should be removed fr om this context and
3744 * added to the returned context 4246 * added to the returned context
3745 * @param newContext the context to be initialized 4247 * @param newContext the context to be initialized
3746 * @return the analysis context that was initialized 4248 * @return the analysis context that was initialized
3747 */ 4249 */
3748 InternalAnalysisContext extractContextInto(SourceContainer container, Internal AnalysisContext newContext); 4250 InternalAnalysisContext extractContextInto(SourceContainer container, Internal AnalysisContext newContext);
4251
3749 /** 4252 /**
3750 * Return a namespace containing mappings for all of the public names defined by the given 4253 * Return a namespace containing mappings for all of the public names defined by the given
3751 * library. 4254 * library.
3752 * @param library the library whose public namespace is to be returned 4255 * @param library the library whose public namespace is to be returned
3753 * @return the public namespace of the given library 4256 * @return the public namespace of the given library
3754 */ 4257 */
3755 Namespace getPublicNamespace(LibraryElement library); 4258 Namespace getPublicNamespace(LibraryElement library);
4259
3756 /** 4260 /**
3757 * Return a namespace containing mappings for all of the public names defined by the library 4261 * Return a namespace containing mappings for all of the public names defined by the library
3758 * defined by the given source. 4262 * defined by the given source.
3759 * @param source the source defining the library whose public namespace is to be returned 4263 * @param source the source defining the library whose public namespace is to be returned
3760 * @return the public namespace corresponding to the library defined by the gi ven source 4264 * @return the public namespace corresponding to the library defined by the gi ven source
3761 * @throws AnalysisException if the public namespace could not be computed 4265 * @throws AnalysisException if the public namespace could not be computed
3762 */ 4266 */
3763 Namespace getPublicNamespace2(Source source); 4267 Namespace getPublicNamespace2(Source source);
4268
3764 /** 4269 /**
3765 * Given a table mapping the source for the libraries represented by the corre sponding elements to 4270 * Given a table mapping the source for the libraries represented by the corre sponding elements to
3766 * the elements representing the libraries, record those mappings. 4271 * the elements representing the libraries, record those mappings.
3767 * @param elementMap a table mapping the source for the libraries represented by the elements to 4272 * @param elementMap a table mapping the source for the libraries represented by the elements to
3768 * the elements representing the libraries 4273 * the elements representing the libraries
3769 */ 4274 */
3770 void recordLibraryElements(Map<Source, LibraryElement> elementMap); 4275 void recordLibraryElements(Map<Source, LibraryElement> elementMap);
3771 /**
3772 * Give the resolution errors and line info associated with the given source, add the information
3773 * to the cache.
3774 * @param source the source with which the information is associated
3775 * @param librarySource the source of the defining compilation unit of the lib rary in which the
3776 * source was resolved
3777 * @param errors the resolution errors associated with the source
3778 * @param lineInfo the line information associated with the source
3779 */
3780 void recordResolutionErrors(Source source, Source librarySource, List<Analysis Error> errors, LineInfo lineInfo);
3781 /**
3782 * Give the resolved compilation unit associated with the given source, add th e unit to the cache.
3783 * @param source the source with which the unit is associated
3784 * @param librarySource the source of the defining compilation unit of the lib rary in which the
3785 * source was resolved
3786 * @param unit the compilation unit associated with the source
3787 */
3788 void recordResolvedCompilationUnit(Source source, Source librarySource, Compil ationUnit unit);
3789 } 4276 }
4277
3790 /** 4278 /**
3791 * Instances of the class {@code RecordingErrorListener} implement an error list ener that will 4279 * Instances of the class {@code RecordingErrorListener} implement an error list ener that will
3792 * record the errors that are reported to it in a way that is appropriate for ca ching those errors 4280 * record the errors that are reported to it in a way that is appropriate for ca ching those errors
3793 * within an analysis context. 4281 * within an analysis context.
3794 * @coverage dart.engine 4282 * @coverage dart.engine
3795 */ 4283 */
3796 class RecordingErrorListener implements AnalysisErrorListener { 4284 class RecordingErrorListener implements AnalysisErrorListener {
4285
3797 /** 4286 /**
3798 * A HashMap of lists containing the errors that were collected, keyed by each {@link Source}. 4287 * A HashMap of lists containing the errors that were collected, keyed by each {@link Source}.
3799 */ 4288 */
3800 Map<Source, List<AnalysisError>> _errors = new Map<Source, List<AnalysisError> >(); 4289 Map<Source, List<AnalysisError>> _errors = new Map<Source, List<AnalysisError> >();
4290
4291 /**
4292 * Add all of the errors recorded by the given listener to this listener.
4293 * @param listener the listener that has recorded the errors to be added
4294 */
4295 void addAll(RecordingErrorListener listener) {
4296 for (AnalysisError error in listener.errors) {
4297 onError(error);
4298 }
4299 }
4300
3801 /** 4301 /**
3802 * Answer the errors collected by the listener. 4302 * Answer the errors collected by the listener.
3803 * @return an array of errors (not {@code null}, contains no {@code null}s) 4303 * @return an array of errors (not {@code null}, contains no {@code null}s)
3804 */ 4304 */
3805 List<AnalysisError> get errors { 4305 List<AnalysisError> get errors {
3806 Set<MapEntry<Source, List<AnalysisError>>> entrySet2 = getMapEntrySet(_error s); 4306 Set<MapEntry<Source, List<AnalysisError>>> entrySet2 = getMapEntrySet(_error s);
3807 if (entrySet2.length == 0) { 4307 if (entrySet2.length == 0) {
3808 return AnalysisError.NO_ERRORS; 4308 return AnalysisError.NO_ERRORS;
3809 } 4309 }
3810 List<AnalysisError> resultList = new List<AnalysisError>(); 4310 List<AnalysisError> resultList = new List<AnalysisError>();
3811 for (MapEntry<Source, List<AnalysisError>> entry in entrySet2) { 4311 for (MapEntry<Source, List<AnalysisError>> entry in entrySet2) {
3812 resultList.addAll(entry.getValue()); 4312 resultList.addAll(entry.getValue());
3813 } 4313 }
3814 return new List.from(resultList); 4314 return new List.from(resultList);
3815 } 4315 }
4316
3816 /** 4317 /**
3817 * Answer the errors collected by the listener for some passed {@link Source}. 4318 * Answer the errors collected by the listener for some passed {@link Source}.
3818 * @param source some {@link Source} for which the caller wants the set of {@l ink AnalysisError}s 4319 * @param source some {@link Source} for which the caller wants the set of {@l ink AnalysisError}s
3819 * collected by this listener 4320 * collected by this listener
3820 * @return the errors collected by the listener for the passed {@link Source} 4321 * @return the errors collected by the listener for the passed {@link Source}
3821 */ 4322 */
3822 List<AnalysisError> getErrors2(Source source) { 4323 List<AnalysisError> getErrors2(Source source) {
3823 List<AnalysisError> errorsForSource = _errors[source]; 4324 List<AnalysisError> errorsForSource = _errors[source];
3824 if (errorsForSource == null) { 4325 if (errorsForSource == null) {
3825 return AnalysisError.NO_ERRORS; 4326 return AnalysisError.NO_ERRORS;
3826 } else { 4327 } else {
3827 return new List.from(errorsForSource); 4328 return new List.from(errorsForSource);
3828 } 4329 }
3829 } 4330 }
3830 void onError(AnalysisError event) { 4331 void onError(AnalysisError event) {
3831 Source source2 = event.source; 4332 Source source2 = event.source;
3832 List<AnalysisError> errorsForSource = _errors[source2]; 4333 List<AnalysisError> errorsForSource = _errors[source2];
3833 if (_errors[source2] == null) { 4334 if (_errors[source2] == null) {
3834 errorsForSource = new List<AnalysisError>(); 4335 errorsForSource = new List<AnalysisError>();
3835 _errors[source2] = errorsForSource; 4336 _errors[source2] = errorsForSource;
3836 } 4337 }
3837 errorsForSource.add(event); 4338 errorsForSource.add(event);
3838 } 4339 }
3839 } 4340 }
4341
3840 /** 4342 /**
3841 * Instances of the class {@code ResolutionEraser} remove any resolution informa tion from an AST 4343 * Instances of the class {@code ResolutionEraser} remove any resolution informa tion from an AST
3842 * structure when used to visit that structure. 4344 * structure when used to visit that structure.
3843 */ 4345 */
3844 class ResolutionEraser extends GeneralizingASTVisitor<Object> { 4346 class ResolutionEraser extends GeneralizingASTVisitor<Object> {
3845 Object visitAssignmentExpression(AssignmentExpression node) { 4347 Object visitAssignmentExpression(AssignmentExpression node) {
3846 node.element = null; 4348 node.element = null;
3847 return super.visitAssignmentExpression(node); 4349 return super.visitAssignmentExpression(node);
3848 } 4350 }
3849 Object visitBinaryExpression(BinaryExpression node) { 4351 Object visitBinaryExpression(BinaryExpression node) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3901 } 4403 }
3902 Object visitSimpleIdentifier(SimpleIdentifier node) { 4404 Object visitSimpleIdentifier(SimpleIdentifier node) {
3903 node.element = null; 4405 node.element = null;
3904 return super.visitSimpleIdentifier(node); 4406 return super.visitSimpleIdentifier(node);
3905 } 4407 }
3906 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { 4408 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
3907 node.element = null; 4409 node.element = null;
3908 return super.visitSuperConstructorInvocation(node); 4410 return super.visitSuperConstructorInvocation(node);
3909 } 4411 }
3910 } 4412 }
4413
3911 /** 4414 /**
3912 * The interface {@code Logger} defines the behavior of objects that can be used to receive 4415 * The interface {@code Logger} defines the behavior of objects that can be used to receive
3913 * information about errors within the analysis engine. Implementations usually write this 4416 * information about errors within the analysis engine. Implementations usually write this
3914 * information to a file, but can also record the information for later use (suc h as during testing) 4417 * information to a file, but can also record the information for later use (suc h as during testing)
3915 * or even ignore the information. 4418 * or even ignore the information.
3916 * @coverage dart.engine.utilities 4419 * @coverage dart.engine.utilities
3917 */ 4420 */
3918 abstract class Logger { 4421 abstract class Logger {
3919 static Logger NULL = new Logger_NullLogger(); 4422 static Logger NULL = new Logger_NullLogger();
4423
3920 /** 4424 /**
3921 * Log the given message as an error. 4425 * Log the given message as an error.
3922 * @param message an explanation of why the error occurred or what it means 4426 * @param message an explanation of why the error occurred or what it means
3923 */ 4427 */
3924 void logError(String message); 4428 void logError(String message);
4429
3925 /** 4430 /**
3926 * Log the given exception as one representing an error. 4431 * Log the given exception as one representing an error.
3927 * @param message an explanation of why the error occurred or what it means 4432 * @param message an explanation of why the error occurred or what it means
3928 * @param exception the exception being logged 4433 * @param exception the exception being logged
3929 */ 4434 */
3930 void logError2(String message, Exception exception); 4435 void logError2(String message, Exception exception);
4436
3931 /** 4437 /**
3932 * Log the given exception as one representing an error. 4438 * Log the given exception as one representing an error.
3933 * @param exception the exception being logged 4439 * @param exception the exception being logged
3934 */ 4440 */
3935 void logError3(Exception exception); 4441 void logError3(Exception exception);
4442
3936 /** 4443 /**
3937 * Log the given informational message. 4444 * Log the given informational message.
3938 * @param message an explanation of why the error occurred or what it means 4445 * @param message an explanation of why the error occurred or what it means
3939 * @param exception the exception being logged 4446 * @param exception the exception being logged
3940 */ 4447 */
3941 void logInformation(String message); 4448 void logInformation(String message);
4449
3942 /** 4450 /**
3943 * Log the given exception as one representing an informational message. 4451 * Log the given exception as one representing an informational message.
3944 * @param message an explanation of why the error occurred or what it means 4452 * @param message an explanation of why the error occurred or what it means
3945 * @param exception the exception being logged 4453 * @param exception the exception being logged
3946 */ 4454 */
3947 void logInformation2(String message, Exception exception); 4455 void logInformation2(String message, Exception exception);
3948 } 4456 }
4457
3949 /** 4458 /**
3950 * Implementation of {@link Logger} that does nothing. 4459 * Implementation of {@link Logger} that does nothing.
3951 */ 4460 */
3952 class Logger_NullLogger implements Logger { 4461 class Logger_NullLogger implements Logger {
3953 void logError(String message) { 4462 void logError(String message) {
3954 } 4463 }
3955 void logError2(String message, Exception exception) { 4464 void logError2(String message, Exception exception) {
3956 } 4465 }
3957 void logError3(Exception exception) { 4466 void logError3(Exception exception) {
3958 } 4467 }
3959 void logInformation(String message) { 4468 void logInformation(String message) {
3960 } 4469 }
3961 void logInformation2(String message, Exception exception) { 4470 void logInformation2(String message, Exception exception) {
3962 } 4471 }
3963 } 4472 }
OLDNEW
« no previous file with comments | « pkg/analyzer_experimental/lib/src/generated/element.dart ('k') | pkg/analyzer_experimental/lib/src/generated/error.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698