Merge pull request #42 from dart-lang/pack_discovery

.packages discovery.
diff --git a/lib/src/driver.dart b/lib/src/driver.dart
index 57fd9e5..b807bdd 100644
--- a/lib/src/driver.dart
+++ b/lib/src/driver.dart
@@ -29,6 +29,7 @@
 import 'package:analyzer_cli/src/options.dart';
 import 'package:dev_compiler/strong_mode.dart';
 import 'package:linter/src/plugin/linter_plugin.dart';
+import 'package:package_config/discovery.dart' as pkgDiscovery;
 import 'package:package_config/packages.dart' show Packages;
 import 'package:package_config/packages_file.dart' as pkgfile show parse;
 import 'package:package_config/src/packages_impl.dart' show MapPackages;
@@ -280,19 +281,25 @@
       JavaFile packageDirectory = new JavaFile(options.packageRootPath);
       resolvers.add(new PackageUriResolver([packageDirectory]));
     } else {
+      fileSystem.Resource cwd =
+          PhysicalResourceProvider.INSTANCE.getResource('.');
 
-      //TODO(pquitslund): add .packages config discovery
+      // Look for .packages.
+      packages = _discoverPackagespec(new Uri.directory(cwd.path));
 
-      PubPackageMapProvider pubPackageMapProvider =
-          new PubPackageMapProvider(PhysicalResourceProvider.INSTANCE, sdk);
-      PackageMapInfo packageMapInfo = pubPackageMapProvider.computePackageMap(
-          PhysicalResourceProvider.INSTANCE.getResource('.'));
-      Map<String, List<fileSystem.Folder>> packageMap =
-          packageMapInfo.packageMap;
-      if (packageMap != null) {
-        resolvers.add(new SdkExtUriResolver(packageMap));
-        resolvers.add(new PackageMapUriResolver(
-            PhysicalResourceProvider.INSTANCE, packageMap));
+      // Fall back to pub list-dir.
+      if (packages == null) {
+        PubPackageMapProvider pubPackageMapProvider =
+            new PubPackageMapProvider(PhysicalResourceProvider.INSTANCE, sdk);
+        PackageMapInfo packageMapInfo =
+            pubPackageMapProvider.computePackageMap(cwd);
+        Map<String, List<fileSystem.Folder>> packageMap =
+            packageMapInfo.packageMap;
+        if (packageMap != null) {
+          resolvers.add(new SdkExtUriResolver(packageMap));
+          resolvers.add(new PackageMapUriResolver(
+              PhysicalResourceProvider.INSTANCE, packageMap));
+        }
       }
     }
     resolvers.add(new FileUriResolver());
@@ -366,6 +373,21 @@
     _context = context;
   }
 
+  /// Return discovered packagespec, or `null` if none is found.
+  Packages _discoverPackagespec(Uri root) {
+    try {
+      Packages packages =
+          pkgDiscovery.findPackagesFromFile(new Uri.directory(root.path));
+      if (packages != Packages.noPackages) {
+        return packages;
+      }
+    } catch (_) {
+      // Ignore and fall through to null.
+    }
+
+    return null;
+  }
+
   void _processAnalysisOptions(CommandLineOptions options) {
     // Determine options file path.
     var filePath = options.analysisOptionsFile != null