Add -L hash

Test: with -Lhash:
  hidl-gen -L hash -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport android.hardware.nfc@1.0::types
  hidl-gen -L hash -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport android.hardware.nfc@1.0::INfc
  hidl-gen -L hash -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport android.hardware.nfc@1.0::INfcClientCallback
  hidl-gen -L hash -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport android.hardware.nfc@1.0

Bug: 34178341
Merged-In: Ibe3707e40c501bec307204b603ba5b596b9fc049
Change-Id: Ibe3707e40c501bec307204b603ba5b596b9fc049
diff --git a/main.cpp b/main.cpp
index 68e033c..30ad85f 100644
--- a/main.cpp
+++ b/main.cpp
@@ -16,6 +16,7 @@
 
 #include "AST.h"
 #include "Coordinator.h"
+#include "Hash.h"
 #include "Scope.h"
 
 #include <hidl-util/Formatter.h>
@@ -1048,6 +1049,43 @@
     return OK;
 }
 
+static status_t generateHashOutput(const FQName &fqName,
+        const char* /*hidl_gen*/,
+        Coordinator *coordinator,
+        const std::string & /*outputDir*/) {
+
+    status_t err;
+    std::vector<FQName> packageInterfaces;
+
+    if (fqName.isFullyQualified()) {
+        packageInterfaces = {fqName};
+    } else {
+        err = coordinator->appendPackageInterfacesToVector(
+                fqName, &packageInterfaces);
+        if (err != OK) {
+            return err;
+        }
+    }
+
+    for (const auto &currentFqName : packageInterfaces) {
+        AST *ast = coordinator->parse(currentFqName);
+
+        if (ast == NULL) {
+            fprintf(stderr,
+                    "ERROR: Could not parse %s. Aborting.\n",
+                    currentFqName.string().c_str());
+
+            return UNKNOWN_ERROR;
+        }
+
+        printf("%s %s\n",
+                Hash::getHash(ast->getFilename()).hexString().c_str(),
+                currentFqName.string().c_str());
+    }
+
+    return OK;
+}
+
 static std::vector<OutputHandler> formats = {
     {"c++",
      OutputHandler::NEEDS_DIR /* mOutputMode */,
@@ -1186,7 +1224,13 @@
      OutputHandler::NEEDS_DIR /* mOutputMode */,
      validateForMakefile,
      generateAndroidBpImplForPackage,
-    }
+    },
+
+    {"hash",
+     OutputHandler::NOT_NEEDED /* mOutputMode */,
+     validateForSource,
+     generateHashOutput,
+    },
 };
 
 static void usage(const char *me) {
@@ -1328,6 +1372,8 @@
             outputFormat->validate(fqName, outputFormat->mKey);
 
         if (valid == OutputHandler::FAILED) {
+            fprintf(stderr,
+                    "ERROR: output handler failed.\n");
             exit(1);
         }