Fix some analyzer warnings and hints in pkg/watcher.

R=rnystrom@google.com
BUG=

Review URL: https://codereview.chromium.org//69013003

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart/pkg/watcher@30172 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/pkgs/watcher/lib/src/constructable_file_system_event.dart b/pkgs/watcher/lib/src/constructable_file_system_event.dart
index e65e258..010d297 100644
--- a/pkgs/watcher/lib/src/constructable_file_system_event.dart
+++ b/pkgs/watcher/lib/src/constructable_file_system_event.dart
@@ -9,7 +9,7 @@
 abstract class _ConstructableFileSystemEvent implements FileSystemEvent {
   final bool isDirectory;
   final String path;
-  final int type;
+  int get type;
 
   _ConstructableFileSystemEvent(this.path, this.isDirectory);
 }
diff --git a/pkgs/watcher/lib/src/directory_watcher/linux.dart b/pkgs/watcher/lib/src/directory_watcher/linux.dart
index f0622f6..5196078 100644
--- a/pkgs/watcher/lib/src/directory_watcher/linux.dart
+++ b/pkgs/watcher/lib/src/directory_watcher/linux.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 import 'dart:io';
 
-import '../directory_watcher.dart';
 import '../utils.dart';
 import '../watch_event.dart';
 import 'resubscribable.dart';
diff --git a/pkgs/watcher/lib/src/directory_watcher/mac_os.dart b/pkgs/watcher/lib/src/directory_watcher/mac_os.dart
index 9d3660d..5b1feb3 100644
--- a/pkgs/watcher/lib/src/directory_watcher/mac_os.dart
+++ b/pkgs/watcher/lib/src/directory_watcher/mac_os.dart
@@ -13,8 +13,6 @@
 import '../watch_event.dart';
 import 'resubscribable.dart';
 
-import 'package:path/path.dart' as p;
-
 /// Uses the FSEvents subsystem to watch for filesystem events.
 ///
 /// FSEvents has two main idiosyncrasies that this class works around. First, it
@@ -337,7 +335,7 @@
 
   /// Emit an error, then close the watcher.
   void _emitError(error, StackTrace stackTrace) {
-    _eventsController.add(error, stackTrace);
+    _eventsController.addError(error, stackTrace);
     close();
   }
 
diff --git a/pkgs/watcher/lib/src/directory_watcher/polling.dart b/pkgs/watcher/lib/src/directory_watcher/polling.dart
index 91ca005..0e190b0 100644
--- a/pkgs/watcher/lib/src/directory_watcher/polling.dart
+++ b/pkgs/watcher/lib/src/directory_watcher/polling.dart
@@ -10,7 +10,6 @@
 import 'package:crypto/crypto.dart';
 
 import '../async_queue.dart';
-import '../directory_watcher.dart';
 import '../stat.dart';
 import '../utils.dart';
 import '../watch_event.dart';
diff --git a/pkgs/watcher/lib/src/directory_watcher/resubscribable.dart b/pkgs/watcher/lib/src/directory_watcher/resubscribable.dart
index daa813a..7d99fc0 100644
--- a/pkgs/watcher/lib/src/directory_watcher/resubscribable.dart
+++ b/pkgs/watcher/lib/src/directory_watcher/resubscribable.dart
@@ -5,10 +5,8 @@
 library watcher.directory_watcher.resubscribable;
 
 import 'dart:async';
-import 'dart:io';
 
 import '../directory_watcher.dart';
-import '../utils.dart';
 import '../watch_event.dart';
 
 typedef ManuallyClosedDirectoryWatcher WatcherFactory();
diff --git a/pkgs/watcher/test/directory_watcher/shared.dart b/pkgs/watcher/test/directory_watcher/shared.dart
index 34b5e62..fe76a03 100644
--- a/pkgs/watcher/test/directory_watcher/shared.dart
+++ b/pkgs/watcher/test/directory_watcher/shared.dart
@@ -6,8 +6,6 @@
 
 import '../utils.dart';
 
