| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 library context.directory.manager; | 5 library context.directory.manager; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 | 9 |
| 10 import 'package:analysis_server/src/analysis_server.dart'; | 10 import 'package:analysis_server/src/analysis_server.dart'; |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 }); | 288 }); |
| 289 // add previously excluded sources | 289 // add previously excluded sources |
| 290 _contexts.forEach((folder, info) { | 290 _contexts.forEach((folder, info) { |
| 291 ChangeSet changeSet = new ChangeSet(); | 291 ChangeSet changeSet = new ChangeSet(); |
| 292 _addPreviouslyExcludedSources(info, changeSet, folder, oldExcludedPaths); | 292 _addPreviouslyExcludedSources(info, changeSet, folder, oldExcludedPaths); |
| 293 applyChangesToContext(folder, changeSet); | 293 applyChangesToContext(folder, changeSet); |
| 294 }); | 294 }); |
| 295 } | 295 } |
| 296 | 296 |
| 297 /** | 297 /** |
| 298 * Return `true` if the given [file] should be analyzed. |
| 299 */ |
| 300 bool shouldFileBeAnalyzed(File file); |
| 301 |
| 302 /** |
| 298 * Called when the package map for a context has changed. | 303 * Called when the package map for a context has changed. |
| 299 */ | 304 */ |
| 300 void updateContextPackageUriResolver( | 305 void updateContextPackageUriResolver( |
| 301 Folder contextFolder, UriResolver packageUriResolver); | 306 Folder contextFolder, UriResolver packageUriResolver); |
| 302 | 307 |
| 303 /** | 308 /** |
| 304 * Resursively adds all Dart and HTML files to the [changeSet]. | 309 * Resursively adds all Dart and HTML files to the [changeSet]. |
| 305 */ | 310 */ |
| 306 void _addPreviouslyExcludedSources(_ContextInfo info, ChangeSet changeSet, | 311 void _addPreviouslyExcludedSources(_ContextInfo info, ChangeSet changeSet, |
| 307 Folder folder, List<String> oldExcludedPaths) { | 312 Folder folder, List<String> oldExcludedPaths) { |
| 308 if (info.excludesResource(folder)) { | 313 if (info.excludesResource(folder)) { |
| 309 return; | 314 return; |
| 310 } | 315 } |
| 311 List<Resource> children; | 316 List<Resource> children; |
| 312 try { | 317 try { |
| 313 children = folder.getChildren(); | 318 children = folder.getChildren(); |
| 314 } on FileSystemException { | 319 } on FileSystemException { |
| 315 // The folder no longer exists, or cannot be read, to there's nothing to | 320 // The folder no longer exists, or cannot be read, to there's nothing to |
| 316 // do. | 321 // do. |
| 317 return; | 322 return; |
| 318 } | 323 } |
| 319 for (Resource child in children) { | 324 for (Resource child in children) { |
| 320 String path = child.path; | 325 String path = child.path; |
| 321 // add files, recurse into folders | 326 // add files, recurse into folders |
| 322 if (child is File) { | 327 if (child is File) { |
| 323 // ignore if should not be analyzed at all | 328 // ignore if should not be analyzed at all |
| 324 if (!_shouldFileBeAnalyzed(child)) { | 329 if (!shouldFileBeAnalyzed(child)) { |
| 325 continue; | 330 continue; |
| 326 } | 331 } |
| 327 // ignore if was not excluded | 332 // ignore if was not excluded |
| 328 bool wasExcluded = _isExcludedBy(oldExcludedPaths, path) && | 333 bool wasExcluded = _isExcludedBy(oldExcludedPaths, path) && |
| 329 !_isExcludedBy(excludedPaths, path); | 334 !_isExcludedBy(excludedPaths, path); |
| 330 if (!wasExcluded) { | 335 if (!wasExcluded) { |
| 331 continue; | 336 continue; |
| 332 } | 337 } |
| 333 // do add the file | 338 // do add the file |
| 334 Source source = createSourceInContext(info.context, child); | 339 Source source = createSourceInContext(info.context, child); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 359 return; | 364 return; |
| 360 } | 365 } |
| 361 for (Resource child in children) { | 366 for (Resource child in children) { |
| 362 String path = child.path; | 367 String path = child.path; |
| 363 // ignore excluded files or folders | 368 // ignore excluded files or folders |
| 364 if (_isExcluded(path) || info.excludes(path)) { | 369 if (_isExcluded(path) || info.excludes(path)) { |
| 365 continue; | 370 continue; |
| 366 } | 371 } |
| 367 // add files, recurse into folders | 372 // add files, recurse into folders |
| 368 if (child is File) { | 373 if (child is File) { |
| 369 if (_shouldFileBeAnalyzed(child)) { | 374 if (shouldFileBeAnalyzed(child)) { |
| 370 Source source = createSourceInContext(info.context, child); | 375 Source source = createSourceInContext(info.context, child); |
| 371 changeSet.addedSource(source); | 376 changeSet.addedSource(source); |
| 372 info.sources[path] = source; | 377 info.sources[path] = source; |
| 373 } | 378 } |
| 374 } else if (child is Folder) { | 379 } else if (child is Folder) { |
| 375 String shortName = child.shortName; | 380 String shortName = child.shortName; |
| 376 if (shortName == PACKAGES_NAME) { | 381 if (shortName == PACKAGES_NAME) { |
| 377 continue; | 382 continue; |
| 378 } | 383 } |
| 379 _addSourceFiles(changeSet, child, info); | 384 _addSourceFiles(changeSet, child, info); |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 // pubspec was added in a sub-folder, extract a new context | 578 // pubspec was added in a sub-folder, extract a new context |
| 574 if (_isPubspec(path) && info.isRoot && !info.isPubspec(path)) { | 579 if (_isPubspec(path) && info.isRoot && !info.isPubspec(path)) { |
| 575 _extractContext(info, resource); | 580 _extractContext(info, resource); |
| 576 return; | 581 return; |
| 577 } | 582 } |
| 578 // If the file went away and was replaced by a folder before we | 583 // If the file went away and was replaced by a folder before we |
| 579 // had a chance to process the event, resource might be a Folder. In | 584 // had a chance to process the event, resource might be a Folder. In |
| 580 // that case don't add it. | 585 // that case don't add it. |
| 581 if (resource is File) { | 586 if (resource is File) { |
| 582 File file = resource; | 587 File file = resource; |
| 583 if (_shouldFileBeAnalyzed(file)) { | 588 if (shouldFileBeAnalyzed(file)) { |
| 584 ChangeSet changeSet = new ChangeSet(); | 589 ChangeSet changeSet = new ChangeSet(); |
| 585 Source source = createSourceInContext(info.context, file); | 590 Source source = createSourceInContext(info.context, file); |
| 586 changeSet.addedSource(source); | 591 changeSet.addedSource(source); |
| 587 applyChangesToContext(folder, changeSet); | 592 applyChangesToContext(folder, changeSet); |
| 588 info.sources[path] = source; | 593 info.sources[path] = source; |
| 589 } | 594 } |
| 590 } | 595 } |
| 591 break; | 596 break; |
| 592 case ChangeType.REMOVE: | 597 case ChangeType.REMOVE: |
| 593 // pubspec was removed, merge the context into its parent | 598 // pubspec was removed, merge the context into its parent |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 static Source createSourceInContext(AnalysisContext context, File file) { | 704 static Source createSourceInContext(AnalysisContext context, File file) { |
| 700 // TODO(brianwilkerson) Optimize this, by allowing support for source | 705 // TODO(brianwilkerson) Optimize this, by allowing support for source |
| 701 // factories to restore URI's from a file path rather than a source. | 706 // factories to restore URI's from a file path rather than a source. |
| 702 Source source = file.createSource(); | 707 Source source = file.createSource(); |
| 703 if (context == null) { | 708 if (context == null) { |
| 704 return source; | 709 return source; |
| 705 } | 710 } |
| 706 Uri uri = context.sourceFactory.restoreUri(source); | 711 Uri uri = context.sourceFactory.restoreUri(source); |
| 707 return file.createSource(uri); | 712 return file.createSource(uri); |
| 708 } | 713 } |
| 709 | |
| 710 static bool _shouldFileBeAnalyzed(File file) { | |
| 711 if (!(AnalysisEngine.isDartFileName(file.path) || | |
| 712 AnalysisEngine.isHtmlFileName(file.path))) { | |
| 713 return false; | |
| 714 } | |
| 715 // Emacs creates dummy links to track the fact that a file is open for | |
| 716 // editing and has unsaved changes (e.g. having unsaved changes to | |
| 717 // 'foo.dart' causes a link '.#foo.dart' to be created, which points to the | |
| 718 // non-existent file 'username@hostname.pid'. To avoid these dummy links | |
| 719 // causing the analyzer to thrash, just ignore links to non-existent files. | |
| 720 return file.exists; | |
| 721 } | |
| 722 } | 714 } |
| 723 | 715 |
| 724 /** | 716 /** |
| 725 * Information tracked by the [ContextManager] for each context. | 717 * Information tracked by the [ContextManager] for each context. |
| 726 */ | 718 */ |
| 727 class _ContextInfo { | 719 class _ContextInfo { |
| 728 /** | 720 /** |
| 729 * The [Folder] for which this information object is created. | 721 * The [Folder] for which this information object is created. |
| 730 */ | 722 */ |
| 731 final Folder folder; | 723 final Folder folder; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 802 return excludes(resource.path); | 794 return excludes(resource.path); |
| 803 } | 795 } |
| 804 | 796 |
| 805 /** | 797 /** |
| 806 * Returns `true` if [path] is the pubspec file of this context. | 798 * Returns `true` if [path] is the pubspec file of this context. |
| 807 */ | 799 */ |
| 808 bool isPubspec(String path) { | 800 bool isPubspec(String path) { |
| 809 return path == pubspecPath; | 801 return path == pubspecPath; |
| 810 } | 802 } |
| 811 } | 803 } |
| OLD | NEW |