| 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 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 try { | 328 try { |
| 329 children = folder.getChildren(); | 329 children = folder.getChildren(); |
| 330 } on FileSystemException { | 330 } on FileSystemException { |
| 331 // The directory either doesn't exist or cannot be read. Either way, there | 331 // The directory either doesn't exist or cannot be read. Either way, there |
| 332 // are no children that need to be added. | 332 // are no children that need to be added. |
| 333 return; | 333 return; |
| 334 } | 334 } |
| 335 for (Resource child in children) { | 335 for (Resource child in children) { |
| 336 String path = child.path; | 336 String path = child.path; |
| 337 // ignore excluded files or folders | 337 // ignore excluded files or folders |
| 338 if (_isExcluded(path)) { | 338 if (_isExcluded(path) || info.excludes(path)) { |
| 339 continue; | 339 continue; |
| 340 } | 340 } |
| 341 // add files, recurse into folders | 341 // add files, recurse into folders |
| 342 if (child is File) { | 342 if (child is File) { |
| 343 if (_shouldFileBeAnalyzed(child)) { | 343 if (_shouldFileBeAnalyzed(child)) { |
| 344 Source source = createSourceInContext(info.context, child); | 344 Source source = createSourceInContext(info.context, child); |
| 345 changeSet.addedSource(source); | 345 changeSet.addedSource(source); |
| 346 info.sources[path] = source; | 346 info.sources[path] = source; |
| 347 } | 347 } |
| 348 } else if (child is Folder) { | 348 } else if (child is Folder) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 info.changeSubscription = folder.changes.listen((WatchEvent event) { | 393 info.changeSubscription = folder.changes.listen((WatchEvent event) { |
| 394 _handleWatchEvent(folder, info, event); | 394 _handleWatchEvent(folder, info, event); |
| 395 }); | 395 }); |
| 396 UriResolver packageUriResolver = _computePackageUriResolver(folder, info); | 396 UriResolver packageUriResolver = _computePackageUriResolver(folder, info); |
| 397 info.context = addContext(folder, packageUriResolver); | 397 info.context = addContext(folder, packageUriResolver); |
| 398 info.context.name = folder.path; | 398 info.context.name = folder.path; |
| 399 return info; | 399 return info; |
| 400 } | 400 } |
| 401 | 401 |
| 402 /** | 402 /** |
| 403 * Creates a new context associated with [folder]. | 403 * Potentially create a new context associated with the given [folder]. |
| 404 * | 404 * |
| 405 * If there are subfolders with 'pubspec.yaml' files, separate contexts | 405 * If there are subfolders with 'pubspec.yaml' files, separate contexts are |
| 406 * are created for them, and excluded from the context associated with | 406 * created for them and excluded from the context associated with the |
| 407 * [folder]. | 407 * [folder]. |
| 408 * | 408 * |
| 409 * If [folder] itself contains a 'pubspec.yaml' file, subfolders are ignored. | |
| 410 * | |
| 411 * If [withPubspecOnly] is `true`, a context will be created only if there | 409 * If [withPubspecOnly] is `true`, a context will be created only if there |
| 412 * is a 'pubspec.yaml' file in [folder]. | 410 * is a 'pubspec.yaml' file in the [folder]. |
| 413 * | 411 * |
| 414 * Returns create pubspec-based contexts. | 412 * Returns create pubspec-based contexts. |
| 415 */ | 413 */ |
| 416 List<_ContextInfo> _createContexts(Folder folder, bool withPubspecOnly) { | 414 List<_ContextInfo> _createContexts(Folder folder, bool withPubspecOnly) { |
| 417 // check whether there is a pubspec in the folder | |
| 418 File pubspecFile = folder.getChild(PUBSPEC_NAME); | |
| 419 if (pubspecFile.exists) { | |
| 420 _ContextInfo info = | |
| 421 _createContextWithSources(folder, pubspecFile, <_ContextInfo>[]); | |
| 422 return [info]; | |
| 423 } | |
| 424 // try to find subfolders with pubspec files | 415 // try to find subfolders with pubspec files |
| 425 List<_ContextInfo> children = <_ContextInfo>[]; | 416 List<_ContextInfo> children = <_ContextInfo>[]; |
| 426 try { | 417 try { |
| 427 for (Resource child in folder.getChildren()) { | 418 for (Resource child in folder.getChildren()) { |
| 428 if (child is Folder) { | 419 if (child is Folder) { |
| 429 List<_ContextInfo> childContexts = _createContexts(child, true); | 420 children.addAll(_createContexts(child, true)); |
| 430 children.addAll(childContexts); | |
| 431 } | 421 } |
| 432 } | 422 } |
| 433 } on FileSystemException { | 423 } on FileSystemException { |
| 434 // The directory either doesn't exist or cannot be read. Either way, there | 424 // The directory either doesn't exist or cannot be read. Either way, there |
| 435 // are no subfolders that need to be added. | 425 // are no subfolders that need to be added. |
| 436 } | 426 } |
| 427 // check whether there is a pubspec in the folder |
| 428 File pubspecFile = folder.getChild(PUBSPEC_NAME); |
| 429 if (pubspecFile.exists) { |
| 430 return <_ContextInfo>[ |
| 431 _createContextWithSources(folder, pubspecFile, children) |
| 432 ]; |
| 433 } |
| 437 // no pubspec, done | 434 // no pubspec, done |
| 438 if (withPubspecOnly) { | 435 if (withPubspecOnly) { |
| 439 return children; | 436 return children; |
| 440 } | 437 } |
| 441 // OK, create a context without a pubspec | 438 // OK, create a context without a pubspec |
| 442 _createContextWithSources(folder, pubspecFile, children); | 439 return <_ContextInfo>[ |
| 443 return children; | 440 _createContextWithSources(folder, pubspecFile, children) |
| 441 ]; |
| 444 } | 442 } |
| 445 | 443 |
| 446 /** | 444 /** |
| 447 * Create a new context associated with the given [folder]. The [pubspecFile] | 445 * Create a new context associated with the given [folder]. The [pubspecFile] |
| 448 * is the `pubspec.yaml` file contained in the folder. Add any sources that | 446 * is the `pubspec.yaml` file contained in the folder. Add any sources that |
| 449 * are not included in one of the [children] to the context. | 447 * are not included in one of the [children] to the context. |
| 450 */ | 448 */ |
| 451 _ContextInfo _createContextWithSources( | 449 _ContextInfo _createContextWithSources( |
| 452 Folder folder, File pubspecFile, List<_ContextInfo> children) { | 450 Folder folder, File pubspecFile, List<_ContextInfo> children) { |
| 453 _ContextInfo info = _createContext(folder, pubspecFile, children); | 451 _ContextInfo info = _createContext(folder, pubspecFile, children); |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 return excludes(resource.path); | 751 return excludes(resource.path); |
| 754 } | 752 } |
| 755 | 753 |
| 756 /** | 754 /** |
| 757 * Returns `true` if [path] is the pubspec file of this context. | 755 * Returns `true` if [path] is the pubspec file of this context. |
| 758 */ | 756 */ |
| 759 bool isPubspec(String path) { | 757 bool isPubspec(String path) { |
| 760 return path == pubspecPath; | 758 return path == pubspecPath; |
| 761 } | 759 } |
| 762 } | 760 } |
| OLD | NEW |