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 0226b7c561a0676dadc9e034f8901ee0318299c7..2b2b28e2645d37d8916f4911660b594ca8ac8cc7 100644 |
--- a/pkg/analysis_server/lib/src/context_manager.dart |
+++ b/pkg/analysis_server/lib/src/context_manager.dart |
@@ -31,6 +31,7 @@ import 'package:analyzer/src/generated/source.dart'; |
import 'package:analyzer/src/generated/source_io.dart'; |
import 'package:analyzer/src/task/options.dart'; |
import 'package:analyzer/src/util/absolute_path.dart'; |
+import 'package:analyzer/src/util/glob.dart'; |
import 'package:analyzer/src/util/yaml.dart'; |
import 'package:package_config/packages.dart'; |
import 'package:package_config/packages_file.dart' as pkgfile show parse; |
@@ -336,11 +337,6 @@ abstract class ContextManagerCallbacks { |
void removeContext(Folder folder, List<String> flushedFiles); |
/** |
- * Return `true` if the given [file] should be analyzed. |
- */ |
- bool shouldFileBeAnalyzed(File file); |
- |
- /** |
* Called when the disposition for a context has changed. |
*/ |
void updateContextPackageUriResolver( |
@@ -442,15 +438,20 @@ class ContextManagerImpl implements ContextManager { |
new AnalysisOptionsProvider(); |
/** |
- * The instrumentation service used to report instrumentation data. |
+ * A list of the globs used to determine which files should be analyzed. |
*/ |
- final InstrumentationService _instrumentationService; |
+ final List<Glob> analyzedFilesGlobs; |
/** |
* The default options used to create new analysis contexts. |
*/ |
final AnalysisOptionsImpl defaultContextOptions; |
+ /** |
+ * The instrumentation service used to report instrumentation data. |
+ */ |
+ final InstrumentationService _instrumentationService; |
+ |
@override |
ContextManagerCallbacks callbacks; |
@@ -478,6 +479,7 @@ class ContextManagerImpl implements ContextManager { |
this.packageResolverProvider, |
this.embeddedUriResolverProvider, |
this._packageMapProvider, |
+ this.analyzedFilesGlobs, |
this._instrumentationService, |
this.defaultContextOptions) { |
absolutePathContext = resourceProvider.absolutePathContext; |
@@ -787,7 +789,7 @@ class ContextManagerImpl implements ContextManager { |
// add files, recurse into folders |
if (child is File) { |
// ignore if should not be analyzed at all |
- if (!callbacks.shouldFileBeAnalyzed(child)) { |
+ if (!_shouldFileBeAnalyzed(child)) { |
continue; |
} |
// ignore if was not excluded |
@@ -834,7 +836,7 @@ class ContextManagerImpl implements ContextManager { |
} |
// add files, recurse into folders |
if (child is File) { |
- if (callbacks.shouldFileBeAnalyzed(child)) { |
+ if (_shouldFileBeAnalyzed(child)) { |
Source source = createSourceInContext(info.context, child); |
changeSet.addedSource(source); |
info.sources[path] = source; |
@@ -1308,7 +1310,7 @@ class ContextManagerImpl implements ContextManager { |
// that case don't add it. |
if (resource is File) { |
File file = resource; |
- if (callbacks.shouldFileBeAnalyzed(file)) { |
+ if (_shouldFileBeAnalyzed(file)) { |
ChangeSet changeSet = new ChangeSet(); |
Source source = createSourceInContext(info.context, file); |
changeSet.addedSource(source); |
@@ -1492,6 +1494,24 @@ class ContextManagerImpl implements ContextManager { |
} |
/** |
+ * Return `true` if the given [file] should be analyzed. |
+ */ |
+ bool _shouldFileBeAnalyzed(File file) { |
+ for (Glob glob in analyzedFilesGlobs) { |
+ if (glob.matches(file.path)) { |
+ // Emacs creates dummy links to track the fact that a file is open for |
+ // editing and has unsaved changes (e.g. having unsaved changes to |
+ // 'foo.dart' causes a link '.#foo.dart' to be created, which points to |
+ // the non-existent file 'username@hostname.pid'. To avoid these dummy |
+ // links causing the analyzer to thrash, just ignore links to |
+ // non-existent files. |
+ return file.exists; |
+ } |
+ } |
+ return false; |
+ } |
+ |
+ /** |
* Create and return a source representing the given [file] within the given |
* [context]. |
*/ |