| Index: pkg/analyzer/lib/src/dart/analysis/driver.dart
|
| diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
|
| index 95f625a8454fb8d43d06fea2c48e534e0de92f15..173ec6c094c68953cb7c7d481a28d24cd7d05815 100644
|
| --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
|
| +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
|
| @@ -296,6 +296,28 @@ class AnalysisDriver {
|
| }
|
|
|
| /**
|
| + * TODO(scheglov) see [_addToStoreUnlinked]
|
| + */
|
| + void _addToStoreLinked(
|
| + SummaryDataStore store, String uri, LinkedLibrary linked) {
|
| + store.linkedMap[uri] = linked;
|
| + }
|
| +
|
| + /**
|
| + * TODO(scheglov) The existing [SummaryDataStore.addBundle] uses
|
| + * [PackageBundle.unlinkedUnitUris] to add [PackageBundle.unlinkedUnits].
|
| + * But we store unlinked bundles with the hash of the file content. This
|
| + * means that when two files are the same, but have different URIs, we
|
| + * add [UnlinkedUnit] with wrong URI.
|
| + *
|
| + * We need to clean this up.
|
| + */
|
| + void _addToStoreUnlinked(
|
| + SummaryDataStore store, String uri, UnlinkedUnit unlinked) {
|
| + store.unlinkedMap[uri] = unlinked;
|
| + }
|
| +
|
| + /**
|
| * TODO(scheglov) replace with actual [AnalysisResult] computing.
|
| */
|
| List<String> _computeAndPrintErrors(_File file) {
|
| @@ -422,12 +444,21 @@ class AnalysisDriver {
|
| nodes[libraryUriStr] = node;
|
| _ReferencedUris referenced = _getReferencedUris(libraryFile);
|
|
|
| + // Append the defining unit.
|
| + {
|
| + PackageBundle unlinked = _getUnlinked(libraryFile);
|
| + node.unlinkedBundles.add(unlinked);
|
| + _addToStoreUnlinked(
|
| + store, libraryUriStr, unlinked.unlinkedUnits.single);
|
| + }
|
| +
|
| // Append unlinked bundles.
|
| for (String uri in referenced.parted) {
|
| _File file = libraryFile.resolveUri(uri);
|
| PackageBundle unlinked = _getUnlinked(file);
|
| node.unlinkedBundles.add(unlinked);
|
| - store.addBundle(null, unlinked);
|
| + _addToStoreUnlinked(
|
| + store, file.uri.toString(), unlinked.unlinkedUnits.single);
|
| }
|
|
|
| // Create nodes for referenced libraries.
|
| @@ -456,7 +487,8 @@ class AnalysisDriver {
|
| List<int> bytes = _byteStore.get(key);
|
| if (bytes != null) {
|
| PackageBundle linked = new PackageBundle.fromBuffer(bytes);
|
| - store.addBundle(null, linked);
|
| + _addToStoreLinked(
|
| + store, node.uri.toString(), linked.linkedLibraries.single);
|
| } else {
|
| libraryUrisToLink.add(node.uri.toString());
|
| }
|
| @@ -493,7 +525,7 @@ class AnalysisDriver {
|
| bytes = assembler.assemble().toBuffer();
|
| }
|
| PackageBundle linked = new PackageBundle.fromBuffer(bytes);
|
| - store.addBundle(null, linked);
|
| + _addToStoreLinked(store, uri, linked.linkedLibraries.single);
|
| _byteStore.put(key, bytes);
|
| });
|
|
|
| @@ -548,7 +580,6 @@ class AnalysisDriver {
|
|
|
| // Compute URIs.
|
| _ReferencedUris referencedUris = new _ReferencedUris();
|
| - referencedUris.parted.add(file.uri.toString());
|
| for (Directive directive in file.unit.directives) {
|
| if (directive is PartOfDirective) {
|
| referencedUris.isLibrary = false;
|
| @@ -859,7 +890,7 @@ class _File {
|
| *
|
| * If the [_content] field is still `null`, get the content from the
|
| * content cache or from the [source]. If the content cannot be accessed
|
| - * because of an exception, it considers to be an empty string.
|
| + * because of an exception, it is considered to be an empty string.
|
| *
|
| * When a new content is read, the new [_contentHash] should be computed and
|
| * the current file state should be updated.
|
| @@ -869,11 +900,14 @@ class _File {
|
| _content = driver._contentCache.getContents(source);
|
| _content ??= source.contents.data;
|
| } catch (_) {
|
| - // TODO(scheglov) Fix the bug with not existing sources.
|
| - // We should not put "self URI" into cached _ReferencedUris.
|
| - // Otherwise such not-existing/empty sources all have the same hash,
|
| - // but their "self URIs" must be all different.
|
| _content = '';
|
| + // TODO(scheglov) We fail to report URI_DOES_NOT_EXIST.
|
| + // On one hand we need to provide an unlinked bundle to prevent
|
| + // analysis context from reading the file (we want it to work
|
| + // hermetically and handle one one file at a time). OTOH,
|
| + // ResynthesizerResultProvider happily reports that any source in the
|
| + // SummaryDataStore has MODIFICATION_TIME `0`. We need to return `-1`
|
| + // for missing files. Maybe add this feature to SummaryDataStore?
|
| }
|
| // Compute the content hash.
|
| List<int> textBytes = UTF8.encode(_content);
|
|
|