Get rid of duplicated #include code.

This is in preparation to add a new target for IServiceManagerDupe and
is also general cleanup.

Test: hidl_test
Bug: 32313592
Change-Id: I9427a042e1ef0b5432e227522b616a8a948f2acf
diff --git a/generateCpp.cpp b/generateCpp.cpp
index 2e381ec..68c8bc3 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -78,6 +78,25 @@
     return guard;
 }
 
+// static
+void AST::generateCppPackageInclude(
+        Formatter &out,
+        const FQName &package,
+        const std::string &klass) {
+
+    out << "#include <";
+
+    std::vector<std::string> components;
+    package.getPackageAndVersionComponents(&components, false /* cpp_compatible */);
+
+    for (const auto &component : components) {
+        out << component << "/";
+    }
+
+    out << klass
+        << ".h>\n";
+}
+
 void AST::enterLeaveNamespace(Formatter &out, bool enter) const {
     std::vector<std::string> packageComponents;
     getPackageAndVersionComponents(
@@ -130,18 +149,7 @@
     out << "#define " << guard << "\n\n";
 
     for (const auto &item : mImportedNames) {
-        out << "#include <";
-
-        std::vector<std::string> components;
-        item.getPackageAndVersionComponents(
-                &components, false /* cpp_compatible */);
-
-        for (const auto &component : components) {
-            out << component << "/";
-        }
-
-        out << item.name()
-            << ".h>\n";
+        generateCppPackageInclude(out, item, item.name());
     }
 
     if (!mImportedNames.empty()) {
@@ -341,36 +349,16 @@
     out << "#ifndef " << guard << "\n";
     out << "#define " << guard << "\n\n";
 
-    std::vector<std::string> packageComponents;
-    getPackageAndVersionComponents(
-            &packageComponents, false /* cpp_compatible */);
+    generateCppPackageInclude(out, mPackage, ifaceName);
 
-    out << "#include <";
-    for (const auto &component : packageComponents) {
-        out << component << "/";
-    }
-    out << ifaceName << ".h>\n\n";
+    out << "\n";
 
     for (const auto &item : mImportedNames) {
         if (item.name() == "types") {
             continue;
         }
 
-        out << "#include <";
-
-        std::vector<std::string> components;
-        item.getPackageAndVersionComponents(
-                &components, false /* cpp_compatible */);
-
-        for (const auto &component : components) {
-            out << component << "/";
-        }
-
-        const std::string itemBaseName = item.getInterfaceBaseName();
-
-        out << "Bn"
-            << itemBaseName
-            << ".h>\n";
+        generateCppPackageInclude(out, item, "Bn" + item.getInterfaceBaseName());
     }
 
     out << "\n";
@@ -583,15 +571,8 @@
     out << "#ifndef " << guard << "\n";
     out << "#define " << guard << "\n\n";
 
-    std::vector<std::string> packageComponents;
-    getPackageAndVersionComponents(
-            &packageComponents, false /* cpp_compatible */);
-
-    out << "#include <";
-    for (const auto &component : packageComponents) {
-        out << component << "/";
-    }
-    out << "IHw" << baseName << ".h>\n\n";
+    generateCppPackageInclude(out, mPackage, "IHw" + baseName);
+    out << "\n";
 
     enterLeaveNamespace(out, true /* enter */);
     out << "\n";
@@ -673,11 +654,8 @@
     getPackageAndVersionComponents(
             &packageComponents, false /* cpp_compatible */);
 
-    out << "#include <";
-    for (const auto &component : packageComponents) {
-        out << component << "/";
-    }
-    out << "IHw" << baseName << ".h>\n\n";
+    generateCppPackageInclude(out, mPackage, "IHw" + baseName);
+    out << "\n";
 
     enterLeaveNamespace(out, true /* enter */);
     out << "\n";
@@ -755,33 +733,18 @@
 
     Formatter out(file);
 
-    std::vector<std::string> packageComponents;
-    getPackageAndVersionComponents(
-            &packageComponents, false /* cpp_compatible */);
-
-    std::string prefix;
-    for (const auto &component : packageComponents) {
-        prefix += component;
-        prefix += "/";
-    }
-
     if (isInterface) {
-        out << "#include <" << prefix << "/Bp" << baseName << ".h>\n";
-        out << "#include <" << prefix << "/Bn" << baseName << ".h>\n";
-        out << "#include <" << prefix << "/Bs" << baseName << ".h>\n";
+        generateCppPackageInclude(out, mPackage, "Bp" + baseName);
+        generateCppPackageInclude(out, mPackage, "Bn" + baseName);
+        generateCppPackageInclude(out, mPackage, "Bs" + baseName);
 
         for (const Interface *superType : iface->superTypeChain()) {
-            std::vector<std::string> superPackageComponents;
-            superType->fqName().getPackageAndVersionComponents(&superPackageComponents, false /* cpp_compatible */);
-            std::string superPrefix;
-            for (const auto &component : superPackageComponents) {
-                superPrefix += component;
-                superPrefix += "/";
-            }
-            out << "#include <" << superPrefix << "/Bp" << superType->getBaseName() << ".h>\n";
+            generateCppPackageInclude(out,
+                                      superType->fqName(),
+                                      "Bp" + superType->getBaseName());
         }
     } else {
-        out << "#include <" << prefix << "types.h>\n";
+        generateCppPackageInclude(out, mPackage, "types");
     }
 
     out << "\n";
@@ -1504,11 +1467,9 @@
             &packageComponents, false /* cpp_compatible */);
 
     out << "#include <future>\n";
-    out << "#include <";
-    for (const auto &component : packageComponents) {
-        out << component << "/";
-    }
-    out << ifaceName << ".h>\n\n";
+
+    generateCppPackageInclude(out, mPackage, ifaceName);
+    out << "\n";
 
     if (supportOneway) {
         out << "#include <hidl/TaskRunner.h>\n";