OLD | NEW |
| (Empty) |
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. | |
3 | |
4 library engine; | |
5 | |
6 import 'java_core.dart'; | |
7 import 'java_engine.dart'; | |
8 import 'dart:collection' show HasNextIterator; | |
9 import 'error.dart'; | |
10 import 'source.dart'; | |
11 import 'scanner.dart' show Token, CharBufferScanner, StringScanner; | |
12 import 'ast.dart' show CompilationUnit, Directive, PartOfDirective; | |
13 import 'parser.dart' show Parser; | |
14 import 'element.dart'; | |
15 import 'resolver.dart' show Namespace, NamespaceBuilder, LibraryResolver; | |
16 import 'html.dart' show HtmlScanner, HtmlScanResult, HtmlParser, HtmlParseResult
; | |
17 | |
18 /** | |
19 * The unique instance of the class {@code AnalysisEngine} serves as the entry p
oint for the | |
20 * functionality provided by the analysis engine. | |
21 * @coverage dart.engine | |
22 */ | |
23 class AnalysisEngine { | |
24 /** | |
25 * The suffix used for Dart source files. | |
26 */ | |
27 static String SUFFIX_DART = "dart"; | |
28 /** | |
29 * The short suffix used for HTML files. | |
30 */ | |
31 static String SUFFIX_HTM = "htm"; | |
32 /** | |
33 * The long suffix used for HTML files. | |
34 */ | |
35 static String SUFFIX_HTML = "html"; | |
36 /** | |
37 * The unique instance of this class. | |
38 */ | |
39 static AnalysisEngine _UniqueInstance = new AnalysisEngine(); | |
40 /** | |
41 * Return the unique instance of this class. | |
42 * @return the unique instance of this class | |
43 */ | |
44 static AnalysisEngine get instance => _UniqueInstance; | |
45 /** | |
46 * Return {@code true} if the given file name is assumed to contain Dart sourc
e code. | |
47 * @param fileName the name of the file being tested | |
48 * @return {@code true} if the given file name is assumed to contain Dart sour
ce code | |
49 */ | |
50 static bool isDartFileName(String fileName) { | |
51 if (fileName == null) { | |
52 return false; | |
53 } | |
54 return javaStringEqualsIgnoreCase(FileNameUtilities.getExtension(fileName),
SUFFIX_DART); | |
55 } | |
56 /** | |
57 * Return {@code true} if the given file name is assumed to contain HTML. | |
58 * @param fileName the name of the file being tested | |
59 * @return {@code true} if the given file name is assumed to contain HTML | |
60 */ | |
61 static bool isHtmlFileName(String fileName) { | |
62 if (fileName == null) { | |
63 return false; | |
64 } | |
65 String extension = FileNameUtilities.getExtension(fileName); | |
66 return javaStringEqualsIgnoreCase(extension, SUFFIX_HTML) || javaStringEqual
sIgnoreCase(extension, SUFFIX_HTM); | |
67 } | |
68 /** | |
69 * The logger that should receive information about errors within the analysis
engine. | |
70 */ | |
71 Logger _logger = Logger.NULL; | |
72 /** | |
73 * Prevent the creation of instances of this class. | |
74 */ | |
75 AnalysisEngine() : super() { | |
76 } | |
77 /** | |
78 * Create a new context in which analysis can be performed. | |
79 * @return the analysis context that was created | |
80 */ | |
81 AnalysisContext createAnalysisContext() => new AnalysisContextImpl(); | |
82 /** | |
83 * Return the logger that should receive information about errors within the a
nalysis engine. | |
84 * @return the logger that should receive information about errors within the
analysis engine | |
85 */ | |
86 Logger get logger => _logger; | |
87 /** | |
88 * Set the logger that should receive information about errors within the anal
ysis engine to the | |
89 * given logger. | |
90 * @param logger the logger that should receive information about errors withi
n the analysis | |
91 * engine | |
92 */ | |
93 void set logger(Logger logger2) { | |
94 this._logger = logger2 == null ? Logger.NULL : logger2; | |
95 } | |
96 } | |
97 /** | |
98 * The interface {@code AnalysisContext} defines the behavior of objects that re
present a context in | |
99 * which analysis can be performed. The context includes such information as the
version of the SDK | |
100 * being analyzed against as well as the package-root used to resolve 'package:'
URI's. (The latter | |
101 * is included indirectly through the {@link SourceFactory source factory}.) | |
102 * <p> | |
103 * Analysis engine allows for having more than one context. This can be used, fo
r example, to | |
104 * perform one analysis based on the state of files on disk and a separate analy
sis based on the | |
105 * state of those files in open editors. It can also be used to perform an analy
sis based on a | |
106 * proposed future state, such as the state after a refactoring. | |
107 */ | |
108 abstract class AnalysisContext { | |
109 /** | |
110 * Respond to the given set of changes by removing any cached information that
might now be | |
111 * out-of-date. The result indicates what operations need to be performed as a
result of this | |
112 * change without actually performing those operations. | |
113 * @param changeSet a description of the changes that have occurred | |
114 * @return a result (not {@code null}) indicating operations to be performed | |
115 */ | |
116 ChangeResult changed(ChangeSet changeSet); | |
117 /** | |
118 * Clear any cached information that is dependent on resolution. This method s
hould be invoked if | |
119 * the assumptions used by resolution have changed but the contents of the fil
e have not changed. | |
120 * Use {@link #sourceChanged(Source)} and {@link #sourcesDeleted(SourceContain
er)} to indicate | |
121 * when the contents of a file or files have changed. | |
122 */ | |
123 void clearResolution(); | |
124 /** | |
125 * Call this method when this context is no longer going to be used. At this p
oint, the receiver | |
126 * may choose to push some of its information back into the global cache for c
onsumption by | |
127 * another context for performance. | |
128 */ | |
129 void discard(); | |
130 /** | |
131 * Create a new context in which analysis can be performed. Any sources in the
specified directory | |
132 * in the receiver will be removed from the receiver and added to the newly cr
eated context. | |
133 * @param directory the directory (not {@code null}) containing sources that s
hould be removed | |
134 * from the receiver and added to the returned context | |
135 * @return the analysis context that was created (not {@code null}) | |
136 */ | |
137 AnalysisContext extractAnalysisContext(SourceContainer container); | |
138 /** | |
139 * Return the element referenced by the given location. | |
140 * @param location the reference describing the element to be returned | |
141 * @return the element referenced by the given location | |
142 */ | |
143 Element getElement(ElementLocation location); | |
144 /** | |
145 * Return an array containing all of the errors associated with the given sour
ce. | |
146 * @param source the source whose errors are to be returned | |
147 * @return all of the errors associated with the given source | |
148 * @throws AnalysisException if the errors could not be determined because the
analysis could not | |
149 * be performed | |
150 */ | |
151 List<AnalysisError> getErrors(Source source); | |
152 /** | |
153 * Parse and build an element model for the HTML file defined by the given sou
rce. | |
154 * @param source the source defining the HTML file whose element model is to b
e returned | |
155 * @return the element model corresponding to the HTML file defined by the giv
en source | |
156 */ | |
157 HtmlElement getHtmlElement(Source source); | |
158 /** | |
159 * Return the kind of the given source if it is already known, or {@code null}
if the kind is not | |
160 * already known. | |
161 * @param source the source whose kind is to be returned | |
162 * @return the kind of the given source | |
163 * @see #getOrComputeKindOf(Source) | |
164 */ | |
165 SourceKind getKnownKindOf(Source source); | |
166 /** | |
167 * Return the sources for the defining compilation units of any libraries of w
hich the given | |
168 * source is a part. The array will normally contain a single library because
most Dart sources | |
169 * are only included in a single library, but it is possible to have a part th
at is contained in | |
170 * multiple identically named libraries. If the source represents the defining
compilation unit of | |
171 * a library, then the returned array will contain the given source as its onl
y element. If the | |
172 * source does not represent a Dart source or is not known to this context, th
e returned array | |
173 * will be empty. | |
174 * @param source the source contained in the returned libraries | |
175 * @return the sources for the libraries containing the given source | |
176 */ | |
177 List<Source> getLibrariesContaining(Source source); | |
178 /** | |
179 * Return the element model corresponding to the library defined by the given
source. If the | |
180 * element model does not yet exist it will be created. The process of creatin
g an element model | |
181 * for a library can long-running, depending on the size of the library and th
e number of | |
182 * libraries that are imported into it that also need to have a model built fo
r them. | |
183 * @param source the source defining the library whose element model is to be
returned | |
184 * @return the element model corresponding to the library defined by the given
source or{@code null} if the element model could not be determined because the
analysis could | |
185 * not be performed | |
186 */ | |
187 LibraryElement getLibraryElement(Source source); | |
188 /** | |
189 * Return the element model corresponding to the library defined by the given
source, or{@code null} if the element model does not yet exist. | |
190 * @param source the source defining the library whose element model is to be
returned | |
191 * @return the element model corresponding to the library defined by the given
source | |
192 */ | |
193 LibraryElement getLibraryElementOrNull(Source source); | |
194 /** | |
195 * Return the kind of the given source, computing it's kind if it is not alrea
dy known. | |
196 * @param source the source whose kind is to be returned | |
197 * @return the kind of the given source | |
198 * @see #getKnownKindOf(Source) | |
199 */ | |
200 SourceKind getOrComputeKindOf(Source source); | |
201 /** | |
202 * Return an array containing all of the parsing errors associated with the gi
ven source. | |
203 * @param source the source whose errors are to be returned | |
204 * @return all of the parsing errors associated with the given source | |
205 * @throws AnalysisException if the errors could not be determined because the
analysis could not | |
206 * be performed | |
207 */ | |
208 List<AnalysisError> getParsingErrors(Source source); | |
209 /** | |
210 * Return an array containing all of the resolution errors associated with the
given source. | |
211 * @param source the source whose errors are to be returned | |
212 * @return all of the resolution errors associated with the given source | |
213 * @throws AnalysisException if the errors could not be determined because the
analysis could not | |
214 * be performed | |
215 */ | |
216 List<AnalysisError> getResolutionErrors(Source source); | |
217 /** | |
218 * Return the source factory used to create the sources that can be analyzed i
n this context. | |
219 * @return the source factory used to create the sources that can be analyzed
in this context | |
220 */ | |
221 SourceFactory get sourceFactory; | |
222 /** | |
223 * Add the sources contained in the specified context to the receiver's collec
tion of sources. | |
224 * This method is called when an existing context's pubspec has been removed,
and the contained | |
225 * sources should be reanalyzed as part of the receiver. | |
226 * @param context the context being merged (not {@code null}) | |
227 */ | |
228 void mergeAnalysisContext(AnalysisContext context); | |
229 /** | |
230 * Parse a single source to produce an AST structure. The resulting AST struct
ure may or may not | |
231 * be resolved, and may have a slightly different structure depending upon whe
ther it is resolved. | |
232 * @param source the source to be parsed | |
233 * @return the AST structure representing the content of the source | |
234 * @throws AnalysisException if the analysis could not be performed | |
235 */ | |
236 CompilationUnit parse(Source source); | |
237 /** | |
238 * Parse a single HTML source to produce an AST structure. The resulting HTML
AST structure may or | |
239 * may not be resolved, and may have a slightly different structure depending
upon whether it is | |
240 * resolved. | |
241 * @param source the HTML source to be parsed | |
242 * @return the parse result (not {@code null}) | |
243 * @throws AnalysisException if the analysis could not be performed | |
244 */ | |
245 HtmlParseResult parseHtml(Source source); | |
246 /** | |
247 * Parse and resolve a single source within the given context to produce a ful
ly resolved AST. | |
248 * @param source the source to be parsed and resolved | |
249 * @param library the library defining the context in which the source file is
to be resolved | |
250 * @return the result of resolving the AST structure representing the content
of the source | |
251 * @throws AnalysisException if the analysis could not be performed | |
252 */ | |
253 CompilationUnit resolve(Source source, LibraryElement library); | |
254 /** | |
255 * Scan a single source to produce a token stream. | |
256 * @param source the source to be scanned | |
257 * @param errorListener the listener to which errors should be reported | |
258 * @return the head of the token stream representing the content of the source | |
259 * @throws AnalysisException if the analysis could not be performed | |
260 */ | |
261 Token scan(Source source, AnalysisErrorListener errorListener); | |
262 /** | |
263 * Scan a single source to produce an HTML token stream. | |
264 * @param source the source to be scanned | |
265 * @return the scan result (not {@code null}) | |
266 * @throws AnalysisException if the analysis could not be performed | |
267 */ | |
268 HtmlScanResult scanHtml(Source source); | |
269 /** | |
270 * Set the source factory used to create the sources that can be analyzed in t
his context to the | |
271 * given source factory. | |
272 * @param sourceFactory the source factory used to create the sources that can
be analyzed in this | |
273 * context | |
274 */ | |
275 void set sourceFactory(SourceFactory sourceFactory4); | |
276 /** | |
277 * Given a collection of sources with content that has changed, return an {@li
nk Iterable}identifying the sources that need to be resolved. | |
278 * @param changedSources an array of sources (not {@code null}, contains no {@
code null}s) | |
279 * @return An iterable returning the sources to be resolved | |
280 */ | |
281 Iterable<Source> sourcesToResolve(List<Source> changedSources); | |
282 } | |
283 /** | |
284 * Instances of the class {@code AnalysisException} represent an exception that
occurred during the | |
285 * analysis of one or more sources. | |
286 * @coverage dart.engine | |
287 */ | |
288 class AnalysisException extends JavaException { | |
289 /** | |
290 * Initialize a newly created exception. | |
291 */ | |
292 AnalysisException() : super() { | |
293 _jtd_constructor_121_impl(); | |
294 } | |
295 _jtd_constructor_121_impl() { | |
296 } | |
297 /** | |
298 * Initialize a newly created exception to have the given message. | |
299 * @param message the message associated with the exception | |
300 */ | |
301 AnalysisException.con1(String message) : super(message) { | |
302 _jtd_constructor_122_impl(message); | |
303 } | |
304 _jtd_constructor_122_impl(String message) { | |
305 } | |
306 /** | |
307 * Initialize a newly created exception to have the given message and cause. | |
308 * @param message the message associated with the exception | |
309 * @param cause the underlying exception that caused this exception | |
310 */ | |
311 AnalysisException.con2(String message, Exception cause) : super(message, cause
) { | |
312 _jtd_constructor_123_impl(message, cause); | |
313 } | |
314 _jtd_constructor_123_impl(String message, Exception cause) { | |
315 } | |
316 /** | |
317 * Initialize a newly created exception to have the given cause. | |
318 * @param cause the underlying exception that caused this exception | |
319 */ | |
320 AnalysisException.con3(Exception cause) : super.withCause(cause) { | |
321 _jtd_constructor_124_impl(cause); | |
322 } | |
323 _jtd_constructor_124_impl(Exception cause) { | |
324 } | |
325 } | |
326 /** | |
327 * Instances of {@code ChangeResult} are returned by {@link AnalysisContext#chan
ged(ChangeSet)} to | |
328 * indicate what operations need to be performed as a result of the change. | |
329 * @coverage dart.engine | |
330 */ | |
331 class ChangeResult { | |
332 } | |
333 /** | |
334 * Instances of the class {@code ChangeSet} indicate what sources have been adde
d, changed, or | |
335 * removed. | |
336 * @coverage dart.engine | |
337 */ | |
338 class ChangeSet { | |
339 /** | |
340 * A table mapping the sources that have been added to their contents. | |
341 */ | |
342 Map<Source, String> _added3 = new Map<Source, String>(); | |
343 /** | |
344 * A table mapping the sources that have been changed to their contents. | |
345 */ | |
346 Map<Source, String> _changed3 = new Map<Source, String>(); | |
347 /** | |
348 * A list containing the sources that have been removed.. | |
349 */ | |
350 List<Source> _removed2 = new List<Source>(); | |
351 /** | |
352 * A list containing the source containers specifying additional sources that
have been removed. | |
353 */ | |
354 List<SourceContainer> _removedContainers = new List<SourceContainer>(); | |
355 /** | |
356 * Initialize a newly created change set to be empty. | |
357 */ | |
358 ChangeSet() : super() { | |
359 } | |
360 /** | |
361 * Record that the specified source has been added and that it's content is th
e default contents | |
362 * of the source. | |
363 * @param source the source that was added | |
364 */ | |
365 void added(Source source) { | |
366 added2(source, null); | |
367 } | |
368 /** | |
369 * Record that the specified source has been added and that it has the given c
ontent. If the | |
370 * content is non-{@code null}, this has the effect of overriding the default
contents of the | |
371 * source. If the contents are {@code null}, any previous the override is remo
ved so that the | |
372 * default contents will be used. | |
373 * @param source the source that was added | |
374 * @param content the content of the new source | |
375 */ | |
376 void added2(Source source, String content) { | |
377 if (source != null) { | |
378 _added3[source] = content; | |
379 } | |
380 } | |
381 /** | |
382 * Record that the specified source has been changed and that it's content is
the default contents | |
383 * of the source. | |
384 * @param source the source that was changed | |
385 */ | |
386 void changed(Source source) { | |
387 changed2(source, null); | |
388 } | |
389 /** | |
390 * Record that the specified source has been changed and that it now has the g
iven content. If the | |
391 * content is non-{@code null}, this has the effect of overriding the default
contents of the | |
392 * source. If the contents are {@code null}, any previous the override is remo
ved so that the | |
393 * default contents will be used. | |
394 * @param source the source that was changed | |
395 * @param content the new content of the source | |
396 */ | |
397 void changed2(Source source, String content) { | |
398 if (source != null) { | |
399 _changed3[source] = content; | |
400 } | |
401 } | |
402 /** | |
403 * Return a table mapping the sources that have been added to their contents. | |
404 * @return a table mapping the sources that have been added to their contents | |
405 */ | |
406 Map<Source, String> get addedWithContent => _added3; | |
407 /** | |
408 * Return a table mapping the sources that have been changed to their contents
. | |
409 * @return a table mapping the sources that have been changed to their content
s | |
410 */ | |
411 Map<Source, String> get changedWithContent => _changed3; | |
412 /** | |
413 * Return a list containing the sources that were removed. | |
414 * @return a list containing the sources that were removed | |
415 */ | |
416 List<Source> get removed => _removed2; | |
417 /** | |
418 * Return a list containing the source containers that were removed. | |
419 * @return a list containing the source containers that were removed | |
420 */ | |
421 List<SourceContainer> get removedContainers => _removedContainers; | |
422 /** | |
423 * Return {@code true} if this change set does not contain any changes. | |
424 * @return {@code true} if this change set does not contain any changes | |
425 */ | |
426 bool isEmpty() => _added3.isEmpty && _changed3.isEmpty && _removed2.isEmpty &&
_removedContainers.isEmpty; | |
427 /** | |
428 * Record that the specified source has been removed. | |
429 * @param source the source that was removed | |
430 */ | |
431 void removed3(Source source) { | |
432 if (source != null) { | |
433 _removed2.add(source); | |
434 } | |
435 } | |
436 /** | |
437 * Record that the specified source container has been removed. | |
438 * @param container the source container that was removed | |
439 */ | |
440 void removedContainer(SourceContainer container) { | |
441 if (container != null) { | |
442 _removedContainers.add(container); | |
443 } | |
444 } | |
445 } | |
446 /** | |
447 * Instances of the class {@code AnalysisContextImpl} implement an {@link Analys
isContext analysis | |
448 * context}. | |
449 * @coverage dart.engine | |
450 */ | |
451 class AnalysisContextImpl implements AnalysisContext { | |
452 /** | |
453 * The source factory used to create the sources that can be analyzed in this
context. | |
454 */ | |
455 SourceFactory _sourceFactory; | |
456 /** | |
457 * A table mapping sources known to the context to the information known about
the source. | |
458 */ | |
459 Map<Source, SourceInfo> _sourceMap = new Map<Source, SourceInfo>(); | |
460 /** | |
461 * A cache mapping sources to the compilation units that were produced for the
contents of the | |
462 * source. | |
463 */ | |
464 Map<Source, CompilationUnit> _parseCache = new Map<Source, CompilationUnit>(); | |
465 /** | |
466 * A cache mapping sources to the html parse results that were produced for th
e contents of the | |
467 * source. | |
468 */ | |
469 Map<Source, HtmlParseResult> _htmlParseCache = new Map<Source, HtmlParseResult
>(); | |
470 /** | |
471 * A cache mapping sources (of the defining compilation units of libraries) to
the library | |
472 * elements for those libraries. | |
473 */ | |
474 Map<Source, LibraryElement> _libraryElementCache = new Map<Source, LibraryElem
ent>(); | |
475 /** | |
476 * A cache mapping sources (of the defining compilation units of libraries) to
the public | |
477 * namespace for that library. | |
478 */ | |
479 Map<Source, Namespace> _publicNamespaceCache = new Map<Source, Namespace>(); | |
480 /** | |
481 * The object used to synchronize access to all of the caches. | |
482 */ | |
483 Object _cacheLock = new Object(); | |
484 /** | |
485 * The suffix used by sources that contain Dart. | |
486 */ | |
487 static String _DART_SUFFIX = ".dart"; | |
488 /** | |
489 * The suffix used by sources that contain HTML. | |
490 */ | |
491 static String _HTML_SUFFIX = ".html"; | |
492 /** | |
493 * Initialize a newly created analysis context. | |
494 */ | |
495 AnalysisContextImpl() : super() { | |
496 } | |
497 ChangeResult changed(ChangeSet changeSet) { | |
498 if (changeSet.isEmpty()) { | |
499 return new ChangeResult(); | |
500 } | |
501 { | |
502 for (MapEntry<Source, String> entry in getMapEntrySet(changeSet.addedWithC
ontent)) { | |
503 _sourceFactory.setContents(entry.getKey(), entry.getValue()); | |
504 } | |
505 for (MapEntry<Source, String> entry in getMapEntrySet(changeSet.changedWit
hContent)) { | |
506 _sourceFactory.setContents(entry.getKey(), entry.getValue()); | |
507 } | |
508 for (Source source in changeSet.addedWithContent.keys.toSet()) { | |
509 sourceAvailable(source); | |
510 } | |
511 for (Source source in changeSet.changedWithContent.keys.toSet()) { | |
512 sourceChanged(source); | |
513 } | |
514 for (Source source in changeSet.removed) { | |
515 sourceDeleted(source); | |
516 } | |
517 for (SourceContainer container in changeSet.removedContainers) { | |
518 sourcesDeleted(container); | |
519 } | |
520 } | |
521 return new ChangeResult(); | |
522 } | |
523 void clearResolution() { | |
524 { | |
525 _parseCache.clear(); | |
526 _htmlParseCache.clear(); | |
527 _libraryElementCache.clear(); | |
528 _publicNamespaceCache.clear(); | |
529 } | |
530 } | |
531 void discard() { | |
532 { | |
533 _sourceMap.clear(); | |
534 _parseCache.clear(); | |
535 _htmlParseCache.clear(); | |
536 _libraryElementCache.clear(); | |
537 _publicNamespaceCache.clear(); | |
538 } | |
539 } | |
540 AnalysisContext extractAnalysisContext(SourceContainer container) { | |
541 AnalysisContextImpl newContext = AnalysisEngine.instance.createAnalysisConte
xt() as AnalysisContextImpl; | |
542 List<Source> sourcesToRemove = new List<Source>(); | |
543 { | |
544 for (MapEntry<Source, SourceInfo> entry in getMapEntrySet(_sourceMap)) { | |
545 Source source = entry.getKey(); | |
546 if (container.contains(source)) { | |
547 sourcesToRemove.add(source); | |
548 newContext._sourceMap[source] = new SourceInfo.con2(entry.getValue()); | |
549 } | |
550 } | |
551 } | |
552 return newContext; | |
553 } | |
554 Element getElement(ElementLocation location) { | |
555 throw new UnsupportedOperationException(); | |
556 } | |
557 List<AnalysisError> getErrors(Source source) { | |
558 throw new UnsupportedOperationException(); | |
559 } | |
560 HtmlElement getHtmlElement(Source source) { | |
561 throw new UnsupportedOperationException(); | |
562 } | |
563 SourceKind getKnownKindOf(Source source) { | |
564 if (source.fullName.endsWith(_HTML_SUFFIX)) { | |
565 return SourceKind.HTML; | |
566 } | |
567 if (!source.fullName.endsWith(_DART_SUFFIX)) { | |
568 return SourceKind.UNKNOWN; | |
569 } | |
570 { | |
571 if (_libraryElementCache.containsKey(source)) { | |
572 return SourceKind.LIBRARY; | |
573 } | |
574 CompilationUnit unit = _parseCache[source]; | |
575 if (unit != null && hasPartOfDirective(unit)) { | |
576 return SourceKind.PART; | |
577 } | |
578 } | |
579 return null; | |
580 } | |
581 List<Source> getLibrariesContaining(Source source) { | |
582 { | |
583 SourceInfo info = _sourceMap[source]; | |
584 if (info == null) { | |
585 return Source.EMPTY_ARRAY; | |
586 } | |
587 return info.librarySources; | |
588 } | |
589 } | |
590 LibraryElement getLibraryElement(Source source) { | |
591 { | |
592 LibraryElement element = _libraryElementCache[source]; | |
593 if (element == null) { | |
594 if (getOrComputeKindOf(source) != SourceKind.LIBRARY) { | |
595 return null; | |
596 } | |
597 LibraryResolver resolver = new LibraryResolver.con1(this); | |
598 try { | |
599 element = resolver.resolveLibrary(source, true); | |
600 if (element != null) { | |
601 _libraryElementCache[source] = element; | |
602 } | |
603 } on AnalysisException catch (exception) { | |
604 AnalysisEngine.instance.logger.logError2("Could not resolve the librar
y ${source.fullName}", exception); | |
605 } | |
606 } | |
607 return element; | |
608 } | |
609 } | |
610 /** | |
611 * Return the element model corresponding to the library defined by the given
source, or{@code null} if the element model does not yet exist. | |
612 * @param source the source defining the library whose element model is to be
returned | |
613 * @return the element model corresponding to the library defined by the given
source | |
614 */ | |
615 LibraryElement getLibraryElementOrNull(Source source) { | |
616 { | |
617 return _libraryElementCache[source]; | |
618 } | |
619 } | |
620 SourceKind getOrComputeKindOf(Source source) { | |
621 SourceKind kind = getKnownKindOf(source); | |
622 if (kind != null) { | |
623 return kind; | |
624 } | |
625 try { | |
626 if (hasPartOfDirective(parse(source))) { | |
627 return SourceKind.PART; | |
628 } | |
629 } on AnalysisException catch (exception) { | |
630 return SourceKind.UNKNOWN; | |
631 } | |
632 return SourceKind.LIBRARY; | |
633 } | |
634 List<AnalysisError> getParsingErrors(Source source) { | |
635 throw new UnsupportedOperationException(); | |
636 } | |
637 /** | |
638 * Return a namespace containing mappings for all of the public names defined
by the given | |
639 * library. | |
640 * @param library the library whose public namespace is to be returned | |
641 * @return the public namespace of the given library | |
642 */ | |
643 Namespace getPublicNamespace(LibraryElement library) { | |
644 Source source8 = library.definingCompilationUnit.source; | |
645 { | |
646 Namespace namespace = _publicNamespaceCache[source8]; | |
647 if (namespace == null) { | |
648 NamespaceBuilder builder = new NamespaceBuilder(); | |
649 namespace = builder.createPublicNamespace(library); | |
650 _publicNamespaceCache[source8] = namespace; | |
651 } | |
652 return namespace; | |
653 } | |
654 } | |
655 /** | |
656 * Return a namespace containing mappings for all of the public names defined
by the library | |
657 * defined by the given source. | |
658 * @param source the source defining the library whose public namespace is to
be returned | |
659 * @return the public namespace corresponding to the library defined by the gi
ven source | |
660 */ | |
661 Namespace getPublicNamespace2(Source source) { | |
662 { | |
663 Namespace namespace = _publicNamespaceCache[source]; | |
664 if (namespace == null) { | |
665 LibraryElement library = getLibraryElement(source); | |
666 if (library == null) { | |
667 return null; | |
668 } | |
669 NamespaceBuilder builder = new NamespaceBuilder(); | |
670 namespace = builder.createPublicNamespace(library); | |
671 _publicNamespaceCache[source] = namespace; | |
672 } | |
673 return namespace; | |
674 } | |
675 } | |
676 List<AnalysisError> getResolutionErrors(Source source) { | |
677 throw new UnsupportedOperationException(); | |
678 } | |
679 SourceFactory get sourceFactory => _sourceFactory; | |
680 void mergeAnalysisContext(AnalysisContext context) { | |
681 { | |
682 for (MapEntry<Source, SourceInfo> entry in getMapEntrySet(((context as Ana
lysisContextImpl))._sourceMap)) { | |
683 Source newSource = entry.getKey(); | |
684 SourceInfo existingInfo = _sourceMap[newSource]; | |
685 if (existingInfo == null) { | |
686 _sourceMap[newSource] = new SourceInfo.con2(entry.getValue()); | |
687 } else { | |
688 } | |
689 } | |
690 } | |
691 } | |
692 CompilationUnit parse(Source source) { | |
693 { | |
694 CompilationUnit unit = _parseCache[source]; | |
695 if (unit == null) { | |
696 RecordingErrorListener errorListener = new RecordingErrorListener(); | |
697 AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorLi
stener); | |
698 Parser parser = new Parser(source, errorListener); | |
699 unit = parser.parseCompilationUnit(scanResult._token); | |
700 unit.parsingErrors = errorListener.getErrors2(source); | |
701 unit.lineInfo = new LineInfo(scanResult._lineStarts); | |
702 _parseCache[source] = unit; | |
703 } | |
704 return unit; | |
705 } | |
706 } | |
707 CompilationUnit parse3(Source source, AnalysisErrorListener errorListener) { | |
708 { | |
709 CompilationUnit unit = _parseCache[source]; | |
710 if (unit == null) { | |
711 AnalysisContextImpl_ScanResult scanResult = internalScan(source, errorLi
stener); | |
712 Parser parser = new Parser(source, errorListener); | |
713 unit = parser.parseCompilationUnit(scanResult._token); | |
714 unit.lineInfo = new LineInfo(scanResult._lineStarts); | |
715 _parseCache[source] = unit; | |
716 } | |
717 return unit; | |
718 } | |
719 } | |
720 HtmlParseResult parseHtml(Source source) { | |
721 { | |
722 HtmlParseResult result = _htmlParseCache[source]; | |
723 if (result == null) { | |
724 result = new HtmlParser(source).parse(scanHtml(source)); | |
725 _htmlParseCache[source] = result; | |
726 } | |
727 return result; | |
728 } | |
729 } | |
730 /** | |
731 * Given a table mapping the source for the libraries represented by the corre
sponding elements to | |
732 * the elements representing the libraries, record those mappings. | |
733 * @param elementMap a table mapping the source for the libraries represented
by the elements to | |
734 * the elements representing the libraries | |
735 */ | |
736 void recordLibraryElements(Map<Source, LibraryElement> elementMap) { | |
737 { | |
738 javaMapPutAll(_libraryElementCache, elementMap); | |
739 } | |
740 } | |
741 CompilationUnit resolve(Source source, LibraryElement library) => parse(source
); | |
742 Token scan(Source source, AnalysisErrorListener errorListener) { | |
743 AnalysisContextImpl_ScanResult result = internalScan(source, errorListener); | |
744 return result._token; | |
745 } | |
746 HtmlScanResult scanHtml(Source source) { | |
747 HtmlScanner scanner = new HtmlScanner(source); | |
748 try { | |
749 source.getContents(scanner); | |
750 } on JavaException catch (exception) { | |
751 throw new AnalysisException.con3(exception); | |
752 } | |
753 return scanner.result; | |
754 } | |
755 void set sourceFactory(SourceFactory sourceFactory2) { | |
756 this._sourceFactory = sourceFactory2; | |
757 } | |
758 Iterable<Source> sourcesToResolve(List<Source> changedSources) { | |
759 List<Source> librarySources = new List<Source>(); | |
760 for (Source source in changedSources) { | |
761 if (identical(getOrComputeKindOf(source), SourceKind.LIBRARY)) { | |
762 librarySources.add(source); | |
763 } | |
764 } | |
765 return librarySources; | |
766 } | |
767 /** | |
768 * Return {@code true} if the given compilation unit has a part-of directive. | |
769 * @param unit the compilation unit being tested | |
770 * @return {@code true} if the compilation unit has a part-of directive | |
771 */ | |
772 bool hasPartOfDirective(CompilationUnit unit) { | |
773 for (Directive directive in unit.directives) { | |
774 if (directive is PartOfDirective) { | |
775 return true; | |
776 } | |
777 } | |
778 return false; | |
779 } | |
780 AnalysisContextImpl_ScanResult internalScan(Source source, AnalysisErrorListen
er errorListener) { | |
781 AnalysisContextImpl_ScanResult result = new AnalysisContextImpl_ScanResult()
; | |
782 Source_ContentReceiver receiver = new Source_ContentReceiver_3(source, error
Listener, result); | |
783 try { | |
784 source.getContents(receiver); | |
785 } on JavaException catch (exception) { | |
786 throw new AnalysisException.con3(exception); | |
787 } | |
788 return result; | |
789 } | |
790 /** | |
791 * Note: This method must only be invoked while we are synchronized on {@link
#cacheLock}. | |
792 * @param source the source that has been added | |
793 */ | |
794 void sourceAvailable(Source source) { | |
795 SourceInfo existingInfo = _sourceMap[source]; | |
796 if (existingInfo == null) { | |
797 _sourceMap[source] = new SourceInfo.con1(source, getOrComputeKindOf(source
)); | |
798 } | |
799 } | |
800 /** | |
801 * Note: This method must only be invoked while we are synchronized on {@link
#cacheLock}. | |
802 * @param source the source that has been changed | |
803 */ | |
804 void sourceChanged(Source source) { | |
805 SourceInfo info = _sourceMap[source]; | |
806 if (info == null) { | |
807 return; | |
808 } | |
809 _parseCache.remove(source); | |
810 _htmlParseCache.remove(source); | |
811 _libraryElementCache.remove(source); | |
812 _publicNamespaceCache.remove(source); | |
813 for (Source librarySource in info.librarySources) { | |
814 _libraryElementCache.remove(librarySource); | |
815 _publicNamespaceCache.remove(librarySource); | |
816 } | |
817 } | |
818 /** | |
819 * Note: This method must only be invoked while we are synchronized on {@link
#cacheLock}. | |
820 * @param source the source that has been deleted | |
821 */ | |
822 void sourceDeleted(Source source) { | |
823 _sourceMap.remove(source); | |
824 sourceChanged(source); | |
825 } | |
826 /** | |
827 * Note: This method must only be invoked while we are synchronized on {@link
#cacheLock}. | |
828 * @param container the source container specifying the sources that have been
deleted | |
829 */ | |
830 void sourcesDeleted(SourceContainer container) { | |
831 List<Source> sourcesToRemove = new List<Source>(); | |
832 for (Source source in _sourceMap.keys.toSet()) { | |
833 if (container.contains(source)) { | |
834 sourcesToRemove.add(source); | |
835 } | |
836 } | |
837 } | |
838 } | |
839 /** | |
840 * Instances of the class {@code ScanResult} represent the results of scanning a
source. | |
841 */ | |
842 class AnalysisContextImpl_ScanResult { | |
843 /** | |
844 * The first token in the token stream. | |
845 */ | |
846 Token _token; | |
847 /** | |
848 * The line start information that was produced. | |
849 */ | |
850 List<int> _lineStarts; | |
851 /** | |
852 * Initialize a newly created result object to be empty. | |
853 */ | |
854 AnalysisContextImpl_ScanResult() : super() { | |
855 } | |
856 } | |
857 class Source_ContentReceiver_3 implements Source_ContentReceiver { | |
858 Source source; | |
859 AnalysisErrorListener errorListener; | |
860 AnalysisContextImpl_ScanResult result; | |
861 Source_ContentReceiver_3(this.source, this.errorListener, this.result); | |
862 accept(CharBuffer contents) { | |
863 CharBufferScanner scanner = new CharBufferScanner(source, contents, errorLis
tener); | |
864 result._token = scanner.tokenize(); | |
865 result._lineStarts = scanner.lineStarts; | |
866 } | |
867 void accept2(String contents) { | |
868 StringScanner scanner = new StringScanner(source, contents, errorListener); | |
869 result._token = scanner.tokenize(); | |
870 result._lineStarts = scanner.lineStarts; | |
871 } | |
872 } | |
873 /** | |
874 * Instances of the class {@code RecordingErrorListener} implement an error list
ener that will | |
875 * record the errors that are reported to it in a way that is appropriate for ca
ching those errors | |
876 * within an analysis context. | |
877 * @coverage dart.engine | |
878 */ | |
879 class RecordingErrorListener implements AnalysisErrorListener { | |
880 /** | |
881 * A HashMap of lists containing the errors that were collected, keyed by each
{@link Source}. | |
882 */ | |
883 Map<Source, List<AnalysisError>> _errors = new Map<Source, List<AnalysisError>
>(); | |
884 /** | |
885 * Answer the errors collected by the listener. | |
886 * @return an array of errors (not {@code null}, contains no {@code null}s) | |
887 */ | |
888 List<AnalysisError> get errors { | |
889 Set<MapEntry<Source, List<AnalysisError>>> entrySet2 = getMapEntrySet(_error
s); | |
890 if (entrySet2.length == 0) { | |
891 return AnalysisError.NO_ERRORS; | |
892 } | |
893 List<AnalysisError> resultList = new List<AnalysisError>(); | |
894 for (MapEntry<Source, List<AnalysisError>> entry in entrySet2) { | |
895 resultList.addAll(entry.getValue()); | |
896 } | |
897 return new List.from(resultList); | |
898 } | |
899 /** | |
900 * Answer the errors collected by the listener for some passed {@link Source}. | |
901 * @param source some {@link Source} for which the caller wants the set of {@l
ink AnalysisError}s | |
902 * collected by this listener | |
903 * @return the errors collected by the listener for the passed {@link Source} | |
904 */ | |
905 List<AnalysisError> getErrors2(Source source) { | |
906 List<AnalysisError> errorsForSource = _errors[source]; | |
907 if (errorsForSource == null) { | |
908 return AnalysisError.NO_ERRORS; | |
909 } else { | |
910 return new List.from(errorsForSource); | |
911 } | |
912 } | |
913 void onError(AnalysisError event) { | |
914 Source source9 = event.source; | |
915 List<AnalysisError> errorsForSource = _errors[source9]; | |
916 if (_errors[source9] == null) { | |
917 errorsForSource = new List<AnalysisError>(); | |
918 _errors[source9] = errorsForSource; | |
919 } | |
920 errorsForSource.add(event); | |
921 } | |
922 } | |
923 /** | |
924 * Instances of the class {@code SourceInfo} maintain the information known by a
n analysis context | |
925 * about an individual source. | |
926 * @coverage dart.engine | |
927 */ | |
928 class SourceInfo { | |
929 /** | |
930 * The kind of the source. | |
931 */ | |
932 SourceKind _kind; | |
933 /** | |
934 * The sources for the defining compilation units for the libraries containing
the source, or{@code null} if the libraries containing the source are not yet k
nown. | |
935 */ | |
936 List<Source> _librarySources = null; | |
937 SourceInfo.con1(Source source, SourceKind kind3) { | |
938 _jtd_constructor_154_impl(source, kind3); | |
939 } | |
940 _jtd_constructor_154_impl(Source source, SourceKind kind3) { | |
941 this._kind = kind3; | |
942 } | |
943 /** | |
944 * Initialize a newly created information holder to hold the same information
as the given holder. | |
945 * @param info the information holder used to initialize this holder | |
946 */ | |
947 SourceInfo.con2(SourceInfo info) { | |
948 _jtd_constructor_155_impl(info); | |
949 } | |
950 _jtd_constructor_155_impl(SourceInfo info) { | |
951 _kind = info._kind; | |
952 _librarySources = new List<Source>.from(info._librarySources); | |
953 } | |
954 /** | |
955 * Add the given source to the list of sources for the defining compilation un
its for the | |
956 * libraries containing this source. | |
957 * @param source the source to be added to the list | |
958 */ | |
959 void addLibrarySource(Source source) { | |
960 if (_librarySources == null) { | |
961 _librarySources = new List<Source>(); | |
962 } | |
963 _librarySources.add(source); | |
964 } | |
965 /** | |
966 * Return the kind of the source. | |
967 * @return the kind of the source | |
968 */ | |
969 SourceKind get kind => _kind; | |
970 /** | |
971 * Return the sources for the defining compilation units for the libraries con
taining this source. | |
972 * @return the sources for the defining compilation units for the libraries co
ntaining this source | |
973 */ | |
974 List<Source> get librarySources { | |
975 if (_librarySources == null) { | |
976 return Source.EMPTY_ARRAY; | |
977 } | |
978 return new List.from(_librarySources); | |
979 } | |
980 /** | |
981 * Remove the given source from the list of sources for the defining compilati
on units for the | |
982 * libraries containing this source. | |
983 * @param source the source to be removed to the list | |
984 */ | |
985 void removeLibrarySource(Source source) { | |
986 _librarySources.remove(source); | |
987 if (_librarySources.isEmpty) { | |
988 _librarySources = null; | |
989 } | |
990 } | |
991 /** | |
992 * Set the kind of the source to the given kind. | |
993 * @param kind the kind of the source | |
994 */ | |
995 void set kind(SourceKind kind4) { | |
996 this._kind = kind4; | |
997 } | |
998 } | |
999 /** | |
1000 * The interface {@code Logger} defines the behavior of objects that can be used
to receive | |
1001 * information about errors within the analysis engine. Implementations usually
write this | |
1002 * information to a file, but can also record the information for later use (suc
h as during testing) | |
1003 * or even ignore the information. | |
1004 * @coverage dart.engine.utilities | |
1005 */ | |
1006 abstract class Logger { | |
1007 static Logger NULL = new Logger_NullLogger(); | |
1008 /** | |
1009 * Log the given message as an error. | |
1010 * @param message an explanation of why the error occurred or what it means | |
1011 */ | |
1012 void logError(String message); | |
1013 /** | |
1014 * Log the given exception as one representing an error. | |
1015 * @param message an explanation of why the error occurred or what it means | |
1016 * @param exception the exception being logged | |
1017 */ | |
1018 void logError2(String message, Exception exception); | |
1019 /** | |
1020 * Log the given exception as one representing an error. | |
1021 * @param exception the exception being logged | |
1022 */ | |
1023 void logError3(Exception exception); | |
1024 /** | |
1025 * Log the given informational message. | |
1026 * @param message an explanation of why the error occurred or what it means | |
1027 * @param exception the exception being logged | |
1028 */ | |
1029 void logInformation(String message); | |
1030 /** | |
1031 * Log the given exception as one representing an informational message. | |
1032 * @param message an explanation of why the error occurred or what it means | |
1033 * @param exception the exception being logged | |
1034 */ | |
1035 void logInformation2(String message, Exception exception); | |
1036 } | |
1037 /** | |
1038 * Implementation of {@link Logger} that does nothing. | |
1039 */ | |
1040 class Logger_NullLogger implements Logger { | |
1041 void logError(String message) { | |
1042 } | |
1043 void logError2(String message, Exception exception) { | |
1044 } | |
1045 void logError3(Exception exception) { | |
1046 } | |
1047 void logInformation(String message) { | |
1048 } | |
1049 void logInformation2(String message, Exception exception) { | |
1050 } | |
1051 } | |
OLD | NEW |