Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 import 'dart:convert'; | 5 import 'dart:convert'; |
| 6 import 'dart:typed_data'; | 6 import 'dart:typed_data'; |
| 7 | 7 |
| 8 import 'package:analyzer/dart/ast/ast.dart'; | 8 import 'package:analyzer/dart/ast/ast.dart'; |
| 9 import 'package:analyzer/dart/ast/token.dart'; | 9 import 'package:analyzer/dart/ast/token.dart'; |
| 10 import 'package:analyzer/error/listener.dart'; | 10 import 'package:analyzer/error/listener.dart'; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 95 List<FileState> _importedFiles; | 95 List<FileState> _importedFiles; |
| 96 List<FileState> _exportedFiles; | 96 List<FileState> _exportedFiles; |
| 97 List<FileState> _partedFiles; | 97 List<FileState> _partedFiles; |
| 98 List<NameFilter> _exportFilters; | 98 List<NameFilter> _exportFilters; |
| 99 | 99 |
| 100 Set<FileState> _directReferencedFiles = new Set<FileState>(); | 100 Set<FileState> _directReferencedFiles = new Set<FileState>(); |
| 101 Set<FileState> _transitiveFiles; | 101 Set<FileState> _transitiveFiles; |
| 102 String _transitiveSignature; | 102 String _transitiveSignature; |
| 103 | 103 |
| 104 List<TopLevelDeclaration> _topLevelDeclarations; | 104 List<TopLevelDeclaration> _topLevelDeclarations; |
| 105 List<TopLevelDeclaration> _exportTopLevelDeclarations; | |
| 105 | 106 |
| 106 FileState._(this._fsState, this.path, this.uri, this.source); | 107 FileState._(this._fsState, this.path, this.uri, this.source); |
| 107 | 108 |
| 108 /** | 109 /** |
| 109 * The unlinked API signature of the file. | 110 * The unlinked API signature of the file. |
| 110 */ | 111 */ |
| 111 List<int> get apiSignature => _apiSignature; | 112 List<int> get apiSignature => _apiSignature; |
| 112 | 113 |
| 113 /** | 114 /** |
| 114 * The content of the file. | 115 * The content of the file. |
| 115 */ | 116 */ |
| 116 String get content => _content; | 117 String get content => _content; |
| 117 | 118 |
| 118 /** | 119 /** |
| 119 * The MD5 hash of the [content]. | 120 * The MD5 hash of the [content]. |
| 120 */ | 121 */ |
| 121 String get contentHash => _contentHash; | 122 String get contentHash => _contentHash; |
| 122 | 123 |
| 123 /** | 124 /** |
| 124 * Return the set of all directly referenced files - imported, exported or | 125 * Return the set of all directly referenced files - imported, exported or |
| 125 * parted. | 126 * parted. |
| 126 */ | 127 */ |
| 127 Set<FileState> get directReferencedFiles => _directReferencedFiles; | 128 Set<FileState> get directReferencedFiles => _directReferencedFiles; |
| 128 | 129 |
| 129 /** | 130 /** |
| 130 * The list of files this file exports. | 131 * The list of files this file exports. |
| 131 */ | 132 */ |
| 132 List<FileState> get exportedFiles => _exportedFiles; | 133 List<FileState> get exportedFiles => _exportedFiles; |
| 133 | 134 |
| 135 /** | |
| 136 * Return [TopLevelDeclaration]s exported from the this library file. | |
| 137 */ | |
| 138 List<TopLevelDeclaration> get exportTopLevelDeclarations { | |
|
Paul Berry
2016/12/01 21:16:10
This sounds like the name of a method with takes s
scheglov
2016/12/01 21:39:56
Done.
| |
| 139 if (_exportTopLevelDeclarations == null) { | |
| 140 _exportTopLevelDeclarations = <TopLevelDeclaration>[]; | |
| 141 | |
| 142 Set<FileState> seenLibraries = new Set<FileState>(); | |
| 143 | |
| 144 /** | |
| 145 * Compute [TopLevelDeclaration]s exported from the [library]. | |
| 146 */ | |
| 147 List<TopLevelDeclaration> computeExported(FileState library) { | |
|
Paul Berry
2016/12/01 21:16:10
I think there's a bug. Consider the following:
a
scheglov
2016/12/01 21:39:56
You're right.
Fixed.
| |
| 148 var declarations = <String, TopLevelDeclaration>{}; | |
| 149 if (seenLibraries.add(library)) { | |
| 150 // Append the library declarations. | |
| 151 for (TopLevelDeclaration t in library.topLevelDeclarations) { | |
| 152 declarations[t.name] = t; | |
|
Brian Wilkerson
2016/12/01 21:07:47
I think we need to test for private names both her
scheglov
2016/12/01 21:39:56
Done.
| |
| 153 } | |
| 154 for (FileState part in library.partedFiles) { | |
| 155 for (TopLevelDeclaration t in part.topLevelDeclarations) { | |
| 156 declarations[t.name] = t; | |
| 157 } | |
| 158 } | |
| 159 | |
| 160 // Append the exported declarations. | |
| 161 for (int i = 0; i < library._exportedFiles.length; i++) { | |
| 162 List<TopLevelDeclaration> exported = | |
| 163 computeExported(library._exportedFiles[i]); | |
| 164 for (TopLevelDeclaration t in exported) { | |
| 165 if (!declarations.containsKey(t.name) && | |
| 166 library._exportFilters[i].accepts(t.name)) { | |
| 167 declarations[t.name] = t; | |
| 168 } | |
| 169 } | |
| 170 } | |
| 171 } | |
| 172 | |
| 173 return declarations.values.toList(); | |
| 174 } | |
| 175 | |
| 176 _exportTopLevelDeclarations = computeExported(this); | |
| 177 } | |
| 178 return _exportTopLevelDeclarations; | |
| 179 } | |
| 180 | |
| 134 @override | 181 @override |
| 135 int get hashCode => uri.hashCode; | 182 int get hashCode => uri.hashCode; |
| 136 | 183 |
| 137 /** | 184 /** |
| 138 * The list of files this file imports. | 185 * The list of files this file imports. |
| 139 */ | 186 */ |
| 140 List<FileState> get importedFiles => _importedFiles; | 187 List<FileState> get importedFiles => _importedFiles; |
| 141 | 188 |
| 142 /** | 189 /** |
| 143 * Return `true` if the file has a `part of` directive, so is probably a part. | 190 * Return `true` if the file has a `part of` directive, so is probably a part. |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 345 _fsState._byteStore.put(unlinkedKey, bytes); | 392 _fsState._byteStore.put(unlinkedKey, bytes); |
| 346 }); | 393 }); |
| 347 } | 394 } |
| 348 } | 395 } |
| 349 | 396 |
| 350 // Read the unlinked bundle. | 397 // Read the unlinked bundle. |
| 351 var driverUnlinkedUnit = new AnalysisDriverUnlinkedUnit.fromBuffer(bytes); | 398 var driverUnlinkedUnit = new AnalysisDriverUnlinkedUnit.fromBuffer(bytes); |
| 352 _referencedNames = new Set<String>.from(driverUnlinkedUnit.referencedNames); | 399 _referencedNames = new Set<String>.from(driverUnlinkedUnit.referencedNames); |
| 353 _unlinked = driverUnlinkedUnit.unit; | 400 _unlinked = driverUnlinkedUnit.unit; |
| 354 _lineInfo = new LineInfo(_unlinked.lineStarts); | 401 _lineInfo = new LineInfo(_unlinked.lineStarts); |
| 402 _topLevelDeclarations = null; | |
| 403 | |
| 404 // Prepare API signature. | |
| 355 List<int> newApiSignature = _unlinked.apiSignature; | 405 List<int> newApiSignature = _unlinked.apiSignature; |
| 356 bool apiSignatureChanged = _apiSignature != null && | 406 bool apiSignatureChanged = _apiSignature != null && |
| 357 !_equalByteLists(_apiSignature, newApiSignature); | 407 !_equalByteLists(_apiSignature, newApiSignature); |
| 358 _apiSignature = newApiSignature; | 408 _apiSignature = newApiSignature; |
| 359 | 409 |
| 360 // If the API signature changed, flush transitive signatures. | 410 // The API signature changed. |
| 411 // Flush transitive signatures of affected files. | |
| 412 // Flush exported top-level declarations of all files. | |
| 361 if (apiSignatureChanged) { | 413 if (apiSignatureChanged) { |
| 362 for (FileState file in _fsState._uriToFile.values) { | 414 for (FileState file in _fsState._uriToFile.values) { |
| 363 if (file._transitiveFiles != null && | 415 if (file._transitiveFiles != null && |
| 364 file._transitiveFiles.contains(this)) { | 416 file._transitiveFiles.contains(this)) { |
| 365 file._transitiveSignature = null; | 417 file._transitiveSignature = null; |
| 366 } | 418 } |
| 419 file._exportTopLevelDeclarations = null; | |
| 367 } | 420 } |
| 368 } | 421 } |
| 369 | 422 |
| 370 // This file is potentially not a library for its previous parts anymore. | 423 // This file is potentially not a library for its previous parts anymore. |
| 371 if (_partedFiles != null) { | 424 if (_partedFiles != null) { |
| 372 for (FileState part in _partedFiles) { | 425 for (FileState part in _partedFiles) { |
| 373 _fsState._partToLibraries[part]?.remove(this); | 426 _fsState._partToLibraries[part]?.remove(this); |
| 374 } | 427 } |
| 375 } | 428 } |
| 376 | 429 |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 612 .where((f) => f._transitiveFiles == null) | 665 .where((f) => f._transitiveFiles == null) |
| 613 .toSet(); | 666 .toSet(); |
| 614 } | 667 } |
| 615 | 668 |
| 616 Set<FileState> get filesWithoutTransitiveSignature { | 669 Set<FileState> get filesWithoutTransitiveSignature { |
| 617 return state._uriToFile.values | 670 return state._uriToFile.values |
| 618 .where((f) => f._transitiveSignature == null) | 671 .where((f) => f._transitiveSignature == null) |
| 619 .toSet(); | 672 .toSet(); |
| 620 } | 673 } |
| 621 } | 674 } |
| OLD | NEW |