Add validity checks to create (#3215)

* Add validity checks to create

* Adjust indent
diff --git a/packages/flutter_tools/lib/src/commands/create.dart b/packages/flutter_tools/lib/src/commands/create.dart
index d567d4d..4611e21 100644
--- a/packages/flutter_tools/lib/src/commands/create.dart
+++ b/packages/flutter_tools/lib/src/commands/create.dart
@@ -88,6 +88,10 @@
     String dirPath = path.normalize(projectDir.absolute.path);
     String projectName = _normalizeProjectName(path.basename(dirPath));
 
+    if (_validateProjectDir(dirPath) != null) {
+      printError(_validateProjectDir(dirPath));
+      return 1;
+    }
     if (_validateProjectName(projectName) != null) {
       printError(_validateProjectName(projectName));
       return 1;
@@ -217,9 +221,32 @@
 String _validateProjectName(String projectName) {
   if (_packageDependencies.contains(projectName)) {
     return "Invalid project name: '$projectName' - this will conflict with Flutter "
-    "package dependencies.";
+      "package dependencies.";
   }
+  return null;
+}
 
+/// Return `null` if the project directory is legal. Return a validation message
+/// if we should disallow the directory name.
+String _validateProjectDir(String projectName) {
+  FileSystemEntityType type = FileSystemEntity.typeSync(projectName);
+  if (type != FileSystemEntityType.NOT_FOUND) {
+    switch(type) {
+      case FileSystemEntityType.DIRECTORY:
+        // Do not re-use directory if it is not empty.
+        if (new Directory(projectName).listSync(followLinks: false).isNotEmpty) {
+          return "Invalid project name: '$projectName' - refers to a directory "
+            "that is not empty.";
+        };
+        break;
+      case FileSystemEntityType.FILE:
+        // Do not overwrite files.
+        return "Invalid project name: '$projectName' - file exists.";
+      case FileSystemEntityType.LINK:
+        // Do not overwrite links.
+        return "Invalid project name: '$projectName' - refers to a link.";
+    }
+  }
   return null;
 }