Cleanup FQName usage.

Bug: 32559427
Test: hidl_test
Change-Id: Ie5e234c102f8ad76ab24db9bce1630e2227562f6
diff --git a/AST.cpp b/AST.cpp
index 309e06f..dcf7495 100644
--- a/AST.cpp
+++ b/AST.cpp
@@ -447,13 +447,11 @@
         // dependencies.  If not, then it must have been defined in types.hal.
         //
         // In the case of just specifying Folder, the resolved type is
-        // android.hardware.tests.foo@1.0::IFoo.Folder, and the same logic as
+        // android.hardware.tests.foo@1.0::Folder, and the same logic as
         // above applies.
 
         if (!resolvedType->isInterface()) {
-            FQName ifc(resolvedName.package(),
-                       resolvedName.version(),
-                       resolvedName.names().at(0));
+            FQName ifc = resolvedName.getTopLevelType();
             for (const auto &importedAST : mImportedASTs) {
                 FQName matchingName;
                 Type *match = importedAST->findDefinedType(ifc, &matchingName);
@@ -465,8 +463,7 @@
 
         if (!resolvedType->isInterface()) {
             // Non-interface types are declared in the associated types header.
-            FQName typesName(
-                    resolvedName.package(), resolvedName.version(), "types");
+            FQName typesName = resolvedName.getTypesForPackage();
 
             mImportedNames.insert(typesName);
         } else {
@@ -500,7 +497,7 @@
 
 void AST::getImportedPackages(std::set<FQName> *importSet) const {
     for (const auto &fqName : mImportedNames) {
-        FQName packageName(fqName.package(), fqName.version(), "");
+        FQName packageName = fqName.getPackageAndVersion();
 
         if (packageName == mPackage) {
             // We only care about external imports, not our own package.
diff --git a/Coordinator.cpp b/Coordinator.cpp
index 5ff5381..f2bab30 100644
--- a/Coordinator.cpp
+++ b/Coordinator.cpp
@@ -62,7 +62,7 @@
 
     if (fqName.name() != "types") {
         // Any interface file implicitly imports its package's types.hal.
-        FQName typesName(fqName.package(), fqName.version(), "types");
+        FQName typesName = fqName.getTypesForPackage();
         typesAST = parse(typesName, parsedASTs);
 
         // fall through.
diff --git a/FQName.cpp b/FQName.cpp
index 99e9f9a..254a5a4 100644
--- a/FQName.cpp
+++ b/FQName.cpp
@@ -72,6 +72,11 @@
       mName(name),
       mValueName(valueName) {
     setVersion(version);
+
+    // Check if this is actually a valid fqName
+    FQName other;
+    other.setTo(this->string());
+    CHECK(other.mValid && (*this) == other);
 }
 
 FQName::FQName(const FQName& other)
@@ -339,7 +344,11 @@
     return FQName(package(), version(), "types");
 }
 
-const FQName FQName::getTopLevelType() const {
+FQName FQName::getPackageAndVersion() const {
+    return FQName(package(), version(), "");
+}
+
+FQName FQName::getTopLevelType() const {
     auto idx = mName.find('.');
 
     if (idx == std::string::npos) {
diff --git a/FQName.h b/FQName.h
index de47bc3..28c14ff 100644
--- a/FQName.h
+++ b/FQName.h
@@ -150,12 +150,16 @@
     // -> android.hardware.foo@1.0::types
     FQName getTypesForPackage() const;
 
+    // android.hardware.foo@1.0::Abc.Type:VALUE
+    // -> android.hardware.foo@1.0
+    FQName getPackageAndVersion() const;
+
     // the following comments all assume that the FQName
     // is android.hardware.foo@1.0::IBar.Baz.Bam
 
     // returns highest type in the hidl namespace, i.e.
     // android.hardware.foo@1.0::IBar
-    const FQName getTopLevelType() const;
+    FQName getTopLevelType() const;
 
     // returns an unambiguous fully qualified name which can be
     // baked into a token, i.e.
@@ -205,8 +209,8 @@
     void setVersion(const std::string &v);
 };
 
-static const FQName gIBaseFqName{"android.hidl.base@1.0::IBase"};
-static const FQName gIBasePackageFqName{gIBaseFqName.package(), gIBaseFqName.version(), ""};
+static const FQName gIBaseFqName = FQName{"android.hidl.base@1.0::IBase"};
+static const FQName gIBasePackageFqName = FQName{"android.hidl.base@1.0"};
 
 }  // namespace android
 
diff --git a/main.cpp b/main.cpp
index 06d7053..ed5eecd 100644
--- a/main.cpp
+++ b/main.cpp
@@ -66,7 +66,7 @@
 
         limitToType = fqName.name().substr(strlen("types."));
 
-        FQName typesName(fqName.package(), fqName.version(), "types");
+        FQName typesName = fqName.getTypesForPackage();
         ast = coordinator->parse(typesName);
     } else {
         ast = coordinator->parse(fqName);