Index: pkg/analyzer/lib/src/generated/engine.dart |
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart |
index 33ca5de59c5f5a1bcd883ca360da6581ac1b295b..62c2d0b8d001b83e82fe88aa54d5f299cd36f8ca 100644 |
--- a/pkg/analyzer/lib/src/generated/engine.dart |
+++ b/pkg/analyzer/lib/src/generated/engine.dart |
@@ -7,27 +7,27 @@ |
library engine; |
-import 'dart:collection'; |
import "dart:math" as math; |
+import 'dart:collection'; |
import 'package:analyzer/src/task/task_dart.dart'; |
-import 'java_core.dart'; |
-import 'java_engine.dart'; |
-import 'utilities_collection.dart'; |
-import 'utilities_general.dart'; |
-import 'instrumentation.dart'; |
-import 'error.dart'; |
-import 'error_verifier.dart'; |
-import 'source.dart'; |
-import 'scanner.dart'; |
import 'ast.dart'; |
-import 'parser.dart' show Parser, IncrementalParser; |
-import 'sdk.dart' show DartSdk; |
import 'constant.dart'; |
import 'element.dart'; |
-import 'resolver.dart'; |
+import 'error.dart'; |
+import 'error_verifier.dart'; |
import 'html.dart' as ht; |
+import 'instrumentation.dart'; |
+import 'java_core.dart'; |
+import 'java_engine.dart'; |
+import 'parser.dart' show Parser, IncrementalParser; |
+import 'resolver.dart'; |
+import 'scanner.dart'; |
+import 'sdk.dart' show DartSdk; |
+import 'source.dart'; |
+import 'utilities_collection.dart'; |
+import 'utilities_general.dart'; |
/** |
* Instances of the class `AnalysisCache` implement an LRU cache of information related to |
@@ -35,17 +35,17 @@ import 'html.dart' as ht; |
*/ |
class AnalysisCache { |
/** |
- * An array containing the partitions of which this cache is comprised. |
- */ |
- final List<CachePartition> _partitions; |
- |
- /** |
* A flag used to control whether trace information should be produced when the content of the |
* cache is modified. |
*/ |
static bool _TRACE_CHANGES = false; |
/** |
+ * An array containing the partitions of which this cache is comprised. |
+ */ |
+ final List<CachePartition> _partitions; |
+ |
+ /** |
* Initialize a newly created cache to have the given partitions. The partitions will be searched |
* in the order in which they appear in the array, so the most specific partition (usually an |
* [SdkCachePartition]) should be first and the most general (usually a |
@@ -56,6 +56,31 @@ class AnalysisCache { |
AnalysisCache(this._partitions); |
/** |
+ * Return the number of entries in this cache that have an AST associated with them. |
+ * |
+ * @return the number of entries in this cache that have an AST associated with them |
+ */ |
+ int get astSize => _partitions[_partitions.length - 1].astSize; |
+ |
+ /** |
+ * Return information about each of the partitions in this cache. |
+ * |
+ * @return information about each of the partitions in this cache |
+ */ |
+ List<AnalysisContextStatistics_PartitionData> get partitionData { |
+ int count = _partitions.length; |
+ List<AnalysisContextStatistics_PartitionData> data = |
+ new List<AnalysisContextStatistics_PartitionData>(count); |
+ for (int i = 0; i < count; i++) { |
+ CachePartition partition = _partitions[i]; |
+ data[i] = new AnalysisContextStatisticsImpl_PartitionDataImpl( |
+ partition.astSize, |
+ partition.map.length); |
+ } |
+ return data; |
+ } |
+ |
+ /** |
* Record that the AST associated with the given source was just read from the cache. |
* |
* @param source the source whose AST was accessed |
@@ -84,21 +109,14 @@ class AnalysisCache { |
} |
} |
// |
- // We should never get to this point because the last partition should always be a universal |
- // partition, except in the case of the SDK context, in which case the source should always be |
- // part of the SDK. |
+ // We should never get to this point because the last partition should |
+ // always be a universal partition, except in the case of the SDK context, |
+ // in which case the source should always be part of the SDK. |
// |
return null; |
} |
/** |
- * Return the number of entries in this cache that have an AST associated with them. |
- * |
- * @return the number of entries in this cache that have an AST associated with them |
- */ |
- int get astSize => _partitions[_partitions.length - 1].astSize; |
- |
- /** |
* Return context that owns the given source. |
* |
* @param source the source whose context is to be returned |
@@ -123,21 +141,6 @@ class AnalysisCache { |
} |
/** |
- * Return information about each of the partitions in this cache. |
- * |
- * @return information about each of the partitions in this cache |
- */ |
- List<AnalysisContextStatistics_PartitionData> get partitionData { |
- int count = _partitions.length; |
- List<AnalysisContextStatistics_PartitionData> data = new List<AnalysisContextStatistics_PartitionData>(count); |
- for (int i = 0; i < count; i++) { |
- CachePartition partition = _partitions[i]; |
- data[i] = new AnalysisContextStatisticsImpl_PartitionDataImpl(partition.astSize, partition.map.length); |
- } |
- return data; |
- } |
- |
- /** |
* Return an iterator returning all of the map entries mapping sources to cache entries. |
* |
* @return an iterator returning all of the map entries mapping sources to cache entries |
@@ -166,9 +169,11 @@ class AnalysisCache { |
try { |
SourceEntry oldEntry = _partitions[i].get(source); |
if (oldEntry == null) { |
- AnalysisEngine.instance.logger.logInformation("Added a cache entry for '${source.fullName}'."); |
+ AnalysisEngine.instance.logger.logInformation( |
+ "Added a cache entry for '${source.fullName}'."); |
} else { |
- AnalysisEngine.instance.logger.logInformation("Modified the cache entry for ${source.fullName}'. Diff = ${entry.getDiff(oldEntry)}"); |
+ AnalysisEngine.instance.logger.logInformation( |
+ "Modified the cache entry for ${source.fullName}'. Diff = ${entry.getDiff(oldEntry)}"); |
} |
} catch (exception) { |
// Ignored |
@@ -192,7 +197,8 @@ class AnalysisCache { |
if (_partitions[i].contains(source)) { |
if (_TRACE_CHANGES) { |
try { |
- AnalysisEngine.instance.logger.logInformation("Removed the cache entry for ${source.fullName}'."); |
+ AnalysisEngine.instance.logger.logInformation( |
+ "Removed the cache entry for ${source.fullName}'."); |
} catch (exception) { |
// Ignored |
JavaSystem.currentTimeMillis(); |
@@ -291,6 +297,115 @@ abstract class AnalysisContext { |
static const List<AnalysisContext> EMPTY_LIST = const <AnalysisContext>[]; |
/** |
+ * Return the set of analysis options controlling the behavior of this context. Clients should not |
+ * modify the returned set of options. The options should only be set by invoking the method |
+ * [setAnalysisOptions]. |
+ * |
+ * @return the set of analysis options controlling the behavior of this context |
+ */ |
+ AnalysisOptions get analysisOptions; |
+ |
+ /** |
+ * Set the set of analysis options controlling the behavior of this context to the given options. |
+ * Clients can safely assume that all necessary analysis results have been invalidated. |
+ * |
+ * @param options the set of analysis options that will control the behavior of this context |
+ */ |
+ void set analysisOptions(AnalysisOptions options); |
+ |
+ /** |
+ * Set the order in which sources will be analyzed by [performAnalysisTask] to match the |
+ * order of the sources in the given list. If a source that needs to be analyzed is not contained |
+ * in the list, then it will be treated as if it were at the end of the list. If the list is empty |
+ * (or `null`) then no sources will be given priority over other sources. |
+ * |
+ * Changes made to the list after this method returns will <b>not</b> be reflected in the priority |
+ * order. |
+ * |
+ * @param sources the sources to be given priority over other sources |
+ */ |
+ void set analysisPriorityOrder(List<Source> sources); |
+ |
+ /** |
+ * Return the set of declared variables used when computing constant values. |
+ * |
+ * @return the set of declared variables used when computing constant values |
+ */ |
+ DeclaredVariables get declaredVariables; |
+ |
+ /** |
+ * Return an array containing all of the sources known to this context that represent HTML files. |
+ * The contents of the array can be incomplete. |
+ * |
+ * @return the sources known to this context that represent HTML files |
+ */ |
+ List<Source> get htmlSources; |
+ |
+ /** |
+ * Returns `true` if this context was disposed using [dispose]. |
+ * |
+ * @return `true` if this context was disposed |
+ */ |
+ bool get isDisposed; |
+ |
+ /** |
+ * Return an array containing all of the sources known to this context that represent the defining |
+ * compilation unit of a library that can be run within a browser. The sources that are returned |
+ * represent libraries that have a 'main' method and are either referenced by an HTML file or |
+ * import, directly or indirectly, a client-only library. The contents of the array can be |
+ * incomplete. |
+ * |
+ * @return the sources known to this context that represent the defining compilation unit of a |
+ * library that can be run within a browser |
+ */ |
+ List<Source> get launchableClientLibrarySources; |
+ |
+ /** |
+ * Return an array containing all of the sources known to this context that represent the defining |
+ * compilation unit of a library that can be run outside of a browser. The contents of the array |
+ * can be incomplete. |
+ * |
+ * @return the sources known to this context that represent the defining compilation unit of a |
+ * library that can be run outside of a browser |
+ */ |
+ List<Source> get launchableServerLibrarySources; |
+ |
+ /** |
+ * Return an array containing all of the sources known to this context that represent the defining |
+ * compilation unit of a library. The contents of the array can be incomplete. |
+ * |
+ * @return the sources known to this context that represent the defining compilation unit of a |
+ * library |
+ */ |
+ List<Source> get librarySources; |
+ |
+ /** |
+ * Return an array containing all of the sources known to this context and their resolution state |
+ * is not valid or flush. So, these sources are not safe to update during refactoring, because we |
+ * may be don't know all the references in them. |
+ * |
+ * @return the sources known to this context and are not safe for refactoring |
+ */ |
+ List<Source> get refactoringUnsafeSources; |
+ |
+ /** |
+ * Return the source factory used to create the sources that can be analyzed in this context. |
+ * |
+ * @return the source factory used to create the sources that can be analyzed in this context |
+ */ |
+ SourceFactory get sourceFactory; |
+ |
+ /** |
+ * Set the source factory used to create the sources that can be analyzed in this context to the |
+ * given source factory. Clients can safely assume that all analysis results have been |
+ * invalidated. |
+ * |
+ * @param factory the source factory used to create the sources that can be analyzed in this |
+ * context |
+ */ |
+ void set sourceFactory(SourceFactory factory); |
+ |
+ /** |
* Add the given listener to the list of objects that are to be notified when various analysis |
* results are produced in this context. |
* |
@@ -425,15 +540,6 @@ abstract class AnalysisContext { |
bool exists(Source source); |
/** |
- * Return the set of analysis options controlling the behavior of this context. Clients should not |
- * modify the returned set of options. The options should only be set by invoking the method |
- * [setAnalysisOptions]. |
- * |
- * @return the set of analysis options controlling the behavior of this context |
- */ |
- AnalysisOptions get analysisOptions; |
- |
- /** |
* Return the Angular application that contains the HTML file defined by the given source, or |
* `null` if the source does not represent an HTML file, the Angular application containing |
* the file has not yet been resolved, or the analysis of the HTML file failed for some reason. |
@@ -453,7 +559,8 @@ abstract class AnalysisContext { |
* compilation unit |
* @return the element model corresponding to the compilation unit defined by the given source |
*/ |
- CompilationUnitElement getCompilationUnitElement(Source unitSource, Source librarySource); |
+ CompilationUnitElement getCompilationUnitElement(Source unitSource, |
+ Source librarySource); |
/** |
* Get the contents and timestamp of the given source. |
@@ -468,13 +575,6 @@ abstract class AnalysisContext { |
TimestampedData<String> getContents(Source source); |
/** |
- * Return the set of declared variables used when computing constant values. |
- * |
- * @return the set of declared variables used when computing constant values |
- */ |
- DeclaredVariables get declaredVariables; |
- |
- /** |
* Return the element referenced by the given location, or `null` if the element is not |
* immediately available or if there is no element with the given location. The latter condition |
* can occur, for example, if the location describes an element from a different context or if the |
@@ -520,14 +620,6 @@ abstract class AnalysisContext { |
List<Source> getHtmlFilesReferencing(Source source); |
/** |
- * Return an array containing all of the sources known to this context that represent HTML files. |
- * The contents of the array can be incomplete. |
- * |
- * @return the sources known to this context that represent HTML files |
- */ |
- List<Source> get htmlSources; |
- |
- /** |
* Return the kind of the given source, or `null` if the kind is not known to this context. |
* |
* @param source the source whose kind is to be returned |
@@ -537,28 +629,6 @@ abstract class AnalysisContext { |
SourceKind getKindOf(Source source); |
/** |
- * Return an array containing all of the sources known to this context that represent the defining |
- * compilation unit of a library that can be run within a browser. The sources that are returned |
- * represent libraries that have a 'main' method and are either referenced by an HTML file or |
- * import, directly or indirectly, a client-only library. The contents of the array can be |
- * incomplete. |
- * |
- * @return the sources known to this context that represent the defining compilation unit of a |
- * library that can be run within a browser |
- */ |
- List<Source> get launchableClientLibrarySources; |
- |
- /** |
- * Return an array containing all of the sources known to this context that represent the defining |
- * compilation unit of a library that can be run outside of a browser. The contents of the array |
- * can be incomplete. |
- * |
- * @return the sources known to this context that represent the defining compilation unit of a |
- * library that can be run outside of a browser |
- */ |
- List<Source> get launchableServerLibrarySources; |
- |
- /** |
* Return the sources for the defining compilation units of any libraries of which the given |
* source is a part. The array will normally contain a single library because most Dart sources |
* are only included in a single library, but it is possible to have a part that is contained in |
@@ -602,15 +672,6 @@ abstract class AnalysisContext { |
LibraryElement getLibraryElement(Source source); |
/** |
- * Return an array containing all of the sources known to this context that represent the defining |
- * compilation unit of a library. The contents of the array can be incomplete. |
- * |
- * @return the sources known to this context that represent the defining compilation unit of a |
- * library |
- */ |
- List<Source> get librarySources; |
- |
- /** |
* Return the line information for the given source, or `null` if the line information is |
* not known. The line information is used to map offsets from the beginning of the source to line |
* and column pairs. |
@@ -637,15 +698,6 @@ abstract class AnalysisContext { |
int getModificationStamp(Source source); |
/** |
- * Return an array containing all of the sources known to this context and their resolution state |
- * is not valid or flush. So, these sources are not safe to update during refactoring, because we |
- * may be don't know all the references in them. |
- * |
- * @return the sources known to this context and are not safe for refactoring |
- */ |
- List<Source> get refactoringUnsafeSources; |
- |
- /** |
* Return a fully resolved AST for a single compilation unit within the given library, or |
* `null` if the resolved AST is not already computed. |
* |
@@ -654,7 +706,8 @@ abstract class AnalysisContext { |
* @return a fully resolved AST for the compilation unit |
* See [resolveCompilationUnit]. |
*/ |
- CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library); |
+ CompilationUnit getResolvedCompilationUnit(Source unitSource, |
+ LibraryElement library); |
/** |
* Return a fully resolved AST for a single compilation unit within the given library, or |
@@ -666,7 +719,8 @@ abstract class AnalysisContext { |
* @return a fully resolved AST for the compilation unit |
* See [resolveCompilationUnit]. |
*/ |
- CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource); |
+ CompilationUnit getResolvedCompilationUnit2(Source unitSource, |
+ Source librarySource); |
/** |
* Return a fully resolved HTML unit, or `null` if the resolved unit is not already |
@@ -679,15 +733,8 @@ abstract class AnalysisContext { |
ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource); |
/** |
- * Return the source factory used to create the sources that can be analyzed in this context. |
- * |
- * @return the source factory used to create the sources that can be analyzed in this context |
- */ |
- SourceFactory get sourceFactory; |
- |
- /** |
- * Return `true` if the given source is known to be the defining compilation unit of a |
- * library that can be run on a client (references 'dart:html', either directly or indirectly). |
+ * Return `true` if the given source is known to be the defining compilation unit of a |
+ * library that can be run on a client (references 'dart:html', either directly or indirectly). |
* |
* <b>Note:</b> In addition to the expected case of returning `false` if the source is known |
* to be a library that cannot be run on a client, this method will also return `false` if |
@@ -699,13 +746,6 @@ abstract class AnalysisContext { |
bool isClientLibrary(Source librarySource); |
/** |
- * Returns `true` if this context was disposed using [dispose]. |
- * |
- * @return `true` if this context was disposed |
- */ |
- bool get isDisposed; |
- |
- /** |
* Return `true` if the given source is known to be the defining compilation unit of a |
* library that can be run on the server (does not reference 'dart:html', either directly or |
* indirectly). |
@@ -774,7 +814,8 @@ abstract class AnalysisContext { |
* @throws AnalysisException if the analysis could not be performed |
* See [getResolvedCompilationUnit]. |
*/ |
- CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library); |
+ CompilationUnit resolveCompilationUnit(Source unitSource, |
+ LibraryElement library); |
/** |
* Parse and resolve a single source within the given context to produce a fully resolved AST. |
@@ -791,7 +832,8 @@ abstract class AnalysisContext { |
* @throws AnalysisException if the analysis could not be performed |
* See [getResolvedCompilationUnit]. |
*/ |
- CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource); |
+ CompilationUnit resolveCompilationUnit2(Source unitSource, |
+ Source librarySource); |
/** |
* Parse and resolve a single source within the given context to produce a fully resolved AST. |
@@ -805,27 +847,6 @@ abstract class AnalysisContext { |
ht.HtmlUnit resolveHtmlUnit(Source htmlSource); |
/** |
- * Set the set of analysis options controlling the behavior of this context to the given options. |
- * Clients can safely assume that all necessary analysis results have been invalidated. |
- * |
- * @param options the set of analysis options that will control the behavior of this context |
- */ |
- void set analysisOptions(AnalysisOptions options); |
- |
- /** |
- * Set the order in which sources will be analyzed by [performAnalysisTask] to match the |
- * order of the sources in the given list. If a source that needs to be analyzed is not contained |
- * in the list, then it will be treated as if it were at the end of the list. If the list is empty |
- * (or `null`) then no sources will be given priority over other sources. |
- * |
- * Changes made to the list after this method returns will <b>not</b> be reflected in the priority |
- * order. |
- * |
- * @param sources the sources to be given priority over other sources |
- */ |
- void set analysisPriorityOrder(List<Source> sources); |
- |
- /** |
* Set the contents of the given source to the given contents and mark the source as having |
* changed. The additional offset and length information is used by the context to determine what |
* reanalysis is necessary. |
@@ -836,7 +857,8 @@ abstract class AnalysisContext { |
* @param oldLength the number of characters in the original contents that were replaced |
* @param newLength the number of characters in the replacement text |
*/ |
- void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength); |
+ void setChangedContents(Source source, String contents, int offset, |
+ int oldLength, int newLength); |
/** |
* Set the contents of the given source to the given contents and mark the source as having |
@@ -847,16 +869,6 @@ abstract class AnalysisContext { |
* @param contents the new contents of the source |
*/ |
void setContents(Source source, String contents); |
- |
- /** |
- * Set the source factory used to create the sources that can be analyzed in this context to the |
- * given source factory. Clients can safely assume that all analysis results have been |
- * invalidated. |
- * |
- * @param factory the source factory used to create the sources that can be analyzed in this |
- * context |
- */ |
- void set sourceFactory(SourceFactory factory); |
} |
/** |
@@ -938,7 +950,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* A table mapping sources to the change notices that are waiting to be returned related to that |
* source. |
*/ |
- HashMap<Source, ChangeNoticeImpl> _pendingNotices = new HashMap<Source, ChangeNoticeImpl>(); |
+ HashMap<Source, ChangeNoticeImpl> _pendingNotices = |
+ new HashMap<Source, ChangeNoticeImpl>(); |
/** |
* The object used to record the results of performing an analysis task. |
@@ -972,137 +985,469 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
*/ |
AnalysisContextImpl() { |
_resultRecorder = new AnalysisContextImpl_AnalysisTaskResultRecorder(this); |
- _privatePartition = new UniversalCachePartition(this, AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, new AnalysisContextImpl_ContextRetentionPolicy(this)); |
+ _privatePartition = new UniversalCachePartition( |
+ this, |
+ AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, |
+ new AnalysisContextImpl_ContextRetentionPolicy(this)); |
_cache = createCacheFromSourceFactory(null); |
} |
- IncrementalAnalysisCache get test_incrementalAnalysisCache { |
- return _incrementalAnalysisCache; |
- } |
+ @override |
+ AnalysisOptions get analysisOptions => _options; |
- set test_incrementalAnalysisCache(IncrementalAnalysisCache value) { |
- _incrementalAnalysisCache = value; |
+ @override |
+ void set analysisOptions(AnalysisOptions options) { |
+ bool needsRecompute = |
+ this._options.analyzeAngular != options.analyzeAngular || |
+ this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || |
+ this._options.generateSdkErrors != options.generateSdkErrors || |
+ this._options.enableAsync != options.enableAsync || |
+ this._options.enableDeferredLoading != options.enableDeferredLoading || |
+ this._options.enableEnum != options.enableEnum || |
+ this._options.dart2jsHint != options.dart2jsHint || |
+ (this._options.hint && !options.hint) || |
+ this._options.preserveComments != options.preserveComments; |
+ int cacheSize = options.cacheSize; |
+ if (this._options.cacheSize != cacheSize) { |
+ this._options.cacheSize = cacheSize; |
+ //cache.setMaxCacheSize(cacheSize); |
+ _privatePartition.maxCacheSize = cacheSize; |
+ // |
+ // Cap the size of the priority list to being less than the cache size. |
+ // Failure to do so can result in an infinite loop in |
+ // performAnalysisTask() because re-caching one AST structure |
+ // can cause another priority source's AST structure to be flushed. |
+ // |
+ int maxPriorityOrderSize = cacheSize - _PRIORITY_ORDER_SIZE_DELTA; |
+ if (_priorityOrder.length > maxPriorityOrderSize) { |
+ List<Source> newPriorityOrder = new List<Source>(maxPriorityOrderSize); |
+ JavaSystem.arraycopy( |
+ _priorityOrder, |
+ 0, |
+ newPriorityOrder, |
+ 0, |
+ maxPriorityOrderSize); |
+ _priorityOrder = newPriorityOrder; |
+ } |
+ } |
+ this._options.analyzeAngular = options.analyzeAngular; |
+ this._options.analyzeFunctionBodies = options.analyzeFunctionBodies; |
+ this._options.generateSdkErrors = options.generateSdkErrors; |
+ this._options.enableAsync = options.enableAsync; |
+ this._options.enableDeferredLoading = options.enableDeferredLoading; |
+ this._options.enableEnum = options.enableEnum; |
+ this._options.dart2jsHint = options.dart2jsHint; |
+ this._options.hint = options.hint; |
+ this._options.incremental = options.incremental; |
+ this._options.preserveComments = options.preserveComments; |
+ _generateSdkErrors = options.generateSdkErrors; |
+ if (needsRecompute) { |
+ _invalidateAllLocalResolutionInformation(false); |
+ } |
} |
- List<Source> get test_priorityOrder => _priorityOrder; |
- |
@override |
- void addListener(AnalysisListener listener) { |
- if (!_listeners.contains(listener)) { |
- _listeners.add(listener); |
+ void set analysisPriorityOrder(List<Source> sources) { |
+ if (sources == null || sources.isEmpty) { |
+ _priorityOrder = Source.EMPTY_ARRAY; |
+ } else { |
+ while (sources.remove(null)) { |
+ // Nothing else to do. |
+ } |
+ if (sources.isEmpty) { |
+ _priorityOrder = Source.EMPTY_ARRAY; |
+ } |
+ // |
+ // Cap the size of the priority list to being less than the cache size. |
+ // Failure to do so can result in an infinite loop in |
+ // performAnalysisTask() because re-caching one AST structure |
+ // can cause another priority source's AST structure to be flushed. |
+ // |
+ int count = |
+ math.min(sources.length, _options.cacheSize - _PRIORITY_ORDER_SIZE_DELTA); |
+ _priorityOrder = new List<Source>(count); |
+ for (int i = 0; i < count; i++) { |
+ _priorityOrder[i] = sources[i]; |
+ } |
} |
} |
@override |
- void addSourceInfo(Source source, SourceEntry info) { |
- // This implementation assumes that the access to the cache does not need to be synchronized |
- // because no other object can have access to this context while this method is being invoked. |
- _cache.put(source, info); |
- } |
+ DeclaredVariables get declaredVariables => _declaredVariables; |
@override |
- void applyAnalysisDelta(AnalysisDelta delta) { |
- ChangeSet changeSet = new ChangeSet(); |
- delta.analysisLevels.forEach((Source source, AnalysisLevel level) { |
- if (level == AnalysisLevel.NONE) { |
- changeSet.removedSource(source); |
- } else { |
- changeSet.addedSource(source); |
+ List<Source> get htmlSources => _getSources(SourceKind.HTML); |
+ |
+ @override |
+ bool get isDisposed => _disposed; |
+ |
+ @override |
+ List<Source> get launchableClientLibrarySources { |
+ // TODO(brianwilkerson) This needs to filter out libraries that do not |
+ // reference dart:html, either directly or indirectly. |
+ List<Source> sources = new List<Source>(); |
+ MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
+ while (iterator.moveNext()) { |
+ Source source = iterator.key; |
+ SourceEntry sourceEntry = iterator.value; |
+ if (sourceEntry.kind == SourceKind.LIBRARY && !source.isInSystemLibrary) { |
+// DartEntry dartEntry = (DartEntry) sourceEntry; |
+// if (dartEntry.getValue(DartEntry.IS_LAUNCHABLE) && dartEntry.getValue(DartEntry.IS_CLIENT)) { |
+ sources.add(source); |
+// } |
} |
- }); |
- applyChanges(changeSet); |
+ } |
+ return sources; |
} |
@override |
- void applyChanges(ChangeSet changeSet) { |
- if (changeSet.isEmpty) { |
- return; |
+ List<Source> get launchableServerLibrarySources { |
+ // TODO(brianwilkerson) This needs to filter out libraries that reference |
+ // dart:html, either directly or indirectly. |
+ List<Source> sources = new List<Source>(); |
+ MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
+ while (iterator.moveNext()) { |
+ Source source = iterator.key; |
+ SourceEntry sourceEntry = iterator.value; |
+ if (sourceEntry.kind == SourceKind.LIBRARY && !source.isInSystemLibrary) { |
+// DartEntry dartEntry = (DartEntry) sourceEntry; |
+// if (dartEntry.getValue(DartEntry.IS_LAUNCHABLE) && !dartEntry.getValue(DartEntry.IS_CLIENT)) { |
+ sources.add(source); |
+// } |
+ } |
} |
+ return sources; |
+ } |
+ |
+ @override |
+ List<Source> get librarySources => _getSources(SourceKind.LIBRARY); |
+ |
+ /** |
+ * Look through the cache for a task that needs to be performed. Return the task that was found, |
+ * or `null` if there is no more work to be done. |
+ * |
+ * @return the next task that needs to be performed |
+ */ |
+ AnalysisTask get nextAnalysisTask { |
+ bool hintsEnabled = _options.hint; |
+ bool hasBlockedTask = false; |
// |
- // First, compute the list of sources that have been removed. |
+ // Look for incremental analysis |
// |
- List<Source> removedSources = new List<Source>.from(changeSet.removedSources); |
- for (SourceContainer container in changeSet.removedContainers) { |
- _addSourcesInContainer(removedSources, container); |
+ if (_incrementalAnalysisCache != null && |
+ _incrementalAnalysisCache.hasWork) { |
+ AnalysisTask task = |
+ new IncrementalAnalysisTask(this, _incrementalAnalysisCache); |
+ _incrementalAnalysisCache = null; |
+ return task; |
} |
// |
- // Then determine which cached results are no longer valid. |
+ // Look for a priority source that needs to be analyzed. |
// |
- bool addedDartSource = false; |
- for (Source source in changeSet.addedSources) { |
- if (_sourceAvailable(source)) { |
- addedDartSource = true; |
- } |
- } |
- for (Source source in changeSet.changedSources) { |
- if (_contentCache.getContents(source) != null) { |
- // This source is overridden in the content cache, so the change will have no effect. |
- // Just ignore it to avoid wasting time doing re-analysis. |
- continue; |
+ int priorityCount = _priorityOrder.length; |
+ for (int i = 0; i < priorityCount; i++) { |
+ Source source = _priorityOrder[i]; |
+ AnalysisContextImpl_TaskData taskData = |
+ _getNextAnalysisTaskForSource(source, _cache.get(source), true, hintsEnabled); |
+ AnalysisTask task = taskData.task; |
+ if (task != null) { |
+ return task; |
+ } else if (taskData.isBlocked) { |
+ hasBlockedTask = true; |
} |
- _sourceChanged(source); |
- } |
- changeSet.changedContents.forEach((Source key, String value) { |
- setContents(key, value); |
- }); |
- changeSet.changedRanges.forEach((Source source, ChangeSet_ContentChange change) { |
- setChangedContents( |
- source, |
- change.contents, |
- change.offset, |
- change.oldLength, |
- change.newLength); |
- }); |
- for (Source source in changeSet.deletedSources) { |
- _sourceDeleted(source); |
- } |
- for (Source source in removedSources) { |
- _sourceRemoved(source); |
} |
- if (addedDartSource) { |
- // TODO(brianwilkerson) This is hugely inefficient, but we need to re-analyze any libraries |
- // that might have been referencing the not-yet-existing source that was just added. Longer |
- // term we need to keep track of which libraries are referencing non-existing sources and |
- // only re-analyze those libraries. |
- // logInformation("Added Dart sources, invalidating all resolution information"); |
- List<Source> sourcesToInvalidate = new List<Source>(); |
- MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
- while (iterator.moveNext()) { |
- Source source = iterator.key; |
- SourceEntry sourceEntry = iterator.value; |
- if (!source.isInSystemLibrary && (sourceEntry is DartEntry || sourceEntry is HtmlEntry)) { |
- sourcesToInvalidate.add(source); |
+ if (_neededForResolution != null) { |
+ List<Source> sourcesToRemove = new List<Source>(); |
+ for (Source source in _neededForResolution) { |
+ SourceEntry sourceEntry = _cache.get(source); |
+ if (sourceEntry is DartEntry) { |
+ DartEntry dartEntry = sourceEntry; |
+ if (!dartEntry.hasResolvableCompilationUnit) { |
+ if (dartEntry.getState(DartEntry.PARSED_UNIT) == CacheState.ERROR) { |
+ sourcesToRemove.add(source); |
+ } else { |
+ AnalysisContextImpl_TaskData taskData = |
+ _createParseDartTask(source, dartEntry); |
+ AnalysisTask task = taskData.task; |
+ if (task != null) { |
+ return task; |
+ } else if (taskData.isBlocked) { |
+ hasBlockedTask = true; |
+ } |
+ } |
+ } |
} |
} |
- int count = sourcesToInvalidate.length; |
+ int count = sourcesToRemove.length; |
for (int i = 0; i < count; i++) { |
- Source source = sourcesToInvalidate[i]; |
- SourceEntry entry = _getReadableSourceEntry(source); |
- if (entry is DartEntry) { |
- entry.invalidateAllResolutionInformation(false); |
- _workManager.add(source, _computePriority(entry)); |
- } else if (entry is HtmlEntry) { |
- entry.invalidateAllResolutionInformation(false); |
- _workManager.add(source, SourcePriority.HTML); |
- } |
+ _neededForResolution.remove(sourcesToRemove[i]); |
} |
} |
- } |
- |
- @override |
- String computeDocumentationComment(Element element) { |
- if (element == null) { |
- return null; |
- } |
- Source source = element.source; |
- if (source == null) { |
- return null; |
- } |
- CompilationUnit unit = parseCompilationUnit(source); |
- if (unit == null) { |
- return null; |
- } |
- NodeLocator locator = new NodeLocator.con1(element.nameOffset); |
+ // |
+ // Look for a non-priority source that needs to be analyzed. |
+ // |
+ List<Source> sourcesToRemove = new List<Source>(); |
+ WorkManager_WorkIterator sources = _workManager.iterator(); |
+ try { |
+ while (sources.hasNext) { |
+ Source source = sources.next(); |
+ AnalysisContextImpl_TaskData taskData = |
+ _getNextAnalysisTaskForSource(source, _cache.get(source), false, hintsEnabled); |
+ AnalysisTask task = taskData.task; |
+ if (task != null) { |
+ return task; |
+ } else if (taskData.isBlocked) { |
+ hasBlockedTask = true; |
+ } else { |
+ sourcesToRemove.add(source); |
+ } |
+ } |
+ } finally { |
+ int count = sourcesToRemove.length; |
+ for (int i = 0; i < count; i++) { |
+ _workManager.remove(sourcesToRemove[i]); |
+ } |
+ } |
+ if (hasBlockedTask) { |
+ // All of the analysis work is blocked waiting for an asynchronous task |
+ // to complete. |
+ return WaitForAsyncTask.instance; |
+ } |
+ return null; |
+ } |
+ |
+ @override |
+ List<Source> get prioritySources => _priorityOrder; |
+ |
+ @override |
+ List<Source> get refactoringUnsafeSources { |
+ List<Source> sources = new List<Source>(); |
+ MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
+ while (iterator.moveNext()) { |
+ SourceEntry sourceEntry = iterator.value; |
+ if (sourceEntry is DartEntry) { |
+ Source source = iterator.key; |
+ if (!source.isInSystemLibrary && !sourceEntry.isRefactoringSafe) { |
+ sources.add(source); |
+ } |
+ } |
+ } |
+ return sources; |
+ } |
+ |
+ @override |
+ SourceFactory get sourceFactory => _sourceFactory; |
+ |
+ @override |
+ void set sourceFactory(SourceFactory factory) { |
+ if (identical(_sourceFactory, factory)) { |
+ return; |
+ } else if (factory.context != null) { |
+ throw new IllegalStateException( |
+ "Source factories cannot be shared between contexts"); |
+ } |
+ if (_sourceFactory != null) { |
+ _sourceFactory.context = null; |
+ } |
+ factory.context = this; |
+ _sourceFactory = factory; |
+ _coreLibrarySource = _sourceFactory.forUri(DartSdk.DART_CORE); |
+ _cache = createCacheFromSourceFactory(factory); |
+ _invalidateAllLocalResolutionInformation(true); |
+ } |
+ |
+ /** |
+ * Return a list of the sources that would be processed by [performAnalysisTask]. This |
+ * method duplicates, and must therefore be kept in sync with, [getNextAnalysisTask]. |
+ * This method is intended to be used for testing purposes only. |
+ * |
+ * @return a list of the sources that would be processed by [performAnalysisTask] |
+ */ |
+ List<Source> get sourcesNeedingProcessing { |
+ HashSet<Source> sources = new HashSet<Source>(); |
+ bool hintsEnabled = _options.hint; |
+ // |
+ // Look for priority sources that need to be analyzed. |
+ // |
+ for (Source source in _priorityOrder) { |
+ _getSourcesNeedingProcessing( |
+ source, |
+ _cache.get(source), |
+ true, |
+ hintsEnabled, |
+ sources); |
+ } |
+ // |
+ // Look for non-priority sources that need to be analyzed. |
+ // |
+ WorkManager_WorkIterator iterator = _workManager.iterator(); |
+ while (iterator.hasNext) { |
+ Source source = iterator.next(); |
+ _getSourcesNeedingProcessing( |
+ source, |
+ _cache.get(source), |
+ false, |
+ hintsEnabled, |
+ sources); |
+ } |
+ return new List<Source>.from(sources); |
+ } |
+ |
+ @override |
+ AnalysisContextStatistics get statistics { |
+ AnalysisContextStatisticsImpl statistics = |
+ new AnalysisContextStatisticsImpl(); |
+ visitCacheItems(statistics._internalPutCacheItem); |
+ statistics.partitionData = _cache.partitionData; |
+ return statistics; |
+ } |
+ |
+ IncrementalAnalysisCache get test_incrementalAnalysisCache { |
+ return _incrementalAnalysisCache; |
+ } |
+ |
+ set test_incrementalAnalysisCache(IncrementalAnalysisCache value) { |
+ _incrementalAnalysisCache = value; |
+ } |
+ |
+ List<Source> get test_priorityOrder => _priorityOrder; |
+ |
+ @override |
+ TypeProvider get typeProvider { |
+ Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE); |
+ if (coreSource == null) { |
+ throw new AnalysisException("Could not create a source for dart:core"); |
+ } |
+ LibraryElement coreElement = computeLibraryElement(coreSource); |
+ if (coreElement == null) { |
+ throw new AnalysisException("Could not create an element for dart:core"); |
+ } |
+ return new TypeProviderImpl(coreElement); |
+ } |
+ |
+ @override |
+ void addListener(AnalysisListener listener) { |
+ if (!_listeners.contains(listener)) { |
+ _listeners.add(listener); |
+ } |
+ } |
+ |
+ @override |
+ void addSourceInfo(Source source, SourceEntry info) { |
+ // This implementation assumes that the access to the cache does not need to |
+ // be synchronized because no other object can have access to this context |
+ // while this method is being invoked. |
+ _cache.put(source, info); |
+ } |
+ |
+ @override |
+ void applyAnalysisDelta(AnalysisDelta delta) { |
+ ChangeSet changeSet = new ChangeSet(); |
+ delta.analysisLevels.forEach((Source source, AnalysisLevel level) { |
+ if (level == AnalysisLevel.NONE) { |
+ changeSet.removedSource(source); |
+ } else { |
+ changeSet.addedSource(source); |
+ } |
+ }); |
+ applyChanges(changeSet); |
+ } |
+ |
+ @override |
+ void applyChanges(ChangeSet changeSet) { |
+ if (changeSet.isEmpty) { |
+ return; |
+ } |
+ // |
+ // First, compute the list of sources that have been removed. |
+ // |
+ List<Source> removedSources = |
+ new List<Source>.from(changeSet.removedSources); |
+ for (SourceContainer container in changeSet.removedContainers) { |
+ _addSourcesInContainer(removedSources, container); |
+ } |
+ // |
+ // Then determine which cached results are no longer valid. |
+ // |
+ bool addedDartSource = false; |
+ for (Source source in changeSet.addedSources) { |
+ if (_sourceAvailable(source)) { |
+ addedDartSource = true; |
+ } |
+ } |
+ for (Source source in changeSet.changedSources) { |
+ if (_contentCache.getContents(source) != null) { |
+ // This source is overridden in the content cache, so the change will |
+ // have no effect. Just ignore it to avoid wasting time doing |
+ // re-analysis. |
+ continue; |
+ } |
+ _sourceChanged(source); |
+ } |
+ changeSet.changedContents.forEach((Source key, String value) { |
+ setContents(key, value); |
+ }); |
+ changeSet.changedRanges.forEach( |
+ (Source source, ChangeSet_ContentChange change) { |
+ setChangedContents( |
+ source, |
+ change.contents, |
+ change.offset, |
+ change.oldLength, |
+ change.newLength); |
+ }); |
+ for (Source source in changeSet.deletedSources) { |
+ _sourceDeleted(source); |
+ } |
+ for (Source source in removedSources) { |
+ _sourceRemoved(source); |
+ } |
+ if (addedDartSource) { |
+ // TODO(brianwilkerson) This is hugely inefficient, but we need to |
+ // re-analyze any libraries that might have been referencing the |
+ // not-yet-existing source that was just added. Longer term we need to |
+ // keep track of which libraries are referencing non-existing sources and |
+ // only re-analyze those libraries. |
+// logInformation("Added Dart sources, invalidating all resolution information"); |
+ List<Source> sourcesToInvalidate = new List<Source>(); |
+ MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
+ while (iterator.moveNext()) { |
+ Source source = iterator.key; |
+ SourceEntry sourceEntry = iterator.value; |
+ if (!source.isInSystemLibrary && |
+ (sourceEntry is DartEntry || sourceEntry is HtmlEntry)) { |
+ sourcesToInvalidate.add(source); |
+ } |
+ } |
+ int count = sourcesToInvalidate.length; |
+ for (int i = 0; i < count; i++) { |
+ Source source = sourcesToInvalidate[i]; |
+ SourceEntry entry = _getReadableSourceEntry(source); |
+ if (entry is DartEntry) { |
+ entry.invalidateAllResolutionInformation(false); |
+ _workManager.add(source, _computePriority(entry)); |
+ } else if (entry is HtmlEntry) { |
+ entry.invalidateAllResolutionInformation(false); |
+ _workManager.add(source, SourcePriority.HTML); |
+ } |
+ } |
+ } |
+ } |
+ |
+ @override |
+ String computeDocumentationComment(Element element) { |
+ if (element == null) { |
+ return null; |
+ } |
+ Source source = element.source; |
+ if (source == null) { |
+ return null; |
+ } |
+ CompilationUnit unit = parseCompilationUnit(source); |
+ if (unit == null) { |
+ return null; |
+ } |
+ NodeLocator locator = new NodeLocator.con1(element.nameOffset); |
AstNode nameNode = locator.searchWithin(unit); |
while (nameNode != null) { |
if (nameNode is AnnotatedNode) { |
@@ -1133,27 +1478,55 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
List<AnalysisError> errors = new List<AnalysisError>(); |
try { |
DartEntry dartEntry = sourceEntry; |
- ListUtilities.addAll(errors, _getDartScanData(source, dartEntry, DartEntry.SCAN_ERRORS)); |
+ ListUtilities.addAll( |
+ errors, |
+ _getDartScanData(source, dartEntry, DartEntry.SCAN_ERRORS)); |
dartEntry = _getReadableDartEntry(source); |
- ListUtilities.addAll(errors, _getDartParseData(source, dartEntry, DartEntry.PARSE_ERRORS)); |
+ ListUtilities.addAll( |
+ errors, |
+ _getDartParseData(source, dartEntry, DartEntry.PARSE_ERRORS)); |
dartEntry = _getReadableDartEntry(source); |
if (dartEntry.getValue(DartEntry.SOURCE_KIND) == SourceKind.LIBRARY) { |
- ListUtilities.addAll(errors, _getDartResolutionData(source, source, dartEntry, DartEntry.RESOLUTION_ERRORS)); |
+ ListUtilities.addAll( |
+ errors, |
+ _getDartResolutionData(source, source, dartEntry, DartEntry.RESOLUTION_ERRORS)); |
dartEntry = _getReadableDartEntry(source); |
- ListUtilities.addAll(errors, _getDartVerificationData(source, source, dartEntry, DartEntry.VERIFICATION_ERRORS)); |
+ ListUtilities.addAll( |
+ errors, |
+ _getDartVerificationData( |
+ source, |
+ source, |
+ dartEntry, |
+ DartEntry.VERIFICATION_ERRORS)); |
if (enableHints) { |
dartEntry = _getReadableDartEntry(source); |
- ListUtilities.addAll(errors, _getDartHintData(source, source, dartEntry, DartEntry.HINTS)); |
+ ListUtilities.addAll( |
+ errors, |
+ _getDartHintData(source, source, dartEntry, DartEntry.HINTS)); |
} |
} else { |
List<Source> libraries = getLibrariesContaining(source); |
for (Source librarySource in libraries) { |
- ListUtilities.addAll(errors, _getDartResolutionData(source, librarySource, dartEntry, DartEntry.RESOLUTION_ERRORS)); |
+ ListUtilities.addAll( |
+ errors, |
+ _getDartResolutionData( |
+ source, |
+ librarySource, |
+ dartEntry, |
+ DartEntry.RESOLUTION_ERRORS)); |
dartEntry = _getReadableDartEntry(source); |
- ListUtilities.addAll(errors, _getDartVerificationData(source, librarySource, dartEntry, DartEntry.VERIFICATION_ERRORS)); |
+ ListUtilities.addAll( |
+ errors, |
+ _getDartVerificationData( |
+ source, |
+ librarySource, |
+ dartEntry, |
+ DartEntry.VERIFICATION_ERRORS)); |
if (enableHints) { |
dartEntry = _getReadableDartEntry(source); |
- ListUtilities.addAll(errors, _getDartHintData(source, librarySource, dartEntry, DartEntry.HINTS)); |
+ ListUtilities.addAll( |
+ errors, |
+ _getDartHintData(source, librarySource, dartEntry, DartEntry.HINTS)); |
} |
} |
} |
@@ -1169,7 +1542,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} else if (sourceEntry is HtmlEntry) { |
HtmlEntry htmlEntry = sourceEntry; |
try { |
- return _getHtmlResolutionData2(source, htmlEntry, HtmlEntry.RESOLUTION_ERRORS); |
+ return _getHtmlResolutionData2( |
+ source, |
+ htmlEntry, |
+ HtmlEntry.RESOLUTION_ERRORS); |
} on ObsoleteSourceAnalysisException catch (exception, stackTrace) { |
AnalysisEngine.instance.logger.logInformation( |
"Could not compute errors", |
@@ -1180,13 +1556,16 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> computeExportedLibraries(Source source) => _getDartParseData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY); |
+ List<Source> computeExportedLibraries(Source source) => |
+ _getDartParseData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY); |
@override |
- HtmlElement computeHtmlElement(Source source) => _getHtmlResolutionData(source, HtmlEntry.ELEMENT, null); |
+ HtmlElement computeHtmlElement(Source source) => |
+ _getHtmlResolutionData(source, HtmlEntry.ELEMENT, null); |
@override |
- List<Source> computeImportedLibraries(Source source) => _getDartParseData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY); |
+ List<Source> computeImportedLibraries(Source source) => |
+ _getDartParseData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY); |
@override |
SourceKind computeKindOf(Source source) { |
@@ -1204,7 +1583,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- LibraryElement computeLibraryElement(Source source) => _getDartResolutionData2(source, source, DartEntry.ELEMENT, null); |
+ LibraryElement computeLibraryElement(Source source) => |
+ _getDartResolutionData2(source, source, DartEntry.ELEMENT, null); |
@override |
LineInfo computeLineInfo(Source source) { |
@@ -1227,16 +1607,39 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
CompilationUnit computeResolvableCompilationUnit(Source source) { |
DartEntry dartEntry = _getReadableDartEntry(source); |
if (dartEntry == null) { |
- throw new AnalysisException("computeResolvableCompilationUnit for non-Dart: ${source.fullName}"); |
+ throw new AnalysisException( |
+ "computeResolvableCompilationUnit for non-Dart: ${source.fullName}"); |
} |
dartEntry = _cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT); |
CompilationUnit unit = dartEntry.resolvableCompilationUnit; |
if (unit == null) { |
- throw new AnalysisException("Internal error: computeResolvableCompilationUnit could not parse ${source.fullName}", new CaughtException(dartEntry.exception, null)); |
+ throw new AnalysisException( |
+ "Internal error: computeResolvableCompilationUnit could not parse ${source.fullName}", |
+ new CaughtException(dartEntry.exception, null)); |
} |
return unit; |
} |
+ /** |
+ * Create an analysis cache based on the given source factory. |
+ * |
+ * @param factory the source factory containing the information needed to create the cache |
+ * @return the cache that was created |
+ */ |
+ AnalysisCache createCacheFromSourceFactory(SourceFactory factory) { |
+ if (factory == null) { |
+ return new AnalysisCache(<CachePartition>[_privatePartition]); |
+ } |
+ DartSdk sdk = factory.dartSdk; |
+ if (sdk == null) { |
+ return new AnalysisCache(<CachePartition>[_privatePartition]); |
+ } |
+ return new AnalysisCache( |
+ <CachePartition>[ |
+ AnalysisEngine.instance.partitionManager.forSdk(sdk), |
+ _privatePartition]); |
+ } |
+ |
@override |
void dispose() { |
_disposed = true; |
@@ -1254,14 +1657,12 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- AnalysisOptions get analysisOptions => _options; |
- |
- @override |
AngularApplication getAngularApplicationWithHtml(Source htmlSource) { |
SourceEntry sourceEntry = _getReadableSourceEntryOrNull(htmlSource); |
if (sourceEntry is HtmlEntry) { |
HtmlEntry htmlEntry = sourceEntry; |
- AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION); |
+ AngularApplication application = |
+ htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION); |
if (application != null) { |
return application; |
} |
@@ -1271,11 +1672,13 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- CompilationUnitElement getCompilationUnitElement(Source unitSource, Source librarySource) { |
+ CompilationUnitElement getCompilationUnitElement(Source unitSource, |
+ Source librarySource) { |
LibraryElement libraryElement = getLibraryElement(librarySource); |
if (libraryElement != null) { |
// try defining unit |
- CompilationUnitElement definingUnit = libraryElement.definingCompilationUnit; |
+ CompilationUnitElement definingUnit = |
+ libraryElement.definingCompilationUnit; |
if (definingUnit.source == unitSource) { |
return definingUnit; |
} |
@@ -1293,7 +1696,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
TimestampedData<String> getContents(Source source) { |
String contents = _contentCache.getContents(source); |
if (contents != null) { |
- return new TimestampedData<String>(_contentCache.getModificationStamp(source), contents); |
+ return new TimestampedData<String>( |
+ _contentCache.getModificationStamp(source), |
+ contents); |
} |
return source.contents; |
} |
@@ -1305,9 +1710,6 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- DeclaredVariables get declaredVariables => _declaredVariables; |
- |
- @override |
Element getElement(ElementLocation location) { |
// TODO(brianwilkerson) This should not be a "get" method. |
try { |
@@ -1337,10 +1739,14 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source); |
if (sourceEntry is DartEntry) { |
DartEntry dartEntry = sourceEntry; |
- return new AnalysisErrorInfoImpl(dartEntry.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO)); |
+ return new AnalysisErrorInfoImpl( |
+ dartEntry.allErrors, |
+ dartEntry.getValue(SourceEntry.LINE_INFO)); |
} else if (sourceEntry is HtmlEntry) { |
HtmlEntry htmlEntry = sourceEntry; |
- return new AnalysisErrorInfoImpl(htmlEntry.allErrors, htmlEntry.getValue(SourceEntry.LINE_INFO)); |
+ return new AnalysisErrorInfoImpl( |
+ htmlEntry.allErrors, |
+ htmlEntry.getValue(SourceEntry.LINE_INFO)); |
} |
return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null); |
} |
@@ -1368,7 +1774,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
while (partIterator.moveNext()) { |
SourceEntry sourceEntry = partIterator.value; |
if (sourceEntry.kind == SourceKind.HTML) { |
- List<Source> referencedLibraries = (sourceEntry as HtmlEntry).getValue(HtmlEntry.REFERENCED_LIBRARIES); |
+ List<Source> referencedLibraries = |
+ (sourceEntry as HtmlEntry).getValue(HtmlEntry.REFERENCED_LIBRARIES); |
if (_containsAny(referencedLibraries, librarySources)) { |
htmlSources.add(partIterator.key); |
} |
@@ -1379,7 +1786,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
while (iterator.moveNext()) { |
SourceEntry sourceEntry = iterator.value; |
if (sourceEntry.kind == SourceKind.HTML) { |
- List<Source> referencedLibraries = (sourceEntry as HtmlEntry).getValue(HtmlEntry.REFERENCED_LIBRARIES); |
+ List<Source> referencedLibraries = |
+ (sourceEntry as HtmlEntry).getValue(HtmlEntry.REFERENCED_LIBRARIES); |
if (_contains(referencedLibraries, source)) { |
htmlSources.add(iterator.key); |
} |
@@ -1395,9 +1803,6 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> get htmlSources => _getSources(SourceKind.HTML); |
- |
- @override |
SourceKind getKindOf(Source source) { |
SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source); |
if (sourceEntry == null) { |
@@ -1407,44 +1812,6 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> get launchableClientLibrarySources { |
- // TODO(brianwilkerson) This needs to filter out libraries that do not reference dart:html, |
- // either directly or indirectly. |
- List<Source> sources = new List<Source>(); |
- MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
- while (iterator.moveNext()) { |
- Source source = iterator.key; |
- SourceEntry sourceEntry = iterator.value; |
- if (sourceEntry.kind == SourceKind.LIBRARY && !source.isInSystemLibrary) { |
- // DartEntry dartEntry = (DartEntry) sourceEntry; |
- // if (dartEntry.getValue(DartEntry.IS_LAUNCHABLE) && dartEntry.getValue(DartEntry.IS_CLIENT)) { |
- sources.add(source); |
- // } |
- } |
- } |
- return sources; |
- } |
- |
- @override |
- List<Source> get launchableServerLibrarySources { |
- // TODO(brianwilkerson) This needs to filter out libraries that reference dart:html, either |
- // directly or indirectly. |
- List<Source> sources = new List<Source>(); |
- MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
- while (iterator.moveNext()) { |
- Source source = iterator.key; |
- SourceEntry sourceEntry = iterator.value; |
- if (sourceEntry.kind == SourceKind.LIBRARY && !source.isInSystemLibrary) { |
- // DartEntry dartEntry = (DartEntry) sourceEntry; |
- // if (dartEntry.getValue(DartEntry.IS_LAUNCHABLE) && !dartEntry.getValue(DartEntry.IS_CLIENT)) { |
- sources.add(source); |
- // } |
- } |
- } |
- return sources; |
- } |
- |
- @override |
List<Source> getLibrariesContaining(Source source) { |
SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source); |
if (sourceEntry is DartEntry) { |
@@ -1460,10 +1827,14 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
while (iterator.moveNext()) { |
SourceEntry sourceEntry = iterator.value; |
if (sourceEntry.kind == SourceKind.LIBRARY) { |
- if (_contains((sourceEntry as DartEntry).getValue(DartEntry.EXPORTED_LIBRARIES), librarySource)) { |
+ if (_contains( |
+ (sourceEntry as DartEntry).getValue(DartEntry.EXPORTED_LIBRARIES), |
+ librarySource)) { |
dependentLibraries.add(iterator.key); |
} |
- if (_contains((sourceEntry as DartEntry).getValue(DartEntry.IMPORTED_LIBRARIES), librarySource)) { |
+ if (_contains( |
+ (sourceEntry as DartEntry).getValue(DartEntry.IMPORTED_LIBRARIES), |
+ librarySource)) { |
dependentLibraries.add(iterator.key); |
} |
} |
@@ -1494,9 +1865,6 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> get librarySources => _getSources(SourceKind.LIBRARY); |
- |
- @override |
LineInfo getLineInfo(Source source) { |
SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source); |
if (sourceEntry != null) { |
@@ -1515,12 +1883,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> get prioritySources => _priorityOrder; |
- |
- @override |
Namespace getPublicNamespace(LibraryElement library) { |
- // TODO(brianwilkerson) Rename this to not start with 'get'. Note that this is not part of the |
- // API of the interface. |
+ // TODO(brianwilkerson) Rename this to not start with 'get'. |
+ // Note that this is not part of the API of the interface. |
Source source = library.definingCompilationUnit.source; |
DartEntry dartEntry = _getReadableDartEntry(source); |
if (dartEntry == null) { |
@@ -1549,23 +1914,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> get refactoringUnsafeSources { |
- List<Source> sources = new List<Source>(); |
- MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
- while (iterator.moveNext()) { |
- SourceEntry sourceEntry = iterator.value; |
- if (sourceEntry is DartEntry) { |
- Source source = iterator.key; |
- if (!source.isInSystemLibrary && !sourceEntry.isRefactoringSafe) { |
- sources.add(source); |
- } |
- } |
- } |
- return sources; |
- } |
- |
- @override |
- CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) { |
+ CompilationUnit getResolvedCompilationUnit(Source unitSource, |
+ LibraryElement library) { |
if (library == null) { |
return null; |
} |
@@ -1573,10 +1923,13 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) { |
+ CompilationUnit getResolvedCompilationUnit2(Source unitSource, |
+ Source librarySource) { |
SourceEntry sourceEntry = _getReadableSourceEntryOrNull(unitSource); |
if (sourceEntry is DartEntry) { |
- return sourceEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
+ return sourceEntry.getValueInLibrary( |
+ DartEntry.RESOLVED_UNIT, |
+ librarySource); |
} |
return null; |
} |
@@ -1592,170 +1945,34 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- SourceFactory get sourceFactory => _sourceFactory; |
- |
- /** |
- * Return a list of the sources that would be processed by [performAnalysisTask]. This |
- * method duplicates, and must therefore be kept in sync with, [getNextAnalysisTask]. |
- * This method is intended to be used for testing purposes only. |
- * |
- * @return a list of the sources that would be processed by [performAnalysisTask] |
- */ |
- List<Source> get sourcesNeedingProcessing { |
- HashSet<Source> sources = new HashSet<Source>(); |
- bool hintsEnabled = _options.hint; |
- // |
- // Look for priority sources that need to be analyzed. |
- // |
- for (Source source in _priorityOrder) { |
- _getSourcesNeedingProcessing(source, _cache.get(source), true, hintsEnabled, sources); |
- } |
- // |
- // Look for non-priority sources that need to be analyzed. |
- // |
- WorkManager_WorkIterator iterator = _workManager.iterator(); |
- while (iterator.hasNext) { |
- Source source = iterator.next(); |
- _getSourcesNeedingProcessing(source, _cache.get(source), false, hintsEnabled, sources); |
- } |
- return new List<Source>.from(sources); |
- } |
- |
- @override |
- void visitCacheItems(void callback(Source source, SourceEntry dartEntry, |
- DataDescriptor rowDesc, |
- CacheState state)) { |
- void handleCacheItem(Source source, SourceEntry dartEntry, |
- DataDescriptor descriptor) { |
- callback(source, dartEntry, descriptor, dartEntry.getState(descriptor)); |
- } |
- void handleCacheItemInLibrary(DartEntry dartEntry, Source librarySource, |
- DataDescriptor descriptor) { |
- callback(librarySource, dartEntry, descriptor, |
- dartEntry.getStateInLibrary(descriptor, librarySource)); |
- } |
- |
- bool hintsEnabled = _options.hint; |
- MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
- while (iterator.moveNext()) { |
- Source source = iterator.key; |
- SourceEntry sourceEntry = iterator.value; |
- if (sourceEntry is DartEntry) { |
- DartEntry dartEntry = sourceEntry; |
- SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND); |
- // get library independent values |
- handleCacheItem(source, dartEntry, SourceEntry.CONTENT); |
- handleCacheItem(source, dartEntry, SourceEntry.LINE_INFO); |
- // The list of containing libraries is always valid, so the state isn't |
- // interesting. |
-// handleCacheItem(source, dartEntry, DartEntry.CONTAINING_LIBRARIES); |
- handleCacheItem(source, dartEntry, DartEntry.PARSE_ERRORS); |
- handleCacheItem(source, dartEntry, DartEntry.PARSED_UNIT); |
- handleCacheItem(source, dartEntry, DartEntry.SCAN_ERRORS); |
- handleCacheItem(source, dartEntry, DartEntry.SOURCE_KIND); |
- handleCacheItem(source, dartEntry, DartEntry.TOKEN_STREAM); |
- if (kind == SourceKind.LIBRARY) { |
- handleCacheItem(source, dartEntry, DartEntry.ELEMENT); |
- handleCacheItem(source, dartEntry, DartEntry.EXPORTED_LIBRARIES); |
- handleCacheItem(source, dartEntry, DartEntry.IMPORTED_LIBRARIES); |
- handleCacheItem(source, dartEntry, DartEntry.INCLUDED_PARTS); |
- handleCacheItem(source, dartEntry, DartEntry.IS_CLIENT); |
- handleCacheItem(source, dartEntry, DartEntry.IS_LAUNCHABLE); |
- // The public namespace isn't computed by performAnalysisTask() |
- // and therefore isn't interesting. |
- //handleCacheItem(key, dartEntry, DartEntry.PUBLIC_NAMESPACE); |
- } |
- // get library-specific values |
- List<Source> librarySources = getLibrariesContaining(source); |
- for (Source librarySource in librarySources) { |
- // These values are not currently being computed, so their state is |
- // not interesting. |
-// handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.ANGULAR_ERRORS); |
-// handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.BUILT_ELEMENT); |
-// handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.BUILT_UNIT); |
- handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.RESOLUTION_ERRORS); |
- handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.RESOLVED_UNIT); |
- if (_generateSdkErrors || !source.isInSystemLibrary) { |
- handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.VERIFICATION_ERRORS); |
- if (hintsEnabled) { |
- handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.HINTS); |
- } |
- } |
- } |
- } else if (sourceEntry is HtmlEntry) { |
- HtmlEntry htmlEntry = sourceEntry; |
- handleCacheItem(source, htmlEntry, SourceEntry.CONTENT); |
- handleCacheItem(source, htmlEntry, SourceEntry.LINE_INFO); |
- // These values are not currently being computed, so their state is |
- // not interesting. |
-// handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_APPLICATION); |
-// handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_COMPONENT); |
-// handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_ENTRY); |
-// handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_ERRORS); |
- handleCacheItem(source, htmlEntry, HtmlEntry.ELEMENT); |
- handleCacheItem(source, htmlEntry, HtmlEntry.PARSE_ERRORS); |
- handleCacheItem(source, htmlEntry, HtmlEntry.PARSED_UNIT); |
- // These values are not currently being computed, so their state is |
- // not interesting. |
-// handleCacheItem(source, htmlEntry, HtmlEntry.POLYMER_BUILD_ERRORS); |
-// handleCacheItem(source, htmlEntry, HtmlEntry.POLYMER_RESOLUTION_ERRORS); |
- handleCacheItem(source, htmlEntry, HtmlEntry.RESOLUTION_ERRORS); |
- handleCacheItem(source, htmlEntry, HtmlEntry.RESOLVED_UNIT); |
- // We are not currently recording any hints related to HTML. |
-// handleCacheItem(key, htmlEntry, HtmlEntry.HINTS); |
- } |
- } |
- } |
- |
- @override |
- AnalysisContextStatistics get statistics { |
- AnalysisContextStatisticsImpl statistics = new AnalysisContextStatisticsImpl(); |
- visitCacheItems(statistics._internalPutCacheItem); |
- statistics.partitionData = _cache.partitionData; |
- return statistics; |
- } |
- |
- @override |
- TypeProvider get typeProvider { |
- Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE); |
- if (coreSource == null) { |
- throw new AnalysisException("Could not create a source for dart:core"); |
- } |
- LibraryElement coreElement = computeLibraryElement(coreSource); |
- if (coreElement == null) { |
- throw new AnalysisException("Could not create an element for dart:core"); |
- } |
- return new TypeProviderImpl(coreElement); |
- } |
- |
- @override |
bool isClientLibrary(Source librarySource) { |
SourceEntry sourceEntry = _getReadableSourceEntry(librarySource); |
if (sourceEntry is DartEntry) { |
DartEntry dartEntry = sourceEntry; |
- return dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartEntry.IS_LAUNCHABLE); |
+ return dartEntry.getValue(DartEntry.IS_CLIENT) && |
+ dartEntry.getValue(DartEntry.IS_LAUNCHABLE); |
} |
return false; |
} |
@override |
- bool get isDisposed => _disposed; |
- |
- @override |
bool isServerLibrary(Source librarySource) { |
SourceEntry sourceEntry = _getReadableSourceEntry(librarySource); |
if (sourceEntry is DartEntry) { |
DartEntry dartEntry = sourceEntry; |
- return !dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartEntry.IS_LAUNCHABLE); |
+ return !dartEntry.getValue(DartEntry.IS_CLIENT) && |
+ dartEntry.getValue(DartEntry.IS_LAUNCHABLE); |
} |
return false; |
} |
@override |
- CompilationUnit parseCompilationUnit(Source source) => _getDartParseData2(source, DartEntry.PARSED_UNIT, null); |
+ CompilationUnit parseCompilationUnit(Source source) => |
+ _getDartParseData2(source, DartEntry.PARSED_UNIT, null); |
@override |
- ht.HtmlUnit parseHtmlUnit(Source source) => _getHtmlParseData(source, HtmlEntry.PARSED_UNIT, null); |
+ ht.HtmlUnit parseHtmlUnit(Source source) => |
+ _getHtmlParseData(source, HtmlEntry.PARSED_UNIT, null); |
@override |
AnalysisResult performAnalysisTask() { |
@@ -1769,7 +1986,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
task = nextAnalysisTask; |
} |
if (task == null) { |
- return new AnalysisResult(_getChangeNotices(true), getEnd - getStart, null, -1); |
+ return new AnalysisResult( |
+ _getChangeNotices(true), |
+ getEnd - getStart, |
+ null, |
+ -1); |
} |
String taskDescription = task.toString(); |
_notifyAboutToPerformTask(taskDescription); |
@@ -1796,9 +2017,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
for (int i = 0; i < noticeCount; i++) { |
ChangeNotice notice = notices[i]; |
Source source = notice.source; |
- // TODO(brianwilkerson) Figure out whether the compilation unit is always resolved, or whether |
- // we need to decide whether to invoke the "parsed" or "resolved" method. This might be better |
- // done when recording task results in order to reduce the chance of errors. |
+ // TODO(brianwilkerson) Figure out whether the compilation unit is always |
+ // resolved, or whether we need to decide whether to invoke the "parsed" |
+ // or "resolved" method. This might be better done when recording task |
+ // results in order to reduce the chance of errors. |
// if (notice.getCompilationUnit() != null) { |
// notifyResolvedDart(source, notice.getCompilationUnit()); |
// } else if (notice.getHtmlUnit() != null) { |
@@ -1806,7 +2028,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// } |
_notifyErrors(source, notice.errors, notice.lineInfo); |
} |
- return new AnalysisResult(notices, getEnd - getStart, task.runtimeType.toString(), performEnd - performStart); |
+ return new AnalysisResult( |
+ notices, |
+ getEnd - getStart, |
+ task.runtimeType.toString(), |
+ performEnd - performStart); |
} |
@override |
@@ -1820,7 +2046,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (dartEntry != null) { |
_recordElementData(dartEntry, library, library.source, htmlSource); |
dartEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED); |
- dartEntry.setValue(SourceEntry.LINE_INFO, new LineInfo(<int> [0])); |
+ dartEntry.setValue(SourceEntry.LINE_INFO, new LineInfo(<int>[0])); |
dartEntry.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS); |
// DartEntry.ELEMENT - set in recordElementData |
dartEntry.setValue(DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY); |
@@ -1834,206 +2060,61 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
dartEntry.setValue(DartEntry.SCAN_ERRORS, AnalysisError.NO_ERRORS); |
dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.LIBRARY); |
dartEntry.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED); |
- dartEntry.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, librarySource, AnalysisError.NO_ERRORS); |
- dartEntry.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.FLUSHED); |
- dartEntry.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, AnalysisError.NO_ERRORS); |
- dartEntry.setValueInLibrary(DartEntry.HINTS, librarySource, AnalysisError.NO_ERRORS); |
+ dartEntry.setValueInLibrary( |
+ DartEntry.RESOLUTION_ERRORS, |
+ librarySource, |
+ AnalysisError.NO_ERRORS); |
+ dartEntry.setStateInLibrary( |
+ DartEntry.RESOLVED_UNIT, |
+ librarySource, |
+ CacheState.FLUSHED); |
+ dartEntry.setValueInLibrary( |
+ DartEntry.VERIFICATION_ERRORS, |
+ librarySource, |
+ AnalysisError.NO_ERRORS); |
+ dartEntry.setValueInLibrary( |
+ DartEntry.HINTS, |
+ librarySource, |
+ AnalysisError.NO_ERRORS); |
} |
}); |
} |
- @override |
- void removeListener(AnalysisListener listener) { |
- _listeners.remove(listener); |
- } |
- |
- @override |
- CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) { |
- if (library == null) { |
- return null; |
- } |
- return resolveCompilationUnit2(unitSource, library.source); |
- } |
- |
- @override |
- CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) => _getDartResolutionData2(unitSource, librarySource, DartEntry.RESOLVED_UNIT, null); |
- |
- @override |
- ht.HtmlUnit resolveHtmlUnit(Source htmlSource) { |
- computeHtmlElement(htmlSource); |
- return parseHtmlUnit(htmlSource); |
- } |
- |
- @override |
- void set analysisOptions(AnalysisOptions options) { |
- bool needsRecompute = this._options.analyzeAngular != options.analyzeAngular || this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors || this._options.enableAsync != options.enableAsync || this._options.enableDeferredLoading != options.enableDeferredLoading || this._options.enableEnum != options.enableEnum || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments; |
- int cacheSize = options.cacheSize; |
- if (this._options.cacheSize != cacheSize) { |
- this._options.cacheSize = cacheSize; |
- //cache.setMaxCacheSize(cacheSize); |
- _privatePartition.maxCacheSize = cacheSize; |
+ /** |
+ * Record the results produced by performing a [task] and return the cache |
+ * entry associated with the results. |
+ */ |
+ DartEntry |
+ recordResolveDartLibraryCycleTaskResults(ResolveDartLibraryCycleTask task) { |
+ LibraryResolver2 resolver = task.libraryResolver; |
+ CaughtException thrownException = task.exception; |
+ Source unitSource = task.unitSource; |
+ DartEntry unitEntry = _getReadableDartEntry(unitSource); |
+ if (resolver != null) { |
// |
- // Cap the size of the priority list to being less than the cache size. Failure to do so can |
- // result in an infinite loop in performAnalysisTask() because re-caching one AST structure |
- // can cause another priority source's AST structure to be flushed. |
+ // The resolver should only be null if an exception was thrown before (or |
+ // while) it was being created. |
// |
- int maxPriorityOrderSize = cacheSize - _PRIORITY_ORDER_SIZE_DELTA; |
- if (_priorityOrder.length > maxPriorityOrderSize) { |
- List<Source> newPriorityOrder = new List<Source>(maxPriorityOrderSize); |
- JavaSystem.arraycopy(_priorityOrder, 0, newPriorityOrder, 0, maxPriorityOrderSize); |
- _priorityOrder = newPriorityOrder; |
- } |
- } |
- this._options.analyzeAngular = options.analyzeAngular; |
- this._options.analyzeFunctionBodies = options.analyzeFunctionBodies; |
- this._options.generateSdkErrors = options.generateSdkErrors; |
- this._options.enableAsync = options.enableAsync; |
- this._options.enableDeferredLoading = options.enableDeferredLoading; |
- this._options.enableEnum = options.enableEnum; |
- this._options.dart2jsHint = options.dart2jsHint; |
- this._options.hint = options.hint; |
- this._options.incremental = options.incremental; |
- this._options.preserveComments = options.preserveComments; |
- _generateSdkErrors = options.generateSdkErrors; |
- if (needsRecompute) { |
- _invalidateAllLocalResolutionInformation(false); |
- } |
- } |
- |
- @override |
- void set analysisPriorityOrder(List<Source> sources) { |
- if (sources == null || sources.isEmpty) { |
- _priorityOrder = Source.EMPTY_ARRAY; |
- } else { |
- while (sources.remove(null)) { |
- // Nothing else to do. |
- } |
- if (sources.isEmpty) { |
- _priorityOrder = Source.EMPTY_ARRAY; |
- } |
- // |
- // Cap the size of the priority list to being less than the cache size. Failure to do so can |
- // result in an infinite loop in performAnalysisTask() because re-caching one AST structure |
- // can cause another priority source's AST structure to be flushed. |
- // |
- int count = math.min(sources.length, _options.cacheSize - _PRIORITY_ORDER_SIZE_DELTA); |
- _priorityOrder = new List<Source>(count); |
- for (int i = 0; i < count; i++) { |
- _priorityOrder[i] = sources[i]; |
- } |
- } |
- } |
- |
- @override |
- void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) { |
- String originalContents = _contentCache.setContents(source, contents); |
- if (contents != null) { |
- if (contents != originalContents) { |
- if (_options.incremental) { |
- _incrementalAnalysisCache = IncrementalAnalysisCache.update(_incrementalAnalysisCache, source, originalContents, contents, offset, oldLength, newLength, _getReadableSourceEntry(source)); |
- } |
- _sourceChanged(source); |
- SourceEntry sourceEntry = _cache.get(source); |
- if (sourceEntry != null) { |
- sourceEntry.modificationTime = _contentCache.getModificationStamp(source); |
- sourceEntry.setValue(SourceEntry.CONTENT, contents); |
- } |
- } |
- } else if (originalContents != null) { |
- _incrementalAnalysisCache = IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source); |
- _sourceChanged(source); |
- } |
- } |
- |
- @override |
- void setContents(Source source, String contents) { |
- String originalContents = _contentCache.setContents(source, contents); |
- if (contents != null) { |
- if (contents != originalContents) { |
- _incrementalAnalysisCache = IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source); |
- _sourceChanged(source); |
- SourceEntry sourceEntry = _cache.get(source); |
- if (sourceEntry != null) { |
- sourceEntry.modificationTime = _contentCache.getModificationStamp(source); |
- sourceEntry.setValue(SourceEntry.CONTENT, contents); |
- } |
- } |
- } else if (originalContents != null) { |
- _incrementalAnalysisCache = IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source); |
- _sourceChanged(source); |
- } |
- } |
- |
- @override |
- void set sourceFactory(SourceFactory factory) { |
- if (identical(_sourceFactory, factory)) { |
- return; |
- } else if (factory.context != null) { |
- throw new IllegalStateException("Source factories cannot be shared between contexts"); |
- } |
- if (_sourceFactory != null) { |
- _sourceFactory.context = null; |
- } |
- factory.context = this; |
- _sourceFactory = factory; |
- _coreLibrarySource = _sourceFactory.forUri(DartSdk.DART_CORE); |
- _cache = createCacheFromSourceFactory(factory); |
- _invalidateAllLocalResolutionInformation(true); |
- } |
- |
- /** |
- * Create an analysis cache based on the given source factory. |
- * |
- * @param factory the source factory containing the information needed to create the cache |
- * @return the cache that was created |
- */ |
- AnalysisCache createCacheFromSourceFactory(SourceFactory factory) { |
- if (factory == null) { |
- return new AnalysisCache(<CachePartition> [_privatePartition]); |
- } |
- DartSdk sdk = factory.dartSdk; |
- if (sdk == null) { |
- return new AnalysisCache(<CachePartition> [_privatePartition]); |
- } |
- return new AnalysisCache(<CachePartition> [ |
- AnalysisEngine.instance.partitionManager.forSdk(sdk), |
- _privatePartition]); |
- } |
- |
- /** |
- * Record the results produced by performing a [task] and return the cache |
- * entry associated with the results. |
- */ |
- DartEntry recordResolveDartLibraryCycleTaskResults(ResolveDartLibraryCycleTask task) { |
- LibraryResolver2 resolver = task.libraryResolver; |
- CaughtException thrownException = task.exception; |
- Source unitSource = task.unitSource; |
- DartEntry unitEntry = _getReadableDartEntry(unitSource); |
- if (resolver != null) { |
- // |
- // The resolver should only be null if an exception was thrown before (or |
- // while) it was being created. |
- // |
- List<ResolvableLibrary> resolvedLibraries = resolver.resolvedLibraries; |
- if (resolvedLibraries == null) { |
- // |
- // The resolved libraries should only be null if an exception was thrown |
- // during resolution. |
- // |
- if (thrownException == null) { |
- var message = "In recordResolveDartLibraryCycleTaskResults, " |
- "resolvedLibraries was null and there was no thrown exception"; |
- unitEntry.recordResolutionError(new CaughtException( |
- new AnalysisException(message), |
- null)); |
- } else { |
- unitEntry.recordResolutionError(thrownException); |
- } |
- _cache.remove(unitSource); |
- if (thrownException != null) { |
- throw new AnalysisException('<rethrow>', thrownException); |
- } |
- return unitEntry; |
+ List<ResolvableLibrary> resolvedLibraries = resolver.resolvedLibraries; |
+ if (resolvedLibraries == null) { |
+ // |
+ // The resolved libraries should only be null if an exception was thrown |
+ // during resolution. |
+ // |
+ if (thrownException == null) { |
+ var message = |
+ "In recordResolveDartLibraryCycleTaskResults, " |
+ "resolvedLibraries was null and there was no thrown exception"; |
+ unitEntry.recordResolutionError( |
+ new CaughtException(new AnalysisException(message), null)); |
+ } else { |
+ unitEntry.recordResolutionError(thrownException); |
+ } |
+ _cache.remove(unitSource); |
+ if (thrownException != null) { |
+ throw new AnalysisException('<rethrow>', thrownException); |
+ } |
+ return unitEntry; |
} |
Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML); |
RecordingErrorListener errorListener = resolver.errorListener; |
@@ -2058,7 +2139,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
_recordElementData( |
dartEntry, |
library.libraryElement, |
- librarySource, htmlSource); |
+ librarySource, |
+ htmlSource); |
} |
_cache.storedAst(source); |
} else { |
@@ -2102,11 +2184,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// during resolution. |
// |
if (thrownException == null) { |
- String message = "In recordResolveDartLibraryTaskResults, " |
- "resolvedLibraries was null and there was no thrown exception"; |
- unitEntry.recordResolutionError(new CaughtException( |
- new AnalysisException(message), |
- null)); |
+ String message = |
+ "In recordResolveDartLibraryTaskResults, " |
+ "resolvedLibraries was null and there was no thrown exception"; |
+ unitEntry.recordResolutionError( |
+ new CaughtException(new AnalysisException(message), null)); |
} else { |
unitEntry.recordResolutionError(thrownException); |
} |
@@ -2140,7 +2222,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
_recordElementData( |
dartEntry, |
library.libraryElement, |
- librarySource, htmlSource); |
+ librarySource, |
+ htmlSource); |
} |
_cache.storedAst(source); |
} else { |
@@ -2164,6 +2247,189 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
return unitEntry; |
} |
+ @override |
+ void removeListener(AnalysisListener listener) { |
+ _listeners.remove(listener); |
+ } |
+ |
+ @override |
+ CompilationUnit resolveCompilationUnit(Source unitSource, |
+ LibraryElement library) { |
+ if (library == null) { |
+ return null; |
+ } |
+ return resolveCompilationUnit2(unitSource, library.source); |
+ } |
+ |
+ @override |
+ CompilationUnit resolveCompilationUnit2(Source unitSource, |
+ Source librarySource) => |
+ _getDartResolutionData2( |
+ unitSource, |
+ librarySource, |
+ DartEntry.RESOLVED_UNIT, |
+ null); |
+ |
+ @override |
+ ht.HtmlUnit resolveHtmlUnit(Source htmlSource) { |
+ computeHtmlElement(htmlSource); |
+ return parseHtmlUnit(htmlSource); |
+ } |
+ |
+ @override |
+ void setChangedContents(Source source, String contents, int offset, |
+ int oldLength, int newLength) { |
+ String originalContents = _contentCache.setContents(source, contents); |
+ if (contents != null) { |
+ if (contents != originalContents) { |
+ if (_options.incremental) { |
+ _incrementalAnalysisCache = IncrementalAnalysisCache.update( |
+ _incrementalAnalysisCache, |
+ source, |
+ originalContents, |
+ contents, |
+ offset, |
+ oldLength, |
+ newLength, |
+ _getReadableSourceEntry(source)); |
+ } |
+ _sourceChanged(source); |
+ SourceEntry sourceEntry = _cache.get(source); |
+ if (sourceEntry != null) { |
+ sourceEntry.modificationTime = |
+ _contentCache.getModificationStamp(source); |
+ sourceEntry.setValue(SourceEntry.CONTENT, contents); |
+ } |
+ } |
+ } else if (originalContents != null) { |
+ _incrementalAnalysisCache = |
+ IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source); |
+ _sourceChanged(source); |
+ } |
+ } |
+ |
+ @override |
+ void setContents(Source source, String contents) { |
+ String originalContents = _contentCache.setContents(source, contents); |
+ if (contents != null) { |
+ if (contents != originalContents) { |
+ _incrementalAnalysisCache = |
+ IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source); |
+ _sourceChanged(source); |
+ SourceEntry sourceEntry = _cache.get(source); |
+ if (sourceEntry != null) { |
+ sourceEntry.modificationTime = |
+ _contentCache.getModificationStamp(source); |
+ sourceEntry.setValue(SourceEntry.CONTENT, contents); |
+ } |
+ } |
+ } else if (originalContents != null) { |
+ _incrementalAnalysisCache = |
+ IncrementalAnalysisCache.clear(_incrementalAnalysisCache, source); |
+ _sourceChanged(source); |
+ } |
+ } |
+ |
+ @override |
+ void visitCacheItems(void callback(Source source, SourceEntry dartEntry, |
+ DataDescriptor rowDesc, CacheState state)) { |
+ void handleCacheItem(Source source, SourceEntry dartEntry, |
+ DataDescriptor descriptor) { |
+ callback(source, dartEntry, descriptor, dartEntry.getState(descriptor)); |
+ } |
+ void handleCacheItemInLibrary(DartEntry dartEntry, Source librarySource, |
+ DataDescriptor descriptor) { |
+ callback( |
+ librarySource, |
+ dartEntry, |
+ descriptor, |
+ dartEntry.getStateInLibrary(descriptor, librarySource)); |
+ } |
+ |
+ bool hintsEnabled = _options.hint; |
+ MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
+ while (iterator.moveNext()) { |
+ Source source = iterator.key; |
+ SourceEntry sourceEntry = iterator.value; |
+ if (sourceEntry is DartEntry) { |
+ DartEntry dartEntry = sourceEntry; |
+ SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND); |
+ // get library independent values |
+ handleCacheItem(source, dartEntry, SourceEntry.CONTENT); |
+ handleCacheItem(source, dartEntry, SourceEntry.LINE_INFO); |
+ // The list of containing libraries is always valid, so the state isn't |
+ // interesting. |
+// handleCacheItem(source, dartEntry, DartEntry.CONTAINING_LIBRARIES); |
+ handleCacheItem(source, dartEntry, DartEntry.PARSE_ERRORS); |
+ handleCacheItem(source, dartEntry, DartEntry.PARSED_UNIT); |
+ handleCacheItem(source, dartEntry, DartEntry.SCAN_ERRORS); |
+ handleCacheItem(source, dartEntry, DartEntry.SOURCE_KIND); |
+ handleCacheItem(source, dartEntry, DartEntry.TOKEN_STREAM); |
+ if (kind == SourceKind.LIBRARY) { |
+ handleCacheItem(source, dartEntry, DartEntry.ELEMENT); |
+ handleCacheItem(source, dartEntry, DartEntry.EXPORTED_LIBRARIES); |
+ handleCacheItem(source, dartEntry, DartEntry.IMPORTED_LIBRARIES); |
+ handleCacheItem(source, dartEntry, DartEntry.INCLUDED_PARTS); |
+ handleCacheItem(source, dartEntry, DartEntry.IS_CLIENT); |
+ handleCacheItem(source, dartEntry, DartEntry.IS_LAUNCHABLE); |
+ // The public namespace isn't computed by performAnalysisTask() |
+ // and therefore isn't interesting. |
+ //handleCacheItem(key, dartEntry, DartEntry.PUBLIC_NAMESPACE); |
+ } |
+ // get library-specific values |
+ List<Source> librarySources = getLibrariesContaining(source); |
+ for (Source librarySource in librarySources) { |
+ // These values are not currently being computed, so their state is |
+ // not interesting. |
+// handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.ANGULAR_ERRORS); |
+// handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.BUILT_ELEMENT); |
+// handleCacheItemInLibrary(dartEntry, librarySource, DartEntry.BUILT_UNIT); |
+ handleCacheItemInLibrary( |
+ dartEntry, |
+ librarySource, |
+ DartEntry.RESOLUTION_ERRORS); |
+ handleCacheItemInLibrary( |
+ dartEntry, |
+ librarySource, |
+ DartEntry.RESOLVED_UNIT); |
+ if (_generateSdkErrors || !source.isInSystemLibrary) { |
+ handleCacheItemInLibrary( |
+ dartEntry, |
+ librarySource, |
+ DartEntry.VERIFICATION_ERRORS); |
+ if (hintsEnabled) { |
+ handleCacheItemInLibrary( |
+ dartEntry, |
+ librarySource, |
+ DartEntry.HINTS); |
+ } |
+ } |
+ } |
+ } else if (sourceEntry is HtmlEntry) { |
+ HtmlEntry htmlEntry = sourceEntry; |
+ handleCacheItem(source, htmlEntry, SourceEntry.CONTENT); |
+ handleCacheItem(source, htmlEntry, SourceEntry.LINE_INFO); |
+ // These values are not currently being computed, so their state is |
+ // not interesting. |
+// handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_APPLICATION); |
+// handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_COMPONENT); |
+// handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_ENTRY); |
+// handleCacheItem(source, htmlEntry, HtmlEntry.ANGULAR_ERRORS); |
+ handleCacheItem(source, htmlEntry, HtmlEntry.ELEMENT); |
+ handleCacheItem(source, htmlEntry, HtmlEntry.PARSE_ERRORS); |
+ handleCacheItem(source, htmlEntry, HtmlEntry.PARSED_UNIT); |
+ // These values are not currently being computed, so their state is |
+ // not interesting. |
+// handleCacheItem(source, htmlEntry, HtmlEntry.POLYMER_BUILD_ERRORS); |
+// handleCacheItem(source, htmlEntry, HtmlEntry.POLYMER_RESOLUTION_ERRORS); |
+ handleCacheItem(source, htmlEntry, HtmlEntry.RESOLUTION_ERRORS); |
+ handleCacheItem(source, htmlEntry, HtmlEntry.RESOLVED_UNIT); |
+ // We are not currently recording any hints related to HTML. |
+// handleCacheItem(key, htmlEntry, HtmlEntry.HINTS); |
+ } |
+ } |
+ } |
+ |
/** |
* Record that we have accessed the AST structure associated with the given source. At the moment, |
* there is no differentiation between the parsed and resolved forms of the AST. |
@@ -2207,35 +2473,51 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return a cache entry containing the required data |
* @throws AnalysisException if data could not be returned because the source could not be parsed |
*/ |
- DartEntry _cacheDartHintData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) { |
+ DartEntry _cacheDartHintData(Source unitSource, Source librarySource, |
+ DartEntry dartEntry, DataDescriptor descriptor) { |
// |
// Check to see whether we already have the information being requested. |
// |
CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource); |
while (state != CacheState.ERROR && state != CacheState.VALID) { |
// |
- // If not, compute the information. Unless the modification date of the source continues to |
- // change, this loop will eventually terminate. |
+ // If not, compute the information. |
+ // Unless the modification date of the source continues to change, |
+ // this loop will eventually terminate. |
// |
DartEntry libraryEntry = _getReadableDartEntry(librarySource); |
- libraryEntry = _cacheDartResolutionData(librarySource, librarySource, libraryEntry, DartEntry.ELEMENT); |
+ libraryEntry = _cacheDartResolutionData( |
+ librarySource, |
+ librarySource, |
+ libraryEntry, |
+ DartEntry.ELEMENT); |
LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT); |
- CompilationUnitElement definingUnit = libraryElement.definingCompilationUnit; |
+ CompilationUnitElement definingUnit = |
+ libraryElement.definingCompilationUnit; |
List<CompilationUnitElement> parts = libraryElement.parts; |
- List<TimestampedData<CompilationUnit>> units = new List<TimestampedData>(parts.length + 1); |
+ List<TimestampedData<CompilationUnit>> units = |
+ new List<TimestampedData>(parts.length + 1); |
units[0] = _getResolvedUnit(definingUnit, librarySource); |
if (units[0] == null) { |
Source source = definingUnit.source; |
- units[0] = new TimestampedData<CompilationUnit>(getModificationStamp(source), resolveCompilationUnit(source, libraryElement)); |
+ units[0] = new TimestampedData<CompilationUnit>( |
+ getModificationStamp(source), |
+ resolveCompilationUnit(source, libraryElement)); |
} |
for (int i = 0; i < parts.length; i++) { |
units[i + 1] = _getResolvedUnit(parts[i], librarySource); |
if (units[i + 1] == null) { |
Source source = parts[i].source; |
- units[i + 1] = new TimestampedData<CompilationUnit>(getModificationStamp(source), resolveCompilationUnit(source, libraryElement)); |
+ units[i + |
+ 1] = new TimestampedData<CompilationUnit>( |
+ getModificationStamp(source), |
+ resolveCompilationUnit(source, libraryElement)); |
} |
} |
- dartEntry = new GenerateDartHintsTask(this, units, getLibraryElement(librarySource)).perform(_resultRecorder) as DartEntry; |
+ dartEntry = new GenerateDartHintsTask( |
+ this, |
+ units, |
+ getLibraryElement(librarySource)).perform(_resultRecorder) as DartEntry; |
state = dartEntry.getStateInLibrary(descriptor, librarySource); |
} |
return dartEntry; |
@@ -2254,7 +2536,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return a cache entry containing the required data |
* @throws AnalysisException if data could not be returned because the source could not be parsed |
*/ |
- DartEntry _cacheDartParseData(Source source, DartEntry dartEntry, DataDescriptor descriptor) { |
+ DartEntry _cacheDartParseData(Source source, DartEntry dartEntry, |
+ DataDescriptor descriptor) { |
if (identical(descriptor, DartEntry.PARSED_UNIT)) { |
if (dartEntry.hasResolvableCompilationUnit) { |
return dartEntry; |
@@ -2266,11 +2549,16 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
CacheState state = dartEntry.getState(descriptor); |
while (state != CacheState.ERROR && state != CacheState.VALID) { |
// |
- // If not, compute the information. Unless the modification date of the source continues to |
- // change, this loop will eventually terminate. |
+ // If not, compute the information. Unless the modification date of the |
+ // source continues to change, this loop will eventually terminate. |
// |
dartEntry = _cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM); |
- dartEntry = new ParseDartTask(this, source, dartEntry.getValue(DartEntry.TOKEN_STREAM), dartEntry.getValue(SourceEntry.LINE_INFO)).perform(_resultRecorder) as DartEntry; |
+ dartEntry = new ParseDartTask( |
+ this, |
+ source, |
+ dartEntry.getValue(DartEntry.TOKEN_STREAM), |
+ dartEntry.getValue( |
+ SourceEntry.LINE_INFO)).perform(_resultRecorder) as DartEntry; |
state = dartEntry.getState(descriptor); |
} |
return dartEntry; |
@@ -2291,20 +2579,29 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return a cache entry containing the required data |
* @throws AnalysisException if data could not be returned because the source could not be parsed |
*/ |
- DartEntry _cacheDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) { |
+ DartEntry _cacheDartResolutionData(Source unitSource, Source librarySource, |
+ DartEntry dartEntry, DataDescriptor descriptor) { |
// |
// Check to see whether we already have the information being requested. |
// |
- CacheState state = (identical(descriptor, DartEntry.ELEMENT)) ? dartEntry.getState(descriptor) : dartEntry.getStateInLibrary(descriptor, librarySource); |
+ CacheState state = (identical(descriptor, DartEntry.ELEMENT)) ? |
+ dartEntry.getState(descriptor) : |
+ dartEntry.getStateInLibrary(descriptor, librarySource); |
while (state != CacheState.ERROR && state != CacheState.VALID) { |
// |
- // If not, compute the information. Unless the modification date of the source continues to |
- // change, this loop will eventually terminate. |
+ // If not, compute the information. Unless the modification date of the |
+ // source continues to change, this loop will eventually terminate. |
// |
- // TODO(brianwilkerson) As an optimization, if we already have the element model for the |
- // library we can use ResolveDartUnitTask to produce the resolved AST structure much faster. |
- dartEntry = new ResolveDartLibraryTask(this, unitSource, librarySource).perform(_resultRecorder) as DartEntry; |
- state = (identical(descriptor, DartEntry.ELEMENT)) ? dartEntry.getState(descriptor) : dartEntry.getStateInLibrary(descriptor, librarySource); |
+ // TODO(brianwilkerson) As an optimization, if we already have the |
+ // element model for the library we can use ResolveDartUnitTask to produce |
+ // the resolved AST structure much faster. |
+ dartEntry = new ResolveDartLibraryTask( |
+ this, |
+ unitSource, |
+ librarySource).perform(_resultRecorder) as DartEntry; |
+ state = (identical(descriptor, DartEntry.ELEMENT)) ? |
+ dartEntry.getState(descriptor) : |
+ dartEntry.getStateInLibrary(descriptor, librarySource); |
} |
return dartEntry; |
} |
@@ -2323,25 +2620,32 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return a cache entry containing the required data |
* @throws AnalysisException if data could not be returned because the source could not be scanned |
*/ |
- DartEntry _cacheDartScanData(Source source, DartEntry dartEntry, DataDescriptor descriptor) { |
+ DartEntry _cacheDartScanData(Source source, DartEntry dartEntry, |
+ DataDescriptor descriptor) { |
// |
// Check to see whether we already have the information being requested. |
// |
CacheState state = dartEntry.getState(descriptor); |
while (state != CacheState.ERROR && state != CacheState.VALID) { |
// |
- // If not, compute the information. Unless the modification date of the source continues to |
- // change, this loop will eventually terminate. |
+ // If not, compute the information. Unless the modification date of the |
+ // source continues to change, this loop will eventually terminate. |
// |
try { |
if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) { |
- dartEntry = new GetContentTask(this, source).perform(_resultRecorder) as DartEntry; |
+ dartEntry = |
+ new GetContentTask(this, source).perform(_resultRecorder) as DartEntry; |
} |
- dartEntry = new ScanDartTask(this, source, dartEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as DartEntry; |
+ dartEntry = new ScanDartTask( |
+ this, |
+ source, |
+ dartEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as DartEntry; |
} on AnalysisException catch (exception) { |
throw exception; |
} catch (exception, stackTrace) { |
- throw new AnalysisException("Exception", new CaughtException(exception, stackTrace)); |
+ throw new AnalysisException( |
+ "Exception", |
+ new CaughtException(exception, stackTrace)); |
} |
state = dartEntry.getState(descriptor); |
} |
@@ -2363,22 +2667,28 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return a cache entry containing the required data |
* @throws AnalysisException if data could not be returned because the source could not be parsed |
*/ |
- DartEntry _cacheDartVerificationData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) { |
+ DartEntry _cacheDartVerificationData(Source unitSource, Source librarySource, |
+ DartEntry dartEntry, DataDescriptor descriptor) { |
// |
// Check to see whether we already have the information being requested. |
// |
CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource); |
while (state != CacheState.ERROR && state != CacheState.VALID) { |
// |
- // If not, compute the information. Unless the modification date of the source continues to |
- // change, this loop will eventually terminate. |
+ // If not, compute the information. Unless the modification date of the |
+ // source continues to change, this loop will eventually terminate. |
// |
LibraryElement library = computeLibraryElement(librarySource); |
CompilationUnit unit = resolveCompilationUnit(unitSource, library); |
if (unit == null) { |
- throw new AnalysisException("Could not resolve compilation unit ${unitSource.fullName} in ${librarySource.fullName}"); |
- } |
- dartEntry = new GenerateDartErrorsTask(this, unitSource, unit, library).perform(_resultRecorder) as DartEntry; |
+ throw new AnalysisException( |
+ "Could not resolve compilation unit ${unitSource.fullName} in ${librarySource.fullName}"); |
+ } |
+ dartEntry = new GenerateDartErrorsTask( |
+ this, |
+ unitSource, |
+ unit, |
+ library).perform(_resultRecorder) as DartEntry; |
state = dartEntry.getStateInLibrary(descriptor, librarySource); |
} |
return dartEntry; |
@@ -2399,7 +2709,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @throws AnalysisException if data could not be returned because the source could not be |
* resolved |
*/ |
- HtmlEntry _cacheHtmlParseData(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) { |
+ HtmlEntry _cacheHtmlParseData(Source source, HtmlEntry htmlEntry, |
+ DataDescriptor descriptor) { |
if (identical(descriptor, HtmlEntry.PARSED_UNIT)) { |
ht.HtmlUnit unit = htmlEntry.anyParsedUnit; |
if (unit != null) { |
@@ -2412,18 +2723,24 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
CacheState state = htmlEntry.getState(descriptor); |
while (state != CacheState.ERROR && state != CacheState.VALID) { |
// |
- // If not, compute the information. Unless the modification date of the source continues to |
- // change, this loop will eventually terminate. |
+ // If not, compute the information. Unless the modification date of the |
+ // source continues to change, this loop will eventually terminate. |
// |
try { |
if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) { |
- htmlEntry = new GetContentTask(this, source).perform(_resultRecorder) as HtmlEntry; |
+ htmlEntry = |
+ new GetContentTask(this, source).perform(_resultRecorder) as HtmlEntry; |
} |
- htmlEntry = new ParseHtmlTask(this, source, htmlEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as HtmlEntry; |
+ htmlEntry = new ParseHtmlTask( |
+ this, |
+ source, |
+ htmlEntry.getValue(SourceEntry.CONTENT)).perform(_resultRecorder) as HtmlEntry; |
} on AnalysisException catch (exception) { |
throw exception; |
} catch (exception, stackTrace) { |
- throw new AnalysisException("Exception", new CaughtException(exception, stackTrace)); |
+ throw new AnalysisException( |
+ "Exception", |
+ new CaughtException(exception, stackTrace)); |
} |
state = htmlEntry.getState(descriptor); |
} |
@@ -2445,18 +2762,24 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @throws AnalysisException if data could not be returned because the source could not be |
* resolved |
*/ |
- HtmlEntry _cacheHtmlResolutionData(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) { |
+ HtmlEntry _cacheHtmlResolutionData(Source source, HtmlEntry htmlEntry, |
+ DataDescriptor descriptor) { |
// |
// Check to see whether we already have the information being requested. |
// |
CacheState state = htmlEntry.getState(descriptor); |
while (state != CacheState.ERROR && state != CacheState.VALID) { |
// |
- // If not, compute the information. Unless the modification date of the source continues to |
- // change, this loop will eventually terminate. |
+ // If not, compute the information. Unless the modification date of the |
+ // source continues to change, this loop will eventually terminate. |
// |
htmlEntry = _cacheHtmlParseData(source, htmlEntry, HtmlEntry.PARSED_UNIT); |
- htmlEntry = new ResolveHtmlTask(this, source, htmlEntry.modificationTime, htmlEntry.getValue(HtmlEntry.PARSED_UNIT)).perform(_resultRecorder) as HtmlEntry; |
+ htmlEntry = new ResolveHtmlTask( |
+ this, |
+ source, |
+ htmlEntry.modificationTime, |
+ htmlEntry.getValue( |
+ HtmlEntry.PARSED_UNIT)).perform(_resultRecorder) as HtmlEntry; |
state = htmlEntry.getState(descriptor); |
} |
return htmlEntry; |
@@ -2469,10 +2792,13 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param library the library on which the other libraries depend |
* @param librariesToInvalidate the libraries that depend on the given library |
*/ |
- void _computeAllLibrariesDependingOn(Source library, HashSet<Source> librariesToInvalidate) { |
+ void _computeAllLibrariesDependingOn(Source library, |
+ HashSet<Source> librariesToInvalidate) { |
if (librariesToInvalidate.add(library)) { |
for (Source dependentLibrary in getLibrariesDependingOn(library)) { |
- _computeAllLibrariesDependingOn(dependentLibrary, librariesToInvalidate); |
+ _computeAllLibrariesDependingOn( |
+ dependentLibrary, |
+ librariesToInvalidate); |
} |
} |
} |
@@ -2500,7 +2826,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param encoding the encoded form of a source |
* @return the source represented by the encoding |
*/ |
- Source _computeSourceFromEncoding(String encoding) => _sourceFactory.fromEncoding(encoding); |
+ Source _computeSourceFromEncoding(String encoding) => |
+ _sourceFactory.fromEncoding(encoding); |
/** |
* Return `true` if the given array of sources contains the given source. |
@@ -2537,7 +2864,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
/** |
* Create a [BuildUnitElementTask] for the given [source]. |
*/ |
- AnalysisContextImpl_TaskData _createBuildUnitElementTask(Source source, DartEntry dartEntry, Source librarySource) { |
+ AnalysisContextImpl_TaskData _createBuildUnitElementTask(Source source, |
+ DartEntry dartEntry, Source librarySource) { |
CompilationUnit unit = dartEntry.resolvableCompilationUnit; |
if (unit == null) { |
return _createParseDartTask(source, dartEntry); |
@@ -2558,22 +2886,34 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param libraryEntry the entry for the library |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createGenerateDartErrorsTask(Source unitSource, DartEntry unitEntry, Source librarySource, DartEntry libraryEntry) { |
- if (unitEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) != CacheState.VALID || libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) { |
+ AnalysisContextImpl_TaskData _createGenerateDartErrorsTask(Source unitSource, |
+ DartEntry unitEntry, Source librarySource, DartEntry libraryEntry) { |
+ if (unitEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) != |
+ CacheState.VALID || |
+ libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) { |
return _createResolveDartLibraryTask(librarySource, libraryEntry); |
} |
- CompilationUnit unit = unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
+ CompilationUnit unit = |
+ unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
if (unit == null) { |
CaughtException exception = new CaughtException( |
- new AnalysisException("Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}"), |
+ new AnalysisException( |
+ "Entry has VALID state for RESOLVED_UNIT but null value for ${unitSource.fullName} in ${librarySource.fullName}"), |
null); |
- AnalysisEngine.instance.logger.logInformation(exception.toString(), exception); |
+ AnalysisEngine.instance.logger.logInformation( |
+ exception.toString(), |
+ exception); |
unitEntry.recordResolutionError(exception); |
return new AnalysisContextImpl_TaskData(null, false); |
} |
LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT); |
- unitEntry.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, unitSource, unit, libraryElement), false); |
+ unitEntry.setStateInLibrary( |
+ DartEntry.VERIFICATION_ERRORS, |
+ librarySource, |
+ CacheState.IN_PROCESS); |
+ return new AnalysisContextImpl_TaskData( |
+ new GenerateDartErrorsTask(this, unitSource, unit, libraryElement), |
+ false); |
} |
/** |
@@ -2586,32 +2926,40 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param libraryEntry the entry for the library |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createGenerateDartHintsTask(Source source, DartEntry dartEntry, Source librarySource, DartEntry libraryEntry) { |
+ AnalysisContextImpl_TaskData _createGenerateDartHintsTask(Source source, |
+ DartEntry dartEntry, Source librarySource, DartEntry libraryEntry) { |
if (libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) { |
return _createResolveDartLibraryTask(librarySource, libraryEntry); |
} |
LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT); |
- CompilationUnitElement definingUnit = libraryElement.definingCompilationUnit; |
+ CompilationUnitElement definingUnit = |
+ libraryElement.definingCompilationUnit; |
List<CompilationUnitElement> parts = libraryElement.parts; |
- List<TimestampedData<CompilationUnit>> units = new List<TimestampedData>(parts.length + 1); |
+ List<TimestampedData<CompilationUnit>> units = |
+ new List<TimestampedData>(parts.length + 1); |
units[0] = _getResolvedUnit(definingUnit, librarySource); |
if (units[0] == null) { |
- // TODO(brianwilkerson) We should return a ResolveDartUnitTask (unless there are multiple ASTs |
- // that need to be resolved. |
+ // TODO(brianwilkerson) We should return a ResolveDartUnitTask |
+ // (unless there are multiple ASTs that need to be resolved). |
return _createResolveDartLibraryTask(librarySource, libraryEntry); |
} |
for (int i = 0; i < parts.length; i++) { |
units[i + 1] = _getResolvedUnit(parts[i], librarySource); |
if (units[i + 1] == null) { |
- // TODO(brianwilkerson) We should return a ResolveDartUnitTask (unless there are multiple |
- // ASTs that need to be resolved. |
+ // TODO(brianwilkerson) We should return a ResolveDartUnitTask |
+ // (unless there are multiple ASTs that need to be resolved). |
return _createResolveDartLibraryTask(librarySource, libraryEntry); |
} |
} |
- dartEntry.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new GenerateDartHintsTask(this, units, libraryElement), false); |
- } |
- |
+ dartEntry.setStateInLibrary( |
+ DartEntry.HINTS, |
+ librarySource, |
+ CacheState.IN_PROCESS); |
+ return new AnalysisContextImpl_TaskData( |
+ new GenerateDartHintsTask(this, units, libraryElement), |
+ false); |
+ } |
+ |
/** |
* Create a [GetContentTask] for the given source, marking the content as being in-process. |
* |
@@ -2619,35 +2967,49 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param sourceEntry the entry for the source |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createGetContentTask(Source source, SourceEntry sourceEntry) { |
+ AnalysisContextImpl_TaskData _createGetContentTask(Source source, |
+ SourceEntry sourceEntry) { |
sourceEntry.setState(SourceEntry.CONTENT, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new GetContentTask(this, source), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new GetContentTask(this, source), |
+ false); |
} |
/** |
* Create a [ParseDartTask] for the given [source]. |
*/ |
- AnalysisContextImpl_TaskData _createParseDartTask(Source source, DartEntry dartEntry) { |
- if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID || dartEntry.getState(SourceEntry.LINE_INFO) != CacheState.VALID) { |
+ AnalysisContextImpl_TaskData _createParseDartTask(Source source, |
+ DartEntry dartEntry) { |
+ if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID || |
+ dartEntry.getState(SourceEntry.LINE_INFO) != CacheState.VALID) { |
return _createScanDartTask(source, dartEntry); |
} |
Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM); |
dartEntry.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED); |
dartEntry.setState(DartEntry.PARSE_ERRORS, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source, tokenStream, dartEntry.getValue(SourceEntry.LINE_INFO)), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new ParseDartTask( |
+ this, |
+ source, |
+ tokenStream, |
+ dartEntry.getValue(SourceEntry.LINE_INFO)), |
+ false); |
} |
/** |
* Create a [ParseHtmlTask] for the given [source]. |
*/ |
- AnalysisContextImpl_TaskData _createParseHtmlTask(Source source, HtmlEntry htmlEntry) { |
+ AnalysisContextImpl_TaskData _createParseHtmlTask(Source source, |
+ HtmlEntry htmlEntry) { |
if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) { |
return _createGetContentTask(source, htmlEntry); |
} |
String content = htmlEntry.getValue(SourceEntry.CONTENT); |
htmlEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED); |
htmlEntry.setState(HtmlEntry.PARSE_ERRORS, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new ParseHtmlTask(this, source, content), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new ParseHtmlTask(this, source, content), |
+ false); |
} |
/** |
@@ -2658,12 +3020,19 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param htmlEntry the entry for the source |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createPolymerBuildHtmlTask(Source source, HtmlEntry htmlEntry) { |
+ AnalysisContextImpl_TaskData _createPolymerBuildHtmlTask(Source source, |
+ HtmlEntry htmlEntry) { |
if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) { |
return _createResolveHtmlTask(source, htmlEntry); |
} |
htmlEntry.setState(HtmlEntry.POLYMER_BUILD_ERRORS, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new PolymerBuildHtmlTask(this, source, htmlEntry.getValue(SourceEntry.LINE_INFO), htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT)), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new PolymerBuildHtmlTask( |
+ this, |
+ source, |
+ htmlEntry.getValue(SourceEntry.LINE_INFO), |
+ htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT)), |
+ false); |
} |
/** |
@@ -2674,12 +3043,21 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param htmlEntry the entry for the source |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createPolymerResolveHtmlTask(Source source, HtmlEntry htmlEntry) { |
+ AnalysisContextImpl_TaskData _createPolymerResolveHtmlTask(Source source, |
+ HtmlEntry htmlEntry) { |
if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) { |
return _createResolveHtmlTask(source, htmlEntry); |
} |
- htmlEntry.setState(HtmlEntry.POLYMER_RESOLUTION_ERRORS, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new PolymerResolveHtmlTask(this, source, htmlEntry.getValue(SourceEntry.LINE_INFO), htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT)), false); |
+ htmlEntry.setState( |
+ HtmlEntry.POLYMER_RESOLUTION_ERRORS, |
+ CacheState.IN_PROCESS); |
+ return new AnalysisContextImpl_TaskData( |
+ new PolymerResolveHtmlTask( |
+ this, |
+ source, |
+ htmlEntry.getValue(SourceEntry.LINE_INFO), |
+ htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT)), |
+ false); |
} |
/** |
@@ -2690,14 +3068,24 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param htmlEntry the entry for the source |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createResolveAngularComponentTemplateTask(Source source, HtmlEntry htmlEntry) { |
+ AnalysisContextImpl_TaskData |
+ _createResolveAngularComponentTemplateTask(Source source, HtmlEntry htmlEntry) { |
if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) { |
return _createResolveHtmlTask(source, htmlEntry); |
} |
- AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION); |
- AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT); |
+ AngularApplication application = |
+ htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION); |
+ AngularComponentElement component = |
+ htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT); |
htmlEntry.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new ResolveAngularComponentTemplateTask(this, source, htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT), component, application), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new ResolveAngularComponentTemplateTask( |
+ this, |
+ source, |
+ htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT), |
+ component, |
+ application), |
+ false); |
} |
/** |
@@ -2708,12 +3096,18 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param htmlEntry the entry for the source |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createResolveAngularEntryHtmlTask(Source source, HtmlEntry htmlEntry) { |
+ AnalysisContextImpl_TaskData _createResolveAngularEntryHtmlTask(Source source, |
+ HtmlEntry htmlEntry) { |
if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) { |
return _createResolveHtmlTask(source, htmlEntry); |
} |
htmlEntry.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this, source, htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT)), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new ResolveAngularEntryHtmlTask( |
+ this, |
+ source, |
+ htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT)), |
+ false); |
} |
/** |
@@ -2723,17 +3117,22 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param dartEntry the entry for the source |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createResolveDartLibraryTask(Source source, DartEntry dartEntry) { |
+ AnalysisContextImpl_TaskData _createResolveDartLibraryTask(Source source, |
+ DartEntry dartEntry) { |
try { |
- AnalysisContextImpl_CycleBuilder builder = new AnalysisContextImpl_CycleBuilder(this); |
+ AnalysisContextImpl_CycleBuilder builder = |
+ new AnalysisContextImpl_CycleBuilder(this); |
builder.computeCycleContaining(source); |
AnalysisContextImpl_TaskData taskData = builder.taskData; |
if (taskData != null) { |
return taskData; |
} |
- return new AnalysisContextImpl_TaskData(new ResolveDartLibraryCycleTask(this, source, source, builder.librariesInCycle), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new ResolveDartLibraryCycleTask(this, source, source, builder.librariesInCycle), |
+ false); |
} on AnalysisException catch (exception, stackTrace) { |
- dartEntry.recordResolutionError(new CaughtException(exception, stackTrace)); |
+ dartEntry.recordResolutionError( |
+ new CaughtException(exception, stackTrace)); |
AnalysisEngine.instance.logger.logError( |
"Internal error trying to create a ResolveDartLibraryTask", |
new CaughtException(exception, stackTrace)); |
@@ -2749,12 +3148,19 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param htmlEntry the entry for the source |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createResolveHtmlTask(Source source, HtmlEntry htmlEntry) { |
+ AnalysisContextImpl_TaskData _createResolveHtmlTask(Source source, |
+ HtmlEntry htmlEntry) { |
if (htmlEntry.getState(HtmlEntry.PARSED_UNIT) != CacheState.VALID) { |
return _createParseHtmlTask(source, htmlEntry); |
} |
htmlEntry.setState(HtmlEntry.RESOLVED_UNIT, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new ResolveHtmlTask(this, source, htmlEntry.modificationTime, htmlEntry.getValue(HtmlEntry.PARSED_UNIT)), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new ResolveHtmlTask( |
+ this, |
+ source, |
+ htmlEntry.modificationTime, |
+ htmlEntry.getValue(HtmlEntry.PARSED_UNIT)), |
+ false); |
} |
/** |
@@ -2765,14 +3171,17 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param dartEntry the entry for the source |
* @return task data representing the created task |
*/ |
- AnalysisContextImpl_TaskData _createScanDartTask(Source source, DartEntry dartEntry) { |
+ AnalysisContextImpl_TaskData _createScanDartTask(Source source, |
+ DartEntry dartEntry) { |
if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) { |
return _createGetContentTask(source, dartEntry); |
} |
String content = dartEntry.getValue(SourceEntry.CONTENT); |
dartEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED); |
dartEntry.setState(DartEntry.SCAN_ERRORS, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new ScanDartTask(this, source, content), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new ScanDartTask(this, source, content), |
+ false); |
} |
/** |
@@ -2835,8 +3244,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @throws AnalysisException if data could not be returned because the source could not be |
* resolved |
*/ |
- Object _getDartHintData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) { |
- dartEntry = _cacheDartHintData(unitSource, librarySource, dartEntry, descriptor); |
+ Object _getDartHintData(Source unitSource, Source librarySource, |
+ DartEntry dartEntry, DataDescriptor descriptor) { |
+ dartEntry = |
+ _cacheDartHintData(unitSource, librarySource, dartEntry, descriptor); |
if (identical(descriptor, DartEntry.ELEMENT)) { |
return dartEntry.getValue(descriptor); |
} |
@@ -2856,7 +3267,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return the requested data about the given source |
* @throws AnalysisException if data could not be returned because the source could not be parsed |
*/ |
- Object _getDartParseData(Source source, DartEntry dartEntry, DataDescriptor descriptor) { |
+ Object _getDartParseData(Source source, DartEntry dartEntry, |
+ DataDescriptor descriptor) { |
dartEntry = _cacheDartParseData(source, dartEntry, descriptor); |
if (identical(descriptor, DartEntry.PARSED_UNIT)) { |
_accessedAst(source); |
@@ -2878,7 +3290,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return the requested data about the given source |
* @throws AnalysisException if data could not be returned because the source could not be parsed |
*/ |
- Object _getDartParseData2(Source source, DataDescriptor descriptor, Object defaultValue) { |
+ Object _getDartParseData2(Source source, DataDescriptor descriptor, |
+ Object defaultValue) { |
DartEntry dartEntry = _getReadableDartEntry(source); |
if (dartEntry == null) { |
return defaultValue; |
@@ -2908,8 +3321,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @throws AnalysisException if data could not be returned because the source could not be |
* resolved |
*/ |
- Object _getDartResolutionData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) { |
- dartEntry = _cacheDartResolutionData(unitSource, librarySource, dartEntry, descriptor); |
+ Object _getDartResolutionData(Source unitSource, Source librarySource, |
+ DartEntry dartEntry, DataDescriptor descriptor) { |
+ dartEntry = |
+ _cacheDartResolutionData(unitSource, librarySource, dartEntry, descriptor); |
if (identical(descriptor, DartEntry.ELEMENT)) { |
return dartEntry.getValue(descriptor); |
} else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) { |
@@ -2934,13 +3349,18 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @throws AnalysisException if data could not be returned because the source could not be |
* resolved |
*/ |
- Object _getDartResolutionData2(Source unitSource, Source librarySource, DataDescriptor descriptor, Object defaultValue) { |
+ Object _getDartResolutionData2(Source unitSource, Source librarySource, |
+ DataDescriptor descriptor, Object defaultValue) { |
DartEntry dartEntry = _getReadableDartEntry(unitSource); |
if (dartEntry == null) { |
return defaultValue; |
} |
try { |
- return _getDartResolutionData(unitSource, librarySource, dartEntry, descriptor); |
+ return _getDartResolutionData( |
+ unitSource, |
+ librarySource, |
+ dartEntry, |
+ descriptor); |
} on ObsoleteSourceAnalysisException catch (exception, stackTrace) { |
AnalysisEngine.instance.logger.logInformation( |
"Could not compute $descriptor", |
@@ -2962,7 +3382,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return the requested data about the given source |
* @throws AnalysisException if data could not be returned because the source could not be scanned |
*/ |
- Object _getDartScanData(Source source, DartEntry dartEntry, DataDescriptor descriptor) { |
+ Object _getDartScanData(Source source, DartEntry dartEntry, |
+ DataDescriptor descriptor) { |
dartEntry = _cacheDartScanData(source, dartEntry, descriptor); |
return dartEntry.getValue(descriptor); |
} |
@@ -2981,7 +3402,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return the requested data about the given source |
* @throws AnalysisException if data could not be returned because the source could not be scanned |
*/ |
- Object _getDartScanData2(Source source, DataDescriptor descriptor, Object defaultValue) { |
+ Object _getDartScanData2(Source source, DataDescriptor descriptor, |
+ Object defaultValue) { |
DartEntry dartEntry = _getReadableDartEntry(source); |
if (dartEntry == null) { |
return defaultValue; |
@@ -3011,8 +3433,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @throws AnalysisException if data could not be returned because the source could not be |
* resolved |
*/ |
- Object _getDartVerificationData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) { |
- dartEntry = _cacheDartVerificationData(unitSource, librarySource, dartEntry, descriptor); |
+ Object _getDartVerificationData(Source unitSource, Source librarySource, |
+ DartEntry dartEntry, DataDescriptor descriptor) { |
+ dartEntry = |
+ _cacheDartVerificationData(unitSource, librarySource, dartEntry, descriptor); |
return dartEntry.getValueInLibrary(descriptor, librarySource); |
} |
@@ -3029,7 +3453,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return the requested data about the given source |
* @throws AnalysisException if data could not be returned because the source could not be parsed |
*/ |
- Object _getHtmlParseData(Source source, DataDescriptor descriptor, Object defaultValue) { |
+ Object _getHtmlParseData(Source source, DataDescriptor descriptor, |
+ Object defaultValue) { |
HtmlEntry htmlEntry = _getReadableHtmlEntry(source); |
if (htmlEntry == null) { |
return defaultValue; |
@@ -3057,7 +3482,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @throws AnalysisException if data could not be returned because the source could not be |
* resolved |
*/ |
- Object _getHtmlResolutionData(Source source, DataDescriptor descriptor, Object defaultValue) { |
+ Object _getHtmlResolutionData(Source source, DataDescriptor descriptor, |
+ Object defaultValue) { |
HtmlEntry htmlEntry = _getReadableHtmlEntry(source); |
if (htmlEntry == null) { |
return defaultValue; |
@@ -3086,7 +3512,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @throws AnalysisException if data could not be returned because the source could not be |
* resolved |
*/ |
- Object _getHtmlResolutionData2(Source source, HtmlEntry htmlEntry, DataDescriptor descriptor) { |
+ Object _getHtmlResolutionData2(Source source, HtmlEntry htmlEntry, |
+ DataDescriptor descriptor) { |
htmlEntry = _cacheHtmlResolutionData(source, htmlEntry, descriptor); |
if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) { |
_accessedAst(source); |
@@ -3095,94 +3522,6 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
/** |
- * Look through the cache for a task that needs to be performed. Return the task that was found, |
- * or `null` if there is no more work to be done. |
- * |
- * @return the next task that needs to be performed |
- */ |
- AnalysisTask get nextAnalysisTask { |
- bool hintsEnabled = _options.hint; |
- bool hasBlockedTask = false; |
- // |
- // Look for incremental analysis |
- // |
- if (_incrementalAnalysisCache != null && _incrementalAnalysisCache.hasWork) { |
- AnalysisTask task = new IncrementalAnalysisTask(this, _incrementalAnalysisCache); |
- _incrementalAnalysisCache = null; |
- return task; |
- } |
- // |
- // Look for a priority source that needs to be analyzed. |
- // |
- int priorityCount = _priorityOrder.length; |
- for (int i = 0; i < priorityCount; i++) { |
- Source source = _priorityOrder[i]; |
- AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), true, hintsEnabled); |
- AnalysisTask task = taskData.task; |
- if (task != null) { |
- return task; |
- } else if (taskData.isBlocked) { |
- hasBlockedTask = true; |
- } |
- } |
- if (_neededForResolution != null) { |
- List<Source> sourcesToRemove = new List<Source>(); |
- for (Source source in _neededForResolution) { |
- SourceEntry sourceEntry = _cache.get(source); |
- if (sourceEntry is DartEntry) { |
- DartEntry dartEntry = sourceEntry; |
- if (!dartEntry.hasResolvableCompilationUnit) { |
- if (dartEntry.getState(DartEntry.PARSED_UNIT) == CacheState.ERROR) { |
- sourcesToRemove.add(source); |
- } else { |
- AnalysisContextImpl_TaskData taskData = _createParseDartTask(source, dartEntry); |
- AnalysisTask task = taskData.task; |
- if (task != null) { |
- return task; |
- } else if (taskData.isBlocked) { |
- hasBlockedTask = true; |
- } |
- } |
- } |
- } |
- } |
- int count = sourcesToRemove.length; |
- for (int i = 0; i < count; i++) { |
- _neededForResolution.remove(sourcesToRemove[i]); |
- } |
- } |
- // |
- // Look for a non-priority source that needs to be analyzed. |
- // |
- List<Source> sourcesToRemove = new List<Source>(); |
- WorkManager_WorkIterator sources = _workManager.iterator(); |
- try { |
- while (sources.hasNext) { |
- Source source = sources.next(); |
- AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), false, hintsEnabled); |
- AnalysisTask task = taskData.task; |
- if (task != null) { |
- return task; |
- } else if (taskData.isBlocked) { |
- hasBlockedTask = true; |
- } else { |
- sourcesToRemove.add(source); |
- } |
- } |
- } finally { |
- int count = sourcesToRemove.length; |
- for (int i = 0; i < count; i++) { |
- _workManager.remove(sourcesToRemove[i]); |
- } |
- } |
- if (hasBlockedTask) { |
- // All of the analysis work is blocked waiting for an asynchronous task to complete. |
- return WaitForAsyncTask.instance; |
- } |
- return null; |
- } |
- |
- /** |
* Look at the given source to see whether a task needs to be performed related to it. Return the |
* task that should be performed, or `null` if there is no more work to be done for the |
* source. |
@@ -3195,10 +3534,12 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param hintsEnabled `true` if hints are currently enabled |
* @return the next task that needs to be performed for the given source |
*/ |
- AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled) { |
+ AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, |
+ SourceEntry sourceEntry, bool isPriority, bool hintsEnabled) { |
// Refuse to generate tasks for html based files that are above 1500 KB |
if (_isTooBigHtmlSourceEntry(source, sourceEntry)) { |
- // TODO (jwren) we still need to report an error of some kind back to the client. |
+ // TODO (jwren) we still need to report an error of some kind back to the |
+ // client. |
return new AnalysisContextImpl_TaskData(null, false); |
} |
if (sourceEntry == null) { |
@@ -3208,21 +3549,24 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (contentState == CacheState.INVALID) { |
return _createGetContentTask(source, sourceEntry); |
} else if (contentState == CacheState.IN_PROCESS) { |
- // We are already in the process of getting the content. There's nothing else we can do with |
- // this source until that's complete. |
+ // We are already in the process of getting the content. |
+ // There's nothing else we can do with this source until that's complete. |
return new AnalysisContextImpl_TaskData(null, true); |
} else if (contentState == CacheState.ERROR) { |
- // We have done all of the analysis we can for this source because we cannot get its content. |
+ // We have done all of the analysis we can for this source because we |
+ // cannot get its content. |
return new AnalysisContextImpl_TaskData(null, false); |
} |
if (sourceEntry is DartEntry) { |
DartEntry dartEntry = sourceEntry; |
CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS); |
- if (scanErrorsState == CacheState.INVALID || (isPriority && scanErrorsState == CacheState.FLUSHED)) { |
+ if (scanErrorsState == CacheState.INVALID || |
+ (isPriority && scanErrorsState == CacheState.FLUSHED)) { |
return _createScanDartTask(source, dartEntry); |
} |
CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS); |
- if (parseErrorsState == CacheState.INVALID || (isPriority && parseErrorsState == CacheState.FLUSHED)) { |
+ if (parseErrorsState == CacheState.INVALID || |
+ (isPriority && parseErrorsState == CacheState.FLUSHED)) { |
return _createParseDartTask(source, dartEntry); |
} |
if (isPriority && parseErrorsState != CacheState.ERROR) { |
@@ -3245,35 +3589,60 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (librarySourceEntry is DartEntry) { |
DartEntry libraryEntry = librarySourceEntry; |
CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT); |
- if (elementState == CacheState.INVALID || (isPriority && elementState == CacheState.FLUSHED)) { |
- //return createResolveDartLibraryTask(librarySource, (DartEntry) libraryEntry); |
+ if (elementState == CacheState.INVALID || |
+ (isPriority && elementState == CacheState.FLUSHED)) { |
+// return createResolveDartLibraryTask(librarySource, (DartEntry) libraryEntry); |
libraryEntry.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false); |
+ return new AnalysisContextImpl_TaskData( |
+ new ResolveDartLibraryTask(this, source, librarySource), |
+ false); |
} |
- CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
- if (resolvedUnitState == CacheState.INVALID || (isPriority && resolvedUnitState == CacheState.FLUSHED)) { |
+ CacheState resolvedUnitState = |
+ dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
+ if (resolvedUnitState == CacheState.INVALID || |
+ (isPriority && resolvedUnitState == CacheState.FLUSHED)) { |
// |
- // The commented out lines below are an optimization that doesn't quite work yet. The |
- // problem is that if the source was not resolved because it wasn't part of any library, |
- // then there won't be any elements in the element model that we can use to resolve it. |
+ // The commented out lines below are an optimization that doesn't |
+ // quite work yet. The problem is that if the source was not |
+ // resolved because it wasn't part of any library, then there won't |
+ // be any elements in the element model that we can use to resolve |
+ // it. |
// |
- //LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT); |
- //if (libraryElement != null) { |
- // return new ResolveDartUnitTask(this, source, libraryElement); |
- //} |
- // Possibly replace with: return createResolveDartLibraryTask(librarySource, (DartEntry) libraryEntry); |
- dartEntry.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.IN_PROCESS); |
- return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false); |
+// LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT); |
+// if (libraryElement != null) { |
+// return new ResolveDartUnitTask(this, source, libraryElement); |
+// } |
+ // Possibly replace with: |
+// return createResolveDartLibraryTask(librarySource, (DartEntry) libraryEntry); |
+ dartEntry.setStateInLibrary( |
+ DartEntry.RESOLVED_UNIT, |
+ librarySource, |
+ CacheState.IN_PROCESS); |
+ return new AnalysisContextImpl_TaskData( |
+ new ResolveDartLibraryTask(this, source, librarySource), |
+ false); |
} |
if (_generateSdkErrors || !source.isInSystemLibrary) { |
- CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource); |
- if (verificationErrorsState == CacheState.INVALID || (isPriority && verificationErrorsState == CacheState.FLUSHED)) { |
- return _createGenerateDartErrorsTask(source, dartEntry, librarySource, libraryEntry); |
+ CacheState verificationErrorsState = |
+ dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource); |
+ if (verificationErrorsState == CacheState.INVALID || |
+ (isPriority && verificationErrorsState == CacheState.FLUSHED)) { |
+ return _createGenerateDartErrorsTask( |
+ source, |
+ dartEntry, |
+ librarySource, |
+ libraryEntry); |
} |
if (hintsEnabled) { |
- CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource); |
- if (hintsState == CacheState.INVALID || (isPriority && hintsState == CacheState.FLUSHED)) { |
- return _createGenerateDartHintsTask(source, dartEntry, librarySource, libraryEntry); |
+ CacheState hintsState = |
+ dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource); |
+ if (hintsState == CacheState.INVALID || |
+ (isPriority && hintsState == CacheState.FLUSHED)) { |
+ return _createGenerateDartHintsTask( |
+ source, |
+ dartEntry, |
+ librarySource, |
+ libraryEntry); |
} |
} |
} |
@@ -3282,7 +3651,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} else if (sourceEntry is HtmlEntry) { |
HtmlEntry htmlEntry = sourceEntry; |
CacheState parseErrorsState = htmlEntry.getState(HtmlEntry.PARSE_ERRORS); |
- if (parseErrorsState == CacheState.INVALID || (isPriority && parseErrorsState == CacheState.FLUSHED)) { |
+ if (parseErrorsState == CacheState.INVALID || |
+ (isPriority && parseErrorsState == CacheState.FLUSHED)) { |
return _createParseHtmlTask(source, htmlEntry); |
} |
if (isPriority && parseErrorsState != CacheState.ERROR) { |
@@ -3291,8 +3661,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
return _createParseHtmlTask(source, htmlEntry); |
} |
} |
- CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT); |
- if (resolvedUnitState == CacheState.INVALID || (isPriority && resolvedUnitState == CacheState.FLUSHED)) { |
+ CacheState resolvedUnitState = |
+ htmlEntry.getState(HtmlEntry.RESOLVED_UNIT); |
+ if (resolvedUnitState == CacheState.INVALID || |
+ (isPriority && resolvedUnitState == CacheState.FLUSHED)) { |
return _createResolveHtmlTask(source, htmlEntry); |
} |
// |
@@ -3300,13 +3672,17 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// |
if (_options.analyzeAngular) { |
// Try to resolve the HTML as an Angular entry point. |
- CacheState angularEntryState = htmlEntry.getState(HtmlEntry.ANGULAR_ENTRY); |
- if (angularEntryState == CacheState.INVALID || (isPriority && angularEntryState == CacheState.FLUSHED)) { |
+ CacheState angularEntryState = |
+ htmlEntry.getState(HtmlEntry.ANGULAR_ENTRY); |
+ if (angularEntryState == CacheState.INVALID || |
+ (isPriority && angularEntryState == CacheState.FLUSHED)) { |
return _createResolveAngularEntryHtmlTask(source, htmlEntry); |
} |
// Try to resolve the HTML as an Angular application part. |
- CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS); |
- if (angularErrorsState == CacheState.INVALID || (isPriority && angularErrorsState == CacheState.FLUSHED)) { |
+ CacheState angularErrorsState = |
+ htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS); |
+ if (angularErrorsState == CacheState.INVALID || |
+ (isPriority && angularErrorsState == CacheState.FLUSHED)) { |
return _createResolveAngularComponentTemplateTask(source, htmlEntry); |
} |
} |
@@ -3315,13 +3691,17 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// |
if (_options.analyzePolymer) { |
// Build elements. |
- CacheState polymerBuildErrorsState = htmlEntry.getState(HtmlEntry.POLYMER_BUILD_ERRORS); |
- if (polymerBuildErrorsState == CacheState.INVALID || (isPriority && polymerBuildErrorsState == CacheState.FLUSHED)) { |
+ CacheState polymerBuildErrorsState = |
+ htmlEntry.getState(HtmlEntry.POLYMER_BUILD_ERRORS); |
+ if (polymerBuildErrorsState == CacheState.INVALID || |
+ (isPriority && polymerBuildErrorsState == CacheState.FLUSHED)) { |
return _createPolymerBuildHtmlTask(source, htmlEntry); |
} |
// Resolve references. |
- CacheState polymerResolutionErrorsState = htmlEntry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS); |
- if (polymerResolutionErrorsState == CacheState.INVALID || (isPriority && polymerResolutionErrorsState == CacheState.FLUSHED)) { |
+ CacheState polymerResolutionErrorsState = |
+ htmlEntry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS); |
+ if (polymerResolutionErrorsState == CacheState.INVALID || |
+ (isPriority && polymerResolutionErrorsState == CacheState.FLUSHED)) { |
return _createPolymerResolveHtmlTask(source, htmlEntry); |
} |
} |
@@ -3401,7 +3781,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param source the source for which a cache entry is being sought |
* @return the source cache entry associated with the given source |
*/ |
- SourceEntry _getReadableSourceEntryOrNull(Source source) => _cache.get(source); |
+ SourceEntry _getReadableSourceEntryOrNull(Source source) => |
+ _cache.get(source); |
/** |
* Return a resolved compilation unit corresponding to the given element in the given library, or |
@@ -3411,12 +3792,16 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param librarySource the source representing the library containing the unit |
* @return the specified resolved compilation unit |
*/ |
- TimestampedData<CompilationUnit> _getResolvedUnit(CompilationUnitElement element, Source librarySource) { |
+ TimestampedData<CompilationUnit> |
+ _getResolvedUnit(CompilationUnitElement element, Source librarySource) { |
SourceEntry sourceEntry = _cache.get(element.source); |
if (sourceEntry is DartEntry) { |
DartEntry dartEntry = sourceEntry; |
- if (dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) == CacheState.VALID) { |
- return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource)); |
+ if (dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) == |
+ CacheState.VALID) { |
+ return new TimestampedData<CompilationUnit>( |
+ dartEntry.modificationTime, |
+ dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource)); |
} |
} |
return null; |
@@ -3454,16 +3839,19 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param hintsEnabled `true` if hints are currently enabled |
* @param sources the set to which sources should be added |
*/ |
- void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, HashSet<Source> sources) { |
+ void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, |
+ bool isPriority, bool hintsEnabled, HashSet<Source> sources) { |
if (sourceEntry is DartEntry) { |
DartEntry dartEntry = sourceEntry; |
CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS); |
- if (scanErrorsState == CacheState.INVALID || (isPriority && scanErrorsState == CacheState.FLUSHED)) { |
+ if (scanErrorsState == CacheState.INVALID || |
+ (isPriority && scanErrorsState == CacheState.FLUSHED)) { |
sources.add(source); |
return; |
} |
CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS); |
- if (parseErrorsState == CacheState.INVALID || (isPriority && parseErrorsState == CacheState.FLUSHED)) { |
+ if (parseErrorsState == CacheState.INVALID || |
+ (isPriority && parseErrorsState == CacheState.FLUSHED)) { |
sources.add(source); |
return; |
} |
@@ -3477,31 +3865,41 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
SourceEntry libraryEntry = _cache.get(librarySource); |
if (libraryEntry is DartEntry) { |
CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT); |
- if (elementState == CacheState.INVALID || (isPriority && elementState == CacheState.FLUSHED)) { |
+ if (elementState == CacheState.INVALID || |
+ (isPriority && elementState == CacheState.FLUSHED)) { |
sources.add(source); |
return; |
} |
- CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
- if (resolvedUnitState == CacheState.INVALID || (isPriority && resolvedUnitState == CacheState.FLUSHED)) { |
- LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT); |
+ CacheState resolvedUnitState = |
+ dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
+ if (resolvedUnitState == CacheState.INVALID || |
+ (isPriority && resolvedUnitState == CacheState.FLUSHED)) { |
+ LibraryElement libraryElement = |
+ libraryEntry.getValue(DartEntry.ELEMENT); |
if (libraryElement != null) { |
sources.add(source); |
return; |
} |
} |
if (_generateSdkErrors || !source.isInSystemLibrary) { |
- CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource); |
- if (verificationErrorsState == CacheState.INVALID || (isPriority && verificationErrorsState == CacheState.FLUSHED)) { |
- LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT); |
+ CacheState verificationErrorsState = |
+ dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource); |
+ if (verificationErrorsState == CacheState.INVALID || |
+ (isPriority && verificationErrorsState == CacheState.FLUSHED)) { |
+ LibraryElement libraryElement = |
+ libraryEntry.getValue(DartEntry.ELEMENT); |
if (libraryElement != null) { |
sources.add(source); |
return; |
} |
} |
if (hintsEnabled) { |
- CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource); |
- if (hintsState == CacheState.INVALID || (isPriority && hintsState == CacheState.FLUSHED)) { |
- LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT); |
+ CacheState hintsState = |
+ dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource); |
+ if (hintsState == CacheState.INVALID || |
+ (isPriority && hintsState == CacheState.FLUSHED)) { |
+ LibraryElement libraryElement = |
+ libraryEntry.getValue(DartEntry.ELEMENT); |
if (libraryElement != null) { |
sources.add(source); |
return; |
@@ -3514,27 +3912,35 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} else if (sourceEntry is HtmlEntry) { |
HtmlEntry htmlEntry = sourceEntry; |
CacheState parsedUnitState = htmlEntry.getState(HtmlEntry.PARSED_UNIT); |
- if (parsedUnitState == CacheState.INVALID || (isPriority && parsedUnitState == CacheState.FLUSHED)) { |
+ if (parsedUnitState == CacheState.INVALID || |
+ (isPriority && parsedUnitState == CacheState.FLUSHED)) { |
sources.add(source); |
return; |
} |
- CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT); |
- if (resolvedUnitState == CacheState.INVALID || (isPriority && resolvedUnitState == CacheState.FLUSHED)) { |
+ CacheState resolvedUnitState = |
+ htmlEntry.getState(HtmlEntry.RESOLVED_UNIT); |
+ if (resolvedUnitState == CacheState.INVALID || |
+ (isPriority && resolvedUnitState == CacheState.FLUSHED)) { |
sources.add(source); |
return; |
} |
// Angular |
if (_options.analyzeAngular) { |
- CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS); |
- if (angularErrorsState == CacheState.INVALID || (isPriority && angularErrorsState == CacheState.FLUSHED)) { |
- AngularApplication entryInfo = htmlEntry.getValue(HtmlEntry.ANGULAR_ENTRY); |
+ CacheState angularErrorsState = |
+ htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS); |
+ if (angularErrorsState == CacheState.INVALID || |
+ (isPriority && angularErrorsState == CacheState.FLUSHED)) { |
+ AngularApplication entryInfo = |
+ htmlEntry.getValue(HtmlEntry.ANGULAR_ENTRY); |
if (entryInfo != null) { |
sources.add(source); |
return; |
} |
- AngularApplication applicationInfo = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION); |
+ AngularApplication applicationInfo = |
+ htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION); |
if (applicationInfo != null) { |
- AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT); |
+ AngularComponentElement component = |
+ htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT); |
if (component != null) { |
sources.add(source); |
return; |
@@ -3545,13 +3951,17 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// Polymer |
if (_options.analyzePolymer) { |
// Elements building. |
- CacheState polymerBuildErrorsState = htmlEntry.getState(HtmlEntry.POLYMER_BUILD_ERRORS); |
- if (polymerBuildErrorsState == CacheState.INVALID || (isPriority && polymerBuildErrorsState == CacheState.FLUSHED)) { |
+ CacheState polymerBuildErrorsState = |
+ htmlEntry.getState(HtmlEntry.POLYMER_BUILD_ERRORS); |
+ if (polymerBuildErrorsState == CacheState.INVALID || |
+ (isPriority && polymerBuildErrorsState == CacheState.FLUSHED)) { |
sources.add(source); |
} |
// Resolution. |
- CacheState polymerResolutionErrorsState = htmlEntry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS); |
- if (polymerResolutionErrorsState == CacheState.INVALID || (isPriority && polymerResolutionErrorsState == CacheState.FLUSHED)) { |
+ CacheState polymerResolutionErrorsState = |
+ htmlEntry.getState(HtmlEntry.POLYMER_RESOLUTION_ERRORS); |
+ if (polymerResolutionErrorsState == CacheState.INVALID || |
+ (isPriority && polymerResolutionErrorsState == CacheState.FLUSHED)) { |
sources.add(source); |
} |
} |
@@ -3567,7 +3977,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* should also be invalidated. |
*/ |
void _invalidateAllLocalResolutionInformation(bool invalidateUris) { |
- HashMap<Source, List<Source>> oldPartMap = new HashMap<Source, List<Source>>(); |
+ HashMap<Source, List<Source>> oldPartMap = |
+ new HashMap<Source, List<Source>>(); |
MapIterator<Source, SourceEntry> iterator = _privatePartition.iterator(); |
while (iterator.moveNext()) { |
Source source = iterator.key; |
@@ -3600,7 +4011,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param entryCopy the [HtmlEntry] of the (maybe) Angular entry point being invalidated |
*/ |
void _invalidateAngularResolution(HtmlEntry entryCopy) { |
- AngularApplication application = entryCopy.getValue(HtmlEntry.ANGULAR_ENTRY); |
+ AngularApplication application = |
+ entryCopy.getValue(HtmlEntry.ANGULAR_ENTRY); |
if (application == null) { |
return; |
} |
@@ -3629,7 +4041,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
dartEntry.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS); |
// notify about (disappeared) Angular errors |
ChangeNoticeImpl notice = _getNotice(elementSource); |
- notice.setErrors(dartEntry.allErrors, dartEntry.getValue(SourceEntry.LINE_INFO)); |
+ notice.setErrors( |
+ dartEntry.allErrors, |
+ dartEntry.getValue(SourceEntry.LINE_INFO)); |
} |
} |
@@ -3645,12 +4059,14 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param librarySource the source of the library being invalidated |
*/ |
void _invalidateLibraryResolution(Source librarySource) { |
- // TODO(brianwilkerson) This could be optimized. There's no need to flush all of these entries |
- // if the public namespace hasn't changed, which will be a fairly common case. The question is |
- // whether we can afford the time to compute the namespace to look for differences. |
+ // TODO(brianwilkerson) This could be optimized. There's no need to flush |
+ // all of these entries if the public namespace hasn't changed, which will |
+ // be a fairly common case. The question is whether we can afford the time |
+ // to compute the namespace to look for differences. |
DartEntry libraryEntry = _getReadableDartEntry(librarySource); |
if (libraryEntry != null) { |
- List<Source> includedParts = libraryEntry.getValue(DartEntry.INCLUDED_PARTS); |
+ List<Source> includedParts = |
+ libraryEntry.getValue(DartEntry.INCLUDED_PARTS); |
libraryEntry.invalidateAllResolutionInformation(false); |
_workManager.add(librarySource, SourcePriority.LIBRARY); |
for (Source partSource in includedParts) { |
@@ -3680,7 +4096,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* infinite recursion |
* @return `true` if this library is, or depends on, dart:html |
*/ |
- bool _isClient(LibraryElement library, Source htmlSource, HashSet<LibraryElement> visitedLibraries) { |
+ bool _isClient(LibraryElement library, Source htmlSource, |
+ HashSet<LibraryElement> visitedLibraries) { |
if (visitedLibraries.contains(library)) { |
return false; |
} |
@@ -3701,7 +4118,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
return false; |
} |
- bool _isTooBigHtmlSourceEntry(Source source, SourceEntry sourceEntry) => false; |
+ bool _isTooBigHtmlSourceEntry(Source source, SourceEntry sourceEntry) => |
+ false; |
/** |
* Log the given debugging information. |
@@ -3732,7 +4150,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param errors the errors that were computed |
* @param lineInfo the line information associated with the source |
*/ |
- void _notifyErrors(Source source, List<AnalysisError> errors, LineInfo lineInfo) { |
+ void _notifyErrors(Source source, List<AnalysisError> errors, |
+ LineInfo lineInfo) { |
int count = _listeners.length; |
for (int i = 0; i < count; i++) { |
_listeners[i].computedErrors(this, source, errors, lineInfo); |
@@ -3821,7 +4240,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* Updates [HtmlEntry]s that correspond to the previously known and new Angular application |
* information. |
*/ |
- void _recordAngularEntryPoint(HtmlEntry entry, ResolveAngularEntryHtmlTask task) { |
+ void _recordAngularEntryPoint(HtmlEntry entry, |
+ ResolveAngularEntryHtmlTask task) { |
AngularApplication application = task.application; |
if (application != null) { |
_angularApplications.add(application); |
@@ -3849,7 +4269,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
List<Source> newElementSources = application.elementSources; |
for (Source elementSource in newElementSources) { |
DartEntry dartEntry = _getReadableDartEntry(elementSource); |
- dartEntry.setValue(DartEntry.ANGULAR_ERRORS, task.getErrors(elementSource)); |
+ dartEntry.setValue( |
+ DartEntry.ANGULAR_ERRORS, |
+ task.getErrors(elementSource)); |
// notify about Dart errors |
ChangeNoticeImpl notice = _getNotice(elementSource); |
notice.setErrors(dartEntry.allErrors, computeLineInfo(elementSource)); |
@@ -3873,7 +4295,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
throw new AnalysisException('<rethrow>', thrownException); |
} |
dartEntry.setValueInLibrary(DartEntry.BUILT_UNIT, library, task.unit); |
- dartEntry.setValueInLibrary(DartEntry.BUILT_ELEMENT, library, task.unitElement); |
+ dartEntry.setValueInLibrary( |
+ DartEntry.BUILT_ELEMENT, |
+ library, |
+ task.unitElement); |
ChangeNoticeImpl notice = _getNotice(source); |
LineInfo lineInfo = dartEntry.getValue(SourceEntry.LINE_INFO); |
notice.setErrors(dartEntry.allErrors, lineInfo); |
@@ -3889,10 +4314,13 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @param librarySource the source for the library used to record information |
* @param htmlSource the source for the HTML library |
*/ |
- void _recordElementData(DartEntry dartEntry, LibraryElement library, Source librarySource, Source htmlSource) { |
+ void _recordElementData(DartEntry dartEntry, LibraryElement library, |
+ Source librarySource, Source htmlSource) { |
dartEntry.setValue(DartEntry.ELEMENT, library); |
dartEntry.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null); |
- dartEntry.setValue(DartEntry.IS_CLIENT, _isClient(library, htmlSource, new HashSet<LibraryElement>())); |
+ dartEntry.setValue( |
+ DartEntry.IS_CLIENT, |
+ _isClient(library, htmlSource, new HashSet<LibraryElement>())); |
} |
/** |
@@ -3905,7 +4333,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
Source librarySource = task.libraryElement.source; |
CaughtException thrownException = task.exception; |
if (thrownException != null) { |
- dartEntry.recordVerificationErrorInLibrary(librarySource, thrownException); |
+ dartEntry.recordVerificationErrorInLibrary( |
+ librarySource, |
+ thrownException); |
throw new AnalysisException('<rethrow>', thrownException); |
} |
dartEntry.setValueInLibrary( |
@@ -3932,9 +4362,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// other than the library source. |
DartEntry libraryEntry = _cache.get(librarySource); |
if (thrownException == null) { |
- String message = "GenerateDartHintsTask returned a null hint map " |
- "without throwing an exception: ${librarySource.fullName}"; |
- thrownException = new CaughtException(new AnalysisException(message), null); |
+ String message = |
+ "GenerateDartHintsTask returned a null hint map " |
+ "without throwing an exception: ${librarySource.fullName}"; |
+ thrownException = |
+ new CaughtException(new AnalysisException(message), null); |
} |
libraryEntry.recordHintErrorInLibrary(librarySource, thrownException); |
throw new AnalysisException('<rethrow>', thrownException); |
@@ -3987,14 +4419,14 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* @return an entry containing the computed results |
* @throws AnalysisException if the results could not be recorded |
*/ |
- DartEntry _recordIncrementalAnalysisTaskResults(IncrementalAnalysisTask task) { |
+ DartEntry |
+ _recordIncrementalAnalysisTaskResults(IncrementalAnalysisTask task) { |
CompilationUnit unit = task.compilationUnit; |
if (unit != null) { |
ChangeNoticeImpl notice = _getNotice(task.source); |
notice.compilationUnit = unit; |
- _incrementalAnalysisCache = IncrementalAnalysisCache.cacheResult( |
- task.cache, |
- unit); |
+ _incrementalAnalysisCache = |
+ IncrementalAnalysisCache.cacheResult(task.cache, unit); |
} |
return null; |
} |
@@ -4025,9 +4457,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} else { |
// The file contains no directives. |
List<Source> containingLibraries = dartEntry.containingLibraries; |
- if (containingLibraries.length > 1 |
- || (containingLibraries.length == 1 |
- && containingLibraries[0] != source)) { |
+ if (containingLibraries.length > 1 || |
+ (containingLibraries.length == 1 && containingLibraries[0] != source)) { |
dartEntry.setValue(DartEntry.SOURCE_KIND, SourceKind.PART); |
dartEntry.removeContainingLibrary(source); |
_workManager.add(source, SourcePriority.NORMAL_PART); |
@@ -4081,7 +4512,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
htmlEntry.setValue(SourceEntry.LINE_INFO, lineInfo); |
htmlEntry.setValue(HtmlEntry.PARSED_UNIT, task.htmlUnit); |
htmlEntry.setValue(HtmlEntry.PARSE_ERRORS, task.errors); |
- htmlEntry.setValue(HtmlEntry.REFERENCED_LIBRARIES, task.referencedLibraries); |
+ htmlEntry.setValue( |
+ HtmlEntry.REFERENCED_LIBRARIES, |
+ task.referencedLibraries); |
_cache.storedAst(source); |
ChangeNoticeImpl notice = _getNotice(source); |
notice.setErrors(htmlEntry.allErrors, lineInfo); |
@@ -4132,7 +4565,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* Record the results produced by performing a [task] and return the cache |
* entry associated with the results. |
*/ |
- HtmlEntry _recordResolveAngularComponentTemplateTaskResults(ResolveAngularComponentTemplateTask task) { |
+ HtmlEntry |
+ _recordResolveAngularComponentTemplateTaskResults(ResolveAngularComponentTemplateTask task) { |
Source source = task.source; |
HtmlEntry htmlEntry = _cache.get(source); |
CaughtException thrownException = task.exception; |
@@ -4153,7 +4587,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* Record the results produced by performing a [task] and return the cache |
* entry associated with the results. |
*/ |
- HtmlEntry _recordResolveAngularEntryHtmlTaskResults(ResolveAngularEntryHtmlTask task) { |
+ HtmlEntry |
+ _recordResolveAngularEntryHtmlTaskResults(ResolveAngularEntryHtmlTask task) { |
Source source = task.source; |
HtmlEntry htmlEntry = _cache.get(source); |
CaughtException thrownException = task.exception; |
@@ -4281,7 +4716,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
DartEntry partEntry = _getReadableDartEntry(partSource); |
if (partEntry != null) { |
partEntry.removeContainingLibrary(librarySource); |
- if (partEntry.containingLibraries.length == 0 && !exists(partSource)) { |
+ if (partEntry.containingLibraries.length == 0 && |
+ !exists(partSource)) { |
_cache.remove(partSource); |
} |
} |
@@ -4340,9 +4776,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
*/ |
void _sourceChanged(Source source) { |
SourceEntry sourceEntry = _cache.get(source); |
- if (sourceEntry == null || sourceEntry.modificationTime == getModificationStamp(source)) { |
- // Either we have removed this source, in which case we don't care that it is changed, or we |
- // have already invalidated the cache and don't need to invalidate it again. |
+ if (sourceEntry == null || |
+ sourceEntry.modificationTime == getModificationStamp(source)) { |
+ // Either we have removed this source, in which case we don't care that |
+ // it is changed, or we have already invalidated the cache and don't need |
+ // to invalidate it again. |
return; |
} |
if (sourceEntry is HtmlEntry) { |
@@ -4356,7 +4794,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
List<Source> containingLibraries = getLibrariesContaining(source); |
HashSet<Source> librariesToInvalidate = new HashSet<Source>(); |
for (Source containingLibrary in containingLibraries) { |
- _computeAllLibrariesDependingOn(containingLibrary, librariesToInvalidate); |
+ _computeAllLibrariesDependingOn( |
+ containingLibrary, |
+ librariesToInvalidate); |
} |
for (Source library in librariesToInvalidate) { |
_invalidateLibraryResolution(library); |
@@ -4380,20 +4820,27 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (sourceEntry is HtmlEntry) { |
HtmlEntry htmlEntry = sourceEntry; |
_invalidateAngularResolution(htmlEntry); |
- htmlEntry.recordContentError(new CaughtException(new AnalysisException("This source was marked as being deleted"), null)); |
+ htmlEntry.recordContentError( |
+ new CaughtException( |
+ new AnalysisException("This source was marked as being deleted"), |
+ null)); |
} else if (sourceEntry is DartEntry) { |
DartEntry dartEntry = sourceEntry; |
HashSet<Source> libraries = new HashSet<Source>(); |
for (Source librarySource in getLibrariesContaining(source)) { |
libraries.add(librarySource); |
- for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) { |
+ for (Source dependentLibrary in getLibrariesDependingOn( |
+ librarySource)) { |
libraries.add(dependentLibrary); |
} |
} |
for (Source librarySource in libraries) { |
_invalidateLibraryResolution(librarySource); |
} |
- dartEntry.recordContentError(new CaughtException(new AnalysisException("This source was marked as being deleted"), null)); |
+ dartEntry.recordContentError( |
+ new CaughtException( |
+ new AnalysisException("This source was marked as being deleted"), |
+ null)); |
} |
_workManager.remove(source); |
_removeFromPriorityOrder(source); |
@@ -4412,7 +4859,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
HashSet<Source> libraries = new HashSet<Source>(); |
for (Source librarySource in getLibrariesContaining(source)) { |
libraries.add(librarySource); |
- for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) { |
+ for (Source dependentLibrary in getLibrariesDependingOn( |
+ librarySource)) { |
libraries.add(dependentLibrary); |
} |
} |
@@ -4482,77 +4930,83 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* An `AnalysisTaskResultRecorder` is used by an analysis context to record the |
* results of a task. |
*/ |
-class AnalysisContextImpl_AnalysisTaskResultRecorder implements AnalysisTaskVisitor<SourceEntry> { |
+class AnalysisContextImpl_AnalysisTaskResultRecorder implements |
+ AnalysisTaskVisitor<SourceEntry> { |
final AnalysisContextImpl AnalysisContextImpl_this; |
AnalysisContextImpl_AnalysisTaskResultRecorder(this.AnalysisContextImpl_this); |
@override |
- DartEntry visitBuildUnitElementTask(BuildUnitElementTask task) |
- => AnalysisContextImpl_this._recordBuildUnitElementTask(task); |
+ DartEntry visitBuildUnitElementTask(BuildUnitElementTask task) => |
+ AnalysisContextImpl_this._recordBuildUnitElementTask(task); |
@override |
- DartEntry visitGenerateDartErrorsTask(GenerateDartErrorsTask task) |
- => AnalysisContextImpl_this._recordGenerateDartErrorsTask(task); |
+ DartEntry visitGenerateDartErrorsTask(GenerateDartErrorsTask task) => |
+ AnalysisContextImpl_this._recordGenerateDartErrorsTask(task); |
@override |
- DartEntry visitGenerateDartHintsTask(GenerateDartHintsTask task) |
- => AnalysisContextImpl_this._recordGenerateDartHintsTask(task); |
+ DartEntry visitGenerateDartHintsTask(GenerateDartHintsTask task) => |
+ AnalysisContextImpl_this._recordGenerateDartHintsTask(task); |
@override |
- SourceEntry visitGetContentTask(GetContentTask task) |
- => AnalysisContextImpl_this._recordGetContentsTask(task); |
+ SourceEntry visitGetContentTask(GetContentTask task) => |
+ AnalysisContextImpl_this._recordGetContentsTask(task); |
@override |
- DartEntry visitIncrementalAnalysisTask(IncrementalAnalysisTask task) |
- => AnalysisContextImpl_this._recordIncrementalAnalysisTaskResults(task); |
+ DartEntry visitIncrementalAnalysisTask(IncrementalAnalysisTask task) => |
+ AnalysisContextImpl_this._recordIncrementalAnalysisTaskResults(task); |
@override |
- DartEntry visitParseDartTask(ParseDartTask task) |
- => AnalysisContextImpl_this._recordParseDartTaskResults(task); |
+ DartEntry visitParseDartTask(ParseDartTask task) => |
+ AnalysisContextImpl_this._recordParseDartTaskResults(task); |
@override |
- HtmlEntry visitParseHtmlTask(ParseHtmlTask task) |
- => AnalysisContextImpl_this._recordParseHtmlTaskResults(task); |
+ HtmlEntry visitParseHtmlTask(ParseHtmlTask task) => |
+ AnalysisContextImpl_this._recordParseHtmlTaskResults(task); |
@override |
- HtmlEntry visitPolymerBuildHtmlTask(PolymerBuildHtmlTask task) |
- => AnalysisContextImpl_this._recordPolymerBuildHtmlTaskResults(task); |
+ HtmlEntry visitPolymerBuildHtmlTask(PolymerBuildHtmlTask task) => |
+ AnalysisContextImpl_this._recordPolymerBuildHtmlTaskResults(task); |
@override |
- HtmlEntry visitPolymerResolveHtmlTask(PolymerResolveHtmlTask task) |
- => AnalysisContextImpl_this._recordPolymerResolveHtmlTaskResults(task); |
+ HtmlEntry visitPolymerResolveHtmlTask(PolymerResolveHtmlTask task) => |
+ AnalysisContextImpl_this._recordPolymerResolveHtmlTaskResults(task); |
@override |
- HtmlEntry visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task) |
- => AnalysisContextImpl_this._recordResolveAngularComponentTemplateTaskResults(task); |
+ HtmlEntry |
+ visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task) => |
+ AnalysisContextImpl_this._recordResolveAngularComponentTemplateTaskResults( |
+ task); |
@override |
- HtmlEntry visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) |
- => AnalysisContextImpl_this._recordResolveAngularEntryHtmlTaskResults(task); |
+ HtmlEntry |
+ visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) => |
+ AnalysisContextImpl_this._recordResolveAngularEntryHtmlTaskResults(task); |
@override |
- DartEntry visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task) |
- => AnalysisContextImpl_this.recordResolveDartLibraryCycleTaskResults(task); |
+ DartEntry |
+ visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task) => |
+ AnalysisContextImpl_this.recordResolveDartLibraryCycleTaskResults(task); |
@override |
- DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) |
- => AnalysisContextImpl_this.recordResolveDartLibraryTaskResults(task); |
+ DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) => |
+ AnalysisContextImpl_this.recordResolveDartLibraryTaskResults(task); |
@override |
- DartEntry visitResolveDartUnitTask(ResolveDartUnitTask task) |
- => AnalysisContextImpl_this._recordResolveDartUnitTaskResults(task); |
+ DartEntry visitResolveDartUnitTask(ResolveDartUnitTask task) => |
+ AnalysisContextImpl_this._recordResolveDartUnitTaskResults(task); |
@override |
- HtmlEntry visitResolveHtmlTask(ResolveHtmlTask task) |
- => AnalysisContextImpl_this._recordResolveHtmlTaskResults(task); |
+ HtmlEntry visitResolveHtmlTask(ResolveHtmlTask task) => |
+ AnalysisContextImpl_this._recordResolveHtmlTaskResults(task); |
@override |
- DartEntry visitScanDartTask(ScanDartTask task) |
- => AnalysisContextImpl_this._recordScanDartTaskResults(task); |
+ DartEntry visitScanDartTask(ScanDartTask task) => |
+ AnalysisContextImpl_this._recordScanDartTaskResults(task); |
} |
-class AnalysisContextImpl_ContextRetentionPolicy implements CacheRetentionPolicy { |
+class AnalysisContextImpl_ContextRetentionPolicy implements CacheRetentionPolicy |
+ { |
final AnalysisContextImpl AnalysisContextImpl_this; |
AnalysisContextImpl_ContextRetentionPolicy(this.AnalysisContextImpl_this); |
@@ -4565,7 +5019,8 @@ class AnalysisContextImpl_ContextRetentionPolicy implements CacheRetentionPolicy |
return RetentionPriority.HIGH; |
} |
} |
- if (AnalysisContextImpl_this._neededForResolution != null && AnalysisContextImpl_this._neededForResolution.contains(source)) { |
+ if (AnalysisContextImpl_this._neededForResolution != null && |
+ AnalysisContextImpl_this._neededForResolution.contains(source)) { |
return RetentionPriority.HIGH; |
} |
if (sourceEntry is DartEntry) { |
@@ -4577,7 +5032,10 @@ class AnalysisContextImpl_ContextRetentionPolicy implements CacheRetentionPolicy |
return RetentionPriority.LOW; |
} |
- bool _astIsNeeded(DartEntry dartEntry) => dartEntry.hasInvalidData(DartEntry.HINTS) || dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS); |
+ bool _astIsNeeded(DartEntry dartEntry) => |
+ dartEntry.hasInvalidData(DartEntry.HINTS) || |
+ dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || |
+ dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS); |
} |
/** |
@@ -4591,7 +5049,8 @@ class AnalysisContextImpl_CycleBuilder { |
* A table mapping the sources of the defining compilation units of libraries to the |
* representation of the library that has the information needed to resolve the library. |
*/ |
- HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>(); |
+ HashMap<Source, ResolvableLibrary> _libraryMap = |
+ new HashMap<Source, ResolvableLibrary>(); |
/** |
* The dependency graph used to compute the libraries in the cycle. |
@@ -4615,6 +5074,23 @@ class AnalysisContextImpl_CycleBuilder { |
AnalysisContextImpl_CycleBuilder(this.AnalysisContextImpl_this) : super(); |
/** |
+ * Return a list containing the libraries that are ready to be resolved (assuming that |
+ * [getTaskData] returns `null`). |
+ * |
+ * @return the libraries that are ready to be resolved |
+ */ |
+ List<ResolvableLibrary> get librariesInCycle => _librariesInCycle; |
+ |
+ /** |
+ * Return a representation of an analysis task that needs to be performed before the cycle of |
+ * libraries can be resolved, or `null` if the libraries are ready to be resolved. |
+ * |
+ * @return the analysis task that needs to be performed before the cycle of libraries can be |
+ * resolved |
+ */ |
+ AnalysisContextImpl_TaskData get taskData => _taskData; |
+ |
+ /** |
* Compute a list of the libraries that need to be resolved together in order to resolve the |
* given library. |
* |
@@ -4640,10 +5116,13 @@ class AnalysisContextImpl_CycleBuilder { |
// |
_ensureImportsAndExports(); |
if (_taskData != null) { |
- // At least one imported library needs to be resolved before the target library. |
+ // At least one imported library needs to be resolved before the target |
+ // library. |
AnalysisTask task = _taskData.task; |
if (task is ResolveDartLibraryTask) { |
- AnalysisContextImpl_this._workManager.addFirst(task.librarySource, SourcePriority.LIBRARY); |
+ AnalysisContextImpl_this._workManager.addFirst( |
+ task.librarySource, |
+ SourcePriority.LIBRARY); |
} |
return; |
} |
@@ -4652,29 +5131,13 @@ class AnalysisContextImpl_CycleBuilder { |
// At least one part needs to be parsed. |
return; |
} |
- // All of the AST's necessary to perform a resolution of the library cycle have been |
- // gathered, so it is no longer necessary to retain them in the cache. |
+ // All of the AST's necessary to perform a resolution of the library cycle |
+ // have been gathered, so it is no longer necessary to retain them in the |
+ // cache. |
AnalysisContextImpl_this._neededForResolution = null; |
} |
/** |
- * Return a list containing the libraries that are ready to be resolved (assuming that |
- * [getTaskData] returns `null`). |
- * |
- * @return the libraries that are ready to be resolved |
- */ |
- List<ResolvableLibrary> get librariesInCycle => _librariesInCycle; |
- |
- /** |
- * Return a representation of an analysis task that needs to be performed before the cycle of |
- * libraries can be resolved, or `null` if the libraries are ready to be resolved. |
- * |
- * @return the analysis task that needs to be performed before the cycle of libraries can be |
- * resolved |
- */ |
- AnalysisContextImpl_TaskData get taskData => _taskData; |
- |
- /** |
* Recursively traverse the libraries reachable from the given library, creating instances of |
* the class [Library] to represent them, and record the references in the library |
* objects. |
@@ -4684,16 +5147,22 @@ class AnalysisContextImpl_CycleBuilder { |
*/ |
void _computeLibraryDependencies(ResolvableLibrary library) { |
Source librarySource = library.librarySource; |
- DartEntry dartEntry = AnalysisContextImpl_this._getReadableDartEntry(librarySource); |
- List<Source> importedSources = _getSources(librarySource, dartEntry, DartEntry.IMPORTED_LIBRARIES); |
+ DartEntry dartEntry = |
+ AnalysisContextImpl_this._getReadableDartEntry(librarySource); |
+ List<Source> importedSources = |
+ _getSources(librarySource, dartEntry, DartEntry.IMPORTED_LIBRARIES); |
if (_taskData != null) { |
return; |
} |
- List<Source> exportedSources = _getSources(librarySource, dartEntry, DartEntry.EXPORTED_LIBRARIES); |
+ List<Source> exportedSources = |
+ _getSources(librarySource, dartEntry, DartEntry.EXPORTED_LIBRARIES); |
if (_taskData != null) { |
return; |
} |
- _computeLibraryDependenciesFromDirectives(library, importedSources, exportedSources); |
+ _computeLibraryDependenciesFromDirectives( |
+ library, |
+ importedSources, |
+ exportedSources); |
} |
/** |
@@ -4707,7 +5176,8 @@ class AnalysisContextImpl_CycleBuilder { |
* @param exportedSources an array containing the sources that are exported from the given |
* library |
*/ |
- void _computeLibraryDependenciesFromDirectives(ResolvableLibrary library, List<Source> importedSources, List<Source> exportedSources) { |
+ void _computeLibraryDependenciesFromDirectives(ResolvableLibrary library, |
+ List<Source> importedSources, List<Source> exportedSources) { |
int importCount = importedSources.length; |
if (importCount > 0) { |
List<ResolvableLibrary> importedLibraries = new List<ResolvableLibrary>(); |
@@ -4733,10 +5203,13 @@ class AnalysisContextImpl_CycleBuilder { |
} |
} |
library.explicitlyImportsCore = explicitlyImportsCore; |
- if (!explicitlyImportsCore && AnalysisContextImpl_this._coreLibrarySource != library.librarySource) { |
- ResolvableLibrary importedLibrary = _libraryMap[AnalysisContextImpl_this._coreLibrarySource]; |
+ if (!explicitlyImportsCore && |
+ AnalysisContextImpl_this._coreLibrarySource != library.librarySource) { |
+ ResolvableLibrary importedLibrary = |
+ _libraryMap[AnalysisContextImpl_this._coreLibrarySource]; |
if (importedLibrary == null) { |
- importedLibrary = _createLibraryOrNull(AnalysisContextImpl_this._coreLibrarySource); |
+ importedLibrary = |
+ _createLibraryOrNull(AnalysisContextImpl_this._coreLibrarySource); |
if (importedLibrary != null) { |
_computeLibraryDependencies(importedLibrary); |
if (_taskData != null) { |
@@ -4752,9 +5225,11 @@ class AnalysisContextImpl_CycleBuilder { |
library.importedLibraries = importedLibraries; |
} else { |
library.explicitlyImportsCore = false; |
- ResolvableLibrary importedLibrary = _libraryMap[AnalysisContextImpl_this._coreLibrarySource]; |
+ ResolvableLibrary importedLibrary = |
+ _libraryMap[AnalysisContextImpl_this._coreLibrarySource]; |
if (importedLibrary == null) { |
- importedLibrary = _createLibraryOrNull(AnalysisContextImpl_this._coreLibrarySource); |
+ importedLibrary = |
+ _createLibraryOrNull(AnalysisContextImpl_this._coreLibrarySource); |
if (importedLibrary != null) { |
_computeLibraryDependencies(importedLibrary); |
if (_taskData != null) { |
@@ -4764,7 +5239,7 @@ class AnalysisContextImpl_CycleBuilder { |
} |
if (importedLibrary != null) { |
_dependencyGraph.addEdge(library, importedLibrary); |
- library.importedLibraries = <ResolvableLibrary> [importedLibrary]; |
+ library.importedLibraries = <ResolvableLibrary>[importedLibrary]; |
} |
} |
int exportCount = exportedSources.length; |
@@ -4800,14 +5275,17 @@ class AnalysisContextImpl_CycleBuilder { |
*/ |
void _computePartsInCycle(Source librarySource) { |
int count = _librariesInCycle.length; |
- List<CycleBuilder_LibraryPair> libraryData = new List<CycleBuilder_LibraryPair>(); |
+ List<CycleBuilder_LibraryPair> libraryData = |
+ new List<CycleBuilder_LibraryPair>(); |
for (int i = 0; i < count; i++) { |
ResolvableLibrary library = _librariesInCycle[i]; |
- libraryData.add(new CycleBuilder_LibraryPair(library, _ensurePartsInLibrary(library))); |
+ libraryData.add( |
+ new CycleBuilder_LibraryPair(library, _ensurePartsInLibrary(library))); |
} |
AnalysisContextImpl_this._neededForResolution = _gatherSources(libraryData); |
if (AnalysisContextImpl._TRACE_PERFORM_TASK) { |
- print(" preserve resolution data for ${AnalysisContextImpl_this._neededForResolution.length} sources while resolving ${librarySource.fullName}"); |
+ print( |
+ " preserve resolution data for ${AnalysisContextImpl_this._neededForResolution.length} sources while resolving ${librarySource.fullName}"); |
} |
if (_taskData != null) { |
return; |
@@ -4828,12 +5306,14 @@ class AnalysisContextImpl_CycleBuilder { |
ResolvableLibrary library = libraryPair.library; |
List<CycleBuilder_SourceEntryPair> entryPairs = libraryPair.entryPairs; |
int count = entryPairs.length; |
- List<ResolvableCompilationUnit> units = new List<ResolvableCompilationUnit>(count); |
+ List<ResolvableCompilationUnit> units = |
+ new List<ResolvableCompilationUnit>(count); |
for (int i = 0; i < count; i++) { |
CycleBuilder_SourceEntryPair entryPair = entryPairs[i]; |
Source source = entryPair.source; |
DartEntry dartEntry = entryPair.entry; |
- units[i] = new ResolvableCompilationUnit(source, dartEntry.resolvableCompilationUnit); |
+ units[i] = |
+ new ResolvableCompilationUnit(source, dartEntry.resolvableCompilationUnit); |
} |
library.resolvableCompilationUnits = units; |
} |
@@ -4847,9 +5327,11 @@ class AnalysisContextImpl_CycleBuilder { |
*/ |
ResolvableLibrary _createLibrary(Source librarySource) { |
ResolvableLibrary library = new ResolvableLibrary(librarySource); |
- SourceEntry sourceEntry = AnalysisContextImpl_this._cache.get(librarySource); |
+ SourceEntry sourceEntry = |
+ AnalysisContextImpl_this._cache.get(librarySource); |
if (sourceEntry is DartEntry) { |
- LibraryElementImpl libraryElement = sourceEntry.getValue(DartEntry.ELEMENT) as LibraryElementImpl; |
+ LibraryElementImpl libraryElement = |
+ sourceEntry.getValue(DartEntry.ELEMENT) as LibraryElementImpl; |
if (libraryElement != null) { |
library.libraryElement = libraryElement; |
} |
@@ -4867,9 +5349,11 @@ class AnalysisContextImpl_CycleBuilder { |
*/ |
ResolvableLibrary _createLibraryOrNull(Source librarySource) { |
ResolvableLibrary library = new ResolvableLibrary(librarySource); |
- SourceEntry sourceEntry = AnalysisContextImpl_this._cache.get(librarySource); |
+ SourceEntry sourceEntry = |
+ AnalysisContextImpl_this._cache.get(librarySource); |
if (sourceEntry is DartEntry) { |
- LibraryElementImpl libraryElement = sourceEntry.getValue(DartEntry.ELEMENT) as LibraryElementImpl; |
+ LibraryElementImpl libraryElement = |
+ sourceEntry.getValue(DartEntry.ELEMENT) as LibraryElementImpl; |
if (libraryElement != null) { |
library.libraryElement = libraryElement; |
} |
@@ -4886,11 +5370,17 @@ class AnalysisContextImpl_CycleBuilder { |
*/ |
void _ensureElementModel(ResolvableLibrary library) { |
Source librarySource = library.librarySource; |
- DartEntry libraryEntry = AnalysisContextImpl_this._getReadableDartEntry(librarySource); |
- if (libraryEntry != null && libraryEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) { |
- AnalysisContextImpl_this._workManager.addFirst(librarySource, SourcePriority.LIBRARY); |
+ DartEntry libraryEntry = |
+ AnalysisContextImpl_this._getReadableDartEntry(librarySource); |
+ if (libraryEntry != null && |
+ libraryEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) { |
+ AnalysisContextImpl_this._workManager.addFirst( |
+ librarySource, |
+ SourcePriority.LIBRARY); |
if (_taskData == null) { |
- _taskData = AnalysisContextImpl_this._createResolveDartLibraryTask(librarySource, libraryEntry); |
+ _taskData = AnalysisContextImpl_this._createResolveDartLibraryTask( |
+ librarySource, |
+ libraryEntry); |
} |
} |
} |
@@ -4902,12 +5392,14 @@ class AnalysisContextImpl_CycleBuilder { |
* |
* @param library the library being tested |
*/ |
- void _ensureExports(ResolvableLibrary library, HashSet<Source> visitedLibraries) { |
+ void _ensureExports(ResolvableLibrary library, |
+ HashSet<Source> visitedLibraries) { |
List<ResolvableLibrary> dependencies = library.exports; |
int dependencyCount = dependencies.length; |
for (int i = 0; i < dependencyCount; i++) { |
ResolvableLibrary dependency = dependencies[i]; |
- if (!_librariesInCycle.contains(dependency) && visitedLibraries.add(dependency.librarySource)) { |
+ if (!_librariesInCycle.contains(dependency) && |
+ visitedLibraries.add(dependency.librarySource)) { |
if (dependency.libraryElement == null) { |
_ensureElementModel(dependency); |
} else { |
@@ -4932,7 +5424,8 @@ class AnalysisContextImpl_CycleBuilder { |
int dependencyCount = dependencies.length; |
for (int i = 0; i < dependencyCount; i++) { |
ResolvableLibrary dependency = dependencies[i]; |
- if (!_librariesInCycle.contains(dependency) && dependency.libraryElement == null) { |
+ if (!_librariesInCycle.contains(dependency) && |
+ dependency.libraryElement == null) { |
_ensureElementModel(dependency); |
if (_taskData != null) { |
return; |
@@ -4968,28 +5461,39 @@ class AnalysisContextImpl_CycleBuilder { |
* @param library the library for which resolvable compilation units must be available |
* @return a list of (source, entry) pairs for all of the compilation units in the library |
*/ |
- List<CycleBuilder_SourceEntryPair> _ensurePartsInLibrary(ResolvableLibrary library) { |
- List<CycleBuilder_SourceEntryPair> pairs = new List<CycleBuilder_SourceEntryPair>(); |
+ List<CycleBuilder_SourceEntryPair> |
+ _ensurePartsInLibrary(ResolvableLibrary library) { |
+ List<CycleBuilder_SourceEntryPair> pairs = |
+ new List<CycleBuilder_SourceEntryPair>(); |
Source librarySource = library.librarySource; |
- DartEntry libraryEntry = AnalysisContextImpl_this._getReadableDartEntry(librarySource); |
+ DartEntry libraryEntry = |
+ AnalysisContextImpl_this._getReadableDartEntry(librarySource); |
if (libraryEntry == null) { |
- throw new AnalysisException("Cannot find entry for ${librarySource.fullName}"); |
- } else if (libraryEntry.getState(DartEntry.PARSED_UNIT) == CacheState.ERROR) { |
- String message = "Cannot compute parsed unit for ${librarySource.fullName}"; |
+ throw new AnalysisException( |
+ "Cannot find entry for ${librarySource.fullName}"); |
+ } else if (libraryEntry.getState(DartEntry.PARSED_UNIT) == |
+ CacheState.ERROR) { |
+ String message = |
+ "Cannot compute parsed unit for ${librarySource.fullName}"; |
CaughtException exception = libraryEntry.exception; |
if (exception == null) { |
throw new AnalysisException(message); |
} |
- throw new AnalysisException(message, new CaughtException(exception, null)); |
+ throw new AnalysisException( |
+ message, |
+ new CaughtException(exception, null)); |
} |
_ensureResolvableCompilationUnit(librarySource, libraryEntry); |
pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry)); |
- List<Source> partSources = _getSources(librarySource, libraryEntry, DartEntry.INCLUDED_PARTS); |
+ List<Source> partSources = |
+ _getSources(librarySource, libraryEntry, DartEntry.INCLUDED_PARTS); |
int count = partSources.length; |
for (int i = 0; i < count; i++) { |
Source partSource = partSources[i]; |
- DartEntry partEntry = AnalysisContextImpl_this._getReadableDartEntry(partSource); |
- if (partEntry != null && partEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) { |
+ DartEntry partEntry = |
+ AnalysisContextImpl_this._getReadableDartEntry(partSource); |
+ if (partEntry != null && |
+ partEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) { |
_ensureResolvableCompilationUnit(partSource, partEntry); |
pairs.add(new CycleBuilder_SourceEntryPair(partSource, partEntry)); |
} |
@@ -5007,7 +5511,8 @@ class AnalysisContextImpl_CycleBuilder { |
// The entry will be null if the source represents a non-Dart file. |
if (dartEntry != null && !dartEntry.hasResolvableCompilationUnit) { |
if (_taskData == null) { |
- _taskData = AnalysisContextImpl_this._createParseDartTask(source, dartEntry); |
+ _taskData = |
+ AnalysisContextImpl_this._createParseDartTask(source, dartEntry); |
} |
} |
} |
@@ -5033,7 +5538,8 @@ class AnalysisContextImpl_CycleBuilder { |
* @param descriptor the descriptor indicating which sources are to be returned |
* @return the sources described by the given descriptor |
*/ |
- List<Source> _getSources(Source source, DartEntry dartEntry, DataDescriptor<List<Source>> descriptor) { |
+ List<Source> _getSources(Source source, DartEntry dartEntry, |
+ DataDescriptor<List<Source>> descriptor) { |
if (dartEntry == null) { |
return Source.EMPTY_ARRAY; |
} |
@@ -5042,7 +5548,8 @@ class AnalysisContextImpl_CycleBuilder { |
return Source.EMPTY_ARRAY; |
} else if (exportState != CacheState.VALID) { |
if (_taskData == null) { |
- _taskData = AnalysisContextImpl_this._createParseDartTask(source, dartEntry); |
+ _taskData = |
+ AnalysisContextImpl_this._createParseDartTask(source, dartEntry); |
} |
return Source.EMPTY_ARRAY; |
} |
@@ -5127,10 +5634,77 @@ abstract class AnalysisContextStatistics { |
} |
/** |
+ * Information about single piece of data in the cache. |
+ */ |
+abstract class AnalysisContextStatistics_CacheRow { |
+ /** |
+ * List of possible states which can be queried. |
+ */ |
+ static const List<CacheState> STATES = const <CacheState>[ |
+ CacheState.ERROR, |
+ CacheState.FLUSHED, |
+ CacheState.IN_PROCESS, |
+ CacheState.INVALID, |
+ CacheState.VALID]; |
+ |
+ /** |
+ * Return the number of entries whose state is [CacheState.ERROR]. |
+ */ |
+ int get errorCount; |
+ |
+ /** |
+ * Return the number of entries whose state is [CacheState.FLUSHED]. |
+ */ |
+ int get flushedCount; |
+ |
+ /** |
+ * Return the number of entries whose state is [CacheState.IN_PROCESS]. |
+ */ |
+ int get inProcessCount; |
+ |
+ /** |
+ * Return the number of entries whose state is [CacheState.INVALID]. |
+ */ |
+ int get invalidCount; |
+ |
+ /** |
+ * Return the name of the data represented by this object. |
+ */ |
+ String get name; |
+ |
+ /** |
+ * Return the number of entries whose state is [CacheState.VALID]. |
+ */ |
+ int get validCount; |
+ |
+ /** |
+ * Return the number of entries whose state is [state]. |
+ */ |
+ int getCount(CacheState state); |
+} |
+ |
+/** |
+ * Information about a single partition in the cache. |
+ */ |
+abstract class AnalysisContextStatistics_PartitionData { |
+ /** |
+ * Return the number of entries in the partition that have an AST structure in one state or |
+ * another. |
+ */ |
+ int get astCount; |
+ |
+ /** |
+ * Return the total number of entries in the partition. |
+ */ |
+ int get totalCount; |
+} |
+ |
+/** |
* Implementation of the [AnalysisContextStatistics]. |
*/ |
class AnalysisContextStatisticsImpl implements AnalysisContextStatistics { |
- Map<String, AnalysisContextStatistics_CacheRow> _dataMap = new HashMap<String, AnalysisContextStatistics_CacheRow>(); |
+ Map<String, AnalysisContextStatistics_CacheRow> _dataMap = |
+ new HashMap<String, AnalysisContextStatistics_CacheRow>(); |
List<Source> _sources = new List<Source>(); |
@@ -5138,22 +5712,16 @@ class AnalysisContextStatisticsImpl implements AnalysisContextStatistics { |
List<AnalysisContextStatistics_PartitionData> _partitionData; |
- void addSource(Source source) { |
- _sources.add(source); |
- } |
- |
@override |
- List<AnalysisContextStatistics_CacheRow> get cacheRows |
- => _dataMap.values.toList(); |
+ List<AnalysisContextStatistics_CacheRow> get cacheRows => |
+ _dataMap.values.toList(); |
@override |
List<CaughtException> get exceptions => new List.from(_exceptions); |
@override |
- List<AnalysisContextStatistics_PartitionData> get partitionData => _partitionData; |
- |
- @override |
- List<Source> get sources => _sources; |
+ List<AnalysisContextStatistics_PartitionData> get partitionData => |
+ _partitionData; |
/** |
* Set the partition data returned by this object to the given data. |
@@ -5162,10 +5730,18 @@ class AnalysisContextStatisticsImpl implements AnalysisContextStatistics { |
_partitionData = data; |
} |
+ @override |
+ List<Source> get sources => _sources; |
+ |
+ void addSource(Source source) { |
+ _sources.add(source); |
+ } |
+ |
void _internalPutCacheItem(Source source, SourceEntry dartEntry, |
- DataDescriptor rowDesc, CacheState state) { |
+ DataDescriptor rowDesc, CacheState state) { |
String rowName = rowDesc.toString(); |
- AnalysisContextStatisticsImpl_CacheRowImpl row = _dataMap[rowName] as AnalysisContextStatisticsImpl_CacheRowImpl; |
+ AnalysisContextStatisticsImpl_CacheRowImpl row = |
+ _dataMap[rowName] as AnalysisContextStatisticsImpl_CacheRowImpl; |
if (row == null) { |
row = new AnalysisContextStatisticsImpl_CacheRowImpl(rowName); |
_dataMap[rowName] = row; |
@@ -5180,7 +5756,8 @@ class AnalysisContextStatisticsImpl implements AnalysisContextStatistics { |
} |
} |
-class AnalysisContextStatisticsImpl_CacheRowImpl implements AnalysisContextStatistics_CacheRow { |
+class AnalysisContextStatisticsImpl_CacheRowImpl implements |
+ AnalysisContextStatistics_CacheRow { |
final String name; |
Map<CacheState, int> _counts = <CacheState, int>{}; |
@@ -5188,15 +5765,15 @@ class AnalysisContextStatisticsImpl_CacheRowImpl implements AnalysisContextStati |
AnalysisContextStatisticsImpl_CacheRowImpl(this.name); |
@override |
- bool operator ==(Object obj) => obj is AnalysisContextStatisticsImpl_CacheRowImpl && obj.name == name; |
- |
- @override |
int get errorCount => getCount(CacheState.ERROR); |
@override |
int get flushedCount => getCount(CacheState.FLUSHED); |
@override |
+ int get hashCode => name.hashCode; |
+ |
+ @override |
int get inProcessCount => getCount(CacheState.IN_PROCESS); |
@override |
@@ -5206,7 +5783,8 @@ class AnalysisContextStatisticsImpl_CacheRowImpl implements AnalysisContextStati |
int get validCount => getCount(CacheState.VALID); |
@override |
- int get hashCode => name.hashCode; |
+ bool operator ==(Object obj) => |
+ obj is AnalysisContextStatisticsImpl_CacheRowImpl && obj.name == name; |
@override |
int getCount(CacheState state) { |
@@ -5227,108 +5805,48 @@ class AnalysisContextStatisticsImpl_CacheRowImpl implements AnalysisContextStati |
} |
} |
-class AnalysisContextStatisticsImpl_PartitionDataImpl implements AnalysisContextStatistics_PartitionData { |
+class AnalysisContextStatisticsImpl_PartitionDataImpl implements |
+ AnalysisContextStatistics_PartitionData { |
final int astCount; |
final int totalCount; |
- AnalysisContextStatisticsImpl_PartitionDataImpl(this.astCount, this.totalCount); |
+ AnalysisContextStatisticsImpl_PartitionDataImpl(this.astCount, |
+ this.totalCount); |
} |
/** |
- * Information about single piece of data in the cache. |
+ * Instances of the class `AnalysisDelta` indicate changes to the types of analysis that |
+ * should be performed. |
*/ |
-abstract class AnalysisContextStatistics_CacheRow { |
+class AnalysisDelta { |
/** |
- * List of possible states which can be queried. |
+ * A mapping from source to what type of analysis should be performed on that source. |
*/ |
- static const List<CacheState> STATES = const <CacheState>[ |
- CacheState.ERROR, CacheState.FLUSHED, CacheState.IN_PROCESS, |
- CacheState.INVALID, CacheState.VALID]; |
+ HashMap<Source, AnalysisLevel> _analysisMap = |
+ new HashMap<Source, AnalysisLevel>(); |
/** |
- * Return the number of entries whose state is [state]. |
+ * Return a collection of the sources that have been added. This is equivalent to calling |
+ * [getAnalysisLevels] and collecting all sources that do not have an analysis level of |
+ * [AnalysisLevel.NONE]. |
+ * |
+ * @return a collection of the sources |
*/ |
- int getCount(CacheState state); |
+ List<Source> get addedSources { |
+ List<Source> result = new List<Source>(); |
+ _analysisMap.forEach((Source source, AnalysisLevel level) { |
+ if (level != AnalysisLevel.NONE) { |
+ result.add(source); |
+ } |
+ }); |
+ return result; |
+ } |
/** |
- * Return the number of entries whose state is [CacheState.ERROR]. |
- */ |
- int get errorCount; |
- |
- /** |
- * Return the number of entries whose state is [CacheState.FLUSHED]. |
- */ |
- int get flushedCount; |
- |
- /** |
- * Return the number of entries whose state is [CacheState.IN_PROCESS]. |
- */ |
- int get inProcessCount; |
- |
- /** |
- * Return the number of entries whose state is [CacheState.INVALID]. |
- */ |
- int get invalidCount; |
- |
- /** |
- * Return the name of the data represented by this object. |
- */ |
- String get name; |
- |
- /** |
- * Return the number of entries whose state is [CacheState.VALID]. |
- */ |
- int get validCount; |
-} |
- |
-/** |
- * Information about a single partition in the cache. |
- */ |
-abstract class AnalysisContextStatistics_PartitionData { |
- /** |
- * Return the number of entries in the partition that have an AST structure in one state or |
- * another. |
- */ |
- int get astCount; |
- |
- /** |
- * Return the total number of entries in the partition. |
- */ |
- int get totalCount; |
-} |
- |
-/** |
- * Instances of the class `AnalysisDelta` indicate changes to the types of analysis that |
- * should be performed. |
- */ |
-class AnalysisDelta { |
- /** |
- * A mapping from source to what type of analysis should be performed on that source. |
- */ |
- HashMap<Source, AnalysisLevel> _analysisMap = new HashMap<Source, AnalysisLevel>(); |
- |
- /** |
- * Return a collection of the sources that have been added. This is equivalent to calling |
- * [getAnalysisLevels] and collecting all sources that do not have an analysis level of |
- * [AnalysisLevel.NONE]. |
- * |
- * @return a collection of the sources |
- */ |
- List<Source> get addedSources { |
- List<Source> result = new List<Source>(); |
- _analysisMap.forEach((Source source, AnalysisLevel level) { |
- if (level != AnalysisLevel.NONE) { |
- result.add(source); |
- } |
- }); |
- return result; |
- } |
- |
- /** |
- * Return a mapping of sources to the level of analysis that should be performed. |
- * |
- * @return the analysis map |
+ * Return a mapping of sources to the level of analysis that should be performed. |
+ * |
+ * @return the analysis map |
*/ |
Map<Source, AnalysisLevel> get analysisLevels => _analysisMap; |
@@ -5346,7 +5864,8 @@ class AnalysisDelta { |
String toString() { |
StringBuffer buffer = new StringBuffer(); |
bool needsSeparator = _appendSources(buffer, false, AnalysisLevel.ALL); |
- needsSeparator = _appendSources(buffer, needsSeparator, AnalysisLevel.RESOLVED); |
+ needsSeparator = |
+ _appendSources(buffer, needsSeparator, AnalysisLevel.RESOLVED); |
_appendSources(buffer, needsSeparator, AnalysisLevel.NONE); |
return buffer.toString(); |
} |
@@ -5355,7 +5874,8 @@ class AnalysisDelta { |
* Appendto the given [builder] all sources with the given analysis [level], |
* prefixed with a label and a separator if [needsSeparator] is `true`. |
*/ |
- bool _appendSources(StringBuffer buffer, bool needsSeparator, AnalysisLevel level) { |
+ bool _appendSources(StringBuffer buffer, bool needsSeparator, |
+ AnalysisLevel level) { |
bool first = true; |
_analysisMap.forEach((Source source, AnalysisLevel sourceLevel) { |
if (sourceLevel == level) { |
@@ -5409,33 +5929,6 @@ class AnalysisEngine { |
static AnalysisEngine get instance => _UniqueInstance; |
/** |
- * Return `true` if the given file name is assumed to contain Dart source code. |
- * |
- * @param fileName the name of the file being tested |
- * @return `true` if the given file name is assumed to contain Dart source code |
- */ |
- static bool isDartFileName(String fileName) { |
- if (fileName == null) { |
- return false; |
- } |
- return javaStringEqualsIgnoreCase(FileNameUtilities.getExtension(fileName), SUFFIX_DART); |
- } |
- |
- /** |
- * Return `true` if the given file name is assumed to contain HTML. |
- * |
- * @param fileName the name of the file being tested |
- * @return `true` if the given file name is assumed to contain HTML |
- */ |
- static bool isHtmlFileName(String fileName) { |
- if (fileName == null) { |
- return false; |
- } |
- String extension = FileNameUtilities.getExtension(fileName); |
- return javaStringEqualsIgnoreCase(extension, SUFFIX_HTML) || javaStringEqualsIgnoreCase(extension, SUFFIX_HTM); |
- } |
- |
- /** |
* The logger that should receive information about errors within the analysis engine. |
*/ |
Logger _logger = Logger.NULL; |
@@ -5457,6 +5950,24 @@ class AnalysisEngine { |
bool strictUnionTypes = false; |
/** |
+ * Return the logger that should receive information about errors within the analysis engine. |
+ * |
+ * @return the logger that should receive information about errors within the analysis engine |
+ */ |
+ Logger get logger => _logger; |
+ |
+ /** |
+ * Set the logger that should receive information about errors within the analysis engine to the |
+ * given logger. |
+ * |
+ * @param logger the logger that should receive information about errors within the analysis |
+ * engine |
+ */ |
+ void set logger(Logger logger) { |
+ this._logger = logger == null ? Logger.NULL : logger; |
+ } |
+ |
+ /** |
* Clear any caches holding on to analysis results so that a full re-analysis will be performed |
* the next time an analysis context is created. |
*/ |
@@ -5471,7 +5982,8 @@ class AnalysisEngine { |
*/ |
AnalysisContext createAnalysisContext() { |
// |
- // If instrumentation is ignoring data, return an uninstrumented analysis context. |
+ // If instrumentation is ignoring data, return an uninstrumented analysis |
+ // context. |
// |
if (Instrumentation.isNullLogger) { |
return new AnalysisContextImpl(); |
@@ -5480,21 +5992,33 @@ class AnalysisEngine { |
} |
/** |
- * Return the logger that should receive information about errors within the analysis engine. |
+ * Return `true` if the given file name is assumed to contain Dart source code. |
* |
- * @return the logger that should receive information about errors within the analysis engine |
+ * @param fileName the name of the file being tested |
+ * @return `true` if the given file name is assumed to contain Dart source code |
*/ |
- Logger get logger => _logger; |
+ static bool isDartFileName(String fileName) { |
+ if (fileName == null) { |
+ return false; |
+ } |
+ return javaStringEqualsIgnoreCase( |
+ FileNameUtilities.getExtension(fileName), |
+ SUFFIX_DART); |
+ } |
/** |
- * Set the logger that should receive information about errors within the analysis engine to the |
- * given logger. |
+ * Return `true` if the given file name is assumed to contain HTML. |
* |
- * @param logger the logger that should receive information about errors within the analysis |
- * engine |
+ * @param fileName the name of the file being tested |
+ * @return `true` if the given file name is assumed to contain HTML |
*/ |
- void set logger(Logger logger) { |
- this._logger = logger == null ? Logger.NULL : logger; |
+ static bool isHtmlFileName(String fileName) { |
+ if (fileName == null) { |
+ return false; |
+ } |
+ String extension = FileNameUtilities.getExtension(fileName); |
+ return javaStringEqualsIgnoreCase(extension, SUFFIX_HTML) || |
+ javaStringEqualsIgnoreCase(extension, SUFFIX_HTM); |
} |
} |
@@ -5595,7 +6119,8 @@ abstract class AnalysisListener { |
* @param errors the errors that were computed |
* @param lineInfo the line information associated with the source |
*/ |
- void computedErrors(AnalysisContext context, Source source, List<AnalysisError> errors, LineInfo lineInfo); |
+ void computedErrors(AnalysisContext context, Source source, |
+ List<AnalysisError> errors, LineInfo lineInfo); |
/** |
* Reports that the given source is no longer included in the set of sources that are being |
@@ -5640,7 +6165,8 @@ abstract class AnalysisListener { |
* @param source the source that was resolved |
* @param unit the result of resolving the source in the given context |
*/ |
- void resolvedDart(AnalysisContext context, Source source, CompilationUnit unit); |
+ void resolvedDart(AnalysisContext context, Source source, |
+ CompilationUnit unit); |
/** |
* Reports that the given HTML source was resolved in the given context. |
@@ -5905,7 +6431,8 @@ class AnalysisResult { |
* @param taskClassName the name of the class of the task that was performed |
* @param performTime the number of milliseconds required to perform the task |
*/ |
- AnalysisResult(this._notices, this.getTime, this.taskClassName, this.performTime); |
+ AnalysisResult(this._notices, this.getTime, this.taskClassName, |
+ this.performTime); |
/** |
* Return the change notices associated with this result, or `null` if there were no changes |
@@ -5947,6 +6474,21 @@ abstract class AnalysisTask { |
AnalysisTask(this.context); |
/** |
+ * Return the exception that was thrown while performing this task, or `null` if the task |
+ * completed successfully. |
+ * |
+ * @return the exception that was thrown while performing this task |
+ */ |
+ CaughtException get exception => _thrownException; |
+ |
+ /** |
+ * Return a textual description of this task. |
+ * |
+ * @return a textual description of this task |
+ */ |
+ String get taskDescription; |
+ |
+ /** |
* Use the given visitor to visit this task. |
* |
* @param visitor the visitor that should be used to visit this task |
@@ -5956,12 +6498,11 @@ abstract class AnalysisTask { |
accept(AnalysisTaskVisitor visitor); |
/** |
- * Return the exception that was thrown while performing this task, or `null` if the task |
- * completed successfully. |
+ * Perform this analysis task, protected by an exception handler. |
* |
- * @return the exception that was thrown while performing this task |
+ * @throws AnalysisException if an exception occurs while performing the task |
*/ |
- CaughtException get exception => _thrownException; |
+ void internalPerform(); |
/** |
* Perform this analysis task and use the given visitor to visit this task after it has completed. |
@@ -5986,20 +6527,6 @@ abstract class AnalysisTask { |
String toString() => taskDescription; |
/** |
- * Return a textual description of this task. |
- * |
- * @return a textual description of this task |
- */ |
- String get taskDescription; |
- |
- /** |
- * Perform this analysis task, protected by an exception handler. |
- * |
- * @throws AnalysisException if an exception occurs while performing the task |
- */ |
- void internalPerform(); |
- |
- /** |
* Perform this analysis task, ensuring that all exceptions are wrapped in an |
* [AnalysisException]. |
* |
@@ -6011,7 +6538,9 @@ abstract class AnalysisTask { |
} on AnalysisException catch (exception) { |
throw exception; |
} catch (exception, stackTrace) { |
- throw new AnalysisException(exception.toString(), new CaughtException(exception, stackTrace)); |
+ throw new AnalysisException( |
+ exception.toString(), |
+ new CaughtException(exception, stackTrace)); |
} |
} |
} |
@@ -6050,7 +6579,8 @@ abstract class AnalysisTaskVisitor<E> { |
* Visit the given [task], returning the result of the visit. This method will |
* throw an AnalysisException if the visitor throws an exception. |
*/ |
- E visitIncrementalAnalysisTask(IncrementalAnalysisTask incrementalAnalysisTask); |
+ E |
+ visitIncrementalAnalysisTask(IncrementalAnalysisTask incrementalAnalysisTask); |
/** |
* Visit the given [task], returning the result of the visit. This method will |
@@ -6080,7 +6610,8 @@ abstract class AnalysisTaskVisitor<E> { |
* Visit the given [task], returning the result of the visit. This method will |
* throw an AnalysisException if the visitor throws an exception. |
*/ |
- E visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task); |
+ E |
+ visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemplateTask task); |
/** |
* Visit the given [task], returning the result of the visit. This method will |
@@ -6230,156 +6761,52 @@ class AngularFormatterNode { |
class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
static String _NG_APP = "ng-app"; |
- /** |
- * Checks if given [Element] is an artificial local variable and returns corresponding |
- * [AngularElement], or `null` otherwise. |
- */ |
- static AngularElement getAngularElement(Element element) { |
- // may be artificial local variable, replace with AngularElement |
- if (element is LocalVariableElement) { |
- LocalVariableElement local = element; |
- List<ToolkitObjectElement> toolkitObjects = local.toolkitObjects; |
- if (toolkitObjects.length == 1 && toolkitObjects[0] is AngularElement) { |
- return toolkitObjects[0] as AngularElement; |
- } |
- } |
- // not a special Element |
- return null; |
- } |
+ final InternalAnalysisContext _context; |
- /** |
- * @return `true` if the given [HtmlUnit] has <code>ng-app</code> annotation. |
- */ |
- static bool hasAngularAnnotation(ht.HtmlUnit htmlUnit) { |
- try { |
- htmlUnit.accept(new RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation()); |
- } on AngularHtmlUnitResolver_FoundAppError catch (e) { |
- return true; |
- } |
- return false; |
- } |
+ TypeProvider _typeProvider; |
- static SimpleIdentifier _createIdentifier(String name, int offset) { |
- StringToken token = _createStringToken(name, offset); |
- return new SimpleIdentifier(token); |
+ AngularHtmlUnitResolver_FilteringAnalysisErrorListener _errorListener; |
+ |
+ final Source _source; |
+ |
+ final LineInfo _lineInfo; |
+ |
+ final ht.HtmlUnit _unit; |
+ |
+ List<AngularElement> _angularElements; |
+ |
+ List<NgProcessor> _processors = <NgProcessor>[]; |
+ |
+ LibraryElementImpl _libraryElement; |
+ |
+ CompilationUnitElementImpl _unitElement; |
+ |
+ FunctionElementImpl _functionElement; |
+ |
+ ResolverVisitor _resolver; |
+ |
+ bool _isAngular = false; |
+ |
+ List<LocalVariableElementImpl> _definedVariables = <LocalVariableElementImpl>[ |
+ ]; |
+ |
+ Set<LibraryElement> _injectedLibraries = new Set(); |
+ |
+ Scope _topNameScope; |
+ |
+ Scope _nameScope; |
+ |
+ AngularHtmlUnitResolver(this._context, AnalysisErrorListener errorListener, |
+ this._source, this._lineInfo, this._unit) { |
+ this._typeProvider = _context.typeProvider; |
+ this._errorListener = |
+ new AngularHtmlUnitResolver_FilteringAnalysisErrorListener(errorListener); |
} |
/** |
- * Adds [AngularElement] declared by the given top-level [Element]. |
- * |
- * @param angularElements the list to fill with top-level [AngularElement]s |
- * @param classElement the [ClassElement] to get [AngularElement]s from |
+ * @return the [TypeProvider] of the [AnalysisContext]. |
*/ |
- static void _addAngularElementsFromClass(Set<AngularElement> angularElements, ClassElement classElement) { |
- for (ToolkitObjectElement toolkitObject in classElement.toolkitObjects) { |
- if (toolkitObject is AngularElement) { |
- angularElements.add(toolkitObject); |
- } |
- } |
- } |
- |
- /** |
- * Returns the array of all top-level Angular elements that could be used in this library. |
- * |
- * @param libraryElement the [LibraryElement] to analyze |
- * @return the array of all top-level Angular elements that could be used in this library |
- */ |
- static void _addAngularElementsFromLibrary(Set<AngularElement> angularElements, LibraryElement library, Set<LibraryElement> visited) { |
- if (library == null) { |
- return; |
- } |
- if (!visited.add(library)) { |
- return; |
- } |
- // add Angular elements from current library |
- for (CompilationUnitElement unit in library.units) { |
- angularElements.addAll(unit.angularViews); |
- for (ClassElement type in unit.types) { |
- _addAngularElementsFromClass(angularElements, type); |
- } |
- } |
- // handle imports |
- for (ImportElement importElement in library.imports) { |
- LibraryElement importedLibrary = importElement.importedLibrary; |
- _addAngularElementsFromLibrary(angularElements, importedLibrary, visited); |
- } |
- } |
- |
- static StringToken _createStringToken(String name, int offset) => new StringToken(TokenType.IDENTIFIER, name, offset); |
- |
- /** |
- * Returns the array of all top-level Angular elements that could be used in this library. |
- * |
- * @param libraryElement the [LibraryElement] to analyze |
- * @return the array of all top-level Angular elements that could be used in this library |
- */ |
- static List<AngularElement> _getAngularElements(Set<LibraryElement> libraries, LibraryElement libraryElement) { |
- Set<AngularElement> angularElements = new Set(); |
- _addAngularElementsFromLibrary(angularElements, libraryElement, libraries); |
- return new List.from(angularElements); |
- } |
- |
- /** |
- * Returns the external Dart [CompilationUnit] referenced by the given [HtmlUnit]. |
- */ |
- static CompilationUnit _getDartUnit(AnalysisContext context, ht.HtmlUnit unit) { |
- for (HtmlScriptElement script in unit.element.scripts) { |
- if (script is ExternalHtmlScriptElement) { |
- Source scriptSource = script.scriptSource; |
- if (scriptSource != null) { |
- return context.resolveCompilationUnit2(scriptSource, scriptSource); |
- } |
- } |
- } |
- return null; |
- } |
- |
- static Set<Source> _getLibrarySources(Set<LibraryElement> libraries) { |
- Set<Source> sources = new Set(); |
- for (LibraryElement library in libraries) { |
- sources.add(library.source); |
- } |
- return sources; |
- } |
- |
- final InternalAnalysisContext _context; |
- |
- TypeProvider _typeProvider; |
- |
- AngularHtmlUnitResolver_FilteringAnalysisErrorListener _errorListener; |
- |
- final Source _source; |
- |
- final LineInfo _lineInfo; |
- |
- final ht.HtmlUnit _unit; |
- |
- List<AngularElement> _angularElements; |
- |
- List<NgProcessor> _processors = <NgProcessor>[]; |
- |
- LibraryElementImpl _libraryElement; |
- |
- CompilationUnitElementImpl _unitElement; |
- |
- FunctionElementImpl _functionElement; |
- |
- ResolverVisitor _resolver; |
- |
- bool _isAngular = false; |
- |
- List<LocalVariableElementImpl> _definedVariables = <LocalVariableElementImpl>[]; |
- |
- Set<LibraryElement> _injectedLibraries = new Set(); |
- |
- Scope _topNameScope; |
- |
- Scope _nameScope; |
- |
- AngularHtmlUnitResolver(this._context, AnalysisErrorListener errorListener, this._source, this._lineInfo, this._unit) { |
- this._typeProvider = _context.typeProvider; |
- this._errorListener = new AngularHtmlUnitResolver_FilteringAnalysisErrorListener(errorListener); |
- } |
+ TypeProvider get typeProvider => _typeProvider; |
/** |
* The [AngularApplication] for the Web application with this entry point, may be |
@@ -6398,7 +6825,8 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
// prepare accessible Angular elements |
LibraryElement libraryElement = dartUnit.element.library; |
Set<LibraryElement> libraries = new Set(); |
- List<AngularElement> angularElements = _getAngularElements(libraries, libraryElement); |
+ List<AngularElement> angularElements = |
+ _getAngularElements(libraries, libraryElement); |
// resolve AngularComponentElement template URIs |
// TODO(scheglov) resolve to HtmlElement to allow F3 ? |
Set<Source> angularElementsSources = new Set(); |
@@ -6411,11 +6839,19 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
continue; |
} |
try { |
- Source templateSource = _context.sourceFactory.forUri2(_source.resolveRelativeUri(parseUriWithException(templateUri))); |
+ Source templateSource = _context.sourceFactory.forUri2( |
+ _source.resolveRelativeUri(parseUriWithException(templateUri))); |
if (!_context.exists(templateSource)) { |
- templateSource = _context.sourceFactory.resolveUri(_source, "package:$templateUri"); |
+ templateSource = |
+ _context.sourceFactory.resolveUri(_source, "package:$templateUri"); |
if (!_context.exists(templateSource)) { |
- _errorListener.onError(new AnalysisError.con2(angularElement.source, hasTemplate.templateUriOffset, templateUri.length, AngularCode.URI_DOES_NOT_EXIST, [templateUri])); |
+ _errorListener.onError( |
+ new AnalysisError.con2( |
+ angularElement.source, |
+ hasTemplate.templateUriOffset, |
+ templateUri.length, |
+ AngularCode.URI_DOES_NOT_EXIST, |
+ [templateUri])); |
continue; |
} |
} |
@@ -6429,12 +6865,22 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
hasTemplate.templateSource = templateSource; |
} |
} on URISyntaxException catch (exception) { |
- _errorListener.onError(new AnalysisError.con2(angularElement.source, hasTemplate.templateUriOffset, templateUri.length, AngularCode.INVALID_URI, [templateUri])); |
+ _errorListener.onError( |
+ new AnalysisError.con2( |
+ angularElement.source, |
+ hasTemplate.templateUriOffset, |
+ templateUri.length, |
+ AngularCode.INVALID_URI, |
+ [templateUri])); |
} |
} |
} |
// create AngularApplication |
- AngularApplication application = new AngularApplication(_source, _getLibrarySources(libraries), angularElements, new List.from(angularElementsSources)); |
+ AngularApplication application = new AngularApplication( |
+ _source, |
+ _getLibrarySources(libraries), |
+ angularElements, |
+ new List.from(angularElementsSources)); |
// set AngularApplication for each AngularElement |
for (AngularElement angularElement in angularElements) { |
(angularElement as AngularElementImpl).application = application; |
@@ -6449,7 +6895,8 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
* @param application the Angular application we are resolving for |
* @param component the [AngularComponentElement] to resolve template for, not `null` |
*/ |
- void resolveComponentTemplate(AngularApplication application, AngularComponentElement component) { |
+ void resolveComponentTemplate(AngularApplication application, |
+ AngularComponentElement component) { |
_isAngular = true; |
_resolveInternal(application.elements, component); |
} |
@@ -6504,14 +6951,36 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
} |
/** |
+ * Puts into [libraryElement] an artificial [LibraryElementImpl] for this HTML |
+ * [Source]. |
+ */ |
+ void _createLibraryElement() { |
+ // create CompilationUnitElementImpl |
+ String unitName = _source.shortName; |
+ _unitElement = new CompilationUnitElementImpl(unitName); |
+ _unitElement.source = _source; |
+ // create LibraryElementImpl |
+ _libraryElement = |
+ new LibraryElementImpl.forNode(_context.getContextFor(_source), null); |
+ _libraryElement.definingCompilationUnit = _unitElement; |
+ _libraryElement.angularHtml = true; |
+ _injectedLibraries.add(_libraryElement); |
+ // create FunctionElementImpl |
+ _functionElement = new FunctionElementImpl.forOffset(0); |
+ _unitElement.functions = <FunctionElement>[_functionElement]; |
+ } |
+ |
+ /** |
* Creates new [LocalVariableElementImpl] with given type and identifier. |
* |
* @param type the [Type] of the variable |
* @param identifier the identifier to create variable for |
* @return the new [LocalVariableElementImpl] |
*/ |
- LocalVariableElementImpl _createLocalVariableFromIdentifier(DartType type, SimpleIdentifier identifier) { |
- LocalVariableElementImpl variable = new LocalVariableElementImpl.forNode(identifier); |
+ LocalVariableElementImpl _createLocalVariableFromIdentifier(DartType type, |
+ SimpleIdentifier identifier) { |
+ LocalVariableElementImpl variable = |
+ new LocalVariableElementImpl.forNode(identifier); |
_definedVariables.add(variable); |
variable.type = type; |
return variable; |
@@ -6524,12 +6993,56 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
* @param name the name of the variable |
* @return the new [LocalVariableElementImpl] |
*/ |
- LocalVariableElementImpl _createLocalVariableWithName(DartType type, String name) { |
+ LocalVariableElementImpl _createLocalVariableWithName(DartType type, |
+ String name) { |
SimpleIdentifier identifier = _createIdentifier(name, 0); |
return _createLocalVariableFromIdentifier(type, identifier); |
} |
/** |
+ * Creates new [NgProcessor] for the given [AngularElement], maybe `null` if not |
+ * supported. |
+ */ |
+ NgProcessor _createProcessor(AngularElement element) { |
+ if (element is AngularComponentElement) { |
+ AngularComponentElement component = element; |
+ return new NgComponentElementProcessor(component); |
+ } |
+ if (element is AngularControllerElement) { |
+ AngularControllerElement controller = element; |
+ return new NgControllerElementProcessor(controller); |
+ } |
+ if (element is AngularDecoratorElement) { |
+ AngularDecoratorElement directive = element; |
+ return new NgDecoratorElementProcessor(directive); |
+ } |
+ return null; |
+ } |
+ |
+ /** |
+ * Puts into [resolver] an [ResolverVisitor] to resolve [Expression]s in |
+ * [source]. |
+ */ |
+ void _createResolver() { |
+ InheritanceManager inheritanceManager = |
+ new InheritanceManager(_libraryElement); |
+ _resolver = new ResolverVisitor.con2( |
+ _libraryElement, |
+ _source, |
+ _typeProvider, |
+ inheritanceManager, |
+ _errorListener); |
+ _topNameScope = _resolver.pushNameScope(); |
+ // add Scope variables - no type, no location, just to avoid warnings |
+ { |
+ DartType type = _typeProvider.dynamicType; |
+ _topNameScope.define(_createLocalVariableWithName(type, "\$id")); |
+ _topNameScope.define(_createLocalVariableWithName(type, "\$parent")); |
+ _topNameScope.define(_createLocalVariableWithName(type, "\$root")); |
+ } |
+ } |
+ |
+ /** |
* Declares the given [LocalVariableElementImpl] in the [topNameScope]. |
*/ |
void _defineTopVariable(LocalVariableElementImpl variable) { |
@@ -6539,6 +7052,31 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
} |
/** |
+ * Defines variable for the given [AngularElement] with type of the enclosing |
+ * [ClassElement]. |
+ */ |
+ void _defineTopVariable_forClassElement(AngularElement element) { |
+ ClassElement classElement = element.enclosingElement as ClassElement; |
+ InterfaceType type = classElement.type; |
+ LocalVariableElementImpl variable = |
+ _createLocalVariableWithName(type, element.name); |
+ _defineTopVariable(variable); |
+ variable.toolkitObjects = <AngularElement>[element]; |
+ } |
+ |
+ /** |
+ * Defines variable for the given [AngularScopePropertyElement]. |
+ */ |
+ void |
+ _defineTopVariable_forScopeProperty(AngularScopePropertyElement element) { |
+ DartType type = element.type; |
+ LocalVariableElementImpl variable = |
+ _createLocalVariableWithName(type, element.name); |
+ _defineTopVariable(variable); |
+ variable.toolkitObjects = <AngularElement>[element]; |
+ } |
+ |
+ /** |
* Declares the given [LocalVariableElementImpl] in the current [nameScope]. |
*/ |
void _defineVariable(LocalVariableElementImpl variable) { |
@@ -6560,14 +7098,10 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
} |
/** |
- * @return the [TypeProvider] of the [AnalysisContext]. |
- */ |
- TypeProvider get typeProvider => _typeProvider; |
- |
- /** |
* Parses given [String] as an [AngularExpression] at the given offset. |
*/ |
- AngularExpression _parseAngularExpression(String contents, int startIndex, int endIndex, int offset) { |
+ AngularExpression _parseAngularExpression(String contents, int startIndex, |
+ int endIndex, int offset) { |
Token token = _scanDart(contents, startIndex, endIndex, offset); |
return _parseAngularExpressionInToken(token); |
} |
@@ -6615,7 +7149,8 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
/** |
* Parses given [String] as an [Expression] at the given offset. |
*/ |
- Expression _parseDartExpression(String contents, int startIndex, int endIndex, int offset) { |
+ Expression _parseDartExpression(String contents, int startIndex, int endIndex, |
+ int offset) { |
Token token = _scanDart(contents, startIndex, endIndex, offset); |
return _parseDartExpressionInToken(token); |
} |
@@ -6625,6 +7160,88 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
return parser.parseExpression(token); |
} |
+ /** |
+ * Parse the value of the given token for embedded expressions, and add any embedded expressions |
+ * that are found to the given list of expressions. |
+ * |
+ * @param expressions the list to which embedded expressions are to be added |
+ * @param token the token whose value is to be parsed |
+ */ |
+ void |
+ _parseEmbeddedExpressions(List<AngularMoustacheXmlExpression> expressions, |
+ ht.Token token) { |
+ // prepare Token information |
+ String lexeme = token.lexeme; |
+ int offset = token.offset; |
+ // find expressions between {{ and }} |
+ int startIndex = StringUtilities.indexOf2( |
+ lexeme, |
+ 0, |
+ AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, |
+ AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR); |
+ while (startIndex >= 0) { |
+ int endIndex = StringUtilities.indexOf2( |
+ lexeme, |
+ startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH, |
+ AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR, |
+ AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR); |
+ if (endIndex < 0) { |
+ // TODO(brianwilkerson) Should we report this error or will it be |
+ // reported by something else? |
+ return; |
+ } else if (startIndex + |
+ AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH < |
+ endIndex) { |
+ startIndex += AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH; |
+ AngularExpression expression = |
+ _parseAngularExpression(lexeme, startIndex, endIndex, offset); |
+ expressions.add( |
+ new AngularMoustacheXmlExpression(startIndex, endIndex, expression)); |
+ } |
+ startIndex = StringUtilities.indexOf2( |
+ lexeme, |
+ endIndex + AngularMoustacheXmlExpression.CLOSING_DELIMITER_LENGTH, |
+ AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, |
+ AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR); |
+ } |
+ } |
+ |
+ void _parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) { |
+ List<AngularMoustacheXmlExpression> expressions = |
+ <AngularMoustacheXmlExpression>[ |
+ ]; |
+ _parseEmbeddedExpressions(expressions, node.valueToken); |
+ if (!expressions.isEmpty) { |
+ node.expressions = expressions; |
+ } |
+ } |
+ |
+ void _parseEmbeddedExpressionsInTag(ht.XmlTagNode node) { |
+ List<AngularMoustacheXmlExpression> expressions = |
+ <AngularMoustacheXmlExpression>[ |
+ ]; |
+ ht.Token token = node.attributeEnd; |
+ ht.Token endToken = node.endToken; |
+ bool inChild = false; |
+ while (!identical(token, endToken)) { |
+ for (ht.XmlTagNode child in node.tagNodes) { |
+ if (identical(token, child.beginToken)) { |
+ inChild = true; |
+ break; |
+ } |
+ if (identical(token, child.endToken)) { |
+ inChild = false; |
+ break; |
+ } |
+ } |
+ if (!inChild && token.type == ht.TokenType.TEXT) { |
+ _parseEmbeddedExpressions(expressions, token); |
+ } |
+ token = token.next; |
+ } |
+ node.expressions = expressions; |
+ } |
+ |
void _popNameScope() { |
_nameScope = _resolver.popNameScope(); |
} |
@@ -6633,24 +7250,41 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
_nameScope = _resolver.pushNameScope(); |
} |
+ void _recordDefinedVariable(LocalVariableElementImpl variable) { |
+ _definedVariables.add(variable); |
+ _functionElement.localVariables = new List.from(_definedVariables); |
+ } |
+ |
+ /** |
+ * When we inject variable, we give access to the library of its type. |
+ */ |
+ void _recordTypeLibraryInjected(LocalVariableElementImpl variable) { |
+ LibraryElement typeLibrary = variable.type.element.library; |
+ _injectedLibraries.add(typeLibrary); |
+ } |
+ |
/** |
* Reports given [ErrorCode] at the given [AstNode]. |
*/ |
- void _reportErrorForNode(ErrorCode errorCode, AstNode node, [List<Object> arguments]) { |
+ void _reportErrorForNode(ErrorCode errorCode, AstNode node, |
+ [List<Object> arguments]) { |
_reportErrorForOffset(errorCode, node.offset, node.length, arguments); |
} |
/** |
* Reports given [ErrorCode] at the given position. |
*/ |
- void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, [List<Object> arguments]) { |
- _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments)); |
+ void _reportErrorForOffset(ErrorCode errorCode, int offset, int length, |
+ [List<Object> arguments]) { |
+ _errorListener.onError( |
+ new AnalysisError.con2(_source, offset, length, errorCode, arguments)); |
} |
/** |
* Reports given [ErrorCode] at the given [Token]. |
*/ |
- void _reportErrorForToken(ErrorCode errorCode, Token token, [List<Object> arguments]) { |
+ void _reportErrorForToken(ErrorCode errorCode, Token token, |
+ [List<Object> arguments]) { |
_reportErrorForOffset(errorCode, token.offset, token.length, arguments); |
} |
@@ -6661,183 +7295,25 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
} |
} |
- /** |
- * Resolves given [AstNode] using [resolver]. |
- */ |
- void _resolveNode(AstNode node) { |
- node.accept(_resolver); |
+ void _resolveExpressions(List<ht.XmlExpression> expressions) { |
+ for (ht.XmlExpression xmlExpression in expressions) { |
+ if (xmlExpression is AngularXmlExpression) { |
+ AngularXmlExpression angularXmlExpression = xmlExpression; |
+ _resolveXmlExpression(angularXmlExpression); |
+ } |
+ } |
} |
- Token _scanDart(String contents, int startIndex, int endIndex, int offset) => ht.HtmlParser.scanDartSource(_source, _lineInfo, contents.substring(startIndex, endIndex), offset + startIndex, _errorListener); |
- |
/** |
- * Puts into [libraryElement] an artificial [LibraryElementImpl] for this HTML |
- * [Source]. |
+ * Resolves Angular specific expressions and elements in the [source]. |
+ * |
+ * @param angularElements the [AngularElement]s accessible in the component's library, not |
+ * `null` |
+ * @param component the [AngularComponentElement] to resolve template for, maybe |
+ * `null` if not a component template |
*/ |
- void _createLibraryElement() { |
- // create CompilationUnitElementImpl |
- String unitName = _source.shortName; |
- _unitElement = new CompilationUnitElementImpl(unitName); |
- _unitElement.source = _source; |
- // create LibraryElementImpl |
- _libraryElement = new LibraryElementImpl.forNode(_context.getContextFor(_source), null); |
- _libraryElement.definingCompilationUnit = _unitElement; |
- _libraryElement.angularHtml = true; |
- _injectedLibraries.add(_libraryElement); |
- // create FunctionElementImpl |
- _functionElement = new FunctionElementImpl.forOffset(0); |
- _unitElement.functions = <FunctionElement> [_functionElement]; |
- } |
- |
- /** |
- * Creates new [NgProcessor] for the given [AngularElement], maybe `null` if not |
- * supported. |
- */ |
- NgProcessor _createProcessor(AngularElement element) { |
- if (element is AngularComponentElement) { |
- AngularComponentElement component = element; |
- return new NgComponentElementProcessor(component); |
- } |
- if (element is AngularControllerElement) { |
- AngularControllerElement controller = element; |
- return new NgControllerElementProcessor(controller); |
- } |
- if (element is AngularDecoratorElement) { |
- AngularDecoratorElement directive = element; |
- return new NgDecoratorElementProcessor(directive); |
- } |
- return null; |
- } |
- |
- /** |
- * Puts into [resolver] an [ResolverVisitor] to resolve [Expression]s in |
- * [source]. |
- */ |
- void _createResolver() { |
- InheritanceManager inheritanceManager = new InheritanceManager(_libraryElement); |
- _resolver = new ResolverVisitor.con2(_libraryElement, _source, _typeProvider, inheritanceManager, _errorListener); |
- _topNameScope = _resolver.pushNameScope(); |
- // add Scope variables - no type, no location, just to avoid warnings |
- { |
- DartType type = _typeProvider.dynamicType; |
- _topNameScope.define(_createLocalVariableWithName(type, "\$id")); |
- _topNameScope.define(_createLocalVariableWithName(type, "\$parent")); |
- _topNameScope.define(_createLocalVariableWithName(type, "\$root")); |
- } |
- } |
- |
- /** |
- * Defines variable for the given [AngularElement] with type of the enclosing |
- * [ClassElement]. |
- */ |
- void _defineTopVariable_forClassElement(AngularElement element) { |
- ClassElement classElement = element.enclosingElement as ClassElement; |
- InterfaceType type = classElement.type; |
- LocalVariableElementImpl variable = _createLocalVariableWithName(type, element.name); |
- _defineTopVariable(variable); |
- variable.toolkitObjects = <AngularElement> [element]; |
- } |
- |
- /** |
- * Defines variable for the given [AngularScopePropertyElement]. |
- */ |
- void _defineTopVariable_forScopeProperty(AngularScopePropertyElement element) { |
- DartType type = element.type; |
- LocalVariableElementImpl variable = _createLocalVariableWithName(type, element.name); |
- _defineTopVariable(variable); |
- variable.toolkitObjects = <AngularElement> [element]; |
- } |
- |
- /** |
- * Parse the value of the given token for embedded expressions, and add any embedded expressions |
- * that are found to the given list of expressions. |
- * |
- * @param expressions the list to which embedded expressions are to be added |
- * @param token the token whose value is to be parsed |
- */ |
- void _parseEmbeddedExpressions(List<AngularMoustacheXmlExpression> expressions, ht.Token token) { |
- // prepare Token information |
- String lexeme = token.lexeme; |
- int offset = token.offset; |
- // find expressions between {{ and }} |
- int startIndex = StringUtilities.indexOf2(lexeme, 0, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR); |
- while (startIndex >= 0) { |
- int endIndex = StringUtilities.indexOf2(lexeme, startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH, AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR, AngularMoustacheXmlExpression.CLOSING_DELIMITER_CHAR); |
- if (endIndex < 0) { |
- // TODO(brianwilkerson) Should we report this error or will it be reported by something else? |
- return; |
- } else if (startIndex + AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH < endIndex) { |
- startIndex += AngularMoustacheXmlExpression.OPENING_DELIMITER_LENGTH; |
- AngularExpression expression = _parseAngularExpression(lexeme, startIndex, endIndex, offset); |
- expressions.add(new AngularMoustacheXmlExpression(startIndex, endIndex, expression)); |
- } |
- startIndex = StringUtilities.indexOf2(lexeme, endIndex + AngularMoustacheXmlExpression.CLOSING_DELIMITER_LENGTH, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR, AngularMoustacheXmlExpression.OPENING_DELIMITER_CHAR); |
- } |
- } |
- |
- void _parseEmbeddedExpressionsInAttribute(ht.XmlAttributeNode node) { |
- List<AngularMoustacheXmlExpression> expressions = <AngularMoustacheXmlExpression>[]; |
- _parseEmbeddedExpressions(expressions, node.valueToken); |
- if (!expressions.isEmpty) { |
- node.expressions = expressions; |
- } |
- } |
- |
- void _parseEmbeddedExpressionsInTag(ht.XmlTagNode node) { |
- List<AngularMoustacheXmlExpression> expressions = <AngularMoustacheXmlExpression>[]; |
- ht.Token token = node.attributeEnd; |
- ht.Token endToken = node.endToken; |
- bool inChild = false; |
- while (!identical(token, endToken)) { |
- for (ht.XmlTagNode child in node.tagNodes) { |
- if (identical(token, child.beginToken)) { |
- inChild = true; |
- break; |
- } |
- if (identical(token, child.endToken)) { |
- inChild = false; |
- break; |
- } |
- } |
- if (!inChild && token.type == ht.TokenType.TEXT) { |
- _parseEmbeddedExpressions(expressions, token); |
- } |
- token = token.next; |
- } |
- node.expressions = expressions; |
- } |
- |
- void _recordDefinedVariable(LocalVariableElementImpl variable) { |
- _definedVariables.add(variable); |
- _functionElement.localVariables = new List.from(_definedVariables); |
- } |
- |
- /** |
- * When we inject variable, we give access to the library of its type. |
- */ |
- void _recordTypeLibraryInjected(LocalVariableElementImpl variable) { |
- LibraryElement typeLibrary = variable.type.element.library; |
- _injectedLibraries.add(typeLibrary); |
- } |
- |
- void _resolveExpressions(List<ht.XmlExpression> expressions) { |
- for (ht.XmlExpression xmlExpression in expressions) { |
- if (xmlExpression is AngularXmlExpression) { |
- AngularXmlExpression angularXmlExpression = xmlExpression; |
- _resolveXmlExpression(angularXmlExpression); |
- } |
- } |
- } |
- |
- /** |
- * Resolves Angular specific expressions and elements in the [source]. |
- * |
- * @param angularElements the [AngularElement]s accessible in the component's library, not |
- * `null` |
- * @param component the [AngularComponentElement] to resolve template for, maybe |
- * `null` if not a component template |
- */ |
- void _resolveInternal(List<AngularElement> angularElements, AngularComponentElement component) { |
+ void _resolveInternal(List<AngularElement> angularElements, |
+ AngularComponentElement component) { |
this._angularElements = angularElements; |
// add built-in processors |
_processors.add(NgModelProcessor.INSTANCE); |
@@ -6854,7 +7330,8 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
// maybe resolving component template |
if (component != null) { |
_defineTopVariable_forClassElement(component); |
- for (AngularScopePropertyElement scopeProperty in component.scopeProperties) { |
+ for (AngularScopePropertyElement scopeProperty in |
+ component.scopeProperties) { |
_defineTopVariable_forScopeProperty(scopeProperty); |
} |
} |
@@ -6885,11 +7362,26 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
} |
} |
+ /** |
+ * Resolves given [AstNode] using [resolver]. |
+ */ |
+ void _resolveNode(AstNode node) { |
+ node.accept(_resolver); |
+ } |
+ |
void _resolveXmlExpression(AngularXmlExpression angularXmlExpression) { |
AngularExpression angularExpression = angularXmlExpression.expression; |
_resolveExpression(angularExpression); |
} |
+ Token _scanDart(String contents, int startIndex, int endIndex, int offset) => |
+ ht.HtmlParser.scanDartSource( |
+ _source, |
+ _lineInfo, |
+ contents.substring(startIndex, endIndex), |
+ offset + startIndex, |
+ _errorListener); |
+ |
List<Token> _splitAtBar(Token token) { |
List<Token> tokens = <Token>[]; |
tokens.add(token); |
@@ -6910,11 +7402,131 @@ class AngularHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
* found [NG_APP] context. |
*/ |
void _visitModelDirectives(ht.XmlTagNode appNode) { |
- appNode.accept(new RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives(this)); |
+ appNode.accept(new _AngularHtmlUnitResolver_visitModelDirectives(this)); |
+ } |
+ |
+ /** |
+ * Checks if given [Element] is an artificial local variable and returns corresponding |
+ * [AngularElement], or `null` otherwise. |
+ */ |
+ static AngularElement getAngularElement(Element element) { |
+ // may be artificial local variable, replace with AngularElement |
+ if (element is LocalVariableElement) { |
+ LocalVariableElement local = element; |
+ List<ToolkitObjectElement> toolkitObjects = local.toolkitObjects; |
+ if (toolkitObjects.length == 1 && toolkitObjects[0] is AngularElement) { |
+ return toolkitObjects[0] as AngularElement; |
+ } |
+ } |
+ // not a special Element |
+ return null; |
+ } |
+ |
+ /** |
+ * @return `true` if the given [HtmlUnit] has <code>ng-app</code> annotation. |
+ */ |
+ static bool hasAngularAnnotation(ht.HtmlUnit htmlUnit) { |
+ try { |
+ htmlUnit.accept( |
+ new RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation()); |
+ } on AngularHtmlUnitResolver_FoundAppError catch (e) { |
+ return true; |
+ } |
+ return false; |
+ } |
+ |
+ /** |
+ * Adds [AngularElement] declared by the given top-level [Element]. |
+ * |
+ * @param angularElements the list to fill with top-level [AngularElement]s |
+ * @param classElement the [ClassElement] to get [AngularElement]s from |
+ */ |
+ static void _addAngularElementsFromClass(Set<AngularElement> angularElements, |
+ ClassElement classElement) { |
+ for (ToolkitObjectElement toolkitObject in classElement.toolkitObjects) { |
+ if (toolkitObject is AngularElement) { |
+ angularElements.add(toolkitObject); |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * Returns the array of all top-level Angular elements that could be used in this library. |
+ * |
+ * @param libraryElement the [LibraryElement] to analyze |
+ * @return the array of all top-level Angular elements that could be used in this library |
+ */ |
+ static void |
+ _addAngularElementsFromLibrary(Set<AngularElement> angularElements, |
+ LibraryElement library, Set<LibraryElement> visited) { |
+ if (library == null) { |
+ return; |
+ } |
+ if (!visited.add(library)) { |
+ return; |
+ } |
+ // add Angular elements from current library |
+ for (CompilationUnitElement unit in library.units) { |
+ angularElements.addAll(unit.angularViews); |
+ for (ClassElement type in unit.types) { |
+ _addAngularElementsFromClass(angularElements, type); |
+ } |
+ } |
+ // handle imports |
+ for (ImportElement importElement in library.imports) { |
+ LibraryElement importedLibrary = importElement.importedLibrary; |
+ _addAngularElementsFromLibrary(angularElements, importedLibrary, visited); |
+ } |
+ } |
+ |
+ static SimpleIdentifier _createIdentifier(String name, int offset) { |
+ StringToken token = _createStringToken(name, offset); |
+ return new SimpleIdentifier(token); |
+ } |
+ |
+ static StringToken _createStringToken(String name, int offset) => |
+ new StringToken(TokenType.IDENTIFIER, name, offset); |
+ |
+ /** |
+ * Returns the array of all top-level Angular elements that could be used in this library. |
+ * |
+ * @param libraryElement the [LibraryElement] to analyze |
+ * @return the array of all top-level Angular elements that could be used in this library |
+ */ |
+ static List<AngularElement> _getAngularElements(Set<LibraryElement> libraries, |
+ LibraryElement libraryElement) { |
+ Set<AngularElement> angularElements = new Set(); |
+ _addAngularElementsFromLibrary(angularElements, libraryElement, libraries); |
+ return new List.from(angularElements); |
+ } |
+ |
+ /** |
+ * Returns the external Dart [CompilationUnit] referenced by the given [HtmlUnit]. |
+ */ |
+ static CompilationUnit _getDartUnit(AnalysisContext context, |
+ ht.HtmlUnit unit) { |
+ for (HtmlScriptElement script in unit.element.scripts) { |
+ if (script is ExternalHtmlScriptElement) { |
+ Source scriptSource = script.scriptSource; |
+ if (scriptSource != null) { |
+ return context.resolveCompilationUnit2(scriptSource, scriptSource); |
+ } |
+ } |
+ } |
+ return null; |
+ } |
+ |
+ static Set<Source> _getLibrarySources(Set<LibraryElement> libraries) { |
+ Set<Source> sources = new Set(); |
+ for (LibraryElement library in libraries) { |
+ sources.add(library.source); |
+ } |
+ return sources; |
} |
} |
-class AngularHtmlUnitResolver_FilteringAnalysisErrorListener implements AnalysisErrorListener { |
+class AngularHtmlUnitResolver_FilteringAnalysisErrorListener implements |
+ AnalysisErrorListener { |
final AnalysisErrorListener _listener; |
AngularHtmlUnitResolver_FilteringAnalysisErrorListener(this._listener); |
@@ -6922,7 +7534,9 @@ class AngularHtmlUnitResolver_FilteringAnalysisErrorListener implements Analysis |
@override |
void onError(AnalysisError error) { |
ErrorCode errorCode = error.errorCode; |
- if (identical(errorCode, StaticWarningCode.UNDEFINED_GETTER) || identical(errorCode, StaticWarningCode.UNDEFINED_IDENTIFIER) || identical(errorCode, StaticTypeWarningCode.UNDEFINED_GETTER)) { |
+ if (identical(errorCode, StaticWarningCode.UNDEFINED_GETTER) || |
+ identical(errorCode, StaticWarningCode.UNDEFINED_IDENTIFIER) || |
+ identical(errorCode, StaticTypeWarningCode.UNDEFINED_GETTER)) { |
return; |
} |
_listener.onError(error); |
@@ -6959,7 +7573,9 @@ class AngularMoustacheXmlExpression extends AngularXmlExpression { |
*/ |
final int _closingOffset; |
- AngularMoustacheXmlExpression(this._openingOffset, this._closingOffset, AngularExpression expression) : super(expression); |
+ AngularMoustacheXmlExpression(this._openingOffset, this._closingOffset, |
+ AngularExpression expression) |
+ : super(expression); |
@override |
int get end => _closingOffset + CLOSING_DELIMITER_LENGTH; |
@@ -7002,7 +7618,8 @@ abstract class AngularXmlExpression extends ht.XmlExpression { |
@override |
ht.XmlExpression_Reference getReference(int offset) { |
// main expression |
- ht.XmlExpression_Reference reference = _getReferenceAtNode(expression.expression, offset); |
+ ht.XmlExpression_Reference reference = |
+ _getReferenceAtNode(expression.expression, offset); |
if (reference != null) { |
return reference; |
} |
@@ -7039,8 +7656,34 @@ abstract class AngularXmlExpression extends ht.XmlExpression { |
} |
/** |
- * Instances of the class `CachePartition` implement a single partition in an LRU cache of |
- * information related to analysis. |
+ * A `CachedResult` is a single analysis result that is stored in a |
+ * [SourceEntry]. |
+ */ |
+class CachedResult<E> { |
+ /** |
+ * The state of the cached value. |
+ */ |
+ CacheState state; |
+ |
+ /** |
+ * The value being cached, or `null` if there is no value (for example, when |
+ * the [state] is [CacheState.INVALID]. |
+ */ |
+ E value; |
+ |
+ /** |
+ * Initialize a newly created result holder to represent the value of data |
+ * described by the given [descriptor]. |
+ */ |
+ CachedResult(DataDescriptor descriptor) { |
+ state = CacheState.INVALID; |
+ value = descriptor.defaultValue; |
+ } |
+} |
+ |
+/** |
+ * Instances of the class `CachePartition` implement a single partition in an LRU cache of |
+ * information related to analysis. |
*/ |
abstract class CachePartition { |
/** |
@@ -7088,40 +7731,6 @@ abstract class CachePartition { |
} |
/** |
- * Record that the AST associated with the given source was just read from the cache. |
- * |
- * @param source the source whose AST was accessed |
- */ |
- void accessedAst(Source source) { |
- if (_recentlyUsed.remove(source)) { |
- _recentlyUsed.add(source); |
- return; |
- } |
- while (_recentlyUsed.length >= _maxCacheSize) { |
- if (!_flushAstFromCache()) { |
- break; |
- } |
- } |
- _recentlyUsed.add(source); |
- } |
- |
- /** |
- * Return `true` if the given source is contained in this partition. |
- * |
- * @param source the source being tested |
- * @return `true` if the source is contained in this partition |
- */ |
- bool contains(Source source); |
- |
- /** |
- * Return the entry associated with the given source. |
- * |
- * @param source the source whose entry is to be returned |
- * @return the entry associated with the given source |
- */ |
- SourceEntry get(Source source) => _sourceMap[source]; |
- |
- /** |
* Return the number of entries in this partition that have an AST associated with them. |
* |
* @return the number of entries in this partition that have an AST associated with them |
@@ -7158,11 +7767,60 @@ abstract class CachePartition { |
Map<Source, SourceEntry> get map => _sourceMap; |
/** |
+ * Set the maximum size of the cache to the given size. |
+ * |
+ * @param size the maximum number of sources for which AST structures should be kept in the cache |
+ */ |
+ void set maxCacheSize(int size) { |
+ _maxCacheSize = size; |
+ while (_recentlyUsed.length > _maxCacheSize) { |
+ if (!_flushAstFromCache()) { |
+ break; |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * Record that the AST associated with the given source was just read from the cache. |
+ * |
+ * @param source the source whose AST was accessed |
+ */ |
+ void accessedAst(Source source) { |
+ if (_recentlyUsed.remove(source)) { |
+ _recentlyUsed.add(source); |
+ return; |
+ } |
+ while (_recentlyUsed.length >= _maxCacheSize) { |
+ if (!_flushAstFromCache()) { |
+ break; |
+ } |
+ } |
+ _recentlyUsed.add(source); |
+ } |
+ |
+ /** |
+ * Return `true` if the given source is contained in this partition. |
+ * |
+ * @param source the source being tested |
+ * @return `true` if the source is contained in this partition |
+ */ |
+ bool contains(Source source); |
+ |
+ /** |
+ * Return the entry associated with the given source. |
+ * |
+ * @param source the source whose entry is to be returned |
+ * @return the entry associated with the given source |
+ */ |
+ SourceEntry get(Source source) => _sourceMap[source]; |
+ |
+ /** |
* Return an iterator returning all of the map entries mapping sources to cache entries. |
* |
* @return an iterator returning all of the map entries mapping sources to cache entries |
*/ |
- MapIterator<Source, SourceEntry> iterator() => new SingleMapIterator<Source, SourceEntry>(_sourceMap); |
+ MapIterator<Source, SourceEntry> iterator() => |
+ new SingleMapIterator<Source, SourceEntry>(_sourceMap); |
/** |
* Associate the given entry with the given source. |
@@ -7195,20 +7853,6 @@ abstract class CachePartition { |
} |
/** |
- * Set the maximum size of the cache to the given size. |
- * |
- * @param size the maximum number of sources for which AST structures should be kept in the cache |
- */ |
- void set maxCacheSize(int size) { |
- _maxCacheSize = size; |
- while (_recentlyUsed.length > _maxCacheSize) { |
- if (!_flushAstFromCache()) { |
- break; |
- } |
- } |
- } |
- |
- /** |
* Return the number of sources that are mapped to cache entries. |
* |
* @return the number of sources that are mapped to cache entries |
@@ -7264,7 +7908,8 @@ abstract class CachePartition { |
int sourceToRemove = -1; |
for (int i = 0; i < _recentlyUsed.length; i++) { |
Source source = _recentlyUsed[i]; |
- RetentionPriority priority = _retentionPolicy.getAstPriority(source, _sourceMap[source]); |
+ RetentionPriority priority = |
+ _retentionPolicy.getAstPriority(source, _sourceMap[source]); |
if (priority == RetentionPriority.LOW) { |
return _recentlyUsed.removeAt(i); |
} else if (priority == RetentionPriority.MEDIUM && sourceToRemove < 0) { |
@@ -7272,9 +7917,10 @@ abstract class CachePartition { |
} |
} |
if (sourceToRemove < 0) { |
- // This happens if the retention policy returns a priority of HIGH for all of the sources that |
- // have been recently used. This is the case, for example, when the list of priority sources |
- // is bigger than the current cache size. |
+ // This happens if the retention policy returns a priority of HIGH for all |
+ // of the sources that have been recently used. This is the case, for |
+ // example, when the list of priority sources is bigger than the current |
+ // cache size. |
return null; |
} |
return _recentlyUsed.removeAt(sourceToRemove); |
@@ -7345,38 +7991,17 @@ class CacheState extends Enum<CacheState> { |
*/ |
static const CacheState VALID = const CacheState('VALID', 4); |
- static const List<CacheState> values = const [ERROR, FLUSHED, IN_PROCESS, INVALID, VALID]; |
+ static const List<CacheState> values = const [ |
+ ERROR, |
+ FLUSHED, |
+ IN_PROCESS, |
+ INVALID, |
+ VALID]; |
const CacheState(String name, int ordinal) : super(name, ordinal); |
} |
/** |
- * A `CachedResult` is a single analysis result that is stored in a |
- * [SourceEntry]. |
- */ |
-class CachedResult<E> { |
- /** |
- * The state of the cached value. |
- */ |
- CacheState state; |
- |
- /** |
- * The value being cached, or `null` if there is no value (for example, when |
- * the [state] is [CacheState.INVALID]. |
- */ |
- E value; |
- |
- /** |
- * Initialize a newly created result holder to represent the value of data |
- * described by the given [descriptor]. |
- */ |
- CachedResult(DataDescriptor descriptor) { |
- state = CacheState.INVALID; |
- value = descriptor.defaultValue; |
- } |
-} |
- |
-/** |
* The interface `ChangeNotice` defines the behavior of objects that represent a change to the |
* analysis results associated with a given source. |
*/ |
@@ -7411,6 +8036,11 @@ abstract class ChangeNotice implements AnalysisErrorInfo { |
*/ |
class ChangeNoticeImpl implements ChangeNotice { |
/** |
+ * An empty list of change notices. |
+ */ |
+ static const List<ChangeNoticeImpl> EMPTY_ARRAY = const <ChangeNoticeImpl>[]; |
+ |
+ /** |
* The source for which the result is being reported. |
*/ |
final Source source; |
@@ -7439,11 +8069,6 @@ class ChangeNoticeImpl implements ChangeNotice { |
LineInfo _lineInfo; |
/** |
- * An empty list of change notices. |
- */ |
- static const List<ChangeNoticeImpl> EMPTY_ARRAY = const <ChangeNoticeImpl>[]; |
- |
- /** |
* Initialize a newly created notice associated with the given source. |
* |
* @param source the source for which the change is being reported |
@@ -7508,7 +8133,8 @@ class ChangeSet { |
* A table mapping the sources whose content has been changed within a single range to the current |
* content of those sources and information about the affected range. |
*/ |
- final HashMap<Source, ChangeSet_ContentChange> changedRanges = new HashMap<Source, ChangeSet_ContentChange>(); |
+ final HashMap<Source, ChangeSet_ContentChange> changedRanges = |
+ new HashMap<Source, ChangeSet_ContentChange>(); |
/** |
* A list containing the sources that have been removed. |
@@ -7526,6 +8152,29 @@ class ChangeSet { |
final List<Source> deletedSources = new List<Source>(); |
/** |
+ * Return a table mapping the sources whose content has been changed to the current content of |
+ * those sources. |
+ * |
+ * @return a table mapping the sources whose content has been changed to the current content of |
+ * those sources |
+ */ |
+ Map<Source, String> get changedContents => _changedContent; |
+ |
+ /** |
+ * Return `true` if this change set does not contain any changes. |
+ * |
+ * @return `true` if this change set does not contain any changes |
+ */ |
+ bool get isEmpty => |
+ addedSources.isEmpty && |
+ changedSources.isEmpty && |
+ _changedContent.isEmpty && |
+ changedRanges.isEmpty && |
+ removedSources.isEmpty && |
+ removedContainers.isEmpty && |
+ deletedSources.isEmpty; |
+ |
+ /** |
* Record that the specified source has been added and that its content is the default contents of |
* the source. |
* |
@@ -7555,8 +8204,10 @@ class ChangeSet { |
* @param oldLength the number of characters in the original contents that were replaced |
* @param newLength the number of characters in the replacement text |
*/ |
- void changedRange(Source source, String contents, int offset, int oldLength, int newLength) { |
- changedRanges[source] = new ChangeSet_ContentChange(contents, offset, oldLength, newLength); |
+ void changedRange(Source source, String contents, int offset, int oldLength, |
+ int newLength) { |
+ changedRanges[source] = |
+ new ChangeSet_ContentChange(contents, offset, oldLength, newLength); |
} |
/** |
@@ -7580,22 +8231,6 @@ class ChangeSet { |
} |
/** |
- * Return a table mapping the sources whose content has been changed to the current content of |
- * those sources. |
- * |
- * @return a table mapping the sources whose content has been changed to the current content of |
- * those sources |
- */ |
- Map<Source, String> get changedContents => _changedContent; |
- |
- /** |
- * Return `true` if this change set does not contain any changes. |
- * |
- * @return `true` if this change set does not contain any changes |
- */ |
- bool get isEmpty => addedSources.isEmpty && changedSources.isEmpty && _changedContent.isEmpty && changedRanges.isEmpty && removedSources.isEmpty && removedContainers.isEmpty && deletedSources.isEmpty; |
- |
- /** |
* Record that the specified source container has been removed. |
* |
* @param container the source container that was removed |
@@ -7620,12 +8255,18 @@ class ChangeSet { |
@override |
String toString() { |
StringBuffer buffer = new StringBuffer(); |
- bool needsSeparator = _appendSources(buffer, addedSources, false, "addedSources"); |
- needsSeparator = _appendSources(buffer, changedSources, needsSeparator, "changedSources"); |
- needsSeparator = _appendSources2(buffer, _changedContent, needsSeparator, "changedContent"); |
- needsSeparator = _appendSources2(buffer, changedRanges, needsSeparator, "changedRanges"); |
- needsSeparator = _appendSources(buffer, deletedSources, needsSeparator, "deletedSources"); |
- needsSeparator = _appendSources(buffer, removedSources, needsSeparator, "removedSources"); |
+ bool needsSeparator = |
+ _appendSources(buffer, addedSources, false, "addedSources"); |
+ needsSeparator = |
+ _appendSources(buffer, changedSources, needsSeparator, "changedSources"); |
+ needsSeparator = |
+ _appendSources2(buffer, _changedContent, needsSeparator, "changedContent"); |
+ needsSeparator = |
+ _appendSources2(buffer, changedRanges, needsSeparator, "changedRanges"); |
+ needsSeparator = |
+ _appendSources(buffer, deletedSources, needsSeparator, "deletedSources"); |
+ needsSeparator = |
+ _appendSources(buffer, removedSources, needsSeparator, "removedSources"); |
int count = removedContainers.length; |
if (count > 0) { |
if (removedSources.isEmpty) { |
@@ -7654,7 +8295,8 @@ class ChangeSet { |
* @param label the label used to prefix the sources |
* @return `true` if future lists of sources will need a separator |
*/ |
- bool _appendSources(StringBuffer buffer, List<Source> sources, bool needsSeparator, String label) { |
+ bool _appendSources(StringBuffer buffer, List<Source> sources, |
+ bool needsSeparator, String label) { |
if (sources.isEmpty) { |
return needsSeparator; |
} |
@@ -7681,7 +8323,8 @@ class ChangeSet { |
* @param label the label used to prefix the sources |
* @return `true` if future lists of sources will need a separator |
*/ |
- bool _appendSources2(StringBuffer buffer, HashMap<Source, dynamic> sources, bool needsSeparator, String label) { |
+ bool _appendSources2(StringBuffer buffer, HashMap<Source, dynamic> sources, |
+ bool needsSeparator, String label) { |
if (sources.isEmpty) { |
return needsSeparator; |
} |
@@ -7731,7 +8374,8 @@ class ChangeSet_ContentChange { |
* @param oldLength the number of characters in the original contents that were replaced |
* @param newLength the number of characters in the replacement text |
*/ |
- ChangeSet_ContentChange(this.contents, this.offset, this.oldLength, this.newLength); |
+ ChangeSet_ContentChange(this.contents, this.offset, this.oldLength, |
+ this.newLength); |
} |
/** |
@@ -7756,7 +8400,8 @@ class CycleBuilder_LibraryPair { |
* @param entryPairs the (source, entry) pairs representing the compilation units in the |
* library |
*/ |
- CycleBuilder_LibraryPair(ResolvableLibrary library, List<CycleBuilder_SourceEntryPair> entryPairs) { |
+ CycleBuilder_LibraryPair(ResolvableLibrary library, |
+ List<CycleBuilder_SourceEntryPair> entryPairs) { |
this.library = library; |
this.entryPairs = entryPairs; |
} |
@@ -7797,179 +8442,181 @@ class CycleBuilder_SourceEntryPair { |
*/ |
class DartEntry extends SourceEntry { |
/** |
- * The list of libraries that contain this compilation unit. The list will be |
- * empty if there are no known libraries that contain this compilation unit. |
- */ |
- List<Source> _containingLibraries = new List<Source>(); |
- |
- /** |
- * The information known as a result of resolving this compilation unit as |
- * part of the library that contains this unit. This field will never be |
- * `null`. |
- */ |
- ResolutionState _resolutionState |
- = new ResolutionState(); |
- |
- /** |
* The data descriptor representing the errors reported during Angular |
* resolution. |
*/ |
- static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("DartEntry.ANGULAR_ERRORS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "DartEntry.ANGULAR_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the element model representing a single |
* compilation unit. This model is incomplete and should not be used except as |
* input to another task. |
*/ |
- static final DataDescriptor<List<AnalysisError>> BUILT_ELEMENT |
- = new DataDescriptor<List<AnalysisError>>("DartEntry.BUILT_ELEMENT"); |
+ static final DataDescriptor<List<AnalysisError>> BUILT_ELEMENT = |
+ new DataDescriptor<List<AnalysisError>>("DartEntry.BUILT_ELEMENT"); |
/** |
* The data descriptor representing the AST structure after the element model |
* has been built (and declarations are resolved) but before other resolution |
* has been performed. |
*/ |
- static final DataDescriptor<CompilationUnit> BUILT_UNIT |
- = new DataDescriptor<CompilationUnit>("DartEntry.BUILT_UNIT"); |
+ static final DataDescriptor<CompilationUnit> BUILT_UNIT = |
+ new DataDescriptor<CompilationUnit>("DartEntry.BUILT_UNIT"); |
/** |
* The data descriptor representing the list of libraries that contain this |
* compilation unit. |
*/ |
- static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES |
- = new DataDescriptor<List<Source>>("DartEntry.CONTAINING_LIBRARIES", Source.EMPTY_ARRAY); |
+ static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES = |
+ new DataDescriptor<List<Source>>( |
+ "DartEntry.CONTAINING_LIBRARIES", |
+ Source.EMPTY_ARRAY); |
/** |
* The data descriptor representing the library element for the library. This |
* data is only available for Dart files that are the defining compilation |
* unit of a library. |
*/ |
- static final DataDescriptor<LibraryElement> ELEMENT |
- = new DataDescriptor<LibraryElement>("DartEntry.ELEMENT"); |
+ static final DataDescriptor<LibraryElement> ELEMENT = |
+ new DataDescriptor<LibraryElement>("DartEntry.ELEMENT"); |
/** |
* The data descriptor representing the list of exported libraries. This data |
* is only available for Dart files that are the defining compilation unit of |
* a library. |
*/ |
- static final DataDescriptor<List<Source>> EXPORTED_LIBRARIES |
- = new DataDescriptor<List<Source>>("DartEntry.EXPORTED_LIBRARIES", Source.EMPTY_ARRAY); |
+ static final DataDescriptor<List<Source>> EXPORTED_LIBRARIES = |
+ new DataDescriptor<List<Source>>( |
+ "DartEntry.EXPORTED_LIBRARIES", |
+ Source.EMPTY_ARRAY); |
/** |
* The data descriptor representing the hints resulting from auditing the |
* source. |
*/ |
- static final DataDescriptor<List<AnalysisError>> HINTS |
- = new DataDescriptor<List<AnalysisError>>("DartEntry.HINTS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> HINTS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "DartEntry.HINTS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the list of imported libraries. This data |
* is only available for Dart files that are the defining compilation unit of |
* a library. |
*/ |
- static final DataDescriptor<List<Source>> IMPORTED_LIBRARIES |
- = new DataDescriptor<List<Source>>("DartEntry.IMPORTED_LIBRARIES", Source.EMPTY_ARRAY); |
+ static final DataDescriptor<List<Source>> IMPORTED_LIBRARIES = |
+ new DataDescriptor<List<Source>>( |
+ "DartEntry.IMPORTED_LIBRARIES", |
+ Source.EMPTY_ARRAY); |
/** |
* The data descriptor representing the list of included parts. This data is |
* only available for Dart files that are the defining compilation unit of a |
* library. |
*/ |
- static final DataDescriptor<List<Source>> INCLUDED_PARTS |
- = new DataDescriptor<List<Source>>("DartEntry.INCLUDED_PARTS", Source.EMPTY_ARRAY); |
+ static final DataDescriptor<List<Source>> INCLUDED_PARTS = |
+ new DataDescriptor<List<Source>>( |
+ "DartEntry.INCLUDED_PARTS", |
+ Source.EMPTY_ARRAY); |
/** |
* The data descriptor representing the client flag. This data is only |
* available for Dart files that are the defining compilation unit of a |
* library. |
*/ |
- static final DataDescriptor<bool> IS_CLIENT |
- = new DataDescriptor<bool>("DartEntry.IS_CLIENT", false); |
+ static final DataDescriptor<bool> IS_CLIENT = |
+ new DataDescriptor<bool>("DartEntry.IS_CLIENT", false); |
/** |
* The data descriptor representing the launchable flag. This data is only |
* available for Dart files that are the defining compilation unit of a |
* library. |
*/ |
- static final DataDescriptor<bool> IS_LAUNCHABLE |
- = new DataDescriptor<bool>("DartEntry.IS_LAUNCHABLE", false); |
+ static final DataDescriptor<bool> IS_LAUNCHABLE = |
+ new DataDescriptor<bool>("DartEntry.IS_LAUNCHABLE", false); |
/** |
* The data descriptor representing the errors resulting from parsing the |
* source. |
*/ |
- static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("DartEntry.PARSE_ERRORS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "DartEntry.PARSE_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the parsed AST structure. |
*/ |
- static final DataDescriptor<CompilationUnit> PARSED_UNIT |
- = new DataDescriptor<CompilationUnit>("DartEntry.PARSED_UNIT"); |
+ static final DataDescriptor<CompilationUnit> PARSED_UNIT = |
+ new DataDescriptor<CompilationUnit>("DartEntry.PARSED_UNIT"); |
/** |
* The data descriptor representing the public namespace of the library. This |
* data is only available for Dart files that are the defining compilation |
* unit of a library. |
*/ |
- static final DataDescriptor<Namespace> PUBLIC_NAMESPACE |
- = new DataDescriptor<Namespace>("DartEntry.PUBLIC_NAMESPACE"); |
+ static final DataDescriptor<Namespace> PUBLIC_NAMESPACE = |
+ new DataDescriptor<Namespace>("DartEntry.PUBLIC_NAMESPACE"); |
/** |
* The data descriptor representing the errors resulting from resolving the |
* source. |
*/ |
- static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("DartEntry.RESOLUTION_ERRORS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "DartEntry.RESOLUTION_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the resolved AST structure. |
*/ |
- static final DataDescriptor<CompilationUnit> RESOLVED_UNIT |
- = new DataDescriptor<CompilationUnit>("DartEntry.RESOLVED_UNIT"); |
+ static final DataDescriptor<CompilationUnit> RESOLVED_UNIT = |
+ new DataDescriptor<CompilationUnit>("DartEntry.RESOLVED_UNIT"); |
/** |
* The data descriptor representing the token stream. |
*/ |
- static final DataDescriptor<List<AnalysisError>> SCAN_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("DartEntry.SCAN_ERRORS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> SCAN_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "DartEntry.SCAN_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the source kind. |
*/ |
- static final DataDescriptor<SourceKind> SOURCE_KIND |
- = new DataDescriptor<SourceKind>("DartEntry.SOURCE_KIND", SourceKind.UNKNOWN); |
+ static final DataDescriptor<SourceKind> SOURCE_KIND = |
+ new DataDescriptor<SourceKind>("DartEntry.SOURCE_KIND", SourceKind.UNKNOWN); |
/** |
* The data descriptor representing the token stream. |
*/ |
- static final DataDescriptor<Token> TOKEN_STREAM |
- = new DataDescriptor<Token>("DartEntry.TOKEN_STREAM"); |
+ static final DataDescriptor<Token> TOKEN_STREAM = |
+ new DataDescriptor<Token>("DartEntry.TOKEN_STREAM"); |
/** |
* The data descriptor representing the errors resulting from verifying the |
* source. |
*/ |
- static final DataDescriptor<List<AnalysisError>> VERIFICATION_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("DartEntry.VERIFICATION_ERRORS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> VERIFICATION_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "DartEntry.VERIFICATION_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
- * Add the given [librarySource] to the list of libraries that contain this |
- * part. This method should only be invoked on entries that represent a part. |
+ * The list of libraries that contain this compilation unit. The list will be |
+ * empty if there are no known libraries that contain this compilation unit. |
*/ |
- void addContainingLibrary(Source librarySource) { |
- _containingLibraries.add(librarySource); |
- } |
+ List<Source> _containingLibraries = new List<Source>(); |
/** |
- * Flush any AST structures being maintained by this entry. |
+ * The information known as a result of resolving this compilation unit as |
+ * part of the library that contains this unit. This field will never be |
+ * `null`. |
*/ |
- void flushAstStructures() { |
- _flush(TOKEN_STREAM); |
- _flush(PARSED_UNIT); |
- _resolutionState.flushAstStructures(); |
- } |
+ ResolutionState _resolutionState = new ResolutionState(); |
/** |
* Return all of the errors associated with the compilation unit that are |
@@ -8009,7 +8656,7 @@ class DartEntry extends SourceEntry { |
} |
state = state._nextState; |
} |
- ; |
+ |
return anyResolvedCompilationUnit; |
} |
@@ -8033,34 +8680,83 @@ class DartEntry extends SourceEntry { |
*/ |
List<Source> get containingLibraries => _containingLibraries; |
- @override |
- SourceKind get kind => getValue(SOURCE_KIND); |
+ /** |
+ * Set the list of libraries that contain this compilation unit to contain |
+ * only the given source. This method should only be invoked on entries that |
+ * represent a library. |
+ * |
+ * @param librarySource the source of the single library that the list should contain |
+ */ |
+ void set containingLibrary(Source librarySource) { |
+ _containingLibraries.clear(); |
+ _containingLibraries.add(librarySource); |
+ } |
/** |
- * The library sources containing the receiver's source. |
+ * Return `true` if this entry has an AST structure that can be resolved, even |
+ * if it needs to be copied. Returning `true` implies that the method |
+ * [resolvableCompilationUnit] will return a non-`null` result. |
*/ |
- List<Source> get librariesContaining { |
+ bool get hasResolvableCompilationUnit { |
+ if (getState(PARSED_UNIT) == CacheState.VALID) { |
+ return true; |
+ } |
ResolutionState state = _resolutionState; |
- List<Source> result = new List<Source>(); |
while (state != null) { |
- if (state._librarySource != null) { |
- result.add(state._librarySource); |
+ if (state.getState(BUILT_UNIT) == CacheState.VALID || |
+ state.getState(RESOLVED_UNIT) == CacheState.VALID) { |
+ return true; |
} |
state = state._nextState; |
} |
- return result; |
+ |
+ return false; |
} |
/** |
- * A compilation unit that has not been accessed by any other client and can |
- * therefore safely be modified by the reconciler, or `null` if the source has |
- * not been parsed. |
+ * Return `true` if this data is safe to use in refactoring. |
*/ |
- CompilationUnit get resolvableCompilationUnit { |
- if (getState(PARSED_UNIT) == CacheState.VALID) { |
- CompilationUnit unit = getValue(PARSED_UNIT); |
- setState(PARSED_UNIT, CacheState.FLUSHED); |
- return unit; |
+ bool get isRefactoringSafe { |
+ ResolutionState state = _resolutionState; |
+ while (state != null) { |
+ CacheState resolvedState = state.getState(RESOLVED_UNIT); |
+ if (resolvedState != CacheState.VALID && |
+ resolvedState != CacheState.FLUSHED) { |
+ return false; |
+ } |
+ state = state._nextState; |
+ } |
+ return true; |
+ } |
+ |
+ @override |
+ SourceKind get kind => getValue(SOURCE_KIND); |
+ |
+ /** |
+ * The library sources containing the receiver's source. |
+ */ |
+ List<Source> get librariesContaining { |
+ ResolutionState state = _resolutionState; |
+ List<Source> result = new List<Source>(); |
+ while (state != null) { |
+ if (state._librarySource != null) { |
+ result.add(state._librarySource); |
+ } |
+ state = state._nextState; |
+ } |
+ return result; |
+ } |
+ |
+ /** |
+ * A compilation unit that has not been accessed by any other client and can |
+ * therefore safely be modified by the reconciler, or `null` if the source has |
+ * not been parsed. |
+ */ |
+ CompilationUnit get resolvableCompilationUnit { |
+ if (getState(PARSED_UNIT) == CacheState.VALID) { |
+ CompilationUnit unit = getValue(PARSED_UNIT); |
+ setState(PARSED_UNIT, CacheState.FLUSHED); |
+ return unit; |
} |
ResolutionState state = _resolutionState; |
while (state != null) { |
@@ -8078,10 +8774,28 @@ class DartEntry extends SourceEntry { |
} |
/** |
+ * Add the given [librarySource] to the list of libraries that contain this |
+ * part. This method should only be invoked on entries that represent a part. |
+ */ |
+ void addContainingLibrary(Source librarySource) { |
+ _containingLibraries.add(librarySource); |
+ } |
+ |
+ /** |
+ * Flush any AST structures being maintained by this entry. |
+ */ |
+ void flushAstStructures() { |
+ _flush(TOKEN_STREAM); |
+ _flush(PARSED_UNIT); |
+ _resolutionState.flushAstStructures(); |
+ } |
+ |
+ /** |
* Return the state of the data represented by the given [descriptor] in the |
* context of the given [librarySource]. |
*/ |
- CacheState getStateInLibrary(DataDescriptor descriptor, Source librarySource) { |
+ CacheState getStateInLibrary(DataDescriptor descriptor, |
+ Source librarySource) { |
if (!_isValidLibraryDescriptor(descriptor)) { |
throw new ArgumentError("Invalid descriptor: $descriptor"); |
} |
@@ -8135,27 +8849,6 @@ class DartEntry extends SourceEntry { |
return false; |
} |
- /** |
- * Return `true` if this entry has an AST structure that can be resolved, even |
- * if it needs to be copied. Returning `true` implies that the method |
- * [resolvableCompilationUnit] will return a non-`null` result. |
- */ |
- bool get hasResolvableCompilationUnit { |
- if (getState(PARSED_UNIT) == CacheState.VALID) { |
- return true; |
- } |
- ResolutionState state = _resolutionState; |
- while (state != null) { |
- if (state.getState(BUILT_UNIT) == CacheState.VALID |
- || state.getState(RESOLVED_UNIT) == CacheState.VALID) { |
- return true; |
- } |
- state = state._nextState; |
- } |
- ; |
- return false; |
- } |
- |
@override |
void invalidateAllInformation() { |
super.invalidateAllInformation(); |
@@ -8192,28 +8885,13 @@ class DartEntry extends SourceEntry { |
} |
/** |
- * Return `true` if this data is safe to use in refactoring. |
- */ |
- bool get isRefactoringSafe { |
- ResolutionState state = _resolutionState; |
- while (state != null) { |
- CacheState resolvedState = state.getState(RESOLVED_UNIT); |
- if (resolvedState != CacheState.VALID |
- && resolvedState != CacheState.FLUSHED) { |
- return false; |
- } |
- state = state._nextState; |
- } |
- return true; |
- } |
- |
- /** |
* Record that an [exception] occurred while attempting to build the element |
* model for the source represented by this entry in the context of the given |
* [library]. This will set the state of all resolution-based information as |
* being in error, but will not change the state of any parse results. |
*/ |
- void recordBuildElementErrorInLibrary(Source librarySource, CaughtException exception) { |
+ void recordBuildElementErrorInLibrary(Source librarySource, |
+ CaughtException exception) { |
setStateInLibrary(BUILT_ELEMENT, librarySource, CacheState.ERROR); |
setStateInLibrary(BUILT_UNIT, librarySource, CacheState.ERROR); |
recordResolutionErrorInLibrary(librarySource, exception); |
@@ -8233,7 +8911,8 @@ class DartEntry extends SourceEntry { |
* @param librarySource the source of the library in which hints were being generated |
* @param exception the exception that shows where the error occurred |
*/ |
- void recordHintErrorInLibrary(Source librarySource, CaughtException exception) { |
+ void recordHintErrorInLibrary(Source librarySource, |
+ CaughtException exception) { |
this.exception = exception; |
ResolutionState state = _getOrCreateResolutionState(librarySource); |
state.recordHintError(); |
@@ -8279,7 +8958,8 @@ class DartEntry extends SourceEntry { |
* @param librarySource the source of the library in which resolution was being performed |
* @param exception the exception that shows where the error occurred |
*/ |
- void recordResolutionErrorInLibrary(Source librarySource, CaughtException exception) { |
+ void recordResolutionErrorInLibrary(Source librarySource, |
+ CaughtException exception) { |
this.exception = exception; |
setState(ELEMENT, CacheState.ERROR); |
setState(IS_CLIENT, CacheState.ERROR); |
@@ -8310,7 +8990,8 @@ class DartEntry extends SourceEntry { |
* @param librarySource the source of the library in which verification was being performed |
* @param exception the exception that shows where the error occurred |
*/ |
- void recordVerificationErrorInLibrary(Source librarySource, CaughtException exception) { |
+ void recordVerificationErrorInLibrary(Source librarySource, |
+ CaughtException exception) { |
this.exception = exception; |
ResolutionState state = _getOrCreateResolutionState(librarySource); |
state.recordVerificationError(); |
@@ -8355,18 +9036,6 @@ class DartEntry extends SourceEntry { |
} |
/** |
- * Set the list of libraries that contain this compilation unit to contain |
- * only the given source. This method should only be invoked on entries that |
- * represent a library. |
- * |
- * @param librarySource the source of the single library that the list should contain |
- */ |
- void set containingLibrary(Source librarySource) { |
- _containingLibraries.clear(); |
- _containingLibraries.add(librarySource); |
- } |
- |
- /** |
* Set the state of the data represented by the given descriptor in the context of the given |
* library to the given state. |
* |
@@ -8375,7 +9044,8 @@ class DartEntry extends SourceEntry { |
* context for the data |
* @param cacheState the new state of the data represented by the given descriptor |
*/ |
- void setStateInLibrary(DataDescriptor descriptor, Source librarySource, CacheState cacheState) { |
+ void setStateInLibrary(DataDescriptor descriptor, Source librarySource, |
+ CacheState cacheState) { |
if (!_isValidLibraryDescriptor(descriptor)) { |
throw new ArgumentError("Invalid descriptor: $descriptor"); |
} |
@@ -8392,7 +9062,8 @@ class DartEntry extends SourceEntry { |
* context for the data |
* @param value the new value of the data represented by the given descriptor and library |
*/ |
- void setValueInLibrary(DataDescriptor descriptor, Source librarySource, Object value) { |
+ void setValueInLibrary(DataDescriptor descriptor, Source librarySource, |
+ Object value) { |
if (!_isValidLibraryDescriptor(descriptor)) { |
throw new ArgumentError("Invalid descriptor: $descriptor"); |
} |
@@ -8400,6 +9071,82 @@ class DartEntry extends SourceEntry { |
state.setValue(descriptor, value); |
} |
+ /** |
+ * Invalidate all of the resolution information associated with the compilation unit. |
+ * |
+ * @param invalidateUris true if the cached results of converting URIs to source files should also |
+ * be invalidated. |
+ */ |
+ void _discardCachedResolutionInformation(bool invalidateUris) { |
+ setState(ELEMENT, CacheState.INVALID); |
+ setState(IS_CLIENT, CacheState.INVALID); |
+ setState(IS_LAUNCHABLE, CacheState.INVALID); |
+ setState(PUBLIC_NAMESPACE, CacheState.INVALID); |
+ _resolutionState.invalidateAllResolutionInformation(); |
+ if (invalidateUris) { |
+ setState(EXPORTED_LIBRARIES, CacheState.INVALID); |
+ setState(IMPORTED_LIBRARIES, CacheState.INVALID); |
+ setState(INCLUDED_PARTS, CacheState.INVALID); |
+ } |
+ } |
+ |
+ /** |
+ * Return a resolution state for the specified library, creating one as necessary. |
+ * |
+ * @param librarySource the library source (not `null`) |
+ * @return the resolution state (not `null`) |
+ */ |
+ ResolutionState _getOrCreateResolutionState(Source librarySource) { |
+ ResolutionState state = _resolutionState; |
+ if (state._librarySource == null) { |
+ state._librarySource = librarySource; |
+ return state; |
+ } |
+ while (state._librarySource != librarySource) { |
+ if (state._nextState == null) { |
+ ResolutionState newState = new ResolutionState(); |
+ newState._librarySource = librarySource; |
+ state._nextState = newState; |
+ return newState; |
+ } |
+ state = state._nextState; |
+ } |
+ return state; |
+ } |
+ |
+ @override |
+ bool _isValidDescriptor(DataDescriptor descriptor) { |
+ return descriptor == ANGULAR_ERRORS || |
+ descriptor == CONTAINING_LIBRARIES || |
+ descriptor == ELEMENT || |
+ descriptor == EXPORTED_LIBRARIES || |
+ descriptor == IMPORTED_LIBRARIES || |
+ descriptor == INCLUDED_PARTS || |
+ descriptor == IS_CLIENT || |
+ descriptor == IS_LAUNCHABLE || |
+ descriptor == PARSED_UNIT || |
+ descriptor == PARSE_ERRORS || |
+ descriptor == PUBLIC_NAMESPACE || |
+ descriptor == SCAN_ERRORS || |
+ descriptor == SOURCE_KIND || |
+ descriptor == TOKEN_STREAM || |
+ super._isValidDescriptor(descriptor); |
+ } |
+ |
+ /** |
+ * Return `true` if the [descriptor] is valid for this entry when the data is |
+ * relative to a library. |
+ */ |
+ bool _isValidLibraryDescriptor(DataDescriptor descriptor) { |
+ return descriptor == ANGULAR_ERRORS || |
+ descriptor == BUILT_ELEMENT || |
+ descriptor == BUILT_UNIT || |
+ descriptor == HINTS || |
+ descriptor == RESOLUTION_ERRORS || |
+ descriptor == RESOLVED_UNIT || |
+ descriptor == VERIFICATION_ERRORS; |
+ } |
+ |
@override |
bool _writeDiffOn(StringBuffer buffer, SourceEntry oldEntry) { |
bool needsSeparator = super._writeDiffOn(buffer, oldEntry); |
@@ -8411,20 +9158,80 @@ class DartEntry extends SourceEntry { |
buffer.write(oldEntry.runtimeType.toString()); |
return true; |
} |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "tokenStream", DartEntry.TOKEN_STREAM, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "scanErrors", DartEntry.SCAN_ERRORS, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "sourceKind", DartEntry.SOURCE_KIND, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "parsedUnit", DartEntry.PARSED_UNIT, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "parseErrors", DartEntry.PARSE_ERRORS, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "importedLibraries", DartEntry.IMPORTED_LIBRARIES, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "exportedLibraries", DartEntry.EXPORTED_LIBRARIES, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "includedParts", DartEntry.INCLUDED_PARTS, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "element", DartEntry.ELEMENT, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "publicNamespace", DartEntry.PUBLIC_NAMESPACE, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "clientServer", DartEntry.IS_CLIENT, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "launchable", DartEntry.IS_LAUNCHABLE, oldEntry); |
- // TODO(brianwilkerson) Add better support for containingLibraries. It would be nice to be able |
- // to report on size-preserving changes. |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "tokenStream", |
+ DartEntry.TOKEN_STREAM, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "scanErrors", |
+ DartEntry.SCAN_ERRORS, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "sourceKind", |
+ DartEntry.SOURCE_KIND, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "parsedUnit", |
+ DartEntry.PARSED_UNIT, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "parseErrors", |
+ DartEntry.PARSE_ERRORS, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "importedLibraries", |
+ DartEntry.IMPORTED_LIBRARIES, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "exportedLibraries", |
+ DartEntry.EXPORTED_LIBRARIES, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "includedParts", |
+ DartEntry.INCLUDED_PARTS, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "element", |
+ DartEntry.ELEMENT, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "publicNamespace", |
+ DartEntry.PUBLIC_NAMESPACE, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "clientServer", |
+ DartEntry.IS_CLIENT, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "launchable", |
+ DartEntry.IS_LAUNCHABLE, |
+ oldEntry); |
+ // TODO(brianwilkerson) Add better support for containingLibraries. |
+ // It would be nice to be able to report on size-preserving changes. |
int oldLibraryCount = (oldEntry as DartEntry)._containingLibraries.length; |
int libraryCount = _containingLibraries.length; |
if (oldLibraryCount != libraryCount) { |
@@ -8440,7 +9247,8 @@ class DartEntry extends SourceEntry { |
// |
// Report change to the per-library state. |
// |
- HashMap<Source, ResolutionState> oldStateMap = new HashMap<Source, ResolutionState>(); |
+ HashMap<Source, ResolutionState> oldStateMap = |
+ new HashMap<Source, ResolutionState>(); |
ResolutionState state = (oldEntry as DartEntry)._resolutionState; |
while (state != null) { |
Source librarySource = state._librarySource; |
@@ -8462,7 +9270,8 @@ class DartEntry extends SourceEntry { |
buffer.write(librarySource.fullName); |
needsSeparator = true; |
} else { |
- needsSeparator = oldState._writeDiffOn(buffer, needsSeparator, oldEntry as DartEntry); |
+ needsSeparator = |
+ oldState._writeDiffOn(buffer, needsSeparator, oldEntry as DartEntry); |
} |
} |
state = state._nextState; |
@@ -8497,82 +9306,6 @@ class DartEntry extends SourceEntry { |
_writeStateOn(buffer, "angularErrors", ANGULAR_ERRORS); |
_resolutionState._writeOn(buffer); |
} |
- |
- /** |
- * Invalidate all of the resolution information associated with the compilation unit. |
- * |
- * @param invalidateUris true if the cached results of converting URIs to source files should also |
- * be invalidated. |
- */ |
- void _discardCachedResolutionInformation(bool invalidateUris) { |
- setState(ELEMENT, CacheState.INVALID); |
- setState(IS_CLIENT, CacheState.INVALID); |
- setState(IS_LAUNCHABLE, CacheState.INVALID); |
- setState(PUBLIC_NAMESPACE, CacheState.INVALID); |
- _resolutionState.invalidateAllResolutionInformation(); |
- if (invalidateUris) { |
- setState(EXPORTED_LIBRARIES, CacheState.INVALID); |
- setState(IMPORTED_LIBRARIES, CacheState.INVALID); |
- setState(INCLUDED_PARTS, CacheState.INVALID); |
- } |
- } |
- |
- /** |
- * Return a resolution state for the specified library, creating one as necessary. |
- * |
- * @param librarySource the library source (not `null`) |
- * @return the resolution state (not `null`) |
- */ |
- ResolutionState _getOrCreateResolutionState(Source librarySource) { |
- ResolutionState state = _resolutionState; |
- if (state._librarySource == null) { |
- state._librarySource = librarySource; |
- return state; |
- } |
- while (state._librarySource != librarySource) { |
- if (state._nextState == null) { |
- ResolutionState newState = new ResolutionState(); |
- newState._librarySource = librarySource; |
- state._nextState = newState; |
- return newState; |
- } |
- state = state._nextState; |
- } |
- return state; |
- } |
- |
- @override |
- bool _isValidDescriptor(DataDescriptor descriptor) { |
- return descriptor == ANGULAR_ERRORS |
- || descriptor == CONTAINING_LIBRARIES |
- || descriptor == ELEMENT |
- || descriptor == EXPORTED_LIBRARIES |
- || descriptor == IMPORTED_LIBRARIES |
- || descriptor == INCLUDED_PARTS |
- || descriptor == IS_CLIENT |
- || descriptor == IS_LAUNCHABLE |
- || descriptor == PARSED_UNIT |
- || descriptor == PARSE_ERRORS |
- || descriptor == PUBLIC_NAMESPACE |
- || descriptor == SCAN_ERRORS |
- || descriptor == SOURCE_KIND |
- || descriptor == TOKEN_STREAM |
- || super._isValidDescriptor(descriptor); |
- } |
- |
- /** |
- * Return `true` if the [descriptor] is valid for this entry when the data is |
- * relative to a library. |
- */ |
- bool _isValidLibraryDescriptor(DataDescriptor descriptor) { |
- return descriptor == ANGULAR_ERRORS |
- || descriptor == BUILT_ELEMENT |
- || descriptor == BUILT_UNIT |
- || descriptor == HINTS |
- || descriptor == RESOLUTION_ERRORS |
- || descriptor == RESOLVED_UNIT |
- || descriptor == VERIFICATION_ERRORS; |
- } |
} |
/** |
@@ -8611,6 +9344,18 @@ class DefaultRetentionPolicy implements CacheRetentionPolicy { |
*/ |
static DefaultRetentionPolicy POLICY = new DefaultRetentionPolicy(); |
+ /** |
+ * Return `true` if there is analysis information in the given entry that needs to be |
+ * computed, where the computation is dependent on having the AST. |
+ * |
+ * @param dartEntry the entry being tested |
+ * @return `true` if there is analysis information that needs to be computed from the AST |
+ */ |
+ bool astIsNeeded(DartEntry dartEntry) => |
+ dartEntry.hasInvalidData(DartEntry.HINTS) || |
+ dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || |
+ dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS); |
+ |
@override |
RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) { |
if (sourceEntry is DartEntry) { |
@@ -8621,15 +9366,6 @@ class DefaultRetentionPolicy implements CacheRetentionPolicy { |
} |
return RetentionPriority.LOW; |
} |
- |
- /** |
- * Return `true` if there is analysis information in the given entry that needs to be |
- * computed, where the computation is dependent on having the AST. |
- * |
- * @param dartEntry the entry being tested |
- * @return `true` if there is analysis information that needs to be computed from the AST |
- */ |
- bool astIsNeeded(DartEntry dartEntry) => dartEntry.hasInvalidData(DartEntry.HINTS) || dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || dartEntry.hasInvalidData(DartEntry.RESOLUTION_ERRORS); |
} |
/** |
@@ -8662,7 +9398,8 @@ abstract class ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> { |
for (ht.XmlExpression xmlExpression in expressions) { |
if (xmlExpression is AngularXmlExpression) { |
AngularXmlExpression angularXmlExpression = xmlExpression; |
- List<Expression> dartExpressions = angularXmlExpression.expression.expressions; |
+ List<Expression> dartExpressions = |
+ angularXmlExpression.expression.expressions; |
for (Expression dartExpression in dartExpressions) { |
visitExpression(dartExpression); |
} |
@@ -8681,54 +9418,12 @@ abstract class ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> { |
*/ |
class GenerateDartErrorsTask extends AnalysisTask { |
/** |
- * Check each directive in the given compilation unit to see if the referenced source exists and |
- * report an error if it does not. |
- * |
- * @param context the context in which the library exists |
- * @param librarySource the source representing the library containing the directives |
- * @param unit the compilation unit containing the directives to be validated |
- * @param errorListener the error listener to which errors should be reported |
+ * The source for which errors and warnings are to be produced. |
*/ |
- static void validateDirectives(AnalysisContext context, Source librarySource, CompilationUnit unit, AnalysisErrorListener errorListener) { |
- for (Directive directive in unit.directives) { |
- if (directive is UriBasedDirective) { |
- validateReferencedSource(context, librarySource, directive, errorListener); |
- } |
- } |
- } |
+ final Source source; |
/** |
- * Check the given directive to see if the referenced source exists and report an error if it does |
- * not. |
- * |
- * @param context the context in which the library exists |
- * @param librarySource the source representing the library containing the directive |
- * @param directive the directive to be verified |
- * @param errorListener the error listener to which errors should be reported |
- */ |
- static void validateReferencedSource(AnalysisContext context, Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) { |
- Source source = directive.source; |
- if (source != null) { |
- if (context.exists(source)) { |
- return; |
- } |
- } else { |
- // Don't report errors already reported by ParseDartTask.resolveDirective |
- if (directive.validate() != null) { |
- return; |
- } |
- } |
- StringLiteral uriLiteral = directive.uri; |
- errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [directive.uriContent])); |
- } |
- |
- /** |
- * The source for which errors and warnings are to be produced. |
- */ |
- final Source source; |
- |
- /** |
- * The compilation unit used to resolve the dependencies. |
+ * The compilation unit used to resolve the dependencies. |
*/ |
final CompilationUnit _unit; |
@@ -8750,10 +9445,9 @@ class GenerateDartErrorsTask extends AnalysisTask { |
* @param unit the compilation unit used to resolve the dependencies |
* @param libraryElement the element model for the library containing the source |
*/ |
- GenerateDartErrorsTask(InternalAnalysisContext context, this.source, this._unit, this.libraryElement) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(this); |
+ GenerateDartErrorsTask(InternalAnalysisContext context, this.source, |
+ this._unit, this.libraryElement) |
+ : super(context); |
/** |
* Return the errors that were generated for the source. |
@@ -8763,11 +9457,17 @@ class GenerateDartErrorsTask extends AnalysisTask { |
List<AnalysisError> get errors => _errors; |
@override |
- String get taskDescription => "generate errors and warnings for ${source.fullName}"; |
+ String get taskDescription => |
+ "generate errors and warnings for ${source.fullName}"; |
+ |
+ @override |
+ accept(AnalysisTaskVisitor visitor) => |
+ visitor.visitGenerateDartErrorsTask(this); |
@override |
void internalPerform() { |
- TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.errors.start(); |
+ TimeCounter_TimeCounterHandle timeCounter = |
+ PerformanceStatistics.errors.start(); |
try { |
RecordingErrorListener errorListener = new RecordingErrorListener(); |
ErrorReporter errorReporter = new ErrorReporter(errorListener, source); |
@@ -8777,25 +9477,85 @@ class GenerateDartErrorsTask extends AnalysisTask { |
// |
validateDirectives(context, source, _unit, errorListener); |
// |
- // Use the ConstantVerifier to verify the use of constants. This needs to happen before using |
- // the ErrorVerifier because some error codes need the computed constant values. |
+ // Use the ConstantVerifier to verify the use of constants. |
+ // This needs to happen before using the ErrorVerifier because some error |
+ // codes need the computed constant values. |
// |
// TODO(paulberry): as a temporary workaround for issue 21572, |
// ConstantVerifier is being run right after ConstantValueComputer, so we |
// don't need to run it here. Once issue 21572 is fixed, re-enable the |
// call to ConstantVerifier. |
- // ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, libraryElement, typeProvider); |
- // _unit.accept(constantVerifier); |
+// ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, libraryElement, typeProvider); |
+// _unit.accept(constantVerifier); |
// |
// Use the ErrorVerifier to compute the rest of the errors. |
// |
- ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libraryElement, typeProvider, new InheritanceManager(libraryElement)); |
+ ErrorVerifier errorVerifier = new ErrorVerifier( |
+ errorReporter, |
+ libraryElement, |
+ typeProvider, |
+ new InheritanceManager(libraryElement)); |
_unit.accept(errorVerifier); |
_errors = errorListener.getErrorsForSource(source); |
} finally { |
timeCounter.stop(); |
} |
} |
+ |
+ /** |
+ * Check each directive in the given compilation unit to see if the referenced source exists and |
+ * report an error if it does not. |
+ * |
+ * @param context the context in which the library exists |
+ * @param librarySource the source representing the library containing the directives |
+ * @param unit the compilation unit containing the directives to be validated |
+ * @param errorListener the error listener to which errors should be reported |
+ */ |
+ static void validateDirectives(AnalysisContext context, Source librarySource, |
+ CompilationUnit unit, AnalysisErrorListener errorListener) { |
+ for (Directive directive in unit.directives) { |
+ if (directive is UriBasedDirective) { |
+ validateReferencedSource( |
+ context, |
+ librarySource, |
+ directive, |
+ errorListener); |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * Check the given directive to see if the referenced source exists and report an error if it does |
+ * not. |
+ * |
+ * @param context the context in which the library exists |
+ * @param librarySource the source representing the library containing the directive |
+ * @param directive the directive to be verified |
+ * @param errorListener the error listener to which errors should be reported |
+ */ |
+ static void validateReferencedSource(AnalysisContext context, |
+ Source librarySource, UriBasedDirective directive, |
+ AnalysisErrorListener errorListener) { |
+ Source source = directive.source; |
+ if (source != null) { |
+ if (context.exists(source)) { |
+ return; |
+ } |
+ } else { |
+ // Don't report errors already reported by ParseDartTask.resolveDirective |
+ if (directive.validate() != null) { |
+ return; |
+ } |
+ } |
+ StringLiteral uriLiteral = directive.uri; |
+ errorListener.onError( |
+ new AnalysisError.con2( |
+ librarySource, |
+ uriLiteral.offset, |
+ uriLiteral.length, |
+ CompileTimeErrorCode.URI_DOES_NOT_EXIST, |
+ [directive.uriContent])); |
+ } |
} |
/** |
@@ -8827,10 +9587,9 @@ class GenerateDartHintsTask extends AnalysisTask { |
* unit appearing first in the array |
* @param libraryElement the element model for the library being analyzed |
*/ |
- GenerateDartHintsTask(InternalAnalysisContext context, this._units, this.libraryElement) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this); |
+ GenerateDartHintsTask(InternalAnalysisContext context, this._units, |
+ this.libraryElement) |
+ : super(context); |
/** |
* Return a table mapping the sources that were analyzed to the hints that were generated for the |
@@ -8852,12 +9611,17 @@ class GenerateDartHintsTask extends AnalysisTask { |
} |
@override |
+ accept(AnalysisTaskVisitor visitor) => |
+ visitor.visitGenerateDartHintsTask(this); |
+ |
+ @override |
void internalPerform() { |
// |
// Gather the compilation units. |
// |
int unitCount = _units.length; |
- List<CompilationUnit> compilationUnits = new List<CompilationUnit>(unitCount); |
+ List<CompilationUnit> compilationUnits = |
+ new List<CompilationUnit>(unitCount); |
for (int i = 0; i < unitCount; i++) { |
compilationUnits[i] = _units[i].data; |
} |
@@ -8865,7 +9629,8 @@ class GenerateDartHintsTask extends AnalysisTask { |
// Analyze all of the units. |
// |
RecordingErrorListener errorListener = new RecordingErrorListener(); |
- HintGenerator hintGenerator = new HintGenerator(compilationUnits, context, errorListener); |
+ HintGenerator hintGenerator = |
+ new HintGenerator(compilationUnits, context, errorListener); |
hintGenerator.generateForLibrary(); |
// |
// Store the results. |
@@ -8909,15 +9674,13 @@ class GetContentTask extends AnalysisTask { |
* @param source the source to be parsed |
* @param contentData the time-stamped contents of the source |
*/ |
- GetContentTask(InternalAnalysisContext context, this.source) : super(context) { |
+ GetContentTask(InternalAnalysisContext context, this.source) |
+ : super(context) { |
if (source == null) { |
throw new IllegalArgumentException("Cannot get contents of null source"); |
} |
} |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitGetContentTask(this); |
- |
/** |
* Return the contents of the source, or `null` if the task has not completed or if there |
* was an exception while getting the contents. |
@@ -8927,14 +9690,6 @@ class GetContentTask extends AnalysisTask { |
String get content => _content; |
/** |
- * Return the time at which the contents of the source that was parsed were last modified, or a |
- * negative value if the task has not yet been performed or if an exception occurred. |
- * |
- * @return the time at which the contents of the source that was parsed were last modified |
- */ |
- int get modificationTime => _modificationTime; |
- |
- /** |
* Return `true` if this task is complete. Unlike most tasks, this task is allowed to be |
* visited more than once in order to support asynchronous IO. If the task is not complete when it |
* is visited synchronously as part of the [AnalysisTask.perform] |
@@ -8945,10 +9700,21 @@ class GetContentTask extends AnalysisTask { |
*/ |
bool get isComplete => _complete; |
+ /** |
+ * Return the time at which the contents of the source that was parsed were last modified, or a |
+ * negative value if the task has not yet been performed or if an exception occurred. |
+ * |
+ * @return the time at which the contents of the source that was parsed were last modified |
+ */ |
+ int get modificationTime => _modificationTime; |
+ |
@override |
String get taskDescription => "get contents of ${source.fullName}"; |
@override |
+ accept(AnalysisTaskVisitor visitor) => visitor.visitGetContentTask(this); |
+ |
+ @override |
void internalPerform() { |
_complete = true; |
try { |
@@ -8956,7 +9722,9 @@ class GetContentTask extends AnalysisTask { |
_content = data.data; |
_modificationTime = data.modificationTime; |
} catch (exception, stackTrace) { |
- throw new AnalysisException("Could not get contents of $source", new CaughtException(exception, stackTrace)); |
+ throw new AnalysisException( |
+ "Could not get contents of $source", |
+ new CaughtException(exception, stackTrace)); |
} |
} |
} |
@@ -8970,98 +9738,102 @@ class HtmlEntry extends SourceEntry { |
* The data descriptor representing the information about an Angular |
* application this source is used in. |
*/ |
- static final DataDescriptor<AngularApplication> ANGULAR_APPLICATION |
- = new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_APPLICATION"); |
+ static final DataDescriptor<AngularApplication> ANGULAR_APPLICATION = |
+ new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_APPLICATION"); |
/** |
* The data descriptor representing the information about an Angular component |
* this source is used as template for. |
*/ |
- static final DataDescriptor<AngularComponentElement> ANGULAR_COMPONENT |
- = new DataDescriptor<AngularComponentElement>("HtmlEntry.ANGULAR_COMPONENT"); |
+ static final DataDescriptor<AngularComponentElement> ANGULAR_COMPONENT = |
+ new DataDescriptor<AngularComponentElement>("HtmlEntry.ANGULAR_COMPONENT"); |
/** |
* The data descriptor representing the information about an Angular |
* application for which this source is an entry point. |
*/ |
- static final DataDescriptor<AngularApplication> ANGULAR_ENTRY |
- = new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_ENTRY"); |
+ static final DataDescriptor<AngularApplication> ANGULAR_ENTRY = |
+ new DataDescriptor<AngularApplication>("HtmlEntry.ANGULAR_ENTRY"); |
/** |
* The data descriptor representing the errors reported during Angular |
* resolution. |
*/ |
- static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("HtmlEntry.ANGULAR_ERRORS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> ANGULAR_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "HtmlEntry.ANGULAR_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the HTML element. |
*/ |
- static final DataDescriptor<HtmlElement> ELEMENT |
- = new DataDescriptor<HtmlElement>("HtmlEntry.ELEMENT"); |
+ static final DataDescriptor<HtmlElement> ELEMENT = |
+ new DataDescriptor<HtmlElement>("HtmlEntry.ELEMENT"); |
/** |
* The data descriptor representing the hints resulting from auditing the |
* source. |
*/ |
- static final DataDescriptor<List<AnalysisError>> HINTS |
- = new DataDescriptor<List<AnalysisError>>("HtmlEntry.HINTS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> HINTS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "HtmlEntry.HINTS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the errors resulting from parsing the |
* source. |
*/ |
- static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("HtmlEntry.PARSE_ERRORS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> PARSE_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "HtmlEntry.PARSE_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the parsed AST structure. |
*/ |
- static final DataDescriptor<ht.HtmlUnit> PARSED_UNIT |
- = new DataDescriptor<ht.HtmlUnit>("HtmlEntry.PARSED_UNIT"); |
+ static final DataDescriptor<ht.HtmlUnit> PARSED_UNIT = |
+ new DataDescriptor<ht.HtmlUnit>("HtmlEntry.PARSED_UNIT"); |
/** |
* The data descriptor representing the resolved AST structure. |
*/ |
- static final DataDescriptor<ht.HtmlUnit> RESOLVED_UNIT |
- = new DataDescriptor<ht.HtmlUnit>("HtmlEntry.RESOLVED_UNIT"); |
+ static final DataDescriptor<ht.HtmlUnit> RESOLVED_UNIT = |
+ new DataDescriptor<ht.HtmlUnit>("HtmlEntry.RESOLVED_UNIT"); |
/** |
* The data descriptor representing the list of referenced libraries. |
*/ |
- static final DataDescriptor<List<Source>> REFERENCED_LIBRARIES |
- = new DataDescriptor<List<Source>>("HtmlEntry.REFERENCED_LIBRARIES", Source.EMPTY_ARRAY); |
+ static final DataDescriptor<List<Source>> REFERENCED_LIBRARIES = |
+ new DataDescriptor<List<Source>>( |
+ "HtmlEntry.REFERENCED_LIBRARIES", |
+ Source.EMPTY_ARRAY); |
/** |
* The data descriptor representing the errors resulting from resolving the |
* source. |
*/ |
- static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("HtmlEntry.RESOLUTION_ERRORS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> RESOLUTION_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "HtmlEntry.RESOLUTION_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the status of Polymer elements in the |
* source. |
*/ |
- static final DataDescriptor<List<AnalysisError>> POLYMER_BUILD_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("HtmlEntry.POLYMER_BUILD_ERRORS", AnalysisError.NO_ERRORS); |
+ static final DataDescriptor<List<AnalysisError>> POLYMER_BUILD_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "HtmlEntry.POLYMER_BUILD_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
* The data descriptor representing the errors reported during Polymer |
* resolution. |
*/ |
- static final DataDescriptor<List<AnalysisError>> POLYMER_RESOLUTION_ERRORS |
- = new DataDescriptor<List<AnalysisError>>("HtmlEntry.POLYMER_RESOLUTION_ERRORS", AnalysisError.NO_ERRORS); |
- |
- /** |
- * Flush any AST structures being maintained by this entry. |
- */ |
- void flushAstStructures() { |
- _flush(PARSED_UNIT); |
- _flush(RESOLVED_UNIT); |
- _flush(ANGULAR_ENTRY); |
- _flush(ANGULAR_ERRORS); |
- } |
+ static final DataDescriptor<List<AnalysisError>> POLYMER_RESOLUTION_ERRORS = |
+ new DataDescriptor<List<AnalysisError>>( |
+ "HtmlEntry.POLYMER_RESOLUTION_ERRORS", |
+ AnalysisError.NO_ERRORS); |
/** |
* Return all of the errors associated with the HTML file that are currently |
@@ -9099,6 +9871,16 @@ class HtmlEntry extends SourceEntry { |
@override |
SourceKind get kind => SourceKind.HTML; |
+ /** |
+ * Flush any AST structures being maintained by this entry. |
+ */ |
+ void flushAstStructures() { |
+ _flush(PARSED_UNIT); |
+ _flush(RESOLVED_UNIT); |
+ _flush(ANGULAR_ENTRY); |
+ _flush(ANGULAR_ERRORS); |
+ } |
+ |
@override |
void invalidateAllInformation() { |
super.invalidateAllInformation(); |
@@ -9137,7 +9919,8 @@ class HtmlEntry extends SourceEntry { |
* source associated with this entry. |
*/ |
void recordParseError(CaughtException exception) { |
- // If the scanning and parsing of HTML are separated, the following line can be removed. |
+ // If the scanning and parsing of HTML are separated, |
+ // the following line can be removed. |
recordScanError(exception); |
setState(PARSE_ERRORS, CacheState.ERROR); |
setState(PARSED_UNIT, CacheState.ERROR); |
@@ -9162,20 +9945,20 @@ class HtmlEntry extends SourceEntry { |
@override |
bool _isValidDescriptor(DataDescriptor descriptor) { |
- return descriptor == ANGULAR_APPLICATION |
- || descriptor == ANGULAR_COMPONENT |
- || descriptor == ANGULAR_ENTRY |
- || descriptor == ANGULAR_ERRORS |
- || descriptor == ELEMENT |
- || descriptor == HINTS |
- || descriptor == PARSED_UNIT |
- || descriptor == PARSE_ERRORS |
- || descriptor == POLYMER_BUILD_ERRORS |
- || descriptor == POLYMER_RESOLUTION_ERRORS |
- || descriptor == REFERENCED_LIBRARIES |
- || descriptor == RESOLUTION_ERRORS |
- || descriptor == RESOLVED_UNIT |
- || super._isValidDescriptor(descriptor); |
+ return descriptor == ANGULAR_APPLICATION || |
+ descriptor == ANGULAR_COMPONENT || |
+ descriptor == ANGULAR_ENTRY || |
+ descriptor == ANGULAR_ERRORS || |
+ descriptor == ELEMENT || |
+ descriptor == HINTS || |
+ descriptor == PARSED_UNIT || |
+ descriptor == PARSE_ERRORS || |
+ descriptor == POLYMER_BUILD_ERRORS || |
+ descriptor == POLYMER_RESOLUTION_ERRORS || |
+ descriptor == REFERENCED_LIBRARIES || |
+ descriptor == RESOLUTION_ERRORS || |
+ descriptor == RESOLVED_UNIT || |
+ super._isValidDescriptor(descriptor); |
} |
@override |
@@ -9189,18 +9972,78 @@ class HtmlEntry extends SourceEntry { |
buffer.write(oldEntry.runtimeType); |
return true; |
} |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "parseErrors", HtmlEntry.PARSE_ERRORS, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "parsedUnit", HtmlEntry.PARSED_UNIT, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "resolvedUnit", HtmlEntry.RESOLVED_UNIT, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "resolutionErrors", HtmlEntry.RESOLUTION_ERRORS, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "referencedLibraries", HtmlEntry.REFERENCED_LIBRARIES, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "element", HtmlEntry.ELEMENT, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "angularApplicationState", HtmlEntry.ANGULAR_APPLICATION, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "angularComponent", HtmlEntry.ANGULAR_COMPONENT, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "angularEntry", HtmlEntry.ANGULAR_ENTRY, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "angularErrors", HtmlEntry.ANGULAR_ERRORS, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "polymerBuildErrors", HtmlEntry.POLYMER_BUILD_ERRORS, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "polymerResolutionErrors", HtmlEntry.POLYMER_RESOLUTION_ERRORS, oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "parseErrors", |
+ HtmlEntry.PARSE_ERRORS, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "parsedUnit", |
+ HtmlEntry.PARSED_UNIT, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "resolvedUnit", |
+ HtmlEntry.RESOLVED_UNIT, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "resolutionErrors", |
+ HtmlEntry.RESOLUTION_ERRORS, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "referencedLibraries", |
+ HtmlEntry.REFERENCED_LIBRARIES, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "element", |
+ HtmlEntry.ELEMENT, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "angularApplicationState", |
+ HtmlEntry.ANGULAR_APPLICATION, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "angularComponent", |
+ HtmlEntry.ANGULAR_COMPONENT, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "angularEntry", |
+ HtmlEntry.ANGULAR_ENTRY, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "angularErrors", |
+ HtmlEntry.ANGULAR_ERRORS, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "polymerBuildErrors", |
+ HtmlEntry.POLYMER_BUILD_ERRORS, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "polymerResolutionErrors", |
+ HtmlEntry.POLYMER_RESOLUTION_ERRORS, |
+ oldEntry); |
return needsSeparator; |
} |
@@ -9230,6 +10073,66 @@ class HtmlEntry extends SourceEntry { |
* See [AnalysisContextImpl.setChangedContents]. |
*/ |
class IncrementalAnalysisCache { |
+ final Source librarySource; |
+ |
+ final Source source; |
+ |
+ final String oldContents; |
+ |
+ final CompilationUnit resolvedUnit; |
+ |
+ String _newContents; |
+ |
+ int _offset = 0; |
+ |
+ int _oldLength = 0; |
+ |
+ int _newLength = 0; |
+ |
+ IncrementalAnalysisCache(this.librarySource, this.source, this.resolvedUnit, |
+ this.oldContents, String newContents, int offset, int oldLength, int newLength) |
+ { |
+ this._newContents = newContents; |
+ this._offset = offset; |
+ this._oldLength = oldLength; |
+ this._newLength = newLength; |
+ } |
+ |
+ /** |
+ * Determine if the cache contains source changes that need to be analyzed |
+ * |
+ * @return `true` if the cache contains changes to be analyzed, else `false` |
+ */ |
+ bool get hasWork => _oldLength > 0 || _newLength > 0; |
+ |
+ /** |
+ * Return the current contents for the receiver's source. |
+ * |
+ * @return the contents (not `null`) |
+ */ |
+ String get newContents => _newContents; |
+ |
+ /** |
+ * Return the number of characters in the replacement text. |
+ * |
+ * @return the replacement length (zero or greater) |
+ */ |
+ int get newLength => _newLength; |
+ |
+ /** |
+ * Return the character position of the first changed character. |
+ * |
+ * @return the offset (zero or greater) |
+ */ |
+ int get offset => _offset; |
+ |
+ /** |
+ * Return the number of characters that were replaced. |
+ * |
+ * @return the replaced length (zero or greater) |
+ */ |
+ int get oldLength => _oldLength; |
+ |
/** |
* Determine if the incremental analysis result can be cached for the next incremental analysis. |
* |
@@ -9238,9 +10141,18 @@ class IncrementalAnalysisCache { |
* @return the cache used for incremental analysis or `null` if incremental analysis results |
* cannot be cached for the next incremental analysis |
*/ |
- static IncrementalAnalysisCache cacheResult(IncrementalAnalysisCache cache, CompilationUnit unit) { |
+ static IncrementalAnalysisCache cacheResult(IncrementalAnalysisCache cache, |
+ CompilationUnit unit) { |
if (cache != null && unit != null) { |
- return new IncrementalAnalysisCache(cache.librarySource, cache.source, unit, cache._newContents, cache._newContents, 0, 0, 0); |
+ return new IncrementalAnalysisCache( |
+ cache.librarySource, |
+ cache.source, |
+ unit, |
+ cache._newContents, |
+ cache._newContents, |
+ 0, |
+ 0, |
+ 0); |
} |
return null; |
} |
@@ -9253,7 +10165,8 @@ class IncrementalAnalysisCache { |
* @return the cache used for incremental analysis or `null` if incremental analysis cannot |
* be performed |
*/ |
- static IncrementalAnalysisCache clear(IncrementalAnalysisCache cache, Source source) { |
+ static IncrementalAnalysisCache clear(IncrementalAnalysisCache cache, |
+ Source source) { |
if (cache == null || cache.source == source) { |
return null; |
} |
@@ -9274,7 +10187,9 @@ class IncrementalAnalysisCache { |
* @return the cache used for incremental analysis or `null` if incremental analysis cannot |
* be performed |
*/ |
- static IncrementalAnalysisCache update(IncrementalAnalysisCache cache, Source source, String oldContents, String newContents, int offset, int oldLength, int newLength, SourceEntry sourceEntry) { |
+ static IncrementalAnalysisCache update(IncrementalAnalysisCache cache, |
+ Source source, String oldContents, String newContents, int offset, |
+ int oldLength, int newLength, SourceEntry sourceEntry) { |
// Determine the cache resolved unit |
Source librarySource = null; |
CompilationUnit unit = null; |
@@ -9284,12 +10199,13 @@ class IncrementalAnalysisCache { |
if (librarySources.length == 1) { |
librarySource = librarySources[0]; |
if (librarySource != null) { |
- unit = dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
+ unit = |
+ dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
} |
} |
} |
- // Create a new cache if there is not an existing cache or the source is different |
- // or a new resolved compilation unit is available |
+ // Create a new cache if there is not an existing cache or the source is |
+ // different or a new resolved compilation unit is available. |
if (cache == null || cache.source != source || unit != null) { |
if (unit == null) { |
return null; |
@@ -9298,9 +10214,18 @@ class IncrementalAnalysisCache { |
if (oldLength != 0) { |
return null; |
} |
- oldContents = "${newContents.substring(0, offset)}${newContents.substring(offset + newLength)}"; |
+ oldContents = |
+ "${newContents.substring(0, offset)}${newContents.substring(offset + newLength)}"; |
} |
- return new IncrementalAnalysisCache(librarySource, source, unit, oldContents, newContents, offset, oldLength, newLength); |
+ return new IncrementalAnalysisCache( |
+ librarySource, |
+ source, |
+ unit, |
+ oldContents, |
+ newContents, |
+ offset, |
+ oldLength, |
+ newLength); |
} |
// Update the existing cache if the change is contiguous |
if (cache._oldLength == 0 && cache._newLength == 0) { |
@@ -9327,7 +10252,9 @@ class IncrementalAnalysisCache { |
* @return the cache used for incremental analysis or `null` if incremental analysis results |
* cannot be cached for the next incremental analysis |
*/ |
- static IncrementalAnalysisCache verifyStructure(IncrementalAnalysisCache cache, Source source, CompilationUnit unit) { |
+ static IncrementalAnalysisCache |
+ verifyStructure(IncrementalAnalysisCache cache, Source source, |
+ CompilationUnit unit) { |
if (cache != null && unit != null && cache.source == source) { |
if (!AstComparator.equalNodes(cache.resolvedUnit, unit)) { |
return null; |
@@ -9335,64 +10262,6 @@ class IncrementalAnalysisCache { |
} |
return cache; |
} |
- |
- final Source librarySource; |
- |
- final Source source; |
- |
- final String oldContents; |
- |
- final CompilationUnit resolvedUnit; |
- |
- String _newContents; |
- |
- int _offset = 0; |
- |
- int _oldLength = 0; |
- |
- int _newLength = 0; |
- |
- IncrementalAnalysisCache(this.librarySource, this.source, this.resolvedUnit, this.oldContents, String newContents, int offset, int oldLength, int newLength) { |
- this._newContents = newContents; |
- this._offset = offset; |
- this._oldLength = oldLength; |
- this._newLength = newLength; |
- } |
- |
- /** |
- * Return the current contents for the receiver's source. |
- * |
- * @return the contents (not `null`) |
- */ |
- String get newContents => _newContents; |
- |
- /** |
- * Return the number of characters in the replacement text. |
- * |
- * @return the replacement length (zero or greater) |
- */ |
- int get newLength => _newLength; |
- |
- /** |
- * Return the character position of the first changed character. |
- * |
- * @return the offset (zero or greater) |
- */ |
- int get offset => _offset; |
- |
- /** |
- * Return the number of characters that were replaced. |
- * |
- * @return the replaced length (zero or greater) |
- */ |
- int get oldLength => _oldLength; |
- |
- /** |
- * Determine if the cache contains source changes that need to be analyzed |
- * |
- * @return `true` if the cache contains changes to be analyzed, else `false` |
- */ |
- bool get hasWork => _oldLength > 0 || _newLength > 0; |
} |
/** |
@@ -9415,10 +10284,8 @@ class IncrementalAnalysisTask extends AnalysisTask { |
* @param context the context in which the task is to be performed |
* @param cache the incremental analysis cache used to perform the analysis |
*/ |
- IncrementalAnalysisTask(InternalAnalysisContext context, this.cache) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this); |
+ IncrementalAnalysisTask(InternalAnalysisContext context, this.cache) |
+ : super(context); |
/** |
* Return the compilation unit that was produced by incrementally updating the existing |
@@ -9437,7 +10304,25 @@ class IncrementalAnalysisTask extends AnalysisTask { |
Source get source => cache != null ? cache.source : null; |
@override |
- String get taskDescription => "incremental analysis ${cache != null ? cache.source : "null"}"; |
+ String get taskDescription => |
+ "incremental analysis ${cache != null ? cache.source : "null"}"; |
+ |
+ /** |
+ * Return the type provider used for incremental resolution. |
+ * |
+ * @return the type provider (or `null` if an exception occurs) |
+ */ |
+ TypeProvider get typeProvider { |
+ try { |
+ return context.typeProvider; |
+ } on AnalysisException catch (exception) { |
+ return null; |
+ } |
+ } |
+ |
+ @override |
+ accept(AnalysisTaskVisitor visitor) => |
+ visitor.visitIncrementalAnalysisTask(this); |
@override |
void internalPerform() { |
@@ -9451,14 +10336,27 @@ class IncrementalAnalysisTask extends AnalysisTask { |
// Produce an updated token stream |
CharacterReader reader = new CharSequenceReader(cache.newContents); |
BooleanErrorListener errorListener = new BooleanErrorListener(); |
- IncrementalScanner scanner = new IncrementalScanner(cache.source, reader, errorListener); |
- scanner.rescan(cache.resolvedUnit.beginToken, cache.offset, cache.oldLength, cache.newLength); |
+ IncrementalScanner scanner = |
+ new IncrementalScanner(cache.source, reader, errorListener); |
+ scanner.rescan( |
+ cache.resolvedUnit.beginToken, |
+ cache.offset, |
+ cache.oldLength, |
+ cache.newLength); |
if (errorListener.errorReported) { |
return; |
} |
// Produce an updated AST |
- IncrementalParser parser = new IncrementalParser(cache.source, scanner.tokenMap, AnalysisErrorListener.NULL_LISTENER); |
- _updatedUnit = parser.reparse(cache.resolvedUnit, scanner.leftToken, scanner.rightToken, cache.offset, cache.offset + cache.oldLength); |
+ IncrementalParser parser = new IncrementalParser( |
+ cache.source, |
+ scanner.tokenMap, |
+ AnalysisErrorListener.NULL_LISTENER); |
+ _updatedUnit = parser.reparse( |
+ cache.resolvedUnit, |
+ scanner.leftToken, |
+ scanner.rightToken, |
+ cache.offset, |
+ cache.offset + cache.oldLength); |
// Update the resolution |
TypeProvider typeProvider = this.typeProvider; |
if (_updatedUnit != null && typeProvider != null) { |
@@ -9466,77 +10364,232 @@ class IncrementalAnalysisTask extends AnalysisTask { |
if (element != null) { |
LibraryElement library = element.library; |
if (library != null) { |
- IncrementalResolver resolver = new IncrementalResolver(library, cache.source, typeProvider, errorListener); |
+ IncrementalResolver resolver = |
+ new IncrementalResolver(library, cache.source, typeProvider, errorListener); |
resolver.resolve(parser.updatedNode); |
} |
} |
} |
} |
+} |
+ |
+/** |
+ * Instances of the class `InstrumentedAnalysisContextImpl` implement an |
+ * [AnalysisContext] by recording instrumentation data and delegating to |
+ * another analysis context to do the non-instrumentation work. |
+ */ |
+class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
+ /** |
+ * The unique identifier used to identify this analysis context in the instrumentation data. |
+ */ |
+ String _contextId = UUID.randomUUID().toString(); |
+ |
+ /** |
+ * The analysis context to which all of the non-instrumentation work is delegated. |
+ */ |
+ InternalAnalysisContext _basis; |
+ |
+ /** |
+ * Create a new [InstrumentedAnalysisContextImpl] which wraps a new |
+ * [AnalysisContextImpl] as the basis context. |
+ */ |
+ InstrumentedAnalysisContextImpl() : this.con1(new AnalysisContextImpl()); |
+ |
+ /** |
+ * Create a new [InstrumentedAnalysisContextImpl] with a specified basis context, aka the |
+ * context to wrap and instrument. |
+ * |
+ * @param context some [InstrumentedAnalysisContext] to wrap and instrument |
+ */ |
+ InstrumentedAnalysisContextImpl.con1(InternalAnalysisContext context) { |
+ _basis = context; |
+ } |
+ |
+ @override |
+ AnalysisOptions get analysisOptions { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getAnalysisOptions"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ return _basis.analysisOptions; |
+ } finally { |
+ instrumentation.log(); |
+ } |
+ } |
+ |
+ @override |
+ void set analysisOptions(AnalysisOptions options) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-setAnalysisOptions"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ _basis.analysisOptions = options; |
+ } finally { |
+ instrumentation.log(); |
+ } |
+ } |
+ |
+ @override |
+ void set analysisPriorityOrder(List<Source> sources) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-setAnalysisPriorityOrder"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ _basis.analysisPriorityOrder = sources; |
+ } finally { |
+ instrumentation.log(); |
+ } |
+ } |
+ |
+ /** |
+ * @return the underlying [AnalysisContext]. |
+ */ |
+ AnalysisContext get basis => _basis; |
+ |
+ @override |
+ DeclaredVariables get declaredVariables => _basis.declaredVariables; |
+ |
+ @override |
+ List<Source> get htmlSources { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getHtmlSources"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ List<Source> ret = _basis.htmlSources; |
+ if (ret != null) { |
+ instrumentation.metric2("Source-count", ret.length); |
+ } |
+ return ret; |
+ } finally { |
+ instrumentation.log(); |
+ } |
+ } |
+ |
+ @override |
+ bool get isDisposed { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-isDisposed"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ return _basis.isDisposed; |
+ } finally { |
+ instrumentation.log(); |
+ } |
+ } |
+ |
+ @override |
+ List<Source> get launchableClientLibrarySources { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getLaunchableClientLibrarySources"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ List<Source> ret = _basis.launchableClientLibrarySources; |
+ if (ret != null) { |
+ instrumentation.metric2("Source-count", ret.length); |
+ } |
+ return ret; |
+ } finally { |
+ instrumentation.log(); |
+ } |
+ } |
+ |
+ @override |
+ List<Source> get launchableServerLibrarySources { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getLaunchableServerLibrarySources"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ List<Source> ret = _basis.launchableServerLibrarySources; |
+ if (ret != null) { |
+ instrumentation.metric2("Source-count", ret.length); |
+ } |
+ return ret; |
+ } finally { |
+ instrumentation.log(); |
+ } |
+ } |
+ |
+ @override |
+ List<Source> get librarySources { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getLibrarySources"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ List<Source> ret = _basis.librarySources; |
+ if (ret != null) { |
+ instrumentation.metric2("Source-count", ret.length); |
+ } |
+ return ret; |
+ } finally { |
+ instrumentation.log(); |
+ } |
+ } |
- /** |
- * Return the type provider used for incremental resolution. |
- * |
- * @return the type provider (or `null` if an exception occurs) |
- */ |
- TypeProvider get typeProvider { |
+ @override |
+ List<Source> get prioritySources { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getPrioritySources"); |
+ _checkThread(instrumentation); |
try { |
- return context.typeProvider; |
- } on AnalysisException catch (exception) { |
- return null; |
+ instrumentation.metric3("contextId", _contextId); |
+ return _basis.prioritySources; |
+ } finally { |
+ instrumentation.log(); |
} |
} |
-} |
-/** |
- * Instances of the class `InstrumentedAnalysisContextImpl` implement an |
- * [AnalysisContext] by recording instrumentation data and delegating to |
- * another analysis context to do the non-instrumentation work. |
- */ |
-class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
- /** |
- * If the current thread is the UI thread, then note this in the specified instrumentation and |
- * append this information to the log. |
- * |
- * @param instrumentation the instrumentation, not `null` |
- */ |
- static void _checkThread(InstrumentationBuilder instrumentation) { |
+ @override |
+ List<Source> get refactoringUnsafeSources { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getRefactoringUnsafeSources"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ return _basis.refactoringUnsafeSources; |
+ } finally { |
+ instrumentation.log(); |
+ } |
} |
- /** |
- * Record an exception that was thrown during analysis. |
- * |
- * @param instrumentation the instrumentation builder being used to record the exception |
- * @param exception the exception being reported |
- */ |
- static void _recordAnalysisException(InstrumentationBuilder instrumentation, CaughtException exception) { |
- instrumentation.record(exception); |
+ @override |
+ SourceFactory get sourceFactory { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getSourceFactory"); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ return _basis.sourceFactory; |
+ } finally { |
+ instrumentation.log2(2); |
+ //Log if over 1ms |
+ } |
} |
- /** |
- * The unique identifier used to identify this analysis context in the instrumentation data. |
- */ |
- String _contextId = UUID.randomUUID().toString(); |
- |
- /** |
- * The analysis context to which all of the non-instrumentation work is delegated. |
- */ |
- InternalAnalysisContext _basis; |
+ @override |
+ void set sourceFactory(SourceFactory factory) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-setSourceFactory"); |
+ _checkThread(instrumentation); |
+ try { |
+ instrumentation.metric3("contextId", _contextId); |
+ _basis.sourceFactory = factory; |
+ } finally { |
+ instrumentation.log(); |
+ } |
+ } |
- /** |
- * Create a new [InstrumentedAnalysisContextImpl] which wraps a new |
- * [AnalysisContextImpl] as the basis context. |
- */ |
- InstrumentedAnalysisContextImpl() : this.con1(new AnalysisContextImpl()); |
+ @override |
+ AnalysisContextStatistics get statistics => _basis.statistics; |
- /** |
- * Create a new [InstrumentedAnalysisContextImpl] with a specified basis context, aka the |
- * context to wrap and instrument. |
- * |
- * @param context some [InstrumentedAnalysisContext] to wrap and instrument |
- */ |
- InstrumentedAnalysisContextImpl.con1(InternalAnalysisContext context) { |
- _basis = context; |
- } |
+ @override |
+ TypeProvider get typeProvider => _basis.typeProvider; |
@override |
void addListener(AnalysisListener listener) { |
@@ -9550,7 +10603,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
void applyAnalysisDelta(AnalysisDelta delta) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-updateAnalysis"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-updateAnalysis"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9562,7 +10616,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
void applyChanges(ChangeSet changeSet) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-applyChanges"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-applyChanges"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9574,7 +10629,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
String computeDocumentationComment(Element element) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeDocumentationComment"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-computeDocumentationComment"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9586,7 +10642,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
List<AnalysisError> computeErrors(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeErrors"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-computeErrors"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9599,17 +10656,21 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> computeExportedLibraries(Source source) => _basis.computeExportedLibraries(source); |
+ List<Source> computeExportedLibraries(Source source) => |
+ _basis.computeExportedLibraries(source); |
@override |
HtmlElement computeHtmlElement(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeHtmlElement"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-computeHtmlElement"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
return _basis.computeHtmlElement(source); |
} on AnalysisException catch (e, stackTrace) { |
- _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace)); |
+ _recordAnalysisException( |
+ instrumentation, |
+ new CaughtException(e, stackTrace)); |
throw e; |
} finally { |
instrumentation.log(); |
@@ -9617,11 +10678,13 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> computeImportedLibraries(Source source) => _basis.computeImportedLibraries(source); |
+ List<Source> computeImportedLibraries(Source source) => |
+ _basis.computeImportedLibraries(source); |
@override |
SourceKind computeKindOf(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeKindOf"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-computeKindOf"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9633,13 +10696,16 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
LibraryElement computeLibraryElement(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeLibraryElement"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-computeLibraryElement"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
return _basis.computeLibraryElement(source); |
} on AnalysisException catch (e, stackTrace) { |
- _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace)); |
+ _recordAnalysisException( |
+ instrumentation, |
+ new CaughtException(e, stackTrace)); |
throw e; |
} finally { |
instrumentation.log(); |
@@ -9648,13 +10714,16 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
LineInfo computeLineInfo(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-computeLineInfo"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-computeLineInfo"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
return _basis.computeLineInfo(source); |
} on AnalysisException catch (e, stackTrace) { |
- _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace)); |
+ _recordAnalysisException( |
+ instrumentation, |
+ new CaughtException(e, stackTrace)); |
throw e; |
} finally { |
instrumentation.log(); |
@@ -9662,12 +10731,13 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- CompilationUnit computeResolvableCompilationUnit(Source source) |
- => _basis.computeResolvableCompilationUnit(source); |
+ CompilationUnit computeResolvableCompilationUnit(Source source) => |
+ _basis.computeResolvableCompilationUnit(source); |
@override |
void dispose() { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-dispose"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-dispose"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9679,7 +10749,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
bool exists(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-exists"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-exists"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9690,20 +10761,9 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- AnalysisOptions get analysisOptions { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getAnalysisOptions"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- return _basis.analysisOptions; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
AngularApplication getAngularApplicationWithHtml(Source htmlSource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getAngularApplication"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getAngularApplication"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9713,14 +10773,11 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
} |
- /** |
- * @return the underlying [AnalysisContext]. |
- */ |
- AnalysisContext get basis => _basis; |
- |
@override |
- CompilationUnitElement getCompilationUnitElement(Source unitSource, Source librarySource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getCompilationUnitElement"); |
+ CompilationUnitElement getCompilationUnitElement(Source unitSource, |
+ Source librarySource) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getCompilationUnitElement"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9731,11 +10788,13 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- TimestampedData<String> getContents(Source source) => _basis.getContents(source); |
+ TimestampedData<String> getContents(Source source) => |
+ _basis.getContents(source); |
@override |
InternalAnalysisContext getContextFor(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getContextFor"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getContextFor"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9746,11 +10805,9 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- DeclaredVariables get declaredVariables => _basis.declaredVariables; |
- |
- @override |
Element getElement(ElementLocation location) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getElement"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getElement"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9762,7 +10819,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
AnalysisErrorInfo getErrors(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getErrors"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getErrors"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9778,7 +10836,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
HtmlElement getHtmlElement(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getHtmlElement"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getHtmlElement"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9790,7 +10849,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
List<Source> getHtmlFilesReferencing(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getHtmlFilesReferencing"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getHtmlFilesReferencing"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9805,24 +10865,9 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> get htmlSources { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getHtmlSources"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- List<Source> ret = _basis.htmlSources; |
- if (ret != null) { |
- instrumentation.metric2("Source-count", ret.length); |
- } |
- return ret; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
SourceKind getKindOf(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getKindOf"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getKindOf"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9833,40 +10878,9 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> get launchableClientLibrarySources { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLaunchableClientLibrarySources"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- List<Source> ret = _basis.launchableClientLibrarySources; |
- if (ret != null) { |
- instrumentation.metric2("Source-count", ret.length); |
- } |
- return ret; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
- List<Source> get launchableServerLibrarySources { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLaunchableServerLibrarySources"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- List<Source> ret = _basis.launchableServerLibrarySources; |
- if (ret != null) { |
- instrumentation.metric2("Source-count", ret.length); |
- } |
- return ret; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
List<Source> getLibrariesContaining(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrariesContaining"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getLibrariesContaining"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9883,7 +10897,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
List<Source> getLibrariesDependingOn(Source librarySource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrariesDependingOn"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getLibrariesDependingOn"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9899,7 +10914,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
List<Source> getLibrariesReferencedFromHtml(Source htmlSource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrariesReferencedFromHtml"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getLibrariesReferencedFromHtml"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9911,7 +10927,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
LibraryElement getLibraryElement(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibraryElement"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getLibraryElement"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9922,24 +10939,9 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> get librarySources { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLibrarySources"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- List<Source> ret = _basis.librarySources; |
- if (ret != null) { |
- instrumentation.metric2("Source-count", ret.length); |
- } |
- return ret; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
LineInfo getLineInfo(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getLineInfo"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getLineInfo"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9951,7 +10953,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
int getModificationStamp(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getModificationStamp"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getModificationStamp"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -9962,35 +10965,14 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- List<Source> get prioritySources { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getPrioritySources"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- return _basis.prioritySources; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
- Namespace getPublicNamespace(LibraryElement library) => _basis.getPublicNamespace(library); |
+ Namespace getPublicNamespace(LibraryElement library) => |
+ _basis.getPublicNamespace(library); |
@override |
- List<Source> get refactoringUnsafeSources { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getRefactoringUnsafeSources"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- return _basis.refactoringUnsafeSources; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
- CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getResolvedCompilationUnit"); |
+ CompilationUnit getResolvedCompilationUnit(Source unitSource, |
+ LibraryElement library) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getResolvedCompilationUnit"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -10001,8 +10983,10 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- CompilationUnit getResolvedCompilationUnit2(Source unitSource, Source librarySource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getResolvedCompilationUnit"); |
+ CompilationUnit getResolvedCompilationUnit2(Source unitSource, |
+ Source librarySource) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getResolvedCompilationUnit"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -10015,7 +10999,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getResolvedHtmlUnit"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-getResolvedHtmlUnit"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -10027,26 +11012,9 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- SourceFactory get sourceFactory { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getSourceFactory"); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- return _basis.sourceFactory; |
- } finally { |
- instrumentation.log2(2); |
- //Log if over 1ms |
- } |
- } |
- |
- @override |
- AnalysisContextStatistics get statistics => _basis.statistics; |
- |
- @override |
- TypeProvider get typeProvider => _basis.typeProvider; |
- |
- @override |
bool isClientLibrary(Source librarySource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isClientLibrary"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-isClientLibrary"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -10057,20 +11025,9 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- bool get isDisposed { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isDisposed"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- return _basis.isDisposed; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
bool isServerLibrary(Source librarySource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-isServerLibrary"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-isServerLibrary"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -10082,13 +11039,16 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
CompilationUnit parseCompilationUnit(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-parseCompilationUnit"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-parseCompilationUnit"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
return _basis.parseCompilationUnit(source); |
} on AnalysisException catch (e, stackTrace) { |
- _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace)); |
+ _recordAnalysisException( |
+ instrumentation, |
+ new CaughtException(e, stackTrace)); |
throw e; |
} finally { |
instrumentation.log(); |
@@ -10097,13 +11057,16 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
ht.HtmlUnit parseHtmlUnit(Source source) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-parseHtmlUnit"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-parseHtmlUnit"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
return _basis.parseHtmlUnit(source); |
} on AnalysisException catch (e, stackTrace) { |
- _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace)); |
+ _recordAnalysisException( |
+ instrumentation, |
+ new CaughtException(e, stackTrace)); |
throw e; |
} finally { |
instrumentation.log(); |
@@ -10112,13 +11075,16 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
AnalysisResult performAnalysisTask() { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-performAnalysisTask"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-performAnalysisTask"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
AnalysisResult result = _basis.performAnalysisTask(); |
if (result.changeNotices != null) { |
- instrumentation.metric2("ChangeNotice-count", result.changeNotices.length); |
+ instrumentation.metric2( |
+ "ChangeNotice-count", |
+ result.changeNotices.length); |
} |
return result; |
} finally { |
@@ -10138,44 +11104,18 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement library) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveCompilationUnit"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- return _basis.resolveCompilationUnit(unitSource, library); |
- } on AnalysisException catch (e, stackTrace) { |
- _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace)); |
- throw e; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
- CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveCompilationUnit"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- return _basis.resolveCompilationUnit2(unitSource, librarySource); |
- } on AnalysisException catch (e, stackTrace) { |
- _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace)); |
- throw e; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
- ht.HtmlUnit resolveHtmlUnit(Source htmlSource) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-resolveHtmlUnit"); |
+ CompilationUnit resolveCompilationUnit(Source unitSource, |
+ LibraryElement library) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-resolveCompilationUnit"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
- return _basis.resolveHtmlUnit(htmlSource); |
+ return _basis.resolveCompilationUnit(unitSource, library); |
} on AnalysisException catch (e, stackTrace) { |
- _recordAnalysisException(instrumentation, new CaughtException(e, stackTrace)); |
+ _recordAnalysisException( |
+ instrumentation, |
+ new CaughtException(e, stackTrace)); |
throw e; |
} finally { |
instrumentation.log(); |
@@ -10183,32 +11123,47 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- void set analysisOptions(AnalysisOptions options) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setAnalysisOptions"); |
+ CompilationUnit resolveCompilationUnit2(Source unitSource, |
+ Source librarySource) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-resolveCompilationUnit"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
- _basis.analysisOptions = options; |
+ return _basis.resolveCompilationUnit2(unitSource, librarySource); |
+ } on AnalysisException catch (e, stackTrace) { |
+ _recordAnalysisException( |
+ instrumentation, |
+ new CaughtException(e, stackTrace)); |
+ throw e; |
} finally { |
instrumentation.log(); |
} |
} |
@override |
- void set analysisPriorityOrder(List<Source> sources) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setAnalysisPriorityOrder"); |
+ ht.HtmlUnit resolveHtmlUnit(Source htmlSource) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-resolveHtmlUnit"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
- _basis.analysisPriorityOrder = sources; |
+ return _basis.resolveHtmlUnit(htmlSource); |
+ } on AnalysisException catch (e, stackTrace) { |
+ _recordAnalysisException( |
+ instrumentation, |
+ new CaughtException(e, stackTrace)); |
+ throw e; |
} finally { |
instrumentation.log(); |
} |
} |
@override |
- void setChangedContents(Source source, String contents, int offset, int oldLength, int newLength) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setChangedContents"); |
+ void setChangedContents(Source source, String contents, int offset, |
+ int oldLength, int newLength) { |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-setChangedContents"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -10220,7 +11175,8 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
@override |
void setContents(Source source, String contents) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setContents"); |
+ InstrumentationBuilder instrumentation = |
+ Instrumentation.builder2("Analysis-setContents"); |
_checkThread(instrumentation); |
try { |
instrumentation.metric3("contextId", _contextId); |
@@ -10231,23 +11187,30 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
- void set sourceFactory(SourceFactory factory) { |
- InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-setSourceFactory"); |
- _checkThread(instrumentation); |
- try { |
- instrumentation.metric3("contextId", _contextId); |
- _basis.sourceFactory = factory; |
- } finally { |
- instrumentation.log(); |
- } |
- } |
- |
- @override |
void visitCacheItems(void callback(Source source, SourceEntry dartEntry, |
- DataDescriptor rowDesc, |
- CacheState state)) { |
+ DataDescriptor rowDesc, CacheState state)) { |
_basis.visitCacheItems(callback); |
} |
+ |
+ /** |
+ * If the current thread is the UI thread, then note this in the specified instrumentation and |
+ * append this information to the log. |
+ * |
+ * @param instrumentation the instrumentation, not `null` |
+ */ |
+ static void _checkThread(InstrumentationBuilder instrumentation) { |
+ } |
+ |
+ /** |
+ * Record an exception that was thrown during analysis. |
+ * |
+ * @param instrumentation the instrumentation builder being used to record the exception |
+ * @param exception the exception being reported |
+ */ |
+ static void _recordAnalysisException(InstrumentationBuilder instrumentation, |
+ CaughtException exception) { |
+ instrumentation.record(exception); |
+ } |
} |
/** |
@@ -10256,6 +11219,28 @@ class InstrumentedAnalysisContextImpl implements InternalAnalysisContext { |
*/ |
abstract class InternalAnalysisContext implements AnalysisContext { |
/** |
+ * Return an array containing all of the sources that have been marked as priority sources. |
+ * Clients must not modify the returned array. |
+ * |
+ * @return the sources that have been marked as priority sources |
+ */ |
+ List<Source> get prioritySources; |
+ |
+ /** |
+ * Returns a statistics about this context. |
+ */ |
+ AnalysisContextStatistics get statistics; |
+ |
+ /** |
+ * Returns a type provider for this context or throws an exception if dart:core cannot be |
+ * resolved. |
+ * |
+ * @return the type provider (not `null`) |
+ * @throws AnalysisException if dart:core cannot be resolved |
+ */ |
+ TypeProvider get typeProvider; |
+ |
+ /** |
* Add the given source with the given information to this context. |
* |
* @param source the source to be added |
@@ -10307,14 +11292,6 @@ abstract class InternalAnalysisContext implements AnalysisContext { |
InternalAnalysisContext getContextFor(Source source); |
/** |
- * Return an array containing all of the sources that have been marked as priority sources. |
- * Clients must not modify the returned array. |
- * |
- * @return the sources that have been marked as priority sources |
- */ |
- List<Source> get prioritySources; |
- |
- /** |
* Return a namespace containing mappings for all of the public names defined by the given |
* library. |
* |
@@ -10324,20 +11301,6 @@ abstract class InternalAnalysisContext implements AnalysisContext { |
Namespace getPublicNamespace(LibraryElement library); |
/** |
- * Returns a statistics about this context. |
- */ |
- AnalysisContextStatistics get statistics; |
- |
- /** |
- * Returns a type provider for this context or throws an exception if dart:core cannot be |
- * resolved. |
- * |
- * @return the type provider (not `null`) |
- * @throws AnalysisException if dart:core cannot be resolved |
- */ |
- TypeProvider get typeProvider; |
- |
- /** |
* Given a table mapping the source for the libraries represented by the corresponding elements to |
* the elements representing the libraries, record those mappings. |
* |
@@ -10350,8 +11313,7 @@ abstract class InternalAnalysisContext implements AnalysisContext { |
* Call the given callback function for eache cache item in the context. |
*/ |
void visitCacheItems(void callback(Source source, SourceEntry dartEntry, |
- DataDescriptor rowDesc, |
- CacheState state)); |
+ DataDescriptor rowDesc, CacheState state)); |
} |
/** |
@@ -10401,27 +11363,6 @@ abstract class Logger { |
} |
/** |
- * An implementation of [Logger] that does nothing. |
- */ |
-class NullLogger implements Logger { |
- @override |
- void logError(String message, [CaughtException exception]) { |
- } |
- |
- @override |
- void logError2(String message, Object exception) { |
- } |
- |
- @override |
- void logInformation(String message, [CaughtException exception]) { |
- } |
- |
- @override |
- void logInformation2(String message, Object exception) { |
- } |
-} |
- |
-/** |
* [NgComponentElementProcessor] applies [AngularComponentElement] by parsing mapped |
* attributes as expressions. |
*/ |
@@ -10440,7 +11381,8 @@ class NgComponentElementProcessor extends NgDirectiveProcessor { |
attribute.element = property; |
// resolve if binding |
if (property.propertyKind != AngularPropertyKind.ATTR) { |
- AngularExpression expression = parseAngularExpression(resolver, attribute); |
+ AngularExpression expression = |
+ parseAngularExpression(resolver, attribute); |
resolver._resolveExpression(expression); |
setAngularExpression(attribute, expression); |
} |
@@ -10464,9 +11406,10 @@ class NgControllerElementProcessor extends NgProcessor { |
void apply(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) { |
InterfaceType type = (_element.enclosingElement as ClassElement).type; |
String name = _element.name; |
- LocalVariableElementImpl variable = resolver._createLocalVariableWithName(type, name); |
+ LocalVariableElementImpl variable = |
+ resolver._createLocalVariableWithName(type, name); |
resolver._defineVariable(variable); |
- variable.toolkitObjects = <AngularElement> [_element]; |
+ variable.toolkitObjects = <AngularElement>[_element]; |
} |
@override |
@@ -10490,7 +11433,8 @@ class NgDecoratorElementProcessor extends NgDirectiveProcessor { |
if (selector is HasAttributeSelectorElementImpl) { |
selectorAttributeName = selector.name; |
// resolve attribute expression |
- ht.XmlAttributeNode attribute = node.getAttribute(selectorAttributeName); |
+ ht.XmlAttributeNode attribute = |
+ node.getAttribute(selectorAttributeName); |
if (attribute != null) { |
attribute.element = selector; |
} |
@@ -10521,7 +11465,8 @@ class NgDecoratorElementProcessor extends NgDirectiveProcessor { |
resolver._pushNameScope(); |
try { |
_onNgEventDirective(resolver); |
- AngularExpression expression = parseAngularExpression(resolver, attribute); |
+ AngularExpression expression = |
+ parseAngularExpression(resolver, attribute); |
resolver._resolveExpression(expression); |
setAngularExpression(attribute, expression); |
} finally { |
@@ -10540,7 +11485,8 @@ class NgDecoratorElementProcessor extends NgDirectiveProcessor { |
void _onNgEventDirective(AngularHtmlUnitResolver resolver) { |
if (_element.isClass("NgEventDirective")) { |
DartType dynamicType = resolver.typeProvider.dynamicType; |
- resolver._defineVariable(resolver._createLocalVariableWithName(dynamicType, "\$event")); |
+ resolver._defineVariable( |
+ resolver._createLocalVariableWithName(dynamicType, "\$event")); |
} |
} |
} |
@@ -10549,21 +11495,14 @@ class NgDecoratorElementProcessor extends NgDirectiveProcessor { |
* [NgDirectiveProcessor] describes any <code>Directive</code> annotation instance. |
*/ |
abstract class NgDirectiveProcessor extends NgProcessor { |
- static bool hasValue(ht.XmlAttributeNode attribute) { |
- ht.Token valueToken = attribute.valueToken; |
- return valueToken != null && !valueToken.isSynthetic; |
- } |
- |
- static AngularRawXmlExpression newAngularRawXmlExpression(AngularExpression e) => new AngularRawXmlExpression(e); |
- |
- static ht.RawXmlExpression newRawXmlExpression(Expression e) => new ht.RawXmlExpression(e); |
- |
- AngularExpression parseAngularExpression(AngularHtmlUnitResolver resolver, ht.XmlAttributeNode attribute) { |
+ AngularExpression parseAngularExpression(AngularHtmlUnitResolver resolver, |
+ ht.XmlAttributeNode attribute) { |
Token token = _scanAttribute(resolver, attribute); |
return resolver._parseAngularExpressionInToken(token); |
} |
- Expression parseDartExpression(AngularHtmlUnitResolver resolver, ht.XmlAttributeNode attribute) { |
+ Expression parseDartExpression(AngularHtmlUnitResolver resolver, |
+ ht.XmlAttributeNode attribute) { |
Token token = _scanAttribute(resolver, attribute); |
return resolver._parseDartExpressionInToken(token); |
} |
@@ -10571,7 +11510,8 @@ abstract class NgDirectiveProcessor extends NgProcessor { |
/** |
* Sets single [AngularExpression] for [XmlAttributeNode]. |
*/ |
- void setAngularExpression(ht.XmlAttributeNode attribute, AngularExpression expression) { |
+ void setAngularExpression(ht.XmlAttributeNode attribute, |
+ AngularExpression expression) { |
_setExpression(attribute, newAngularRawXmlExpression(expression)); |
} |
@@ -10582,19 +11522,34 @@ abstract class NgDirectiveProcessor extends NgProcessor { |
_setExpression(attribute, newRawXmlExpression(expression)); |
} |
- void setExpressions(ht.XmlAttributeNode attribute, List<ht.XmlExpression> xmlExpressions) { |
+ void setExpressions(ht.XmlAttributeNode attribute, |
+ List<ht.XmlExpression> xmlExpressions) { |
attribute.expressions = new List.from(xmlExpressions); |
} |
- Token _scanAttribute(AngularHtmlUnitResolver resolver, ht.XmlAttributeNode attribute) { |
+ Token _scanAttribute(AngularHtmlUnitResolver resolver, |
+ ht.XmlAttributeNode attribute) { |
int offset = attribute.valueToken.offset + 1; |
String value = attribute.text; |
return resolver._scanDart(value, 0, value.length, offset); |
} |
- void _setExpression(ht.XmlAttributeNode attribute, ht.XmlExpression xmlExpression) { |
- attribute.expressions = <ht.XmlExpression> [xmlExpression]; |
+ void _setExpression(ht.XmlAttributeNode attribute, |
+ ht.XmlExpression xmlExpression) { |
+ attribute.expressions = <ht.XmlExpression>[xmlExpression]; |
+ } |
+ |
+ static bool hasValue(ht.XmlAttributeNode attribute) { |
+ ht.Token valueToken = attribute.valueToken; |
+ return valueToken != null && !valueToken.isSynthetic; |
} |
+ |
+ static AngularRawXmlExpression |
+ newAngularRawXmlExpression(AngularExpression e) => |
+ new AngularRawXmlExpression(e); |
+ |
+ static ht.RawXmlExpression newRawXmlExpression(Expression e) => |
+ new ht.RawXmlExpression(e); |
} |
/** |
@@ -10626,7 +11581,8 @@ class NgModelProcessor extends NgDirectiveProcessor { |
* This method is used to define top-level [VariableElement]s for each "ng-model" with |
* simple identifier model. |
*/ |
- void _applyTopDeclarations(AngularHtmlUnitResolver resolver, ht.XmlTagNode node) { |
+ void _applyTopDeclarations(AngularHtmlUnitResolver resolver, |
+ ht.XmlTagNode node) { |
ht.XmlAttributeNode attribute = node.getAttribute(_NG_MODEL); |
Expression expression = parseDartExpression(resolver, attribute); |
// if not identifier, then not a top-level model, delay until "apply" |
@@ -10636,7 +11592,8 @@ class NgModelProcessor extends NgDirectiveProcessor { |
SimpleIdentifier identifier = expression as SimpleIdentifier; |
// define variable Element |
InterfaceType type = resolver.typeProvider.stringType; |
- LocalVariableElementImpl element = resolver._createLocalVariableFromIdentifier(type, identifier); |
+ LocalVariableElementImpl element = |
+ resolver._createLocalVariableFromIdentifier(type, identifier); |
resolver._defineTopVariable(element); |
// remember expression |
identifier.staticElement = element; |
@@ -10667,6 +11624,27 @@ abstract class NgProcessor { |
} |
/** |
+ * An implementation of [Logger] that does nothing. |
+ */ |
+class NullLogger implements Logger { |
+ @override |
+ void logError(String message, [CaughtException exception]) { |
+ } |
+ |
+ @override |
+ void logError2(String message, Object exception) { |
+ } |
+ |
+ @override |
+ void logInformation(String message, [CaughtException exception]) { |
+ } |
+ |
+ @override |
+ void logInformation2(String message, Object exception) { |
+ } |
+} |
+ |
+/** |
* Instances of the class `ObsoleteSourceAnalysisException` represent an analysis attempt that |
* failed because a source was deleted between the time the analysis started and the time the |
* results of the analysis were ready to be recorded. |
@@ -10682,7 +11660,9 @@ class ObsoleteSourceAnalysisException extends AnalysisException { |
* |
* @param source the source that was removed while it was being analyzed |
*/ |
- ObsoleteSourceAnalysisException(Source source) : super("The source '${source.fullName}' was removed while it was being analyzed") { |
+ ObsoleteSourceAnalysisException(Source source) |
+ : super( |
+ "The source '${source.fullName}' was removed while it was being analyzed") { |
this._source = source; |
} |
@@ -10699,44 +11679,6 @@ class ObsoleteSourceAnalysisException extends AnalysisException { |
*/ |
class ParseDartTask extends AnalysisTask { |
/** |
- * Return the result of resolving the URI of the given URI-based directive against the URI of the |
- * given library, or `null` if the URI is not valid. |
- * |
- * @param context the context in which the resolution is to be performed |
- * @param librarySource the source representing the library containing the directive |
- * @param directive the directive which URI should be resolved |
- * @param errorListener the error listener to which errors should be reported |
- * @return the result of resolving the URI against the URI of the library |
- */ |
- static Source resolveDirective(AnalysisContext context, Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) { |
- StringLiteral uriLiteral = directive.uri; |
- String uriContent = uriLiteral.stringValue; |
- if (uriContent != null) { |
- uriContent = uriContent.trim(); |
- directive.uriContent = uriContent; |
- } |
- UriValidationCode code = directive.validate(); |
- if (code == null) { |
- String encodedUriContent = Uri.encodeFull(uriContent); |
- Source source = context.sourceFactory.resolveUri(librarySource, encodedUriContent); |
- directive.source = source; |
- return source; |
- } |
- if (code == UriValidationCode.URI_WITH_DART_EXT_SCHEME) { |
- return null; |
- } |
- if (code == UriValidationCode.URI_WITH_INTERPOLATION) { |
- errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION)); |
- return null; |
- } |
- if (code == UriValidationCode.INVALID_URI) { |
- errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent])); |
- return null; |
- } |
- throw new RuntimeException(message: "Failed to handle validation code: $code"); |
- } |
- |
- /** |
* The source to be parsed. |
*/ |
final Source source; |
@@ -10794,10 +11736,9 @@ class ParseDartTask extends AnalysisTask { |
* @param tokenStream the head of the token stream used for parsing |
* @param lineInfo the line information associated with the source |
*/ |
- ParseDartTask(InternalAnalysisContext context, this.source, this._tokenStream, this.lineInfo) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this); |
+ ParseDartTask(InternalAnalysisContext context, this.source, this._tokenStream, |
+ this.lineInfo) |
+ : super(context); |
/** |
* Return the compilation unit that was produced by parsing the source, or `null` if the |
@@ -10824,22 +11765,6 @@ class ParseDartTask extends AnalysisTask { |
List<Source> get exportedSources => _toArray(_exportedSources); |
/** |
- * Return an array containing the sources referenced by 'import' directives, or an empty array if |
- * the task has not yet been performed or if an exception occurred. |
- * |
- * @return an array containing the sources referenced by 'import' directives |
- */ |
- List<Source> get importedSources => _toArray(_importedSources); |
- |
- /** |
- * Return an array containing the sources referenced by 'part' directives, or an empty array if |
- * the task has not yet been performed or if an exception occurred. |
- * |
- * @return an array containing the sources referenced by 'part' directives |
- */ |
- List<Source> get includedSources => _toArray(_includedSources); |
- |
- /** |
* Return `true` if the source contains any directive other than a 'part of' directive, or |
* `false` if the task has not yet been performed or if an exception occurred. |
* |
@@ -10855,6 +11780,22 @@ class ParseDartTask extends AnalysisTask { |
*/ |
bool get hasPartOfDirective => _containsPartOfDirective; |
+ /** |
+ * Return an array containing the sources referenced by 'import' directives, or an empty array if |
+ * the task has not yet been performed or if an exception occurred. |
+ * |
+ * @return an array containing the sources referenced by 'import' directives |
+ */ |
+ List<Source> get importedSources => _toArray(_importedSources); |
+ |
+ /** |
+ * Return an array containing the sources referenced by 'part' directives, or an empty array if |
+ * the task has not yet been performed or if an exception occurred. |
+ * |
+ * @return an array containing the sources referenced by 'part' directives |
+ */ |
+ List<Source> get includedSources => _toArray(_includedSources); |
+ |
@override |
String get taskDescription { |
if (source == null) { |
@@ -10864,11 +11805,15 @@ class ParseDartTask extends AnalysisTask { |
} |
@override |
+ accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this); |
+ |
+ @override |
void internalPerform() { |
// |
// Then parse the token stream. |
// |
- TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start(); |
+ TimeCounter_TimeCounterHandle timeCounterParse = |
+ PerformanceStatistics.parse.start(); |
try { |
RecordingErrorListener errorListener = new RecordingErrorListener(); |
Parser parser = new Parser(source, errorListener); |
@@ -10886,7 +11831,8 @@ class ParseDartTask extends AnalysisTask { |
} else { |
_containsNonPartOfDirective = true; |
if (directive is UriBasedDirective) { |
- Source referencedSource = resolveDirective(analysisContext, source, directive, errorListener); |
+ Source referencedSource = |
+ resolveDirective(analysisContext, source, directive, errorListener); |
if (referencedSource != null) { |
if (directive is ExportDirective) { |
_exportedSources.add(referencedSource); |
@@ -10897,7 +11843,8 @@ class ParseDartTask extends AnalysisTask { |
_includedSources.add(referencedSource); |
} |
} else { |
- throw new AnalysisException("$runtimeType failed to handle a ${directive.runtimeType}"); |
+ throw new AnalysisException( |
+ "$runtimeType failed to handle a ${directive.runtimeType}"); |
} |
} |
} |
@@ -10922,12 +11869,74 @@ class ParseDartTask extends AnalysisTask { |
} |
return new List.from(sources); |
} |
+ |
+ /** |
+ * Return the result of resolving the URI of the given URI-based directive against the URI of the |
+ * given library, or `null` if the URI is not valid. |
+ * |
+ * @param context the context in which the resolution is to be performed |
+ * @param librarySource the source representing the library containing the directive |
+ * @param directive the directive which URI should be resolved |
+ * @param errorListener the error listener to which errors should be reported |
+ * @return the result of resolving the URI against the URI of the library |
+ */ |
+ static Source resolveDirective(AnalysisContext context, Source librarySource, |
+ UriBasedDirective directive, AnalysisErrorListener errorListener) { |
+ StringLiteral uriLiteral = directive.uri; |
+ String uriContent = uriLiteral.stringValue; |
+ if (uriContent != null) { |
+ uriContent = uriContent.trim(); |
+ directive.uriContent = uriContent; |
+ } |
+ UriValidationCode code = directive.validate(); |
+ if (code == null) { |
+ String encodedUriContent = Uri.encodeFull(uriContent); |
+ Source source = |
+ context.sourceFactory.resolveUri(librarySource, encodedUriContent); |
+ directive.source = source; |
+ return source; |
+ } |
+ if (code == UriValidationCode.URI_WITH_DART_EXT_SCHEME) { |
+ return null; |
+ } |
+ if (code == UriValidationCode.URI_WITH_INTERPOLATION) { |
+ errorListener.onError( |
+ new AnalysisError.con2( |
+ librarySource, |
+ uriLiteral.offset, |
+ uriLiteral.length, |
+ CompileTimeErrorCode.URI_WITH_INTERPOLATION)); |
+ return null; |
+ } |
+ if (code == UriValidationCode.INVALID_URI) { |
+ errorListener.onError( |
+ new AnalysisError.con2( |
+ librarySource, |
+ uriLiteral.offset, |
+ uriLiteral.length, |
+ CompileTimeErrorCode.INVALID_URI, |
+ [uriContent])); |
+ return null; |
+ } |
+ throw new RuntimeException( |
+ message: "Failed to handle validation code: $code"); |
+ } |
} |
-/** |
- * Instances of the class `ParseHtmlTask` parse a specific source as an HTML file. |
- */ |
-class ParseHtmlTask extends AnalysisTask { |
+/** |
+ * Instances of the class `ParseHtmlTask` parse a specific source as an HTML file. |
+ */ |
+class ParseHtmlTask extends AnalysisTask { |
+ /** |
+ * The name of the 'src' attribute in a HTML tag. |
+ */ |
+ static String _ATTRIBUTE_SRC = "src"; |
+ |
+ /** |
+ * The name of the 'script' tag in an HTML file. |
+ */ |
+ static String _TAG_SCRIPT = "script"; |
+ |
/** |
* The source to be parsed. |
*/ |
@@ -10959,26 +11968,14 @@ class ParseHtmlTask extends AnalysisTask { |
List<Source> _referencedLibraries = Source.EMPTY_ARRAY; |
/** |
- * The name of the 'src' attribute in a HTML tag. |
- */ |
- static String _ATTRIBUTE_SRC = "src"; |
- |
- /** |
- * The name of the 'script' tag in an HTML file. |
- */ |
- static String _TAG_SCRIPT = "script"; |
- |
- /** |
* Initialize a newly created task to perform analysis within the given context. |
* |
* @param context the context in which the task is to be performed |
* @param source the source to be parsed |
* @param content the contents of the source |
*/ |
- ParseHtmlTask(InternalAnalysisContext context, this.source, this._content) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitParseHtmlTask(this); |
+ ParseHtmlTask(InternalAnalysisContext context, this.source, this._content) |
+ : super(context); |
/** |
* Return the errors that were produced by scanning and parsing the source, or `null` if the |
@@ -10996,6 +11993,20 @@ class ParseHtmlTask extends AnalysisTask { |
ht.HtmlUnit get htmlUnit => _unit; |
/** |
+ * Return the sources of libraries that are referenced in the specified HTML file. |
+ * |
+ * @return the sources of libraries that are referenced in the HTML file |
+ */ |
+ List<Source> get librarySources { |
+ List<Source> libraries = new List<Source>(); |
+ _unit.accept(new ParseHtmlTask_getLibrarySources(this, libraries)); |
+ if (libraries.isEmpty) { |
+ return Source.EMPTY_ARRAY; |
+ } |
+ return libraries; |
+ } |
+ |
+ /** |
* Return the line information that was produced, or `null` if the task has not yet been |
* performed or if an exception occurred. |
* |
@@ -11019,49 +12030,80 @@ class ParseHtmlTask extends AnalysisTask { |
} |
@override |
+ accept(AnalysisTaskVisitor visitor) => visitor.visitParseHtmlTask(this); |
+ |
+ @override |
void internalPerform() { |
try { |
ht.AbstractScanner scanner = new ht.StringScanner(source, _content); |
- scanner.passThroughElements = <String> [_TAG_SCRIPT]; |
+ scanner.passThroughElements = <String>[_TAG_SCRIPT]; |
ht.Token token = scanner.tokenize(); |
_lineInfo = new LineInfo(scanner.lineStarts); |
RecordingErrorListener errorListener = new RecordingErrorListener(); |
_unit = new ht.HtmlParser(source, errorListener).parse(token, _lineInfo); |
- _unit.accept(new RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this, errorListener)); |
+ _unit.accept( |
+ new RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this, errorListener)); |
_errors = errorListener.getErrorsForSource(source); |
_referencedLibraries = librarySources; |
} catch (exception, stackTrace) { |
- throw new AnalysisException("Exception", new CaughtException(exception, stackTrace)); |
- } |
- } |
- |
- /** |
- * Return the sources of libraries that are referenced in the specified HTML file. |
- * |
- * @return the sources of libraries that are referenced in the HTML file |
- */ |
- List<Source> get librarySources { |
- List<Source> libraries = new List<Source>(); |
- _unit.accept(new ParseHtmlTask_getLibrarySources(this, libraries)); |
- if (libraries.isEmpty) { |
- return Source.EMPTY_ARRAY; |
+ throw new AnalysisException( |
+ "Exception", |
+ new CaughtException(exception, stackTrace)); |
} |
- return libraries; |
} |
/** |
* Resolves directives in the given [CompilationUnit]. |
*/ |
- void _resolveScriptDirectives(CompilationUnit script, AnalysisErrorListener errorListener) { |
+ void _resolveScriptDirectives(CompilationUnit script, |
+ AnalysisErrorListener errorListener) { |
if (script == null) { |
return; |
} |
AnalysisContext analysisContext = context; |
for (Directive directive in script.directives) { |
if (directive is UriBasedDirective) { |
- ParseDartTask.resolveDirective(analysisContext, source, directive, errorListener); |
+ ParseDartTask.resolveDirective( |
+ analysisContext, |
+ source, |
+ directive, |
+ errorListener); |
+ } |
+ } |
+ } |
+} |
+ |
+class ParseHtmlTask_getLibrarySources extends ht.RecursiveXmlVisitor<Object> { |
+ final ParseHtmlTask _task; |
+ |
+ List<Source> libraries; |
+ |
+ ParseHtmlTask_getLibrarySources(this._task, this.libraries) : super(); |
+ |
+ @override |
+ Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) { |
+ ht.XmlAttributeNode scriptAttribute = null; |
+ for (ht.XmlAttributeNode attribute in node.attributes) { |
+ if (javaStringEqualsIgnoreCase( |
+ attribute.name, |
+ ParseHtmlTask._ATTRIBUTE_SRC)) { |
+ scriptAttribute = attribute; |
+ } |
+ } |
+ if (scriptAttribute != null) { |
+ try { |
+ Uri uri = new Uri(path: scriptAttribute.text); |
+ String fileName = uri.path; |
+ Source librarySource = |
+ _task.context.sourceFactory.resolveUri(_task.source, fileName); |
+ if (_task.context.exists(librarySource)) { |
+ libraries.add(librarySource); |
+ } |
+ } on FormatException catch (e) { |
+ // ignored - invalid URI reported during resolution phase |
} |
} |
+ return super.visitHtmlScriptTagNode(node); |
} |
} |
@@ -11071,14 +12113,15 @@ class ParseHtmlTask extends AnalysisTask { |
*/ |
class PartitionManager { |
/** |
- * A table mapping SDK's to the partitions used for those SDK's. |
+ * The default cache size for a Dart SDK partition. |
*/ |
- HashMap<DartSdk, SdkCachePartition> _sdkPartitions = new HashMap<DartSdk, SdkCachePartition>(); |
+ static int _DEFAULT_SDK_CACHE_SIZE = 256; |
/** |
- * The default cache size for a Dart SDK partition. |
+ * A table mapping SDK's to the partitions used for those SDK's. |
*/ |
- static int _DEFAULT_SDK_CACHE_SIZE = 256; |
+ HashMap<DartSdk, SdkCachePartition> _sdkPartitions = |
+ new HashMap<DartSdk, SdkCachePartition>(); |
/** |
* Clear any cached data being maintained by this manager. |
@@ -11201,10 +12244,9 @@ class PolymerBuildHtmlTask extends AnalysisTask { |
* @param lineInfo the line information associated with the source |
* @param unit the HTML unit to build Polymer elements for |
*/ |
- PolymerBuildHtmlTask(InternalAnalysisContext context, this.source, this._lineInfo, this._unit) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitPolymerBuildHtmlTask(this); |
+ PolymerBuildHtmlTask(InternalAnalysisContext context, this.source, |
+ this._lineInfo, this._unit) |
+ : super(context); |
List<AnalysisError> get errors => _errors; |
@@ -11212,9 +12254,14 @@ class PolymerBuildHtmlTask extends AnalysisTask { |
String get taskDescription => "build Polymer elements ${source.fullName}"; |
@override |
+ accept(AnalysisTaskVisitor visitor) => |
+ visitor.visitPolymerBuildHtmlTask(this); |
+ |
+ @override |
void internalPerform() { |
RecordingErrorListener errorListener = new RecordingErrorListener(); |
- PolymerHtmlUnitBuilder resolver = new PolymerHtmlUnitBuilder(context, errorListener, source, _lineInfo, _unit); |
+ PolymerHtmlUnitBuilder resolver = |
+ new PolymerHtmlUnitBuilder(context, errorListener, source, _lineInfo, _unit); |
resolver.build(); |
_errors = errorListener.getErrorsForSource(source); |
} |
@@ -11231,66 +12278,6 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
*/ |
static Set<String> _FORBIDDEN_TAG_NAMES = new Set(); |
- static bool isValidAttributeName(String name) { |
- // cannot be empty |
- if (name.isEmpty) { |
- return false; |
- } |
- // check characters |
- int length = name.length; |
- for (int i = 0; i < length; i++) { |
- int c = name.codeUnitAt(i); |
- if (i == 0) { |
- if (!Character.isLetter(c)) { |
- return false; |
- } |
- } else { |
- if (!(Character.isLetterOrDigit(c) || c == 0x5F)) { |
- return false; |
- } |
- } |
- } |
- return true; |
- } |
- |
- static bool isValidTagName(String name) { |
- // cannot be empty |
- if (name.isEmpty) { |
- return false; |
- } |
- // check for forbidden name |
- if (_FORBIDDEN_TAG_NAMES.contains(name)) { |
- return false; |
- } |
- // check characters |
- int length = name.length; |
- bool hasDash = false; |
- for (int i = 0; i < length; i++) { |
- int c = name.codeUnitAt(i); |
- // check for '-' |
- if (c == 0x2D) { |
- hasDash = true; |
- } |
- // check character |
- if (i == 0) { |
- if (hasDash) { |
- return false; |
- } |
- if (!Character.isLetter(c)) { |
- return false; |
- } |
- } else { |
- if (!(Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F)) { |
- return false; |
- } |
- } |
- } |
- if (!hasDash) { |
- return false; |
- } |
- return true; |
- } |
- |
final InternalAnalysisContext _context; |
TypeProvider _typeProvider; |
@@ -11313,11 +12300,32 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
PolymerTagDartElementImpl _dartElement; |
- PolymerHtmlUnitBuilder(this._context, this._errorListener, this._source, this._lineInfo, this._unit) { |
+ PolymerHtmlUnitBuilder(this._context, this._errorListener, this._source, |
+ this._lineInfo, this._unit) { |
this._typeProvider = _context.typeProvider; |
} |
/** |
+ * Returns the only [LibraryElement] referenced by a direct `script` child. Maybe |
+ * `null` if none. |
+ */ |
+ LibraryElement get dartUnitElement { |
+ // TODO(scheglov) Maybe check if more than one "script". |
+ for (ht.XmlTagNode child in _elementNode.tagNodes) { |
+ if (child is ht.HtmlScriptTagNode) { |
+ HtmlScriptElement scriptElement = child.scriptElement; |
+ if (scriptElement is ExternalHtmlScriptElement) { |
+ Source scriptSource = scriptElement.scriptSource; |
+ if (scriptSource != null) { |
+ return _context.getLibraryElement(scriptSource); |
+ } |
+ } |
+ } |
+ } |
+ return null; |
+ } |
+ |
+ /** |
* Builds Polymer specific HTML elements. |
*/ |
void build() { |
@@ -11338,23 +12346,29 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
void _createAttributeElements() { |
// prepare "attributes" attribute |
- ht.XmlAttributeNode attributesAttribute = _elementNode.getAttribute("attributes"); |
+ ht.XmlAttributeNode attributesAttribute = |
+ _elementNode.getAttribute("attributes"); |
if (attributesAttribute == null) { |
return; |
} |
// check if there is a Dart part to resolve against it |
if (_dartElement == null) { |
- // TODO(scheglov) maybe report error (if it is allowed at all to have element without Dart part) |
+ // TODO(scheglov) maybe report error (if it is allowed at all to have |
+ // element without Dart part) |
return; |
} |
// prepare value of the "attributes" attribute |
String attributesText = attributesAttribute.text; |
if (attributesText.trim().isEmpty) { |
- _reportErrorForAttribute(attributesAttribute, PolymerCode.EMPTY_ATTRIBUTES); |
+ _reportErrorForAttribute( |
+ attributesAttribute, |
+ PolymerCode.EMPTY_ATTRIBUTES); |
return; |
} |
// prepare attribute name tokens |
- List<PolymerHtmlUnitBuilder_NameToken> nameTokens = <PolymerHtmlUnitBuilder_NameToken>[]; |
+ List<PolymerHtmlUnitBuilder_NameToken> nameTokens = |
+ <PolymerHtmlUnitBuilder_NameToken>[ |
+ ]; |
{ |
int index = 0; |
int textOffset = attributesAttribute.textOffset; |
@@ -11364,7 +12378,8 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
int c = attributesText.codeUnitAt(index++); |
if (Character.isWhitespace(c)) { |
if (nameOffset != -1) { |
- nameTokens.add(new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuffer.toString())); |
+ nameTokens.add( |
+ new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuffer.toString())); |
nameBuffer = new StringBuffer(); |
nameOffset = -1; |
} |
@@ -11376,7 +12391,8 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
nameBuffer.writeCharCode(c); |
} |
if (nameOffset != -1) { |
- nameTokens.add(new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuffer.toString())); |
+ nameTokens.add( |
+ new PolymerHtmlUnitBuilder_NameToken(nameOffset, nameBuffer.toString())); |
nameBuffer = new StringBuffer(); |
} |
} |
@@ -11389,24 +12405,37 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
// prepare name |
String name = nameToken._value; |
if (!isValidAttributeName(name)) { |
- _reportErrorForNameToken(nameToken, PolymerCode.INVALID_ATTRIBUTE_NAME, [name]); |
+ _reportErrorForNameToken( |
+ nameToken, |
+ PolymerCode.INVALID_ATTRIBUTE_NAME, |
+ [name]); |
continue; |
} |
if (!definedNames.add(name)) { |
- _reportErrorForNameToken(nameToken, PolymerCode.DUPLICATE_ATTRIBUTE_DEFINITION, [name]); |
+ _reportErrorForNameToken( |
+ nameToken, |
+ PolymerCode.DUPLICATE_ATTRIBUTE_DEFINITION, |
+ [name]); |
continue; |
} |
// create attribute |
- PolymerAttributeElementImpl attribute = new PolymerAttributeElementImpl(name, offset); |
+ PolymerAttributeElementImpl attribute = |
+ new PolymerAttributeElementImpl(name, offset); |
attributes.add(attribute); |
// resolve field |
FieldElement field = classElement.getField(name); |
if (field == null) { |
- _reportErrorForNameToken(nameToken, PolymerCode.UNDEFINED_ATTRIBUTE_FIELD, [name, classElement.displayName]); |
+ _reportErrorForNameToken( |
+ nameToken, |
+ PolymerCode.UNDEFINED_ATTRIBUTE_FIELD, |
+ [name, classElement.displayName]); |
continue; |
} |
if (!_isPublishedField(field)) { |
- _reportErrorForNameToken(nameToken, PolymerCode.ATTRIBUTE_FIELD_NOT_PUBLISHED, [name, classElement.displayName]); |
+ _reportErrorForNameToken( |
+ nameToken, |
+ PolymerCode.ATTRIBUTE_FIELD_NOT_PUBLISHED, |
+ [name, classElement.displayName]); |
} |
attribute.field = field; |
} |
@@ -11427,10 +12456,14 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
// prepare name |
_elementName = nameAttribute.text; |
if (!isValidTagName(_elementName)) { |
- _reportErrorForAttributeValue(nameAttribute, PolymerCode.INVALID_TAG_NAME, [_elementName]); |
+ _reportErrorForAttributeValue( |
+ nameAttribute, |
+ PolymerCode.INVALID_TAG_NAME, |
+ [_elementName]); |
return; |
} |
- // TODO(scheglov) Maybe check that at least one of "template" or "script" children. |
+ // TODO(scheglov) Maybe check that at least one of "template" or "script" |
+ // children. |
// TODO(scheglov) Maybe check if more than one top-level "template". |
// create HTML element |
int nameOffset = nameAttribute.textOffset; |
@@ -11463,35 +12496,16 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
* Returns the [PolymerTagDartElementImpl] declared in the given [LibraryElement] with |
* the [elementName]. Maybe `null`. |
*/ |
- PolymerTagDartElementImpl _findTagDartElement_inLibrary(LibraryElement library) { |
+ PolymerTagDartElementImpl |
+ _findTagDartElement_inLibrary(LibraryElement library) { |
try { |
- library.accept(new RecursiveElementVisitor_PolymerHtmlUnitBuilder_findTagDartElement_inLibrary(this)); |
+ library.accept(new _PolymerHtmlUnitBuilder_findTagDartElement(this)); |
} on PolymerHtmlUnitBuilder_FoundTagDartElementError catch (e) { |
return e._result; |
} |
return null; |
} |
- /** |
- * Returns the only [LibraryElement] referenced by a direct `script` child. Maybe |
- * `null` if none. |
- */ |
- LibraryElement get dartUnitElement { |
- // TODO(scheglov) Maybe check if more than one "script". |
- for (ht.XmlTagNode child in _elementNode.tagNodes) { |
- if (child is ht.HtmlScriptTagNode) { |
- HtmlScriptElement scriptElement = child.scriptElement; |
- if (scriptElement is ExternalHtmlScriptElement) { |
- Source scriptSource = scriptElement.scriptSource; |
- if (scriptSource != null) { |
- return _context.getLibraryElement(scriptSource); |
- } |
- } |
- } |
- } |
- return null; |
- } |
- |
bool _isPublishedAnnotation(ElementAnnotation annotation) { |
Element element = annotation.element; |
if (element != null && element.name == "published") { |
@@ -11513,14 +12527,16 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
/** |
* Reports an error on the attribute's value, or (if absent) on the attribute's name. |
*/ |
- void _reportErrorForAttribute(ht.XmlAttributeNode node, ErrorCode errorCode, [List<Object> arguments]) { |
+ void _reportErrorForAttribute(ht.XmlAttributeNode node, ErrorCode errorCode, |
+ [List<Object> arguments]) { |
_reportErrorForOffset(node.offset, node.length, errorCode, arguments); |
} |
/** |
* Reports an error on the attribute's value, or (if absent) on the attribute's name. |
*/ |
- void _reportErrorForAttributeValue(ht.XmlAttributeNode node, ErrorCode errorCode, [List<Object> arguments]) { |
+ void _reportErrorForAttributeValue(ht.XmlAttributeNode node, |
+ ErrorCode errorCode, [List<Object> arguments]) { |
ht.Token valueToken = node.valueToken; |
if (valueToken == null || valueToken.isSynthetic) { |
_reportErrorForAttribute(node, errorCode, arguments); |
@@ -11529,21 +12545,85 @@ class PolymerHtmlUnitBuilder extends ht.RecursiveXmlVisitor<Object> { |
} |
} |
- void _reportErrorForNameToken(PolymerHtmlUnitBuilder_NameToken token, ErrorCode errorCode, [List<Object> arguments]) { |
+ void _reportErrorForNameToken(PolymerHtmlUnitBuilder_NameToken token, |
+ ErrorCode errorCode, [List<Object> arguments]) { |
int offset = token._offset; |
int length = token._value.length; |
_reportErrorForOffset(offset, length, errorCode, arguments); |
} |
- void _reportErrorForOffset(int offset, int length, ErrorCode errorCode, [List<Object> arguments]) { |
- _errorListener.onError(new AnalysisError.con2(_source, offset, length, errorCode, arguments)); |
+ void _reportErrorForOffset(int offset, int length, ErrorCode errorCode, |
+ [List<Object> arguments]) { |
+ _errorListener.onError( |
+ new AnalysisError.con2(_source, offset, length, errorCode, arguments)); |
} |
- void _reportErrorForToken(ht.Token token, ErrorCode errorCode, [List<Object> arguments]) { |
+ void _reportErrorForToken(ht.Token token, ErrorCode errorCode, |
+ [List<Object> arguments]) { |
int offset = token.offset; |
int length = token.length; |
_reportErrorForOffset(offset, length, errorCode, arguments); |
} |
+ |
+ static bool isValidAttributeName(String name) { |
+ // cannot be empty |
+ if (name.isEmpty) { |
+ return false; |
+ } |
+ // check characters |
+ int length = name.length; |
+ for (int i = 0; i < length; i++) { |
+ int c = name.codeUnitAt(i); |
+ if (i == 0) { |
+ if (!Character.isLetter(c)) { |
+ return false; |
+ } |
+ } else { |
+ if (!(Character.isLetterOrDigit(c) || c == 0x5F)) { |
+ return false; |
+ } |
+ } |
+ } |
+ return true; |
+ } |
+ |
+ static bool isValidTagName(String name) { |
+ // cannot be empty |
+ if (name.isEmpty) { |
+ return false; |
+ } |
+ // check for forbidden name |
+ if (_FORBIDDEN_TAG_NAMES.contains(name)) { |
+ return false; |
+ } |
+ // check characters |
+ int length = name.length; |
+ bool hasDash = false; |
+ for (int i = 0; i < length; i++) { |
+ int c = name.codeUnitAt(i); |
+ // check for '-' |
+ if (c == 0x2D) { |
+ hasDash = true; |
+ } |
+ // check character |
+ if (i == 0) { |
+ if (hasDash) { |
+ return false; |
+ } |
+ if (!Character.isLetter(c)) { |
+ return false; |
+ } |
+ } else { |
+ if (!(Character.isLetterOrDigit(c) || c == 0x2D || c == 0x5F)) { |
+ return false; |
+ } |
+ } |
+ } |
+ if (!hasDash) { |
+ return false; |
+ } |
+ return true; |
+ } |
} |
class PolymerHtmlUnitBuilder_FoundTagDartElementError extends Error { |
@@ -11579,7 +12659,8 @@ class PolymerHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
final ht.HtmlUnit _unit; |
- PolymerHtmlUnitResolver(this._context, this._errorListener, this._source, this._lineInfo, this._unit) { |
+ PolymerHtmlUnitResolver(this._context, this._errorListener, this._source, |
+ this._lineInfo, this._unit) { |
this._typeProvider = _context.typeProvider; |
} |
@@ -11592,7 +12673,8 @@ class PolymerHtmlUnitResolver extends ht.RecursiveXmlVisitor<Object> { |
} |
@override |
- Object visitXmlAttributeNode(ht.XmlAttributeNode node) => super.visitXmlAttributeNode(node); |
+ Object visitXmlAttributeNode(ht.XmlAttributeNode node) => |
+ super.visitXmlAttributeNode(node); |
@override |
Object visitXmlTagNode(ht.XmlTagNode node) => super.visitXmlTagNode(node); |
@@ -11632,10 +12714,9 @@ class PolymerResolveHtmlTask extends AnalysisTask { |
* @param source the source to be resolved |
* @param unit the HTML unit to be resolved |
*/ |
- PolymerResolveHtmlTask(InternalAnalysisContext context, this.source, this._lineInfo, this._unit) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitPolymerResolveHtmlTask(this); |
+ PolymerResolveHtmlTask(InternalAnalysisContext context, this.source, |
+ this._lineInfo, this._unit) |
+ : super(context); |
List<AnalysisError> get errors => _errors; |
@@ -11643,9 +12724,14 @@ class PolymerResolveHtmlTask extends AnalysisTask { |
String get taskDescription => "resolve as Polymer ${source.fullName}"; |
@override |
+ accept(AnalysisTaskVisitor visitor) => |
+ visitor.visitPolymerResolveHtmlTask(this); |
+ |
+ @override |
void internalPerform() { |
RecordingErrorListener errorListener = new RecordingErrorListener(); |
- PolymerHtmlUnitResolver resolver = new PolymerHtmlUnitResolver(context, errorListener, source, _lineInfo, _unit); |
+ PolymerHtmlUnitResolver resolver = |
+ new PolymerHtmlUnitResolver(context, errorListener, source, _lineInfo, _unit); |
resolver.resolveUnit(); |
_errors = errorListener.getErrorsForSource(source); |
} |
@@ -11660,18 +12746,8 @@ class RecordingErrorListener implements AnalysisErrorListener { |
/** |
* A HashMap of lists containing the errors that were collected, keyed by each [Source]. |
*/ |
- Map<Source, HashSet<AnalysisError>> _errors = new HashMap<Source, HashSet<AnalysisError>>(); |
- |
- /** |
- * Add all of the errors recorded by the given listener to this listener. |
- * |
- * @param listener the listener that has recorded the errors to be added |
- */ |
- void addAll(RecordingErrorListener listener) { |
- for (AnalysisError error in listener.errors) { |
- onError(error); |
- } |
- } |
+ Map<Source, HashSet<AnalysisError>> _errors = |
+ new HashMap<Source, HashSet<AnalysisError>>(); |
/** |
* Answer the errors collected by the listener. |
@@ -11691,6 +12767,17 @@ class RecordingErrorListener implements AnalysisErrorListener { |
} |
/** |
+ * Add all of the errors recorded by the given listener to this listener. |
+ * |
+ * @param listener the listener that has recorded the errors to be added |
+ */ |
+ void addAll(RecordingErrorListener listener) { |
+ for (AnalysisError error in listener.errors) { |
+ onError(error); |
+ } |
+ } |
+ |
+ /** |
* Answer the errors collected by the listener for some passed [Source]. |
* |
* @param source some [Source] for which the caller wants the set of [AnalysisError]s |
@@ -11718,21 +12805,8 @@ class RecordingErrorListener implements AnalysisErrorListener { |
} |
} |
-class RecursiveElementVisitor_PolymerHtmlUnitBuilder_findTagDartElement_inLibrary extends RecursiveElementVisitor<Object> { |
- final PolymerHtmlUnitBuilder PolymerHtmlUnitBuilder_this; |
- |
- RecursiveElementVisitor_PolymerHtmlUnitBuilder_findTagDartElement_inLibrary(this.PolymerHtmlUnitBuilder_this) : super(); |
- |
- @override |
- Object visitPolymerTagDartElement(PolymerTagDartElement element) { |
- if (element.name == PolymerHtmlUnitBuilder_this._elementName) { |
- throw new PolymerHtmlUnitBuilder_FoundTagDartElementError(element as PolymerTagDartElementImpl); |
- } |
- return null; |
- } |
-} |
- |
-class RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation extends ht.RecursiveXmlVisitor<Object> { |
+class RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation extends |
+ ht.RecursiveXmlVisitor<Object> { |
@override |
Object visitXmlTagNode(ht.XmlTagNode node) { |
if (node.getAttribute(AngularHtmlUnitResolver._NG_APP) != null) { |
@@ -11742,58 +12816,15 @@ class RecursiveXmlVisitor_AngularHtmlUnitResolver_hasAngularAnnotation extends h |
} |
} |
-class RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives extends ht.RecursiveXmlVisitor<Object> { |
- final AngularHtmlUnitResolver AngularHtmlUnitResolver_this; |
- |
- RecursiveXmlVisitor_AngularHtmlUnitResolver_visitModelDirectives(this.AngularHtmlUnitResolver_this) : super(); |
- |
- @override |
- Object visitXmlTagNode(ht.XmlTagNode node) { |
- NgModelProcessor directive = NgModelProcessor.INSTANCE; |
- if (directive.canApply(node)) { |
- directive._applyTopDeclarations(AngularHtmlUnitResolver_this, node); |
- } |
- return super.visitXmlTagNode(node); |
- } |
-} |
- |
-class ParseHtmlTask_getLibrarySources extends ht.RecursiveXmlVisitor<Object> { |
- final ParseHtmlTask _task; |
- |
- List<Source> libraries; |
- |
- ParseHtmlTask_getLibrarySources(this._task, this.libraries) : super(); |
- |
- @override |
- Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) { |
- ht.XmlAttributeNode scriptAttribute = null; |
- for (ht.XmlAttributeNode attribute in node.attributes) { |
- if (javaStringEqualsIgnoreCase(attribute.name, ParseHtmlTask._ATTRIBUTE_SRC)) { |
- scriptAttribute = attribute; |
- } |
- } |
- if (scriptAttribute != null) { |
- try { |
- Uri uri = new Uri(path: scriptAttribute.text); |
- String fileName = uri.path; |
- Source librarySource = _task.context.sourceFactory.resolveUri(_task.source, fileName); |
- if (_task.context.exists(librarySource)) { |
- libraries.add(librarySource); |
- } |
- } on FormatException catch (e) { |
- // ignored - invalid URI reported during resolution phase |
- } |
- } |
- return super.visitHtmlScriptTagNode(node); |
- } |
-} |
- |
-class RecursiveXmlVisitor_ParseHtmlTask_internalPerform extends ht.RecursiveXmlVisitor<Object> { |
+class RecursiveXmlVisitor_ParseHtmlTask_internalPerform extends |
+ ht.RecursiveXmlVisitor<Object> { |
final ParseHtmlTask ParseHtmlTask_this; |
RecordingErrorListener errorListener; |
- RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this.ParseHtmlTask_this, this.errorListener) : super(); |
+ RecursiveXmlVisitor_ParseHtmlTask_internalPerform(this.ParseHtmlTask_this, |
+ this.errorListener) |
+ : super(); |
@override |
Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) { |
@@ -11802,18 +12833,25 @@ class RecursiveXmlVisitor_ParseHtmlTask_internalPerform extends ht.RecursiveXmlV |
} |
} |
-class RecursiveXmlVisitor_ResolveHtmlTask_internalPerform extends ht.RecursiveXmlVisitor<Object> { |
+class RecursiveXmlVisitor_ResolveHtmlTask_internalPerform extends |
+ ht.RecursiveXmlVisitor<Object> { |
final ResolveHtmlTask ResolveHtmlTask_this; |
RecordingErrorListener errorListener; |
- RecursiveXmlVisitor_ResolveHtmlTask_internalPerform(this.ResolveHtmlTask_this, this.errorListener) : super(); |
+ RecursiveXmlVisitor_ResolveHtmlTask_internalPerform(this.ResolveHtmlTask_this, |
+ this.errorListener) |
+ : super(); |
@override |
Object visitHtmlScriptTagNode(ht.HtmlScriptTagNode node) { |
CompilationUnit script = node.script; |
if (script != null) { |
- GenerateDartErrorsTask.validateDirectives(ResolveHtmlTask_this.context, ResolveHtmlTask_this.source, script, errorListener); |
+ GenerateDartErrorsTask.validateDirectives( |
+ ResolveHtmlTask_this.context, |
+ ResolveHtmlTask_this.source, |
+ script, |
+ errorListener); |
} |
return null; |
} |
@@ -11824,13 +12862,6 @@ class RecursiveXmlVisitor_ResolveHtmlTask_internalPerform extends ht.RecursiveXm |
* structure when used to visit that structure. |
*/ |
class ResolutionEraser extends GeneralizingAstVisitor<Object> { |
- /** |
- * Remove any resolution information from the given AST structure. |
- */ |
- static void erase(AstNode node) { |
- node.accept(new ResolutionEraser()); |
- } |
- |
@override |
Object visitAssignmentExpression(AssignmentExpression node) { |
node.staticElement = null; |
@@ -11917,7 +12948,8 @@ class ResolutionEraser extends GeneralizingAstVisitor<Object> { |
} |
@override |
- Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) { |
+ Object |
+ visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) { |
node.staticElement = null; |
return super.visitRedirectingConstructorInvocation(node); |
} |
@@ -11934,6 +12966,13 @@ class ResolutionEraser extends GeneralizingAstVisitor<Object> { |
node.staticElement = null; |
return super.visitSuperConstructorInvocation(node); |
} |
+ |
+ /** |
+ * Remove any resolution information from the given AST structure. |
+ */ |
+ static void erase(AstNode node) { |
+ node.accept(new ResolutionEraser()); |
+ } |
} |
/** |
@@ -11958,8 +12997,8 @@ class ResolutionState { |
* If there is no entry for a given descriptor then the state is implicitly |
* [CacheState.INVALID] and the value is implicitly the default value. |
*/ |
- Map<DataDescriptor, CachedResult> resultMap |
- = new HashMap<DataDescriptor, CachedResult>(); |
+ Map<DataDescriptor, CachedResult> resultMap = |
+ new HashMap<DataDescriptor, CachedResult>(); |
/** |
* Flush any AST structures being maintained by this state. |
@@ -11987,7 +13026,7 @@ class ResolutionState { |
* Return the value of the data represented by the given [descriptor], or |
* `null` if the data represented by the descriptor is not valid. |
*/ |
- /*<V>*/ dynamic /*V*/ getValue(DataDescriptor/*<V>*/ descriptor) { |
+ /*<V>*/ dynamic /*V*/ getValue(DataDescriptor /*<V>*/ descriptor) { |
CachedResult result = resultMap[descriptor]; |
if (result == null) { |
return descriptor.defaultValue; |
@@ -12084,14 +13123,13 @@ class ResolutionState { |
if (state == CacheState.INVALID) { |
resultMap.remove(descriptor); |
} else { |
- CachedResult result = resultMap.putIfAbsent( |
- descriptor, |
- () => new CachedResult(descriptor)); |
+ CachedResult result = |
+ resultMap.putIfAbsent(descriptor, () => new CachedResult(descriptor)); |
result.state = state; |
if (state != CacheState.IN_PROCESS) { |
// |
- // If the state is in-process, we can leave the current value in the cache |
- // for any 'get' methods to access. |
+ // If the state is in-process, we can leave the current value in the |
+ // cache for any 'get' methods to access. |
// |
result.value = descriptor.defaultValue; |
} |
@@ -12102,10 +13140,9 @@ class ResolutionState { |
* Set the value of the data represented by the given [descriptor] to the |
* given [value]. |
*/ |
- void setValue(DataDescriptor/*<V>*/ descriptor, dynamic /*V*/ value) { |
- CachedResult result = resultMap.putIfAbsent( |
- descriptor, |
- () => new CachedResult(descriptor)); |
+ void setValue(DataDescriptor /*<V>*/ descriptor, dynamic /*V*/ value) { |
+ CachedResult result = |
+ resultMap.putIfAbsent(descriptor, () => new CachedResult(descriptor)); |
result.state = CacheState.VALID; |
result.value = value == null ? descriptor.defaultValue : value; |
} |
@@ -12129,11 +13166,28 @@ class ResolutionState { |
* @param oldEntry the entry that was replaced by this entry |
* @return `true` if some difference was written |
*/ |
- bool _writeDiffOn(StringBuffer buffer, bool needsSeparator, DartEntry oldEntry) { |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "resolvedUnit", DartEntry.RESOLVED_UNIT, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "resolutionErrors", DartEntry.RESOLUTION_ERRORS, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "verificationErrors", DartEntry.VERIFICATION_ERRORS, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "hints", DartEntry.HINTS, oldEntry); |
+ bool _writeDiffOn(StringBuffer buffer, bool needsSeparator, |
+ DartEntry oldEntry) { |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "resolvedUnit", |
+ DartEntry.RESOLVED_UNIT, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "resolutionErrors", |
+ DartEntry.RESOLUTION_ERRORS, |
+ oldEntry); |
+ needsSeparator = _writeStateDiffOn( |
+ buffer, |
+ needsSeparator, |
+ "verificationErrors", |
+ DartEntry.VERIFICATION_ERRORS, |
+ oldEntry); |
+ needsSeparator = |
+ _writeStateDiffOn(buffer, needsSeparator, "hints", DartEntry.HINTS, oldEntry); |
return needsSeparator; |
} |
@@ -12149,7 +13203,10 @@ class ResolutionState { |
_writeStateOn(buffer, "builtUnit", DartEntry.BUILT_UNIT); |
_writeStateOn(buffer, "resolvedUnit", DartEntry.RESOLVED_UNIT); |
_writeStateOn(buffer, "resolutionErrors", DartEntry.RESOLUTION_ERRORS); |
- _writeStateOn(buffer, "verificationErrors", DartEntry.VERIFICATION_ERRORS); |
+ _writeStateOn( |
+ buffer, |
+ "verificationErrors", |
+ DartEntry.VERIFICATION_ERRORS); |
_writeStateOn(buffer, "hints", DartEntry.HINTS); |
if (_nextState != null) { |
_nextState._writeOn(buffer); |
@@ -12163,7 +13220,7 @@ class ResolutionState { |
* entry to the given [buffer]. Return `true` if some difference was written. |
*/ |
bool _writeStateDiffOn(StringBuffer buffer, bool needsSeparator, String label, |
- DataDescriptor descriptor, SourceEntry oldEntry) { |
+ DataDescriptor descriptor, SourceEntry oldEntry) { |
CacheState oldState = oldEntry.getState(descriptor); |
CacheState newState = getState(descriptor); |
if (oldState != newState) { |
@@ -12185,7 +13242,8 @@ class ResolutionState { |
* given [descriptor] to the given bugger, prefixed by the given [label] to |
* the given [buffer]. |
*/ |
- void _writeStateOn(StringBuffer buffer, String label, DataDescriptor descriptor) { |
+ void _writeStateOn(StringBuffer buffer, String label, |
+ DataDescriptor descriptor) { |
CachedResult result = resultMap[descriptor]; |
buffer.write("; "); |
buffer.write(label); |
@@ -12262,10 +13320,9 @@ class ResolveAngularComponentTemplateTask extends AnalysisTask { |
* @param component the component that uses this HTML template, not `null` |
* @param application the Angular application to resolve in context of |
*/ |
- ResolveAngularComponentTemplateTask(InternalAnalysisContext context, this.source, this._unit, this._component, this._application) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitResolveAngularComponentTemplateTask(this); |
+ ResolveAngularComponentTemplateTask(InternalAnalysisContext context, |
+ this.source, this._unit, this._component, this._application) |
+ : super(context); |
List<AnalysisError> get resolutionErrors => _resolutionErrors; |
@@ -12280,6 +13337,10 @@ class ResolveAngularComponentTemplateTask extends AnalysisTask { |
String get taskDescription => "resolve as Angular template $source"; |
@override |
+ accept(AnalysisTaskVisitor visitor) => |
+ visitor.visitResolveAngularComponentTemplateTask(this); |
+ |
+ @override |
void internalPerform() { |
// |
// Prepare for resolution. |
@@ -12290,7 +13351,8 @@ class ResolveAngularComponentTemplateTask extends AnalysisTask { |
// Perform resolution. |
// |
if (_application != null) { |
- AngularHtmlUnitResolver resolver = new AngularHtmlUnitResolver(context, errorListener, source, lineInfo, _unit); |
+ AngularHtmlUnitResolver resolver = |
+ new AngularHtmlUnitResolver(context, errorListener, source, lineInfo, _unit); |
resolver.resolveComponentTemplate(_application, _component); |
_resolvedUnit = _unit; |
} |
@@ -12343,10 +13405,9 @@ class ResolveAngularEntryHtmlTask extends AnalysisTask { |
* @param source the source to be resolved |
* @param unit the HTML unit to be resolved |
*/ |
- ResolveAngularEntryHtmlTask(InternalAnalysisContext context, this.source, this._unit) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitResolveAngularEntryHtmlTask(this); |
+ ResolveAngularEntryHtmlTask(InternalAnalysisContext context, this.source, |
+ this._unit) |
+ : super(context); |
/** |
* Returns the [AngularApplication] for the Web application with this Angular entry point, |
@@ -12359,12 +13420,8 @@ class ResolveAngularEntryHtmlTask extends AnalysisTask { |
/** |
* The resolution errors that were discovered while resolving the source. |
*/ |
- List<AnalysisError> get entryErrors => _errorListener.getErrorsForSource(source); |
- |
- /** |
- * Returns [AnalysisError]s recorded for the given [Source]. |
- */ |
- List<AnalysisError> getErrors(Source source) => _errorListener.getErrorsForSource(source); |
+ List<AnalysisError> get entryErrors => |
+ _errorListener.getErrorsForSource(source); |
/** |
* Return the [HtmlUnit] that was resolved by this task. |
@@ -12382,6 +13439,16 @@ class ResolveAngularEntryHtmlTask extends AnalysisTask { |
} |
@override |
+ accept(AnalysisTaskVisitor visitor) => |
+ visitor.visitResolveAngularEntryHtmlTask(this); |
+ |
+ /** |
+ * Returns [AnalysisError]s recorded for the given [Source]. |
+ */ |
+ List<AnalysisError> getErrors(Source source) => |
+ _errorListener.getErrorsForSource(source); |
+ |
+ @override |
void internalPerform() { |
// |
// Prepare for resolution. |
@@ -12390,12 +13457,22 @@ class ResolveAngularEntryHtmlTask extends AnalysisTask { |
// |
// Try to resolve as an Angular entry point. |
// |
- _application = new AngularHtmlUnitResolver(context, _errorListener, source, lineInfo, _unit).calculateAngularApplication(); |
+ _application = new AngularHtmlUnitResolver( |
+ context, |
+ _errorListener, |
+ source, |
+ lineInfo, |
+ _unit).calculateAngularApplication(); |
// |
// Perform resolution. |
// |
if (_application != null) { |
- new AngularHtmlUnitResolver(context, _errorListener, source, lineInfo, _unit).resolveEntryPoint(_application); |
+ new AngularHtmlUnitResolver( |
+ context, |
+ _errorListener, |
+ source, |
+ lineInfo, |
+ _unit).resolveEntryPoint(_application); |
} |
// |
// Remember the resolved unit. |
@@ -12438,10 +13515,9 @@ class ResolveDartLibraryCycleTask extends AnalysisTask { |
* @param librariesInCycle the libraries that are part of the cycle containing the library to be |
* resolved |
*/ |
- ResolveDartLibraryCycleTask(InternalAnalysisContext context, this.unitSource, this.librarySource, this._librariesInCycle) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryCycleTask(this); |
+ ResolveDartLibraryCycleTask(InternalAnalysisContext context, this.unitSource, |
+ this.librarySource, this._librariesInCycle) |
+ : super(context); |
/** |
* Return the library resolver holding information about the libraries that were resolved. |
@@ -12459,6 +13535,10 @@ class ResolveDartLibraryCycleTask extends AnalysisTask { |
} |
@override |
+ accept(AnalysisTaskVisitor visitor) => |
+ visitor.visitResolveDartLibraryCycleTask(this); |
+ |
+ @override |
void internalPerform() { |
_resolver = new LibraryResolver2(context); |
_resolver.resolveLibrary(librarySource, _librariesInCycle); |
@@ -12491,10 +13571,9 @@ class ResolveDartLibraryTask extends AnalysisTask { |
* @param unitSource the source representing the file whose compilation unit is to be returned |
* @param librarySource the source representing the library to be resolved |
*/ |
- ResolveDartLibraryTask(InternalAnalysisContext context, this.unitSource, this.librarySource) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryTask(this); |
+ ResolveDartLibraryTask(InternalAnalysisContext context, this.unitSource, |
+ this.librarySource) |
+ : super(context); |
/** |
* Return the library resolver holding information about the libraries that were resolved. |
@@ -12512,6 +13591,10 @@ class ResolveDartLibraryTask extends AnalysisTask { |
} |
@override |
+ accept(AnalysisTaskVisitor visitor) => |
+ visitor.visitResolveDartLibraryTask(this); |
+ |
+ @override |
void internalPerform() { |
_resolver = new LibraryResolver(context); |
_resolver.resolveLibrary(librarySource, true); |
@@ -12545,10 +13628,9 @@ class ResolveDartUnitTask extends AnalysisTask { |
* @param source the source to be parsed |
* @param libraryElement the element model for the library containing the source |
*/ |
- ResolveDartUnitTask(InternalAnalysisContext context, this.source, this._libraryElement) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartUnitTask(this); |
+ ResolveDartUnitTask(InternalAnalysisContext context, this.source, |
+ this._libraryElement) |
+ : super(context); |
/** |
* Return the source for the library containing the source that is to be resolved. |
@@ -12574,11 +13656,16 @@ class ResolveDartUnitTask extends AnalysisTask { |
} |
@override |
+ accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartUnitTask(this); |
+ |
+ @override |
void internalPerform() { |
- TypeProvider typeProvider = (_libraryElement.context as InternalAnalysisContext).typeProvider; |
+ TypeProvider typeProvider = |
+ (_libraryElement.context as InternalAnalysisContext).typeProvider; |
CompilationUnit unit = context.computeResolvableCompilationUnit(source); |
if (unit == null) { |
- throw new AnalysisException("Internal error: computeResolvableCompilationUnit returned a value without a parsed Dart unit"); |
+ throw new AnalysisException( |
+ "Internal error: computeResolvableCompilationUnit returned a value without a parsed Dart unit"); |
} |
// |
// Resolve names in declarations. |
@@ -12588,28 +13675,43 @@ class ResolveDartUnitTask extends AnalysisTask { |
// Resolve the type names. |
// |
RecordingErrorListener errorListener = new RecordingErrorListener(); |
- TypeResolverVisitor typeResolverVisitor = new TypeResolverVisitor.con2(_libraryElement, source, typeProvider, errorListener); |
+ TypeResolverVisitor typeResolverVisitor = new TypeResolverVisitor.con2( |
+ _libraryElement, |
+ source, |
+ typeProvider, |
+ errorListener); |
unit.accept(typeResolverVisitor); |
// |
// Resolve the rest of the structure |
// |
- InheritanceManager inheritanceManager = new InheritanceManager(_libraryElement); |
- ResolverVisitor resolverVisitor = new ResolverVisitor.con2(_libraryElement, source, typeProvider, inheritanceManager, errorListener); |
+ InheritanceManager inheritanceManager = |
+ new InheritanceManager(_libraryElement); |
+ ResolverVisitor resolverVisitor = new ResolverVisitor.con2( |
+ _libraryElement, |
+ source, |
+ typeProvider, |
+ inheritanceManager, |
+ errorListener); |
unit.accept(resolverVisitor); |
// |
// Perform additional error checking. |
// |
- TimeCounter_TimeCounterHandle counterHandleErrors = PerformanceStatistics.errors.start(); |
+ TimeCounter_TimeCounterHandle counterHandleErrors = |
+ PerformanceStatistics.errors.start(); |
try { |
ErrorReporter errorReporter = new ErrorReporter(errorListener, source); |
- ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, _libraryElement, typeProvider, inheritanceManager); |
+ ErrorVerifier errorVerifier = new ErrorVerifier( |
+ errorReporter, |
+ _libraryElement, |
+ typeProvider, |
+ inheritanceManager); |
unit.accept(errorVerifier); |
// TODO(paulberry): as a temporary workaround for issue 21572, |
// ConstantVerifier is being run right after ConstantValueComputer, so we |
// don't need to run it here. Once issue 21572 is fixed, re-enable the |
// call to ConstantVerifier. |
- // ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _libraryElement, typeProvider); |
- // unit.accept(constantVerifier); |
+// ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _libraryElement, typeProvider); |
+// unit.accept(constantVerifier); |
} finally { |
counterHandleErrors.stop(); |
} |
@@ -12628,7 +13730,8 @@ class ResolveDartUnitTask extends AnalysisTask { |
* @param unitSource the source for the compilation unit whose element is to be returned |
* @return the element representing the compilation unit |
*/ |
- CompilationUnitElement _find(LibraryElement libraryElement, Source unitSource) { |
+ CompilationUnitElement _find(LibraryElement libraryElement, |
+ Source unitSource) { |
CompilationUnitElement element = libraryElement.definingCompilationUnit; |
if (element.source == unitSource) { |
return element; |
@@ -12684,10 +13787,9 @@ class ResolveHtmlTask extends AnalysisTask { |
* @param modificationTime the time at which the contents of the source were last modified |
* @param unit the HTML unit to be resolved |
*/ |
- ResolveHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, this._unit) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitResolveHtmlTask(this); |
+ ResolveHtmlTask(InternalAnalysisContext context, this.source, |
+ this.modificationTime, this._unit) |
+ : super(context); |
HtmlElement get element => _element; |
@@ -12709,6 +13811,9 @@ class ResolveHtmlTask extends AnalysisTask { |
} |
@override |
+ accept(AnalysisTaskVisitor visitor) => visitor.visitResolveHtmlTask(this); |
+ |
+ @override |
void internalPerform() { |
// |
// Build the standard HTML element. |
@@ -12719,7 +13824,8 @@ class ResolveHtmlTask extends AnalysisTask { |
// |
// Validate the directives |
// |
- _unit.accept(new RecursiveXmlVisitor_ResolveHtmlTask_internalPerform(this, errorListener)); |
+ _unit.accept( |
+ new RecursiveXmlVisitor_ResolveHtmlTask_internalPerform(this, errorListener)); |
// |
// Record all resolution errors. |
// |
@@ -12796,10 +13902,8 @@ class ScanDartTask extends AnalysisTask { |
* @param source the source to be parsed |
* @param content the contents of the source |
*/ |
- ScanDartTask(InternalAnalysisContext context, this.source, this._content) : super(context); |
- |
- @override |
- accept(AnalysisTaskVisitor visitor) => visitor.visitScanDartTask(this); |
+ ScanDartTask(InternalAnalysisContext context, this.source, this._content) |
+ : super(context); |
/** |
* Return the errors that were produced by scanning the source, or `null` if the task has |
@@ -12817,6 +13921,14 @@ class ScanDartTask extends AnalysisTask { |
*/ |
LineInfo get lineInfo => _lineInfo; |
+ @override |
+ String get taskDescription { |
+ if (source == null) { |
+ return "scan as dart null source"; |
+ } |
+ return "scan as dart ${source.fullName}"; |
+ } |
+ |
/** |
* Return the token stream that was produced by scanning the source, or `null` if the task |
* has not yet been performed or if an exception occurred. |
@@ -12826,25 +13938,24 @@ class ScanDartTask extends AnalysisTask { |
Token get tokenStream => _tokenStream; |
@override |
- String get taskDescription { |
- if (source == null) { |
- return "scan as dart null source"; |
- } |
- return "scan as dart ${source.fullName}"; |
- } |
+ accept(AnalysisTaskVisitor visitor) => visitor.visitScanDartTask(this); |
@override |
void internalPerform() { |
RecordingErrorListener errorListener = new RecordingErrorListener(); |
- TimeCounter_TimeCounterHandle timeCounterScan = PerformanceStatistics.scan.start(); |
+ TimeCounter_TimeCounterHandle timeCounterScan = |
+ PerformanceStatistics.scan.start(); |
try { |
- Scanner scanner = new Scanner(source, new CharSequenceReader(_content), errorListener); |
+ Scanner scanner = |
+ new Scanner(source, new CharSequenceReader(_content), errorListener); |
scanner.preserveComments = context.analysisOptions.preserveComments; |
_tokenStream = scanner.tokenize(); |
_lineInfo = new LineInfo(scanner.lineStarts); |
_errors = errorListener.getErrorsForSource(source); |
} catch (exception, stackTrace) { |
- throw new AnalysisException("Exception", new CaughtException(exception, stackTrace)); |
+ throw new AnalysisException( |
+ "Exception", |
+ new CaughtException(exception, stackTrace)); |
} finally { |
timeCounterScan.stop(); |
} |
@@ -12863,9 +13974,11 @@ class SdkAnalysisContext extends AnalysisContextImpl { |
} |
DartSdk sdk = factory.dartSdk; |
if (sdk == null) { |
- throw new IllegalArgumentException("The source factory for an SDK analysis context must have a DartUriResolver"); |
+ throw new IllegalArgumentException( |
+ "The source factory for an SDK analysis context must have a DartUriResolver"); |
} |
- return new AnalysisCache(<CachePartition> [AnalysisEngine.instance.partitionManager.forSdk(sdk)]); |
+ return new AnalysisCache( |
+ <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]); |
} |
} |
@@ -12881,7 +13994,8 @@ class SdkCachePartition extends CachePartition { |
* @param maxCacheSize the maximum number of sources for which AST structures should be kept in |
* the cache |
*/ |
- SdkCachePartition(InternalAnalysisContext context, int maxCacheSize) : super(context, maxCacheSize, DefaultRetentionPolicy.POLICY); |
+ SdkCachePartition(InternalAnalysisContext context, int maxCacheSize) |
+ : super(context, maxCacheSize, DefaultRetentionPolicy.POLICY); |
@override |
bool contains(Source source) => source.isInSystemLibrary; |
@@ -12893,6 +14007,25 @@ class SdkCachePartition extends CachePartition { |
*/ |
abstract class SourceEntry { |
/** |
+ * The data descriptor representing the contents of the source. |
+ */ |
+ static final DataDescriptor<String> CONTENT = |
+ new DataDescriptor<String>("SourceEntry.CONTENT"); |
+ |
+ /** |
+ * The data descriptor representing the line information. |
+ */ |
+ static final DataDescriptor<LineInfo> LINE_INFO = |
+ new DataDescriptor<LineInfo>("SourceEntry.LINE_INFO"); |
+ |
+ /** |
+ * The index of the flag indicating whether the source was explicitly added to |
+ * the context or whether the source was implicitly added because it was |
+ * referenced by another source. |
+ */ |
+ static int _EXPLICITLY_ADDED_FLAG = 0; |
+ |
+ /** |
* The most recent time at which the state of the source matched the state |
* represented by this entry. |
*/ |
@@ -12913,27 +14046,8 @@ abstract class SourceEntry { |
* A table mapping data descriptors to the cached results for those |
* descriptors. |
*/ |
- Map<DataDescriptor, CachedResult> resultMap |
- = new HashMap<DataDescriptor, CachedResult>(); |
- |
- /** |
- * The data descriptor representing the contents of the source. |
- */ |
- static final DataDescriptor<String> CONTENT |
- = new DataDescriptor<String>("SourceEntry.CONTENT"); |
- |
- /** |
- * The data descriptor representing the line information. |
- */ |
- static final DataDescriptor<LineInfo> LINE_INFO |
- = new DataDescriptor<LineInfo>("SourceEntry.LINE_INFO"); |
- |
- /** |
- * The index of the flag indicating whether the source was explicitly added to |
- * the context or whether the source was implicitly added because it was |
- * referenced by another source. |
- */ |
- static int _EXPLICITLY_ADDED_FLAG = 0; |
+ Map<DataDescriptor, CachedResult> resultMap = |
+ new HashMap<DataDescriptor, CachedResult>(); |
/** |
* Return `true` if the source was explicitly added to the context or `false` |
@@ -12951,6 +14065,12 @@ abstract class SourceEntry { |
} |
/** |
+ * Return the kind of the source, or `null` if the kind is not currently |
+ * cached. |
+ */ |
+ SourceKind get kind; |
+ |
+ /** |
* Fix the state of the [exception] to match the current state of the entry. |
*/ |
void fixExceptionState() { |
@@ -12997,7 +14117,7 @@ abstract class SourceEntry { |
* Return the value of the data represented by the given [descriptor], or |
* `null` if the data represented by the descriptor is not valid. |
*/ |
- /*<V>*/ dynamic /*V*/ getValue(DataDescriptor/*<V>*/ descriptor) { |
+ /*<V>*/ dynamic /*V*/ getValue(DataDescriptor /*<V>*/ descriptor) { |
if (!_isValidDescriptor(descriptor)) { |
throw new ArgumentError("Invalid descriptor: $descriptor"); |
} |
@@ -13029,12 +14149,6 @@ abstract class SourceEntry { |
} |
/** |
- * Return the kind of the source, or `null` if the kind is not currently |
- * cached. |
- */ |
- SourceKind get kind; |
- |
- /** |
* Record that an [exception] occurred while attempting to get the contents of |
* the source represented by this entry. This will set the state of all |
* information, including any resolution-based information, as being in error. |
@@ -13069,9 +14183,8 @@ abstract class SourceEntry { |
if (state == CacheState.INVALID) { |
resultMap.remove(descriptor); |
} else { |
- CachedResult result = resultMap.putIfAbsent( |
- descriptor, |
- () => new CachedResult(descriptor)); |
+ CachedResult result = |
+ resultMap.putIfAbsent(descriptor, () => new CachedResult(descriptor)); |
result.state = state; |
if (state != CacheState.IN_PROCESS) { |
// |
@@ -13087,14 +14200,13 @@ abstract class SourceEntry { |
* Set the value of the data represented by the given [descriptor] to the |
* given [value]. |
*/ |
- void setValue(DataDescriptor/*<V>*/ descriptor, dynamic /*V*/ value) { |
+ void setValue(DataDescriptor /*<V>*/ descriptor, dynamic /*V*/ value) { |
if (!_isValidDescriptor(descriptor)) { |
throw new ArgumentError("Invalid descriptor: $descriptor"); |
} |
_validateStateChange(descriptor, CacheState.VALID); |
- CachedResult result = resultMap.putIfAbsent( |
- descriptor, |
- () => new CachedResult(descriptor)); |
+ CachedResult result = |
+ resultMap.putIfAbsent(descriptor, () => new CachedResult(descriptor)); |
result.state = CacheState.VALID; |
result.value = value == null ? descriptor.defaultValue : value; |
} |
@@ -13127,8 +14239,7 @@ abstract class SourceEntry { |
* Return `true` if the [descriptor] is valid for this entry. |
*/ |
bool _isValidDescriptor(DataDescriptor descriptor) { |
- return descriptor == CONTENT |
- || descriptor == LINE_INFO; |
+ return descriptor == CONTENT || descriptor == LINE_INFO; |
} |
/** |
@@ -13139,6 +14250,28 @@ abstract class SourceEntry { |
} |
/** |
+ * If the state of the value described by the given [descriptor] is changing |
+ * from ERROR to anything else, capture the information. This is an attempt to |
+ * discover the underlying cause of a long-standing bug. |
+ */ |
+ void _validateStateChange(DataDescriptor descriptor, CacheState newState) { |
+ if (descriptor != CONTENT) { |
+ return; |
+ } |
+ CachedResult result = resultMap[CONTENT]; |
+ if (result != null && result.state == CacheState.ERROR) { |
+ String message = |
+ "contentState changing from ${result.state} to $newState"; |
+ InstrumentationBuilder builder = |
+ Instrumentation.builder2("SourceEntry-validateStateChange"); |
+ builder.data3("message", message); |
+ //builder.data("source", source.getFullName()); |
+ builder.record(new CaughtException(new AnalysisException(message), null)); |
+ builder.log(); |
+ } |
+ } |
+ |
+ /** |
* Write a textual representation of the difference between the [oldEntry] and |
* this entry to the given string [buffer]. Return `true` if some difference |
* was written. |
@@ -13164,8 +14297,10 @@ abstract class SourceEntry { |
buffer.write(modificationTime); |
needsSeparator = true; |
} |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "content", CONTENT, oldEntry); |
- needsSeparator = _writeStateDiffOn(buffer, needsSeparator, "lineInfo", LINE_INFO, oldEntry); |
+ needsSeparator = |
+ _writeStateDiffOn(buffer, needsSeparator, "content", CONTENT, oldEntry); |
+ needsSeparator = |
+ _writeStateDiffOn(buffer, needsSeparator, "lineInfo", LINE_INFO, oldEntry); |
return needsSeparator; |
} |
@@ -13186,7 +14321,7 @@ abstract class SourceEntry { |
* entry to the given [buffer]. Return `true` if some difference was written. |
*/ |
bool _writeStateDiffOn(StringBuffer buffer, bool needsSeparator, String label, |
- DataDescriptor descriptor, SourceEntry oldEntry) { |
+ DataDescriptor descriptor, SourceEntry oldEntry) { |
CacheState oldState = oldEntry.getState(descriptor); |
CacheState newState = getState(descriptor); |
if (oldState != newState) { |
@@ -13208,33 +14343,14 @@ abstract class SourceEntry { |
* given [descriptor] to the given bugger, prefixed by the given [label] to |
* the given [buffer]. |
*/ |
- void _writeStateOn(StringBuffer buffer, String label, DataDescriptor descriptor) { |
+ void _writeStateOn(StringBuffer buffer, String label, |
+ DataDescriptor descriptor) { |
CachedResult result = resultMap[descriptor]; |
buffer.write("; "); |
buffer.write(label); |
buffer.write(" = "); |
buffer.write(result == null ? CacheState.INVALID : result.state); |
} |
- |
- /** |
- * If the state of the value described by the given [descriptor] is changing |
- * from ERROR to anything else, capture the information. This is an attempt to |
- * discover the underlying cause of a long-standing bug. |
- */ |
- void _validateStateChange(DataDescriptor descriptor, CacheState newState) { |
- if (descriptor != CONTENT) { |
- return; |
- } |
- CachedResult result = resultMap[CONTENT]; |
- if (result != null && result.state == CacheState.ERROR) { |
- String message = "contentState changing from ${result.state} to $newState"; |
- InstrumentationBuilder builder = Instrumentation.builder2("SourceEntry-validateStateChange"); |
- builder.data3("message", message); |
- //builder.data("source", source.getFullName()); |
- builder.record(new CaughtException(new AnalysisException(message), null)); |
- builder.log(); |
- } |
- } |
} |
/** |
@@ -13247,7 +14363,8 @@ class SourcePriority extends Enum<SourcePriority> { |
* resolved. These parts are given a higher priority because there is a high probability that |
* their AST structure is still in the cache and therefore would not need to be re-created. |
*/ |
- static const SourcePriority PRIORITY_PART = const SourcePriority('PRIORITY_PART', 0); |
+ static const SourcePriority PRIORITY_PART = |
+ const SourcePriority('PRIORITY_PART', 0); |
/** |
* Used for a Dart source that is known to be a library. |
@@ -13262,14 +14379,20 @@ class SourcePriority extends Enum<SourcePriority> { |
/** |
* Used for a Dart source that is known to be a part but whose library has not yet been resolved. |
*/ |
- static const SourcePriority NORMAL_PART = const SourcePriority('NORMAL_PART', 3); |
+ static const SourcePriority NORMAL_PART = |
+ const SourcePriority('NORMAL_PART', 3); |
/** |
* Used for an HTML source. |
*/ |
static const SourcePriority HTML = const SourcePriority('HTML', 4); |
- static const List<SourcePriority> values = const [PRIORITY_PART, LIBRARY, UNKNOWN, NORMAL_PART, HTML]; |
+ static const List<SourcePriority> values = const [ |
+ PRIORITY_PART, |
+ LIBRARY, |
+ UNKNOWN, |
+ NORMAL_PART, |
+ HTML]; |
const SourcePriority(String name, int ordinal) : super(name, ordinal); |
} |
@@ -13312,7 +14435,9 @@ class UniversalCachePartition extends CachePartition { |
* @param retentionPolicy the policy used to determine which pieces of data to remove from the |
* cache |
*/ |
- UniversalCachePartition(InternalAnalysisContext context, int maxCacheSize, CacheRetentionPolicy retentionPolicy) : super(context, maxCacheSize, retentionPolicy); |
+ UniversalCachePartition(InternalAnalysisContext context, int maxCacheSize, |
+ CacheRetentionPolicy retentionPolicy) |
+ : super(context, maxCacheSize, retentionPolicy); |
@override |
bool contains(Source source) => true; |
@@ -13342,10 +14467,10 @@ class WaitForAsyncTask extends AnalysisTask { |
WaitForAsyncTask() : super(null); |
@override |
- accept(AnalysisTaskVisitor visitor) => null; |
+ String get taskDescription => "Waiting for async analysis"; |
@override |
- String get taskDescription => "Waiting for async analysis"; |
+ accept(AnalysisTaskVisitor visitor) => null; |
@override |
void internalPerform() { |
@@ -13529,9 +14654,44 @@ class WorkManager_WorkIterator { |
if (_index >= _manager._workQueues[_queueIndex].length) { |
_index = 0; |
_queueIndex++; |
- while (_queueIndex < _manager._workQueues.length && _manager._workQueues[_queueIndex].isEmpty) { |
+ while (_queueIndex < _manager._workQueues.length && |
+ _manager._workQueues[_queueIndex].isEmpty) { |
_queueIndex++; |
} |
} |
} |
} |
+ |
+class _AngularHtmlUnitResolver_visitModelDirectives extends |
+ ht.RecursiveXmlVisitor<Object> { |
+ final AngularHtmlUnitResolver resolver; |
+ |
+ _AngularHtmlUnitResolver_visitModelDirectives(this.resolver) |
+ : super(); |
+ |
+ @override |
+ Object visitXmlTagNode(ht.XmlTagNode node) { |
+ NgModelProcessor directive = NgModelProcessor.INSTANCE; |
+ if (directive.canApply(node)) { |
+ directive._applyTopDeclarations(resolver, node); |
+ } |
+ return super.visitXmlTagNode(node); |
+ } |
+} |
+ |
+class _PolymerHtmlUnitBuilder_findTagDartElement extends |
+ RecursiveElementVisitor<Object> { |
+ final PolymerHtmlUnitBuilder PolymerHtmlUnitBuilder_this; |
+ |
+ _PolymerHtmlUnitBuilder_findTagDartElement(this.PolymerHtmlUnitBuilder_this) |
+ : super(); |
+ |
+ @override |
+ Object visitPolymerTagDartElement(PolymerTagDartElement element) { |
+ if (element.name == PolymerHtmlUnitBuilder_this._elementName) { |
+ throw new PolymerHtmlUnitBuilder_FoundTagDartElementError( |
+ element as PolymerTagDartElementImpl); |
+ } |
+ return null; |
+ } |
+} |