| Index: pkg/analysis_server/lib/src/context_manager.dart
|
| diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
|
| index 999c975540c01be769f5b80d7a9a4414f2e6c8c0..e0ad10d1805d6da2de34304a7e903f05edcfc1a4 100644
|
| --- a/pkg/analysis_server/lib/src/context_manager.dart
|
| +++ b/pkg/analysis_server/lib/src/context_manager.dart
|
| @@ -272,7 +272,7 @@ abstract class ContextManager {
|
| continue;
|
| }
|
| // do add the file
|
| - Source source = child.createSource();
|
| + Source source = createSourceInContext(info.context, child);
|
| changeSet.addedSource(source);
|
| info.sources[path] = source;
|
| } else if (child is Folder) {
|
| @@ -287,8 +287,7 @@ abstract class ContextManager {
|
| /**
|
| * Resursively adds all Dart and HTML files to the [changeSet].
|
| */
|
| - void _addSourceFiles(ChangeSet changeSet, Folder folder, _ContextInfo info,
|
| - bool pubspecExists, bool createPackageUri) {
|
| + void _addSourceFiles(ChangeSet changeSet, Folder folder, _ContextInfo info) {
|
| if (info.excludesResource(folder) || folder.shortName.startsWith('.')) {
|
| return;
|
| }
|
| @@ -302,27 +301,7 @@ abstract class ContextManager {
|
| // add files, recurse into folders
|
| if (child is File) {
|
| if (_shouldFileBeAnalyzed(child)) {
|
| - Source source = child.createSource();
|
| - if (createPackageUri) {
|
| - //
|
| - // It should be possible to generate the uri by executing:
|
| - //
|
| - // Uri uri = info.context.sourceFactory.restoreUri(source);
|
| - //
|
| - // but for some reason this doesn't produce the same result as the
|
| - // code below. This needs to be investigated.
|
| - // (See https://code.google.com/p/dart/issues/detail?id=22463).
|
| - //
|
| - String packagePath = info.folder.path;
|
| - String packageName =
|
| - resourceProvider.pathContext.basename(packagePath);
|
| - String libPath =
|
| - resourceProvider.pathContext.join(packagePath, LIB_DIR_NAME);
|
| - String relPath = source.fullName.substring(libPath.length);
|
| - Uri uri =
|
| - Uri.parse('${PackageMapUriResolver.PACKAGE_SCHEME}:$packageName$relPath');
|
| - source = child.createSource(uri);
|
| - }
|
| + Source source = createSourceInContext(info.context, child);
|
| changeSet.addedSource(source);
|
| info.sources[path] = source;
|
| }
|
| @@ -331,19 +310,7 @@ abstract class ContextManager {
|
| if (shortName == PACKAGES_NAME) {
|
| continue;
|
| }
|
| - if (pubspecExists &&
|
| - !createPackageUri &&
|
| - shortName == LIB_DIR_NAME &&
|
| - child.parent == info.folder) {
|
| - _addSourceFiles(changeSet, child, info, pubspecExists, true);
|
| - } else {
|
| - _addSourceFiles(
|
| - changeSet,
|
| - child,
|
| - info,
|
| - pubspecExists,
|
| - createPackageUri);
|
| - }
|
| + _addSourceFiles(changeSet, child, info);
|
| }
|
| }
|
| }
|
| @@ -394,6 +361,20 @@ abstract class ContextManager {
|
| }
|
|
|
| /**
|
| + * Create a new context associated with the given [folder]. The [pubspecFile]
|
| + * is the `pubspec.yaml` file contained in the folder. Add any sources that
|
| + * are not included in one of the [children] to the context.
|
| + */
|
| + _ContextInfo _createContextWithSources(Folder folder, File pubspecFile,
|
| + List<_ContextInfo> children) {
|
| + _ContextInfo info = _createContext(folder, pubspecFile, children);
|
| + ChangeSet changeSet = new ChangeSet();
|
| + _addSourceFiles(changeSet, folder, info);
|
| + applyChangesToContext(folder, changeSet);
|
| + return info;
|
| + }
|
| +
|
| + /**
|
| * Creates a new context associated with [folder].
|
| *
|
| * If there are subfolders with 'pubspec.yaml' files, separate contexts
|
| @@ -410,13 +391,9 @@ abstract class ContextManager {
|
| List<_ContextInfo> _createContexts(Folder folder, bool withPubspecOnly) {
|
| // check whether there is a pubspec in the folder
|
| File pubspecFile = folder.getChild(PUBSPEC_NAME);
|
| - bool pubspecExists = pubspecFile.exists;
|
| - if (pubspecExists) {
|
| - _ContextInfo info = _createContextWithSources(
|
| - folder,
|
| - pubspecFile,
|
| - pubspecExists,
|
| - <_ContextInfo>[]);
|
| + if (pubspecFile.exists) {
|
| + _ContextInfo info =
|
| + _createContextWithSources(folder, pubspecFile, <_ContextInfo>[]);
|
| return [info];
|
| }
|
| // try to find subfolders with pubspec files
|
| @@ -432,26 +409,11 @@ abstract class ContextManager {
|
| return children;
|
| }
|
| // OK, create a context without a pubspec
|
| - _createContextWithSources(folder, pubspecFile, pubspecExists, children);
|
| + _createContextWithSources(folder, pubspecFile, children);
|
| return children;
|
| }
|
|
|
| /**
|
| - * Create a new context associated with the given [folder]. The [pubspecFile]
|
| - * is the `pubspec.yaml` file contained in the folder, and [pubspecExists] is
|
| - * `true` if the file exists. Add any sources that are not included in one of
|
| - * the [children] to the context.
|
| - */
|
| - _ContextInfo _createContextWithSources(Folder folder, File pubspecFile,
|
| - bool pubspecExists, List<_ContextInfo> children) {
|
| - _ContextInfo info = _createContext(folder, pubspecFile, children);
|
| - ChangeSet changeSet = new ChangeSet();
|
| - _addSourceFiles(changeSet, folder, info, pubspecExists, false);
|
| - applyChangesToContext(folder, changeSet);
|
| - return info;
|
| - }
|
| -
|
| - /**
|
| * Clean up and destroy the context associated with the given folder.
|
| */
|
| void _destroyContext(Folder folder) {
|
| @@ -523,7 +485,7 @@ abstract class ContextManager {
|
| File file = resource;
|
| if (_shouldFileBeAnalyzed(file)) {
|
| ChangeSet changeSet = new ChangeSet();
|
| - Source source = file.createSource();
|
| + Source source = createSourceInContext(info.context, file);
|
| changeSet.addedSource(source);
|
| applyChangesToContext(folder, changeSet);
|
| info.sources[path] = source;
|
| @@ -628,6 +590,21 @@ abstract class ContextManager {
|
| updateContextPackageUriResolver(info.folder, packageUriResolver);
|
| }
|
|
|
| + /**
|
| + * Create and return a source representing the given [file] within the given
|
| + * [context].
|
| + */
|
| + static Source createSourceInContext(AnalysisContext context, File file) {
|
| + // TODO(brianwilkerson) Optimize this, by allowing support for source
|
| + // factories to restore URI's from a file path rather than a source.
|
| + Source source = file.createSource();
|
| + if (context == null) {
|
| + return source;
|
| + }
|
| + Uri uri = context.sourceFactory.restoreUri(source);
|
| + return file.createSource(uri);
|
| + }
|
| +
|
| static bool _shouldFileBeAnalyzed(File file) {
|
| if (!(AnalysisEngine.isDartFileName(file.path) ||
|
| AnalysisEngine.isHtmlFileName(file.path))) {
|
|
|