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

Unified Diff: pkg/analyzer/lib/src/context/context.dart

Issue 1144023009: Adapt the existing incremental resolution implementation to the new model. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/lib/src/context/context.dart
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index d1e91720ec6653eb333683d99898301f1bba7377..8f4d6a1e429323abf50570b134ef77f278907f58 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -7,6 +7,7 @@ library analyzer.src.context.context;
import 'dart:async';
import 'dart:collection';
+import 'package:analyzer/instrumentation/instrumentation.dart';
import 'package:analyzer/src/cancelable_future.dart';
import 'package:analyzer/src/context/cache.dart';
import 'package:analyzer/src/generated/ast.dart';
@@ -21,6 +22,7 @@ import 'package:analyzer/src/generated/engine.dart'
WorkManager;
import 'package:analyzer/src/generated/error.dart';
import 'package:analyzer/src/generated/html.dart' as ht;
+import 'package:analyzer/src/generated/incremental_resolver.dart';
import 'package:analyzer/src/generated/java_core.dart';
import 'package:analyzer/src/generated/java_engine.dart';
import 'package:analyzer/src/generated/resolver.dart';
@@ -56,6 +58,16 @@ typedef T PendingFutureComputer<T>(CacheEntry entry);
*/
class AnalysisContextImpl implements InternalAnalysisContext {
/**
+ * The next context identifier.
+ */
+ static int _NEXT_ID = 0;
+
+ /**
+ * The unique identifier of this context.
+ */
+ final int _id = _NEXT_ID++;
+
+ /**
* A client-provided name used to identify this context, or `null` if the
* client has not provided a name.
*/
@@ -979,6 +991,16 @@ class AnalysisContextImpl implements InternalAnalysisContext {
}
@override
+ void invalidateLibraryHints(Source librarySource) {
+ List<Source> sources = _cache.getValue(librarySource, UNITS);
+ if (sources != null) {
+ for (Source source in sources) {
+ getCacheEntry(source).setState(HINTS, CacheState.INVALID);
+ }
+ }
+ }
+
+ @override
bool isClientLibrary(Source librarySource) {
CacheEntry entry = _cache.get(librarySource);
return entry.getValue(IS_CLIENT) && entry.getValue(IS_LAUNCHABLE);
@@ -1701,64 +1723,70 @@ class AnalysisContextImpl implements InternalAnalysisContext {
* TODO(scheglov) A hackish, limited incremental resolution implementation.
*/
bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) {
- // TODO(brianwilkerson) Implement this.
- return false;
-// return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() {
-// incrementalResolutionValidation_lastUnitSource = null;
-// incrementalResolutionValidation_lastLibrarySource = null;
-// incrementalResolutionValidation_lastUnit = null;
-// // prepare the entry
-// cache.CacheEntry entry = _cache.get(unitSource);
-// if (entry == null) {
-// return false;
-// }
-// // prepare the (only) library source
-// List<Source> librarySources = getLibrariesContaining(unitSource);
-// if (librarySources.length != 1) {
-// return false;
-// }
-// Source librarySource = librarySources[0];
-// // prepare the library element
-// LibraryElement libraryElement = getLibraryElement(librarySource);
-// if (libraryElement == null) {
-// return false;
-// }
-// // prepare the existing unit
-// CompilationUnit oldUnit =
-// getResolvedCompilationUnit2(unitSource, librarySource);
-// if (oldUnit == null) {
-// return false;
-// }
-// // do resolution
-// Stopwatch perfCounter = new Stopwatch()..start();
-// PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver(
-// typeProvider, unitSource, entry, oldUnit,
-// analysisOptions.incrementalApi, analysisOptions);
-// bool success = resolver.resolve(newCode);
-// AnalysisEngine.instance.instrumentationService.logPerformance(
-// AnalysisPerformanceKind.INCREMENTAL, perfCounter,
-// 'success=$success,context_id=$_id,code_length=${newCode.length}');
-// if (!success) {
-// return false;
-// }
-// // if validation, remember the result, but throw it away
-// if (analysisOptions.incrementalValidation) {
-// incrementalResolutionValidation_lastUnitSource = oldUnit.element.source;
-// incrementalResolutionValidation_lastLibrarySource =
-// oldUnit.element.library.source;
-// incrementalResolutionValidation_lastUnit = oldUnit;
-// return false;
-// }
-// // prepare notice
-// {
-// LineInfo lineInfo = getLineInfo(unitSource);
-// ChangeNoticeImpl notice = _getNotice(unitSource);
-// notice.resolvedDartUnit = oldUnit;
-// notice.setErrors(entry.allErrors, lineInfo);
-// }
-// // OK
-// return true;
-// });
+ return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() {
+ incrementalResolutionValidation_lastUnitSource = null;
+ incrementalResolutionValidation_lastLibrarySource = null;
+ incrementalResolutionValidation_lastUnit = null;
+ // prepare the entry
+ CacheEntry sourceEntry = _cache.get(unitSource);
+ if (sourceEntry == null) {
+ return false;
+ }
+ // prepare the (only) library source
+ List<Source> librarySources = getLibrariesContaining(unitSource);
+ if (librarySources.length != 1) {
+ return false;
+ }
+ Source librarySource = librarySources[0];
+ CacheEntry unitEntry =
+ _cache.get(new LibrarySpecificUnit(librarySource, unitSource));
+ if (unitEntry == null) {
+ return false;
+ }
+ // prepare the library element
+ LibraryElement libraryElement = getLibraryElement(librarySource);
+ if (libraryElement == null) {
+ return false;
+ }
+ // prepare the existing unit
+ CompilationUnit oldUnit =
+ getResolvedCompilationUnit2(unitSource, librarySource);
+ if (oldUnit == null) {
+ return false;
+ }
+ // do resolution
+ Stopwatch perfCounter = new Stopwatch()..start();
+ PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver(
+ typeProvider, unitSource, null, sourceEntry, unitEntry, oldUnit,
+ analysisOptions.incrementalApi, analysisOptions);
+ bool success = resolver.resolve(newCode);
+ // TODO(brianwilkerson) Implement this.
Brian Wilkerson 2015/05/23 15:58:44 Implement what?
+ AnalysisEngine.instance.instrumentationService.logPerformance(
+ AnalysisPerformanceKind.INCREMENTAL, perfCounter,
+ 'success=$success,context_id=$_id,code_length=${newCode.length}');
+ if (!success) {
+ return false;
+ }
+ // if validation, remember the result, but throw it away
+ if (analysisOptions.incrementalValidation) {
+ incrementalResolutionValidation_lastUnitSource = oldUnit.element.source;
+ incrementalResolutionValidation_lastLibrarySource =
+ oldUnit.element.library.source;
+ incrementalResolutionValidation_lastUnit = oldUnit;
+ return false;
+ }
+ // prepare notice
+ {
+ ChangeNoticeImpl notice = getNotice(unitSource);
+ notice.resolvedDartUnit = oldUnit;
+ AnalysisErrorInfo errorInfo = getErrors(unitSource);
+ notice.setErrors(errorInfo.errors, errorInfo.lineInfo);
+ }
+ // schedule
+ dartWorkManager.unitIncrementallyResolved(librarySource, unitSource);
+ // OK
+ return true;
+ });
}
/**

Powered by Google App Engine
This is Rietveld 408576698