-import 'dart:async';
-
 sharedTests() {
   test('does not notify for files that already exist when started', () {
     // Make some pre-existing files.
diff --git a/pkgs/watcher/test/no_subscription/shared.dart b/pkgs/watcher/test/no_subscription/shared.dart
index cd279e1..6623ba3 100644
--- a/pkgs/watcher/test/no_subscription/shared.dart
+++ b/pkgs/watcher/test/no_subscription/shared.dart
@@ -19,8 +19,7 @@
     // Subscribe to the events.
     var completer = new Completer();
     var subscription = watcher.events.listen(wrapAsync((event) {
-      expect(event.type, equals(ChangeType.ADD));
-      expect(event.path, endsWith("file.txt"));
+      expect(event, isWatchEvent(ChangeType.ADD, "file.txt"));
       completer.complete();
     }));
 
@@ -41,10 +40,19 @@
     schedule(() {
       completer = new Completer();
       subscription = watcher.events.listen(wrapAsync((event) {
+        // TODO(nweiz): Remove this when either issue 14373 or 14793 is fixed.
+        // Issue 14373 means that the new [Directory.watch] will emit an event
+        // for "unwatched.txt" being created, and issue 14793 means we have to
+        // check the filesystem, which leads us to assume that the file has been
+        // modified.
+        if (Platform.isMacOS && event.path.endsWith("unwatched.txt")) {
+          expect(event, isWatchEvent(ChangeType.MODIFY, "unwatched.txt"));
+          return;
+        }
+
         // We should get an event for the third file, not the one added while
         // we weren't subscribed.
-        expect(event.type, equals(ChangeType.ADD));
-        expect(event.path, endsWith("added.txt"));
+        expect(event, isWatchEvent(ChangeType.ADD, "added.txt"));
         completer.complete();
       }));
 
diff --git a/pkgs/watcher/test/utils.dart b/pkgs/watcher/test/utils.dart
index e18c7e8..651fd6d 100644
--- a/pkgs/watcher/test/utils.dart
+++ b/pkgs/watcher/test/utils.dart
@@ -176,11 +176,6 @@
 /// Multiple calls to [expectEvent] require that the events are received in that
 /// order unless they're called in an [inAnyOrder] block.
 void expectEvent(ChangeType type, String path) {
-  var matcher = predicate((e) {
-    return e is WatchEvent && e.type == type &&
-        e.path == p.join(_sandboxDir, p.normalize(path));
-  }, "is $type $path");
-
   if (_unorderedEventFuture != null) {
     // Assign this to a local variable since it will be un-assigned by the time
     // the scheduled callback runs.
@@ -188,7 +183,7 @@
 
     expect(
         schedule(() => future, "should fire $type event on $path"),
-        completion(contains(matcher)));
+        completion(contains(isWatchEvent(type, path))));
   } else {
     var future = currentSchedule.wrapFuture(
         _watcherEvents.elementAt(_nextEvent),
@@ -196,11 +191,20 @@
 
     expect(
         schedule(() => future, "should fire $type event on $path"),
-        completion(matcher));
+        completion(isWatchEvent(type, path)));
   }
   _nextEvent++;
 }
 
+/// Returns a matcher that matches a [WatchEvent] with the given [type] and
+/// [path].
+Match isWatchEvent(ChangeType type, String path) {
+  return predicate((e) {
+    return e is WatchEvent && e.type == type &&
+        e.path == p.join(_sandboxDir, p.normalize(path));
+  }, "is $type $path");
+}
+
 void expectAddEvent(String path) => expectEvent(ChangeType.ADD, path);
 void expectModifyEvent(String path) => expectEvent(ChangeType.MODIFY, path);
 void expectRemoveEvent(String path) => expectEvent(ChangeType.REMOVE, path);