Simplify overly long fully specified type names by stripping out the current

namespace prefix if possible. Properly include "types.h" for regular
(non-interface) types. Emit full names where appropriate.
diff --git a/generateCpp.cpp b/generateCpp.cpp
index 0ab32b8..889ac86 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -40,22 +40,6 @@
     return true;
 }
 
-static void SplitString(
-        const std::string &s, char c, std::vector<std::string> *components) {
-    components->clear();
-
-    size_t startPos = 0;
-    size_t matchPos;
-    while ((matchPos = s.find(c, startPos)) != std::string::npos) {
-        components->push_back(s.substr(startPos, matchPos - startPos));
-        startPos = matchPos + 1;
-    }
-
-    if (startPos + 1 < s.length()) {
-        components->push_back(s.substr(startPos));
-    }
-}
-
 static std::string upcase(const std::string in) {
     std::string out{in};
 
@@ -84,47 +68,14 @@
     return err;
 }
 
-// static
-void AST::GetPackageComponents(
-        const FQName &fqName,
-        std::vector<std::string> *components) {
-    SplitString(fqName.package(), '.', components);
-}
-
-// static
-void AST::GetPackageAndVersionComponents(
-        const FQName &fqName,
-        std::vector<std::string> *components,
-        bool cpp_compatible) {
-    GetPackageComponents(fqName, components);
-
-    const std::string packageVersion = fqName.version();
-    CHECK(packageVersion[0] == '@');
-
-    if (!cpp_compatible) {
-        components->push_back(packageVersion.substr(1));
-        return;
-    }
-
-    const size_t dotPos = packageVersion.find('.');
-
-    // Form "Vmajor_minor".
-    std::string versionString = "V";
-    versionString.append(packageVersion.substr(1, dotPos - 1));
-    versionString.append("_");
-    versionString.append(packageVersion.substr(dotPos + 1));
-
-    components->push_back(versionString);
-}
-
 void AST::getPackageComponents(
         std::vector<std::string> *components) const {
-    GetPackageComponents(mPackage, components);
+    mPackage.getPackageComponents(components);
 }
 
 void AST::getPackageAndVersionComponents(
         std::vector<std::string> *components, bool cpp_compatible) const {
-    GetPackageAndVersionComponents(mPackage, components, cpp_compatible);
+    mPackage.getPackageAndVersionComponents(components, cpp_compatible);
 }
 
 std::string AST::makeHeaderGuard(const std::string &baseName) const {
@@ -154,7 +105,11 @@
         for (const auto &component : packageComponents) {
             out << "namespace " << component << " {\n";
         }
+
+        out.setNamespace(mPackage.cppNamespace());
     } else {
+        out.setNamespace(std::string());
+
         for (auto it = packageComponents.rbegin();
                 it != packageComponents.rend();
                 ++it) {
@@ -198,8 +153,8 @@
         out << "#include <";
 
         std::vector<std::string> components;
-        GetPackageAndVersionComponents(
-                item, &components, false /* cpp_compatible */);
+        item.getPackageAndVersionComponents(
+                &components, false /* cpp_compatible */);
 
         for (const auto &component : components) {
             out << component << "/";