Chromium Code Reviews| 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 173ec6c094c68953cb7c7d481a28d24cd7d05815..b2c1fa53775012960a8a6a1cc62686084a4d4319 100644 |
| --- a/pkg/analyzer/lib/src/dart/analysis/driver.dart |
| +++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart |
| @@ -442,23 +442,24 @@ class AnalysisDriver { |
| if (node == null) { |
| node = new _LibraryNode(this, nodes, libraryUri); |
| nodes[libraryUriStr] = node; |
| - _ReferencedUris referenced = _getReferencedUris(libraryFile); |
| // Append the defining unit. |
| + _ReferencedUris referenced; |
| { |
| - PackageBundle unlinked = _getUnlinked(libraryFile); |
| - node.unlinkedBundles.add(unlinked); |
| - _addToStoreUnlinked( |
| - store, libraryUriStr, unlinked.unlinkedUnits.single); |
| + PackageBundle bundle = _getUnlinked(libraryFile); |
| + UnlinkedUnit unlinked = bundle.unlinkedUnits.single; |
| + referenced = new _ReferencedUris(unlinked); |
| + node.unlinkedBundles.add(bundle); |
| + _addToStoreUnlinked(store, libraryUriStr, unlinked); |
| } |
| - // Append unlinked bundles. |
| + // Append parts. |
| for (String uri in referenced.parted) { |
| _File file = libraryFile.resolveUri(uri); |
| - PackageBundle unlinked = _getUnlinked(file); |
| - node.unlinkedBundles.add(unlinked); |
| - _addToStoreUnlinked( |
| - store, file.uri.toString(), unlinked.unlinkedUnits.single); |
| + PackageBundle bundle = _getUnlinked(file); |
| + UnlinkedUnit unlinked = bundle.unlinkedUnits.single; |
| + node.unlinkedBundles.add(bundle); |
| + _addToStoreUnlinked(store, file.uri.toString(), unlinked); |
| } |
| // Create nodes for referenced libraries. |
| @@ -553,79 +554,6 @@ class AnalysisDriver { |
| } |
| /** |
| - * TODO(scheglov) It would be nice to get URIs of "parts" from unlinked. |
| - */ |
| - _ReferencedUris _getReferencedUris(_File file) { |
| - // Try to get from the store. |
| - { |
| - String key = '${file.contentHash}.uris'; |
| - List<int> bytes = _byteStore.get(key); |
| - if (bytes != null) { |
| - fb.BufferContext bp = new fb.BufferContext.fromBytes(bytes); |
| - int table = bp.derefObject(0); |
| - const fb.ListReader<String> stringListReader = |
| - const fb.ListReader<String>(const fb.StringReader()); |
| - bool isLibrary = const fb.BoolReader().vTableGet(bp, table, 0); |
| - List<String> imported = stringListReader.vTableGet(bp, table, 1); |
| - List<String> exported = stringListReader.vTableGet(bp, table, 2); |
| - List<String> parted = stringListReader.vTableGet(bp, table, 3); |
| - _ReferencedUris referencedUris = new _ReferencedUris(); |
| - referencedUris.isLibrary = isLibrary; |
| - referencedUris.imported.addAll(imported); |
| - referencedUris.exported.addAll(exported); |
| - referencedUris.parted.addAll(parted); |
| - return referencedUris; |
| - } |
| - } |
| - |
| - // Compute URIs. |
| - _ReferencedUris referencedUris = new _ReferencedUris(); |
| - for (Directive directive in file.unit.directives) { |
| - if (directive is PartOfDirective) { |
| - referencedUris.isLibrary = false; |
| - } else if (directive is UriBasedDirective) { |
| - String uri = directive.uri.stringValue; |
| - if (directive is ImportDirective) { |
| - referencedUris.imported.add(uri); |
| - } else if (directive is ExportDirective) { |
| - referencedUris.exported.add(uri); |
| - } else if (directive is PartDirective) { |
| - referencedUris.parted.add(uri); |
| - } |
| - } |
| - } |
| - |
| - // Serialize into bytes. |
| - List<int> bytes; |
| - { |
| - fb.Builder fbBuilder = new fb.Builder(); |
| - var importedOffset = fbBuilder.writeList(referencedUris.imported |
| - .map((uri) => fbBuilder.writeString(uri)) |
| - .toList()); |
| - var exportedOffset = fbBuilder.writeList(referencedUris.exported |
| - .map((uri) => fbBuilder.writeString(uri)) |
| - .toList()); |
| - var partedOffset = fbBuilder.writeList(referencedUris.parted |
| - .map((uri) => fbBuilder.writeString(uri)) |
| - .toList()); |
| - fbBuilder.startTable(); |
| - fbBuilder.addBool(0, referencedUris.isLibrary); |
| - fbBuilder.addOffset(1, importedOffset); |
| - fbBuilder.addOffset(2, exportedOffset); |
| - fbBuilder.addOffset(3, partedOffset); |
| - var offset = fbBuilder.endTable(); |
| - bytes = fbBuilder.finish(offset, 'SoRU'); |
| - } |
| - |
| - // We read the content and recomputed the hash. |
| - // So, we need to update the key. |
| - String key = '${file.contentHash}.uris'; |
| - _byteStore.put(key, bytes); |
| - |
| - return referencedUris; |
| - } |
| - |
| - /** |
| * Return the unlinked bundle of [file] for the current file state. |
| * |
| * Return [_getCurrentUnlinked] or read the [file] content is read, compute |
| @@ -634,9 +562,12 @@ class AnalysisDriver { |
| * bundle. The bundle is then put into the [_byteStore] and returned. |
| */ |
| PackageBundle _getUnlinked(_File file) { |
| + // By accessing 'contentHash' we ensure that the current file state |
| + // has some version of the file content hash, so we will be able to |
| + // use it to attempt to get the current unlinked bundle. |
| + String key = '${file.contentHash}.unlinked'; |
| return _getCurrentUnlinked(file) ?? |
| _logger.run('Create unlinked for $file', () { |
| - String key = '${file.contentHash}.unlinked'; |
| UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(file.unit); |
| PackageBundleAssembler assembler = new PackageBundleAssembler(); |
| assembler.addUnlinkedUnitWithHash( |
| @@ -650,6 +581,8 @@ class AnalysisDriver { |
| /** |
| * Verify the API signatures for the changed files, and decide which linked |
| * libraries should be invalidated, and files reanalyzed. |
| + * |
| + * TODO(scheglov) I see that adding a local var changes (full) API signature. |
|
Paul Berry
2016/10/31 15:56:56
Do you have a repro for this? If you'd rather spe
scheglov
2016/10/31 16:03:16
Adding a local variable per se is not a problem.
B
|
| */ |
| void _verifyUnlinkedSignatureOfChangedFiles() { |
| if (_filesToVerifyUnlinkedSignature.isEmpty) { |
| @@ -1039,4 +972,20 @@ class _ReferencedUris { |
| final List<String> imported = <String>[]; |
| final List<String> exported = <String>[]; |
| final List<String> parted = <String>[]; |
| + |
| + factory _ReferencedUris(UnlinkedUnit unit) { |
| + _ReferencedUris referenced = new _ReferencedUris._(); |
| + referenced.parted.addAll(unit.publicNamespace.parts); |
| + for (UnlinkedImport import in unit.imports) { |
| + if (!import.isImplicit) { |
| + referenced.imported.add(import.uri); |
| + } |
| + } |
| + for (UnlinkedExportPublic export in unit.publicNamespace.exports) { |
| + referenced.exported.add(export.uri); |
| + } |
| + return referenced; |
| + } |
| + |
| + _ReferencedUris._(); |
| } |