| Index: pkg/analyzer/lib/src/summary/package_bundle_reader.dart
|
| diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
|
| index 7c6ee3222de9e931c532b279bee876c296cda514..7e994cb1dfc78cc2f1994a14aed829ee490bf73e 100644
|
| --- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
|
| +++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
|
| @@ -20,114 +20,18 @@ import 'package:path/path.dart' as pathos;
|
| /**
|
| * The [ResultProvider] that provides results from input package summaries.
|
| */
|
| -class InputPackagesResultProvider extends ResultProvider {
|
| - final InternalAnalysisContext _context;
|
| -
|
| - _FileBasedSummaryResynthesizer _resynthesizer;
|
| - SummaryResultProvider _sdkProvider;
|
| -
|
| - InputPackagesResultProvider(this._context, SummaryDataStore dataStore) {
|
| - InternalAnalysisContext sdkContext = _context.sourceFactory.dartSdk.context;
|
| - _sdkProvider = sdkContext.resultProvider;
|
| - // Set the type provider to prevent the context from computing it.
|
| - _context.typeProvider = sdkContext.typeProvider;
|
| - // Create a chained resynthesizer.
|
| - _resynthesizer = new _FileBasedSummaryResynthesizer(
|
| - _sdkProvider.resynthesizer,
|
| - _context,
|
| - _context.typeProvider,
|
| - _context.sourceFactory,
|
| - _context.analysisOptions.strongMode,
|
| - dataStore);
|
| +class InputPackagesResultProvider extends ResynthesizerResultProvider {
|
| + InputPackagesResultProvider(
|
| + InternalAnalysisContext context, SummaryDataStore dataStore)
|
| + : super(context, dataStore) {
|
| + AnalysisContext sdkContext = context.sourceFactory.dartSdk.context;
|
| + createResynthesizer(sdkContext, sdkContext.typeProvider);
|
| }
|
|
|
| @override
|
| - bool compute(CacheEntry entry, ResultDescriptor result) {
|
| - if (_sdkProvider.compute(entry, result)) {
|
| - return true;
|
| - }
|
| - AnalysisTarget target = entry.target;
|
| - // Only library results are supported for now.
|
| - if (target is Source) {
|
| - Uri uri = target.uri;
|
| - // We know how to server results to input packages.
|
| - String uriString = uri.toString();
|
| - if (!_resynthesizer.hasLibrarySummary(uriString)) {
|
| - return false;
|
| - }
|
| - // Provide known results.
|
| - if (result == LIBRARY_ELEMENT1 ||
|
| - result == LIBRARY_ELEMENT2 ||
|
| - result == LIBRARY_ELEMENT3 ||
|
| - result == LIBRARY_ELEMENT4 ||
|
| - result == LIBRARY_ELEMENT5 ||
|
| - result == LIBRARY_ELEMENT6 ||
|
| - result == LIBRARY_ELEMENT7 ||
|
| - result == LIBRARY_ELEMENT8 ||
|
| - result == LIBRARY_ELEMENT9 ||
|
| - result == LIBRARY_ELEMENT ||
|
| - false) {
|
| - LibraryElement libraryElement =
|
| - _resynthesizer.getLibraryElement(uriString);
|
| - entry.setValue(result, libraryElement, TargetedResult.EMPTY_LIST);
|
| - return true;
|
| - } else if (result == READY_LIBRARY_ELEMENT2 ||
|
| - result == READY_LIBRARY_ELEMENT6 ||
|
| - result == READY_LIBRARY_ELEMENT7) {
|
| - entry.setValue(result, true, TargetedResult.EMPTY_LIST);
|
| - return true;
|
| - } else if (result == SOURCE_KIND) {
|
| - if (_resynthesizer._dataStore.linkedMap.containsKey(uriString)) {
|
| - entry.setValue(result, SourceKind.LIBRARY, TargetedResult.EMPTY_LIST);
|
| - return true;
|
| - }
|
| - if (_resynthesizer._dataStore.unlinkedMap.containsKey(uriString)) {
|
| - entry.setValue(result, SourceKind.PART, TargetedResult.EMPTY_LIST);
|
| - return true;
|
| - }
|
| - return false;
|
| - }
|
| - } else if (target is LibrarySpecificUnit) {
|
| - String uriString = target.library.uri.toString();
|
| - if (!_resynthesizer.hasLibrarySummary(uriString)) {
|
| - return false;
|
| - }
|
| - if (result == CREATED_RESOLVED_UNIT1 ||
|
| - result == CREATED_RESOLVED_UNIT2 ||
|
| - result == CREATED_RESOLVED_UNIT3 ||
|
| - result == CREATED_RESOLVED_UNIT4 ||
|
| - result == CREATED_RESOLVED_UNIT5 ||
|
| - result == CREATED_RESOLVED_UNIT6 ||
|
| - result == CREATED_RESOLVED_UNIT7 ||
|
| - result == CREATED_RESOLVED_UNIT8 ||
|
| - result == CREATED_RESOLVED_UNIT9 ||
|
| - result == CREATED_RESOLVED_UNIT10 ||
|
| - result == CREATED_RESOLVED_UNIT11 ||
|
| - result == CREATED_RESOLVED_UNIT12) {
|
| - entry.setValue(result, true, TargetedResult.EMPTY_LIST);
|
| - return true;
|
| - }
|
| - if (result == COMPILATION_UNIT_ELEMENT) {
|
| - String libraryUri = target.library.uri.toString();
|
| - String unitUri = target.unit.uri.toString();
|
| - CompilationUnitElement unit = _resynthesizer.getElement(
|
| - new ElementLocationImpl.con3(<String>[libraryUri, unitUri]));
|
| - if (unit != null) {
|
| - entry.setValue(result, unit, TargetedResult.EMPTY_LIST);
|
| - return true;
|
| - }
|
| - }
|
| - } else if (target is VariableElement) {
|
| - if (!_resynthesizer
|
| - .hasLibrarySummary(target.library.source.uri.toString())) {
|
| - return false;
|
| - }
|
| - if (result == PROPAGATED_VARIABLE || result == INFERRED_STATIC_VARIABLE) {
|
| - entry.setValue(result, target, TargetedResult.EMPTY_LIST);
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| + bool hasResultsForSource(Source source) {
|
| + String uriString = source.uri.toString();
|
| + return resynthesizer.hasLibrarySummary(uriString);
|
| }
|
| }
|
|
|
| @@ -211,6 +115,147 @@ class InSummarySource extends Source {
|
| }
|
|
|
| /**
|
| + * The [ResultProvider] that provides results using summary resynthesizer.
|
| + */
|
| +abstract class ResynthesizerResultProvider extends ResultProvider {
|
| + final InternalAnalysisContext _context;
|
| + final SummaryDataStore _dataStore;
|
| +
|
| + _FileBasedSummaryResynthesizer _resynthesizer;
|
| + SummaryResultProvider _sdkProvider;
|
| +
|
| + ResynthesizerResultProvider(this._context, this._dataStore);
|
| +
|
| + SummaryResynthesizer get resynthesizer => _resynthesizer;
|
| +
|
| + /**
|
| + * Add a new [bundle] to the resynthesizer.
|
| + */
|
| + void addBundle(String path, PackageBundle bundle) {
|
| + _dataStore.addBundle(path, bundle);
|
| + }
|
| +
|
| + @override
|
| + bool compute(CacheEntry entry, ResultDescriptor result) {
|
| + if (_sdkProvider != null && _sdkProvider.compute(entry, result)) {
|
| + return true;
|
| + }
|
| + AnalysisTarget target = entry.target;
|
| + // Check whether there are results for the source.
|
| + if (!hasResultsForSource(target.source)) {
|
| + return false;
|
| + }
|
| + // Constant expressions are always resolved in summaries.
|
| + if (result == CONSTANT_EXPRESSION_RESOLVED &&
|
| + target is ConstantEvaluationTarget) {
|
| + entry.setValue(result, true, TargetedResult.EMPTY_LIST);
|
| + return true;
|
| + }
|
| + // Provide results for Source.
|
| + if (target is Source) {
|
| + String uriString = target.uri.toString();
|
| + // Provide known results.
|
| + if (result == LIBRARY_ELEMENT1 ||
|
| + result == LIBRARY_ELEMENT2 ||
|
| + result == LIBRARY_ELEMENT3 ||
|
| + result == LIBRARY_ELEMENT4 ||
|
| + result == LIBRARY_ELEMENT5 ||
|
| + result == LIBRARY_ELEMENT6 ||
|
| + result == LIBRARY_ELEMENT7 ||
|
| + result == LIBRARY_ELEMENT8 ||
|
| + result == LIBRARY_ELEMENT9 ||
|
| + result == LIBRARY_ELEMENT) {
|
| + LibraryElement libraryElement =
|
| + resynthesizer.getLibraryElement(uriString);
|
| + entry.setValue(result, libraryElement, TargetedResult.EMPTY_LIST);
|
| + return true;
|
| + } else if (result == READY_LIBRARY_ELEMENT2 ||
|
| + result == READY_LIBRARY_ELEMENT6 ||
|
| + result == READY_LIBRARY_ELEMENT7) {
|
| + entry.setValue(result, true, TargetedResult.EMPTY_LIST);
|
| + return true;
|
| + } else if (result == SOURCE_KIND) {
|
| + if (_dataStore.linkedMap.containsKey(uriString)) {
|
| + entry.setValue(result, SourceKind.LIBRARY, TargetedResult.EMPTY_LIST);
|
| + return true;
|
| + }
|
| + if (_dataStore.unlinkedMap.containsKey(uriString)) {
|
| + entry.setValue(result, SourceKind.PART, TargetedResult.EMPTY_LIST);
|
| + return true;
|
| + }
|
| + return false;
|
| + }
|
| + } else if (target is LibrarySpecificUnit) {
|
| + if (!hasResultsForSource(target.library)) {
|
| + return false;
|
| + }
|
| + if (result == CREATED_RESOLVED_UNIT1 ||
|
| + result == CREATED_RESOLVED_UNIT2 ||
|
| + result == CREATED_RESOLVED_UNIT3 ||
|
| + result == CREATED_RESOLVED_UNIT4 ||
|
| + result == CREATED_RESOLVED_UNIT5 ||
|
| + result == CREATED_RESOLVED_UNIT6 ||
|
| + result == CREATED_RESOLVED_UNIT7 ||
|
| + result == CREATED_RESOLVED_UNIT8 ||
|
| + result == CREATED_RESOLVED_UNIT9 ||
|
| + result == CREATED_RESOLVED_UNIT10 ||
|
| + result == CREATED_RESOLVED_UNIT11 ||
|
| + result == CREATED_RESOLVED_UNIT12) {
|
| + entry.setValue(result, true, TargetedResult.EMPTY_LIST);
|
| + return true;
|
| + }
|
| + if (result == COMPILATION_UNIT_ELEMENT) {
|
| + String libraryUri = target.library.uri.toString();
|
| + String unitUri = target.unit.uri.toString();
|
| + CompilationUnitElement unit = resynthesizer.getElement(
|
| + new ElementLocationImpl.con3(<String>[libraryUri, unitUri]));
|
| + if (unit != null) {
|
| + entry.setValue(result, unit, TargetedResult.EMPTY_LIST);
|
| + return true;
|
| + }
|
| + }
|
| + } else if (target is VariableElement) {
|
| + if (!hasResultsForSource(target.library.source)) {
|
| + return false;
|
| + }
|
| + if (result == PROPAGATED_VARIABLE || result == INFERRED_STATIC_VARIABLE) {
|
| + entry.setValue(result, target, TargetedResult.EMPTY_LIST);
|
| + return true;
|
| + }
|
| + }
|
| + // Unknown target.
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * Create the [resynthesizer] instance.
|
| + *
|
| + * Subclasses must call this method in their constructors.
|
| + */
|
| + void createResynthesizer(
|
| + InternalAnalysisContext sdkContext, TypeProvider typeProvider) {
|
| + // Set the type provider to prevent the context from computing it.
|
| + _context.typeProvider = typeProvider;
|
| + // Create a chained resynthesizer.
|
| + _sdkProvider = sdkContext?.resultProvider;
|
| + _resynthesizer = new _FileBasedSummaryResynthesizer(
|
| + _sdkProvider?.resynthesizer,
|
| + _context,
|
| + typeProvider,
|
| + _context.sourceFactory,
|
| + _context.analysisOptions.strongMode,
|
| + _dataStore);
|
| + }
|
| +
|
| + /**
|
| + * Return `true` if this result provider can provide a result for the
|
| + * given [source]. The provider must ensure that [addBundle] is invoked for
|
| + * every bundle that would be required to provide results for the [source].
|
| + */
|
| + bool hasResultsForSource(Source source);
|
| +}
|
| +
|
| +/**
|
| * A [SummaryDataStore] is a container for the data extracted from a set of
|
| * summary package bundles. It contains maps which can be used to find linked
|
| * and unlinked summaries by URI.
|
|
|