Index: packages/analyzer/lib/src/generated/engine.dart |
diff --git a/analyzer/lib/src/generated/engine.dart b/packages/analyzer/lib/src/generated/engine.dart |
similarity index 97% |
rename from analyzer/lib/src/generated/engine.dart |
rename to packages/analyzer/lib/src/generated/engine.dart |
index 83769e6d77e53c152d3dfb6cd9677aa65ca2ba35..9560bfffe534803666e3d3fd4d6b5c862e3da6f5 100644 |
--- a/analyzer/lib/src/generated/engine.dart |
+++ b/packages/analyzer/lib/src/generated/engine.dart |
@@ -2,9 +2,6 @@ |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
-// This code was auto-generated, is not intended to be edited, and is subject to |
-// significant change. Please see the README file for more information. |
- |
library engine; |
import 'dart:async'; |
@@ -209,8 +206,10 @@ class AnalysisCache { |
/** |
* Remove all information related to the given [source] from this cache. |
+ * Return the entry associated with the source, or `null` if there was cache |
+ * entry for the source. |
*/ |
- void remove(Source source) { |
+ SourceEntry remove(Source source) { |
int count = _partitions.length; |
for (int i = 0; i < count; i++) { |
if (_partitions[i].contains(source)) { |
@@ -223,10 +222,10 @@ class AnalysisCache { |
JavaSystem.currentTimeMillis(); |
} |
} |
- _partitions[i].remove(source); |
- return; |
+ return _partitions[i].remove(source); |
} |
} |
+ return null; |
} |
/** |
@@ -353,6 +352,12 @@ abstract class AnalysisContext { |
List<Source> get htmlSources; |
/** |
+ * The stream that is notified when a source either starts or stops being |
+ * analyzed implicitly. |
+ */ |
+ Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents; |
+ |
+ /** |
* Returns `true` if this context was disposed using [dispose]. |
*/ |
bool get isDisposed; |
@@ -424,6 +429,11 @@ abstract class AnalysisContext { |
TypeProvider get typeProvider; |
/** |
+ * Return a type system for this context. |
+ */ |
+ TypeSystem get typeSystem; |
+ |
+ /** |
* Add the given [listener] to the list of objects that are to be notified |
* when various analysis results are produced in this context. |
*/ |
@@ -548,6 +558,13 @@ abstract class AnalysisContext { |
Source source, Source librarySource); |
/** |
+ * Perform work until the given [result] has been computed for the given |
+ * [target]. Return the computed value. |
+ */ |
+ Object /*V*/ computeResult( |
+ AnalysisTarget target, ResultDescriptor /*<V>*/ result); |
+ |
+ /** |
* Notifies the context that the client is going to stop using this context. |
*/ |
void dispose(); |
@@ -713,6 +730,15 @@ abstract class AnalysisContext { |
ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource); |
/** |
+ * Return the value of the given [result] for the given [target]. |
+ * |
+ * If the corresponding [target] does not exist, or the [result] is not |
+ * computed yet, then the default value is returned. |
+ */ |
+ Object /*V*/ getResult( |
+ AnalysisTarget target, ResultDescriptor /*<V>*/ result); |
+ |
+ /** |
* Return a list of the sources being analyzed in this context whose full path |
* is equal to the given [path]. |
*/ |
@@ -1019,6 +1045,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
TypeProvider _typeProvider; |
/** |
+ * The [TypeSystem] for this context, `null` if not yet created. |
+ */ |
+ TypeSystem _typeSystem; |
+ |
+ /** |
* The object used to manage the list of sources that need to be analyzed. |
*/ |
WorkManager _workManager = new WorkManager(); |
@@ -1034,6 +1065,12 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
StreamController<SourcesChangedEvent> _onSourcesChangedController; |
/** |
+ * A subscription for a stream of events indicating when files are (and are |
+ * not) being implicitly analyzed. |
+ */ |
+ StreamController<ImplicitAnalysisEvent> _implicitAnalysisEventsController; |
+ |
+ /** |
* The listeners that are to be notified when various analysis results are |
* produced in this context. |
*/ |
@@ -1078,12 +1115,15 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
*/ |
AnalysisContextImpl() { |
_resultRecorder = new AnalysisContextImpl_AnalysisTaskResultRecorder(this); |
- _privatePartition = new UniversalCachePartition(this, |
+ _privatePartition = new UniversalCachePartition( |
+ this, |
AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, |
new AnalysisContextImpl_ContextRetentionPolicy(this)); |
_cache = createCacheFromSourceFactory(null); |
_onSourcesChangedController = |
new StreamController<SourcesChangedEvent>.broadcast(); |
+ _implicitAnalysisEventsController = |
+ new StreamController<ImplicitAnalysisEvent>.broadcast(); |
} |
@override |
@@ -1102,7 +1142,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
this._options.dart2jsHint != options.dart2jsHint || |
(this._options.hint && !options.hint) || |
this._options.preserveComments != options.preserveComments || |
- this._options.enableStrictCallChecks != options.enableStrictCallChecks; |
+ this._options.strongMode != options.strongMode || |
+ this._options.enableStrictCallChecks != |
+ options.enableStrictCallChecks || |
+ this._options.enableSuperMixins != options.enableSuperMixins; |
int cacheSize = options.cacheSize; |
if (this._options.cacheSize != cacheSize) { |
this._options.cacheSize = cacheSize; |
@@ -1128,12 +1171,14 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
this._options.generateSdkErrors = options.generateSdkErrors; |
this._options.dart2jsHint = options.dart2jsHint; |
this._options.enableStrictCallChecks = options.enableStrictCallChecks; |
+ this._options.enableSuperMixins = options.enableSuperMixins; |
this._options.hint = options.hint; |
this._options.incremental = options.incremental; |
this._options.incrementalApi = options.incrementalApi; |
this._options.incrementalValidation = options.incrementalValidation; |
this._options.lint = options.lint; |
this._options.preserveComments = options.preserveComments; |
+ this._options.strongMode = options.strongMode; |
_generateImplicitErrors = options.generateImplicitErrors; |
_generateSdkErrors = options.generateSdkErrors; |
if (needsRecompute) { |
@@ -1198,6 +1243,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
List<Source> get htmlSources => _getSources(SourceKind.HTML); |
@override |
+ Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents => |
+ _implicitAnalysisEventsController.stream; |
+ |
+ @override |
bool get isDisposed => _disposed; |
@override |
@@ -1511,6 +1560,14 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
+ TypeSystem get typeSystem { |
+ if (_typeSystem == null) { |
+ _typeSystem = TypeSystem.create(this); |
+ } |
+ return _typeSystem; |
+ } |
+ |
+ @override |
void addListener(AnalysisListener listener) { |
if (!_listeners.contains(listener)) { |
_listeners.add(listener); |
@@ -1584,31 +1641,13 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (source == null) { |
return null; |
} |
- CompilationUnit unit = parseCompilationUnit(source); |
- if (unit == null) { |
+ SourceRange docRange = element.docRange; |
+ if (docRange == null) { |
return null; |
} |
- NodeLocator locator = new NodeLocator(element.nameOffset); |
- AstNode nameNode = locator.searchWithin(unit); |
- while (nameNode != null) { |
- if (nameNode is AnnotatedNode) { |
- Comment comment = nameNode.documentationComment; |
- if (comment == null) { |
- return null; |
- } |
- StringBuffer buffer = new StringBuffer(); |
- List<Token> tokens = comment.tokens; |
- for (int i = 0; i < tokens.length; i++) { |
- if (i > 0) { |
- buffer.write("\n"); |
- } |
- buffer.write(tokens[i].lexeme); |
- } |
- return buffer.toString(); |
- } |
- nameNode = nameNode.parent; |
- } |
- return null; |
+ String code = getContents(source).data; |
+ String comment = code.substring(docRange.offset, docRange.end); |
+ return comment.replaceAll('\r\n', '\n'); |
} |
@override |
@@ -1628,11 +1667,15 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
_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, |
@@ -1646,20 +1689,28 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} 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)); |
} |
if (enableLints) { |
dartEntry = _getReadableDartEntry(source); |
- ListUtilities.addAll(errors, _getDartLintData( |
- source, librarySource, dartEntry, DartEntry.LINTS)); |
+ ListUtilities.addAll( |
+ errors, |
+ _getDartLintData( |
+ source, librarySource, dartEntry, DartEntry.LINTS)); |
} |
} |
} |
@@ -1755,8 +1806,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
@override |
CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync( |
Source unitSource, Source librarySource) { |
- return new _AnalysisFutureHelper<CompilationUnit>(this).computeAsync( |
- unitSource, (SourceEntry sourceEntry) { |
+ return new _AnalysisFutureHelper<CompilationUnit>(this) |
+ .computeAsync(unitSource, (SourceEntry sourceEntry) { |
if (sourceEntry is DartEntry) { |
if (sourceEntry.getStateInLibrary( |
DartEntry.RESOLVED_UNIT, librarySource) == |
@@ -1770,6 +1821,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
}); |
} |
+ @override |
+ Object computeResult(AnalysisTarget target, ResultDescriptor result) { |
+ return result.defaultValue; |
+ } |
+ |
/** |
* Create an analysis cache based on the given source [factory]. |
*/ |
@@ -2097,7 +2153,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (dartEntry == null) { |
AnalysisEngine.instance.logger.logError( |
"Could not compute the public namespace for ${library.source.fullName}", |
- new CaughtException(new AnalysisException( |
+ new CaughtException( |
+ new AnalysisException( |
"A Dart file became a non-Dart file: ${source.fullName}"), |
null)); |
return null; |
@@ -2147,6 +2204,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
@override |
+ Object getResult(AnalysisTarget target, ResultDescriptor result) { |
+ return result.defaultValue; |
+ } |
+ |
+ @override |
List<Source> getSourcesWithFullName(String path) { |
List<Source> sources = <Source>[]; |
MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
@@ -2292,7 +2354,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
_validateLastIncrementalResolutionResult(); |
if (_performAnalysisTaskStopwatch != null) { |
AnalysisEngine.instance.instrumentationService.logPerformance( |
- AnalysisPerformanceKind.FULL, _performAnalysisTaskStopwatch, |
+ AnalysisPerformanceKind.FULL, |
+ _performAnalysisTaskStopwatch, |
'context_id=$_id'); |
_performAnalysisTaskStopwatch = null; |
} |
@@ -2410,7 +2473,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} else { |
unitEntry.recordResolutionError(thrownException); |
} |
- _cache.remove(unitSource); |
+ _removeFromCache(unitSource); |
if (thrownException != null) { |
throw new AnalysisException('<rethrow>', thrownException); |
} |
@@ -2483,7 +2546,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} else { |
unitEntry.recordResolutionError(thrownException); |
} |
- _cache.remove(unitSource); |
+ _removeFromCache(unitSource); |
if (thrownException != null) { |
throw new AnalysisException('<rethrow>', thrownException); |
} |
@@ -2513,7 +2576,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} else { |
dartEntry.recordResolutionErrorInLibrary( |
librarySource, thrownException); |
- _cache.remove(source); |
+ _removeFromCache(source); |
} |
if (source != librarySource) { |
_workManager.add(source, SourcePriority.PRIORITY_PART); |
@@ -2546,7 +2609,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
@override |
CompilationUnit resolveCompilationUnit2( |
- Source unitSource, Source librarySource) => _getDartResolutionData2( |
+ Source unitSource, Source librarySource) => |
+ _getDartResolutionData2( |
unitSource, librarySource, DartEntry.RESOLVED_UNIT, null); |
@override |
@@ -2615,7 +2679,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
for (Source source in missingSources) { |
if (getLibrariesContaining(source).isEmpty && |
getLibrariesDependingOn(source).isEmpty) { |
- _cache.remove(source); |
+ _removeFromCache(source); |
removalCount++; |
} |
} |
@@ -2870,7 +2934,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// source continues to change, this loop will eventually terminate. |
// |
dartEntry = _cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM); |
- dartEntry = new ParseDartTask(this, source, |
+ dartEntry = new ParseDartTask( |
+ this, |
+ source, |
dartEntry.getValue(DartEntry.TOKEN_STREAM), |
dartEntry.getValue(SourceEntry.LINE_INFO)) |
.perform(_resultRecorder) as DartEntry; |
@@ -2934,8 +3000,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// |
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)) |
@@ -3011,8 +3077,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// |
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)) |
@@ -3148,8 +3214,14 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (contents != originalContents) { |
if (_options.incremental) { |
_incrementalAnalysisCache = IncrementalAnalysisCache.update( |
- _incrementalAnalysisCache, source, originalContents, contents, |
- offset, oldLength, newLength, _getReadableSourceEntry(source)); |
+ _incrementalAnalysisCache, |
+ source, |
+ originalContents, |
+ contents, |
+ offset, |
+ oldLength, |
+ newLength, |
+ _getReadableSourceEntry(source)); |
} |
_sourceChanged(source); |
changed = true; |
@@ -3197,11 +3269,12 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
CompilationUnit unit = |
unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource); |
if (unit == null) { |
- CaughtException exception = new CaughtException(new AnalysisException( |
+ CaughtException exception = new CaughtException( |
+ 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); |
} |
@@ -3299,8 +3372,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
} |
Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM); |
dartEntry.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED); |
- 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); |
} |
/** |
@@ -3333,8 +3408,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
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)); |
@@ -3354,9 +3431,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (htmlEntry.getState(HtmlEntry.PARSED_UNIT) != CacheState.VALID) { |
return _createParseHtmlTask(source, htmlEntry); |
} |
- 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); |
} |
/** |
@@ -3385,12 +3463,20 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
htmlEntry.modificationTime = getModificationStamp(source); |
htmlEntry.explicitlyAdded = explicitlyAdded; |
_cache.put(source, htmlEntry); |
+ if (!explicitlyAdded) { |
+ _implicitAnalysisEventsController |
+ .add(new ImplicitAnalysisEvent(source, true)); |
+ } |
return htmlEntry; |
} else { |
DartEntry dartEntry = new DartEntry(); |
dartEntry.modificationTime = getModificationStamp(source); |
dartEntry.explicitlyAdded = explicitlyAdded; |
_cache.put(source, dartEntry); |
+ if (!explicitlyAdded) { |
+ _implicitAnalysisEventsController |
+ .add(new ImplicitAnalysisEvent(source, true)); |
+ } |
return dartEntry; |
} |
} |
@@ -3692,8 +3778,11 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* related to it. Return the task that should be performed, or `null` if there |
* is no more work to be done for the source. |
*/ |
- AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, |
- SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, |
+ AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource( |
+ Source source, |
+ SourceEntry sourceEntry, |
+ bool isPriority, |
+ bool hintsEnabled, |
bool lintsEnabled) { |
// Refuse to generate tasks for html based files that are above 1500 KB |
if (_isTooBigHtmlSourceEntry(source, sourceEntry)) { |
@@ -3883,7 +3972,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
DartEntry dartEntry = sourceEntry; |
if (dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) == |
CacheState.VALID) { |
- return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, |
+ return new TimestampedData<CompilationUnit>( |
+ dartEntry.modificationTime, |
dartEntry.getValueInLibrary( |
DartEntry.RESOLVED_UNIT, librarySource)); |
} |
@@ -3913,8 +4003,12 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* [_getNextAnalysisTaskForSource]. This method is intended to be used for |
* testing purposes only. |
*/ |
- void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, |
- bool isPriority, bool hintsEnabled, bool lintsEnabled, |
+ void _getSourcesNeedingProcessing( |
+ Source source, |
+ SourceEntry sourceEntry, |
+ bool isPriority, |
+ bool hintsEnabled, |
+ bool lintsEnabled, |
HashSet<Source> sources) { |
if (sourceEntry is DartEntry) { |
DartEntry dartEntry = sourceEntry; |
@@ -4101,13 +4195,6 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
bool _isTooBigHtmlSourceEntry(Source source, SourceEntry sourceEntry) => |
false; |
- /** |
- * Log the given debugging [message]. |
- */ |
- void _logInformation(String message) { |
- AnalysisEngine.instance.logger.logInformation(message); |
- } |
- |
// /** |
// * Notify all of the analysis listeners that the given source is no longer included in the set of |
// * sources that are being analyzed. |
@@ -4187,6 +4274,13 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// } |
/** |
+ * Log the given debugging [message]. |
+ */ |
+ void _logInformation(String message) { |
+ AnalysisEngine.instance.logger.logInformation(message); |
+ } |
+ |
+ /** |
* Notify all of the analysis listeners that a task is about to be performed. |
*/ |
void _notifyAboutToPerformTask(String taskDescription) { |
@@ -4569,6 +4663,14 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
return dartEntry; |
} |
+ void _removeFromCache(Source source) { |
+ SourceEntry entry = _cache.remove(source); |
+ if (entry != null && !entry.explicitlyAdded) { |
+ _implicitAnalysisEventsController |
+ .add(new ImplicitAnalysisEvent(source, false)); |
+ } |
+ } |
+ |
/** |
* Remove the given [librarySource] from the list of containing libraries for |
* all of the parts referenced by the given [dartEntry]. |
@@ -4581,7 +4683,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
if (partEntry != null && !identical(partEntry, dartEntry)) { |
partEntry.removeContainingLibrary(librarySource); |
if (partEntry.containingLibraries.length == 0 && !exists(partSource)) { |
- _cache.remove(partSource); |
+ _removeFromCache(partSource); |
} |
} |
} |
@@ -4601,7 +4703,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
partEntry.removeContainingLibrary(librarySource); |
if (partEntry.containingLibraries.length == 0 && |
!exists(partSource)) { |
- _cache.remove(partSource); |
+ _removeFromCache(partSource); |
} |
} |
} |
@@ -4630,6 +4732,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
* that referenced the source before it existed. |
*/ |
void _sourceAvailable(Source source) { |
+ // TODO(brianwilkerson) This method needs to check whether the source was |
+ // previously being implicitly analyzed. If so, the cache entry needs to be |
+ // update to reflect the new status and an event needs to be generated to |
+ // inform clients that it is no longer being implicitly analyzed. |
SourceEntry sourceEntry = _cache.get(source); |
if (sourceEntry == null) { |
sourceEntry = _createSourceEntry(source, true); |
@@ -4718,7 +4824,7 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
_invalidateLibraryResolution(librarySource); |
} |
} |
- _cache.remove(source); |
+ _removeFromCache(source); |
_workManager.remove(source); |
_removeFromPriorityOrder(source); |
} |
@@ -4756,11 +4862,17 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
// do resolution |
Stopwatch perfCounter = new Stopwatch()..start(); |
PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver( |
- typeProvider, unitSource, getReadableSourceEntryOrNull(unitSource), |
- null, null, oldUnit, analysisOptions.incrementalApi, analysisOptions); |
+ typeProvider, |
+ unitSource, |
+ getReadableSourceEntryOrNull(unitSource), |
+ null, |
+ null, |
+ oldUnit, |
+ analysisOptions.incrementalApi); |
bool success = resolver.resolve(newCode); |
AnalysisEngine.instance.instrumentationService.logPerformance( |
- AnalysisPerformanceKind.INCREMENTAL, perfCounter, |
+ AnalysisPerformanceKind.INCREMENTAL, |
+ perfCounter, |
'success=$success,context_id=$_id,code_length=${newCode.length}'); |
if (!success) { |
return false; |
@@ -4980,8 +5092,8 @@ class AnalysisContextImpl_CycleBuilder { |
// 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; |
} |
@@ -5209,8 +5321,8 @@ class AnalysisContextImpl_CycleBuilder { |
AnalysisContextImpl_this._getReadableDartEntry(librarySource); |
if (libraryEntry != null && |
libraryEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) { |
- AnalysisContextImpl_this._workManager.addFirst( |
- librarySource, SourcePriority.LIBRARY); |
+ AnalysisContextImpl_this._workManager |
+ .addFirst(librarySource, SourcePriority.LIBRARY); |
if (_taskData == null) { |
_taskData = AnalysisContextImpl_this._createResolveDartLibraryTask( |
librarySource, libraryEntry); |
@@ -5792,6 +5904,11 @@ class AnalysisEngine { |
bool limitInvalidationInTaskModel = false; |
/** |
+ * The plugins that are defined outside the `analyzer` package. |
+ */ |
+ List<Plugin> _userDefinedPlugins = <Plugin>[]; |
+ |
+ /** |
* The task manager used to manage the tasks used to analyze code. |
*/ |
TaskManager _taskManager; |
@@ -5840,6 +5957,7 @@ class AnalysisEngine { |
commandLinePlugin, |
optionsPlugin |
]; |
+ _supportedPlugins.addAll(_userDefinedPlugins); |
} |
return _supportedPlugins; |
} |
@@ -5849,10 +5967,7 @@ class AnalysisEngine { |
*/ |
TaskManager get taskManager { |
if (_taskManager == null) { |
- if (enginePlugin.taskExtensionPoint == null) { |
- // The plugin wasn't used, so tasks are not registered. |
- new ExtensionManager().processPlugins([enginePlugin]); |
- } |
+ new ExtensionManager().processPlugins(supportedPlugins); |
_taskManager = new TaskManager(); |
_taskManager.addTaskDescriptors(enginePlugin.taskDescriptors); |
// TODO(brianwilkerson) Create a way to associate different results with |
@@ -5863,6 +5978,18 @@ class AnalysisEngine { |
} |
/** |
+ * Set plugins that are defined outside the `analyzer` package. |
+ */ |
+ void set userDefinedPlugins(List<Plugin> plugins) { |
+ if (plugins == null) { |
+ plugins = <Plugin>[]; |
+ } |
+ _userDefinedPlugins = plugins; |
+ _supportedPlugins = null; |
+ _taskManager = null; |
+ } |
+ |
+ /** |
* 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. |
*/ |
@@ -6109,6 +6236,12 @@ abstract class AnalysisOptions { |
bool get enableStrictCallChecks; |
/** |
+ * Return `true` if mixins are allowed to inherit from types other than |
+ * Object, and are allowed to reference `super`. |
+ */ |
+ bool get enableSuperMixins; |
+ |
+ /** |
* Return `true` if errors, warnings and hints should be generated for sources |
* that are implicitly being analyzed. The default value is `true`. |
*/ |
@@ -6152,6 +6285,11 @@ abstract class AnalysisOptions { |
* Return `true` if analysis is to parse comments. |
*/ |
bool get preserveComments; |
+ |
+ /** |
+ * Return `true` if strong mode analysis should be used. |
+ */ |
+ bool get strongMode; |
} |
/** |
@@ -6193,7 +6331,7 @@ class AnalysisOptionsImpl implements AnalysisOptions { |
* A flag indicating whether analysis is to generate dart2js related hint |
* results. |
*/ |
- bool dart2jsHint = true; |
+ bool dart2jsHint = false; |
/** |
* A flag indicating whether generic methods are to be supported (DEP 22). |
@@ -6207,6 +6345,12 @@ class AnalysisOptionsImpl implements AnalysisOptions { |
bool enableStrictCallChecks = false; |
/** |
+ * A flag indicating whether mixins are allowed to inherit from types other |
+ * than Object, and are allowed to reference `super`. |
+ */ |
+ bool enableSuperMixins = false; |
+ |
+ /** |
* A flag indicating whether errors, warnings and hints should be generated |
* for sources that are implicitly being analyzed. |
*/ |
@@ -6252,6 +6396,11 @@ class AnalysisOptionsImpl implements AnalysisOptions { |
bool preserveComments = true; |
/** |
+ * A flag indicating whether strong-mode analysis should be used. |
+ */ |
+ bool strongMode = false; |
+ |
+ /** |
* Initialize a newly created set of analysis options to have their default |
* values. |
*/ |
@@ -6267,6 +6416,7 @@ class AnalysisOptionsImpl implements AnalysisOptions { |
cacheSize = options.cacheSize; |
dart2jsHint = options.dart2jsHint; |
enableStrictCallChecks = options.enableStrictCallChecks; |
+ enableSuperMixins = options.enableSuperMixins; |
generateImplicitErrors = options.generateImplicitErrors; |
generateSdkErrors = options.generateSdkErrors; |
hint = options.hint; |
@@ -6275,6 +6425,7 @@ class AnalysisOptionsImpl implements AnalysisOptions { |
incrementalValidation = options.incrementalValidation; |
lint = options.lint; |
preserveComments = options.preserveComments; |
+ strongMode = options.strongMode; |
} |
/** |
@@ -6286,6 +6437,7 @@ class AnalysisOptionsImpl implements AnalysisOptions { |
cacheSize = options.cacheSize; |
dart2jsHint = options.dart2jsHint; |
enableStrictCallChecks = options.enableStrictCallChecks; |
+ enableSuperMixins = options.enableSuperMixins; |
generateImplicitErrors = options.generateImplicitErrors; |
generateSdkErrors = options.generateSdkErrors; |
hint = options.hint; |
@@ -6294,6 +6446,7 @@ class AnalysisOptionsImpl implements AnalysisOptions { |
incrementalValidation = options.incrementalValidation; |
lint = options.lint; |
preserveComments = options.preserveComments; |
+ strongMode = options.strongMode; |
} |
bool get analyzeFunctionBodies { |
@@ -6501,8 +6654,8 @@ abstract class AnalysisTask { |
if (contextName == null) { |
contextName = 'unnamed'; |
} |
- AnalysisEngine.instance.instrumentationService.logAnalysisTask( |
- contextName, taskDescription); |
+ AnalysisEngine.instance.instrumentationService |
+ .logAnalysisTask(contextName, taskDescription); |
internalPerform(); |
} on AnalysisException { |
rethrow; |
@@ -6660,8 +6813,7 @@ abstract class CachePartition { |
* [retentionPolicy] will be used to determine which pieces of data to remove |
* from the cache. |
*/ |
- CachePartition(this.context, int maxCacheSize, this._retentionPolicy) { |
- this._maxCacheSize = maxCacheSize; |
+ CachePartition(this.context, this._maxCacheSize, this._retentionPolicy) { |
_recentlyUsed = new List<Source>(); |
} |
@@ -6752,11 +6904,13 @@ abstract class CachePartition { |
} |
/** |
- * Remove all information related to the given [source] from this cache. |
+ * Remove all information related to the given [source] from this partition. |
+ * Return the entry associated with the source, or `null` if there was cache |
+ * entry for the source. |
*/ |
- void remove(Source source) { |
+ SourceEntry remove(Source source) { |
_recentlyUsed.remove(source); |
- _sourceMap.remove(source); |
+ return _sourceMap.remove(source); |
} |
/** |
@@ -7316,11 +7470,7 @@ class CycleBuilder_LibraryPair { |
/** |
* Initialize a newly created pair from the given [library] and [entryPairs]. |
*/ |
- CycleBuilder_LibraryPair(ResolvableLibrary library, |
- List<CycleBuilder_SourceEntryPair> entryPairs) { |
- this.library = library; |
- this.entryPairs = entryPairs; |
- } |
+ CycleBuilder_LibraryPair(this.library, this.entryPairs); |
} |
/** |
@@ -7342,10 +7492,7 @@ class CycleBuilder_SourceEntryPair { |
/** |
* Initialize a newly created pair from the given [source] and [entry]. |
*/ |
- CycleBuilder_SourceEntryPair(Source source, DartEntry entry) { |
- this.source = source; |
- this.entry = entry; |
- } |
+ CycleBuilder_SourceEntryPair(this.source, this.entry); |
} |
/** |
@@ -8342,8 +8489,12 @@ class GenerateDartErrorsTask extends AnalysisTask { |
// |
// 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), |
+ context.analysisOptions.enableSuperMixins); |
_unit.accept(errorVerifier); |
_errors = errorListener.getErrorsForSource(source); |
}); |
@@ -8377,8 +8528,10 @@ class GenerateDartErrorsTask extends AnalysisTask { |
* @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, |
+ static void validateReferencedSource( |
+ AnalysisContext context, |
+ Source librarySource, |
+ UriBasedDirective directive, |
AnalysisErrorListener errorListener) { |
Source source = directive.source; |
if (source != null) { |
@@ -8392,8 +8545,11 @@ class GenerateDartErrorsTask extends AnalysisTask { |
} |
} |
StringLiteral uriLiteral = directive.uri; |
- errorListener.onError(new AnalysisError(librarySource, uriLiteral.offset, |
- uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, |
+ errorListener.onError(new AnalysisError( |
+ librarySource, |
+ uriLiteral.offset, |
+ uriLiteral.length, |
+ CompileTimeErrorCode.URI_DOES_NOT_EXIST, |
[directive.uriContent])); |
} |
} |
@@ -8485,7 +8641,6 @@ class GenerateDartHintsTask extends AnalysisTask { |
/// Generates lint feedback for a single Dart library. |
class GenerateDartLintsTask extends AnalysisTask { |
- |
///The compilation units that comprise the library, with the defining |
///compilation unit appearing first in the list. |
final List<TimestampedData<CompilationUnit>> _units; |
@@ -8615,11 +8770,13 @@ class GetContentTask extends AnalysisTask { |
TimestampedData<String> data = context.getContents(source); |
_content = data.data; |
_modificationTime = data.modificationTime; |
- AnalysisEngine.instance.instrumentationService.logFileRead( |
- source.fullName, _modificationTime, _content); |
+ AnalysisEngine.instance.instrumentationService |
+ .logFileRead(source.fullName, _modificationTime, _content); |
} catch (exception, stackTrace) { |
- errors.add(new AnalysisError( |
- source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [exception])); |
+ if (source.exists()) { |
+ errors.add(new AnalysisError( |
+ source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [exception])); |
+ } |
throw new AnalysisException("Could not get contents of $source", |
new CaughtException(exception, stackTrace)); |
} |
@@ -8853,6 +9010,32 @@ class HtmlEntry extends SourceEntry { |
} |
/** |
+ * An event indicating when a source either starts or stops being implicitly |
+ * analyzed. |
+ */ |
+class ImplicitAnalysisEvent { |
+ /** |
+ * The source whose status has changed. |
+ */ |
+ final Source source; |
+ |
+ /** |
+ * A flag indicating whether the source is now being analyzed. |
+ */ |
+ final bool isAnalyzed; |
+ |
+ /** |
+ * Initialize a newly created event to indicate that the given [source] has |
+ * changed it status to match the [isAnalyzed] flag. |
+ */ |
+ ImplicitAnalysisEvent(this.source, this.isAnalyzed); |
+ |
+ @override |
+ String toString() => |
+ '${isAnalyzed ? '' : 'not '}analyzing ${source.fullName}'; |
+} |
+ |
+/** |
* Instances of the class `IncrementalAnalysisCache` hold information used to perform |
* incremental analysis. |
* |
@@ -8875,14 +9058,15 @@ class IncrementalAnalysisCache { |
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; |
- } |
+ IncrementalAnalysisCache( |
+ this.librarySource, |
+ this.source, |
+ this.resolvedUnit, |
+ this.oldContents, |
+ this._newContents, |
+ this._offset, |
+ this._oldLength, |
+ this._newLength); |
/** |
* Determine if the cache contains source changes that need to be analyzed |
@@ -8966,9 +9150,15 @@ 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; |
@@ -9394,8 +9584,9 @@ class ObsoleteSourceAnalysisException extends AnalysisException { |
* Initialize a newly created exception to represent the removal of the given |
* [source]. |
*/ |
- 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; |
} |
@@ -10119,6 +10310,12 @@ class RecursiveXmlVisitor_ResolveHtmlTask_internalPerform |
* used to visit that structure. |
*/ |
class ResolutionEraser extends GeneralizingAstVisitor<Object> { |
+ /** |
+ * A flag indicating whether the elements associated with declarations should |
+ * be erased. |
+ */ |
+ bool eraseDeclarations = true; |
+ |
@override |
Object visitAssignmentExpression(AssignmentExpression node) { |
node.staticElement = null; |
@@ -10141,13 +10338,17 @@ class ResolutionEraser extends GeneralizingAstVisitor<Object> { |
@override |
Object visitCompilationUnit(CompilationUnit node) { |
- node.element = null; |
+ if (eraseDeclarations) { |
+ node.element = null; |
+ } |
return super.visitCompilationUnit(node); |
} |
@override |
Object visitConstructorDeclaration(ConstructorDeclaration node) { |
- node.element = null; |
+ if (eraseDeclarations) { |
+ node.element = null; |
+ } |
return super.visitConstructorDeclaration(node); |
} |
@@ -10165,7 +10366,9 @@ class ResolutionEraser extends GeneralizingAstVisitor<Object> { |
@override |
Object visitDirective(Directive node) { |
- node.element = null; |
+ if (eraseDeclarations) { |
+ node.element = null; |
+ } |
return super.visitDirective(node); |
} |
@@ -10178,7 +10381,9 @@ class ResolutionEraser extends GeneralizingAstVisitor<Object> { |
@override |
Object visitFunctionExpression(FunctionExpression node) { |
- node.element = null; |
+ if (eraseDeclarations) { |
+ node.element = null; |
+ } |
return super.visitFunctionExpression(node); |
} |
@@ -10225,7 +10430,9 @@ class ResolutionEraser extends GeneralizingAstVisitor<Object> { |
@override |
Object visitSimpleIdentifier(SimpleIdentifier node) { |
- node.staticElement = null; |
+ if (eraseDeclarations || !node.inDeclarationContext()) { |
+ node.staticElement = null; |
+ } |
node.propagatedElement = null; |
return super.visitSimpleIdentifier(node); |
} |
@@ -10239,8 +10446,10 @@ class ResolutionEraser extends GeneralizingAstVisitor<Object> { |
/** |
* Remove any resolution information from the given AST structure. |
*/ |
- static void erase(AstNode node) { |
- node.accept(new ResolutionEraser()); |
+ static void erase(AstNode node, {bool eraseDeclarations: true}) { |
+ ResolutionEraser eraser = new ResolutionEraser(); |
+ eraser.eraseDeclarations = eraseDeclarations; |
+ node.accept(eraser); |
} |
} |
@@ -10753,7 +10962,11 @@ class ResolveDartUnitTask extends AnalysisTask { |
PerformanceStatistics.errors.makeCurrentWhile(() { |
ErrorReporter errorReporter = new ErrorReporter(errorListener, source); |
ErrorVerifier errorVerifier = new ErrorVerifier( |
- errorReporter, _libraryElement, typeProvider, inheritanceManager); |
+ errorReporter, |
+ _libraryElement, |
+ typeProvider, |
+ inheritanceManager, |
+ context.analysisOptions.enableSuperMixins); |
unit.accept(errorVerifier); |
// TODO(paulberry): as a temporary workaround for issue 21572, |
// ConstantVerifier is being run right after ConstantValueComputer, so we |