Index: pkg/analyzer_cli/lib/src/incremental_analyzer.dart |
diff --git a/pkg/analyzer_cli/lib/src/incremental_analyzer.dart b/pkg/analyzer_cli/lib/src/incremental_analyzer.dart |
index b4ad853d74d5ecdb35dde1ad578e3dfc72fec632..3457fe2aab915705df4a3051867d4c703dc700a6 100644 |
--- a/pkg/analyzer_cli/lib/src/incremental_analyzer.dart |
+++ b/pkg/analyzer_cli/lib/src/incremental_analyzer.dart |
@@ -19,6 +19,7 @@ import 'package:analyzer/src/summary/incremental_cache.dart'; |
import 'package:analyzer/src/summary/package_bundle_reader.dart'; |
import 'package:analyzer/src/task/dart.dart'; |
import 'package:analyzer/task/dart.dart'; |
+import 'package:analyzer/task/general.dart'; |
import 'package:analyzer/task/model.dart'; |
import 'package:analyzer_cli/src/options.dart'; |
@@ -47,12 +48,12 @@ IncrementalAnalysisSession configureIncrementalAnalysis( |
context.resultProvider = new _CacheBasedResultProvider(context, cache); |
// Listen for new libraries to put into the cache. |
_IncrementalAnalysisSession session = |
- new _IncrementalAnalysisSession(options, cache, context); |
+ new _IncrementalAnalysisSession(options, context, cache); |
context |
.onResultChanged(LIBRARY_ELEMENT1) |
.listen((ResultChangedEvent event) { |
if (event.wasComputed) { |
- session.librarySources.add(event.target.source); |
+ session.newLibrarySources.add(event.target.source); |
} |
}); |
return session; |
@@ -70,6 +71,13 @@ abstract class IncrementalAnalysisSession { |
* cache, evict old results, etc. |
*/ |
void finish(); |
+ |
+ /** |
+ * Sets the set of [Source]s analyzed in the context, both explicit and |
+ * implicit, for which errors might be requested. This set is used to compute |
+ * containing libraries for every source in the context. |
+ */ |
+ void setAnalyzedSources(Iterable<Source> sources); |
} |
/** |
@@ -91,14 +99,17 @@ class _CacheBasedResultProvider extends ResynthesizerResultProvider { |
@override |
bool compute(CacheEntry entry, ResultDescriptor result) { |
AnalysisTarget target = entry.target; |
- // TODO(scheglov) remove the check after finishing optimizations. |
- if (target.source != null && |
- target.source.fullName |
- .endsWith('analysis_server/lib/src/computer/computer_hover.dart')) { |
- return false; |
- } |
// Source based results. |
if (target is Source) { |
+ if (result == SOURCE_KIND) { |
+ SourceKind kind = cache.getSourceKind(target); |
+ if (kind != null) { |
+ entry.setValue(result, kind, TargetedResult.EMPTY_LIST); |
+ return true; |
+ } else { |
+ return false; |
+ } |
+ } |
if (result == INCLUDED_PARTS) { |
List<Source> parts = cache.getLibraryParts(target); |
if (parts != null) { |
@@ -109,8 +120,18 @@ class _CacheBasedResultProvider extends ResynthesizerResultProvider { |
} |
} |
if (result == DART_ERRORS) { |
- // TODO(scheglov) provide actual errors |
- entry.setValue(result, <AnalysisError>[], TargetedResult.EMPTY_LIST); |
+ List<Source> librarySources = context.getLibrariesContaining(target); |
+ List<List<AnalysisError>> errorList = <List<AnalysisError>>[]; |
+ for (Source librarySource in librarySources) { |
+ List<AnalysisError> errors = |
+ cache.getSourceErrorsInLibrary(librarySource, target); |
+ if (errors == null) { |
+ return false; |
+ } |
+ errorList.add(errors); |
+ } |
+ List<AnalysisError> mergedErrors = AnalysisError.mergeLists(errorList); |
+ entry.setValue(result, mergedErrors, TargetedResult.EMPTY_LIST); |
return true; |
} |
} |
@@ -145,28 +166,51 @@ class _CacheBasedResultProvider extends ResynthesizerResultProvider { |
class _IncrementalAnalysisSession implements IncrementalAnalysisSession { |
final CommandLineOptions commandLineOptions; |
- final IncrementalCache cache; |
final AnalysisContext context; |
+ final IncrementalCache cache; |
- final Set<Source> librarySources = new Set<Source>(); |
+ final Set<Source> newLibrarySources = new Set<Source>(); |
_IncrementalAnalysisSession( |
- this.commandLineOptions, this.cache, this.context); |
+ this.commandLineOptions, this.context, this.cache); |
@override |
void finish() { |
// Finish computing new libraries and put them into the cache. |
- for (Source librarySource in librarySources) { |
+ for (Source librarySource in newLibrarySources) { |
if (!commandLineOptions.machineFormat) { |
print('Compute library element for $librarySource'); |
} |
- LibraryElement libraryElement = |
- context.computeResult(librarySource, LIBRARY_ELEMENT); |
- // TODO(scheglov) compute and store errors |
-// context.computeResult(librarySource, DART_ERRORS); |
- try { |
- cache.putLibrary(libraryElement); |
- } catch (e) {} |
+ _putLibrary(librarySource); |
+ } |
+ } |
+ |
+ @override |
+ void setAnalyzedSources(Iterable<Source> sources) { |
+ for (Source source in sources) { |
+ SourceKind kind = context.computeKindOf(source); |
+ if (kind == SourceKind.LIBRARY) { |
+ context.computeResult(source, LINE_INFO); |
+ context.computeResult(source, INCLUDED_PARTS); |
+ } |
+ } |
+ } |
+ |
+ void _putLibrary(Source librarySource) { |
+ LibraryElement libraryElement = |
+ context.computeResult(librarySource, LIBRARY_ELEMENT); |
+ try { |
+ cache.putLibrary(libraryElement); |
+ } catch (e) { |
+ return; |
+ } |
+ // Write errors for the library units. |
+ for (CompilationUnitElement unit in libraryElement.units) { |
+ Source unitSource = unit.source; |
+ List<AnalysisError> errors = context.computeResult( |
+ new LibrarySpecificUnit(librarySource, unitSource), |
+ LIBRARY_UNIT_ERRORS); |
+ cache.putSourceErrorsInLibrary(librarySource, unitSource, errors); |
} |
} |
} |