Added knowledge of namespacing into generation.

This is the first step in making code aware of namespacing. Currently,
the solution to generate symbols which are properly namespaced is to
post-process text after it is being outputed by a Formatter. Ideally
objects will know what namespace they are in and be able to print
themselves out accordingly. This change specifically will allow
generated code to remove namespaces from symbols that don't need
to be qualified entirely without relying on post-processing to remove
the namespace.

Change-Id: Ie535d05a64eb3d6c7d3b5451abdaa289c574170f
diff --git a/AST.h b/AST.h
index 57676a1..f62425a 100644
--- a/AST.h
+++ b/AST.h
@@ -151,13 +151,16 @@
 
     status_t generateMethods(Formatter &out,
                              const std::string &className,
-                             MethodLocation type) const;
+                             MethodLocation type,
+                             bool specifyNamespaces) const;
     status_t generateStubMethod(Formatter &out,
                                 const std::string &className,
-                                const Method *method) const;
+                                const Method *method,
+                                bool specifyNamespaces) const;
     status_t generateProxyMethod(Formatter &out,
                                  const std::string &className,
-                                 const Method *method) const;
+                                 const Method *method,
+                                 bool specifyNamespaces) const;
 
     status_t generateProxySource(
             Formatter &out, const std::string &baseName) const;
diff --git a/ArrayType.cpp b/ArrayType.cpp
index 53c15dd..fd871cb 100644
--- a/ArrayType.cpp
+++ b/ArrayType.cpp
@@ -27,8 +27,14 @@
       mDimension(dimension) {
 }
 
-std::string ArrayType::getCppType(StorageMode mode, std::string *extra) const {
-    const std::string base = mElementType->getCppType(extra);
+void ArrayType::addNamedTypesToSet(std::set<const FQName> &set) const {
+    mElementType->addNamedTypesToSet(set);
+}
+
+std::string ArrayType::getCppType(StorageMode mode,
+                                  std::string *extra,
+                                  bool specifyNamespaces) const {
+    const std::string base = mElementType->getCppType(extra, specifyNamespaces);
 
     CHECK(extra->empty());
 
diff --git a/ArrayType.h b/ArrayType.h
index aa21df3..26e47de 100644
--- a/ArrayType.h
+++ b/ArrayType.h
@@ -27,7 +27,11 @@
 struct ArrayType : public Type {
     ArrayType(Type *elementType, const char *dimension);
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
+
+    void addNamedTypesToSet(std::set<const FQName> &set) const override;
 
     std::string getJavaType() const override;
 
diff --git a/CompoundType.cpp b/CompoundType.cpp
index 74df0a4..051ed60 100644
--- a/CompoundType.cpp
+++ b/CompoundType.cpp
@@ -58,9 +58,13 @@
 }
 
 std::string CompoundType::getCppType(
-        StorageMode mode, std::string *extra) const {
+        StorageMode mode,
+        std::string *extra,
+        bool specifyNamespaces) const {
+
     extra->clear();
-    const std::string base = fullName();
+    const std::string base =
+        specifyNamespaces ? fullName() : partialCppName();
 
     switch (mode) {
         case StorageMode_Stack:
diff --git a/CompoundType.h b/CompoundType.h
index 35be687..6c55a55 100644
--- a/CompoundType.h
+++ b/CompoundType.h
@@ -36,7 +36,9 @@
 
     bool setFields(std::vector<CompoundField *> *fields, std::string *errorMsg);
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
 
     std::string getJavaType() const override;
 
diff --git a/ConstantExpression.cpp b/ConstantExpression.cpp
index 5a5cbf4..1dd14ed 100644
--- a/ConstantExpression.cpp
+++ b/ConstantExpression.cpp
@@ -333,7 +333,10 @@
   if(castKind == SK(INT64) && (int64_t)mValue == INT64_MIN) {
     std::string extra;
     return strdup(("("
-      + ScalarType(SK(INT64)).getCppType(android::Type::StorageMode_Stack, &extra) // "int64_t"
+      + ScalarType(SK(INT64)).getCppType(
+          android::Type::StorageMode_Stack,
+          &extra,
+          true /* specify namespaces */) // "int64_t"
       + ")(" + literal + "ull)").c_str());
   }
 
diff --git a/EnumType.cpp b/EnumType.cpp
index fbb8a19..9db7cf1 100644
--- a/EnumType.cpp
+++ b/EnumType.cpp
@@ -52,10 +52,12 @@
     return true;
 }
 
-std::string EnumType::getCppType(StorageMode, std::string *extra) const {
+std::string EnumType::getCppType(StorageMode,
+                                 std::string *extra,
+                                 bool specifyNamespaces) const {
     extra->clear();
 
-    return fullName();
+    return specifyNamespaces ? fullName() : partialCppName();
 }
 
 std::string EnumType::getJavaType() const {
diff --git a/EnumType.h b/EnumType.h
index ffe0b49..5aeb477 100644
--- a/EnumType.h
+++ b/EnumType.h
@@ -39,7 +39,9 @@
 
     bool isEnum() const override;
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
 
     std::string getJavaType() const override;
     std::string getJavaSuffix() const override;
diff --git a/FQName.cpp b/FQName.cpp
index 6f6fd09..fcdaf20 100644
--- a/FQName.cpp
+++ b/FQName.cpp
@@ -203,6 +203,13 @@
     return out;
 }
 
+std::string FQName::cppLocalName() const {
+    std::vector<std::string> components;
+    SplitString(mName, '.', &components);
+
+    return JoinStrings(components, "::");
+}
+
 std::string FQName::cppName() const {
     std::string out = cppNamespace();
 
diff --git a/FQName.h b/FQName.h
index 6f5f8d5..8a0ad30 100644
--- a/FQName.h
+++ b/FQName.h
@@ -81,6 +81,10 @@
     // ::android::hardware::Foo::V1_0.
     std::string cppNamespace() const;
 
+    // Returns a name qualified assuming we are in cppNamespace, i.e.
+    // IBar::Baz.
+    std::string cppLocalName() const;
+
     // Returns a fully qualified absolute C++ type name, i.e.
     // ::android::hardware::Foo::V1_0::bar::baz.
     std::string cppName() const;
diff --git a/GenericBinder.cpp b/GenericBinder.cpp
index ed78f78..698b712 100644
--- a/GenericBinder.cpp
+++ b/GenericBinder.cpp
@@ -26,10 +26,20 @@
     return true;
 }
 
+void GenericBinder::addNamedTypesToSet(std::set<const FQName> &) const {
+    // do nothing
+}
+
 std::string GenericBinder::getCppType(
-        StorageMode mode, std::string *extra) const {
+        StorageMode mode,
+        std::string *extra,
+        bool specifyNamespaces) const {
     extra->clear();
-    const std::string base = "::android::sp<::android::hardware::IBinder>";
+    const std::string base =
+          std::string(specifyNamespaces ? "::android::" : "")
+        + "sp<"
+        + std::string(specifyNamespaces ? "::android::hardware::" : "")
+        + "IBinder>";
 
     switch (mode) {
         case StorageMode_Stack:
diff --git a/GenericBinder.h b/GenericBinder.h
index fc18c3e..536e8c4 100644
--- a/GenericBinder.h
+++ b/GenericBinder.h
@@ -27,7 +27,11 @@
 
     bool isBinder() const override;
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    void addNamedTypesToSet(std::set<const FQName> &set) const override;
+
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
     std::string getJavaType() const override;
 
     void emitReaderWriter(
diff --git a/HandleType.cpp b/HandleType.cpp
index bd86326..f1a5572 100644
--- a/HandleType.cpp
+++ b/HandleType.cpp
@@ -24,10 +24,20 @@
 
 HandleType::HandleType() {}
 
-std::string HandleType::getCppType(StorageMode, std::string *extra) const {
+void HandleType::addNamedTypesToSet(std::set<const FQName> &) const {
+    // do nothing
+}
+
+std::string HandleType::getCppType(StorageMode,
+                                   std::string *extra,
+                                   bool specifyNamespaces) const {
     extra->clear();
 
-    return "const ::native_handle_t*";
+    const std::string base =
+          std::string(specifyNamespaces ? "::" : "")
+        + "native_handle_t";
+
+    return "const " + base + "*";
 }
 
 std::string HandleType::getJavaType() const {
diff --git a/HandleType.h b/HandleType.h
index fd46525..386adbb 100644
--- a/HandleType.h
+++ b/HandleType.h
@@ -25,7 +25,11 @@
 struct HandleType : public Type {
     HandleType();
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    void addNamedTypesToSet(std::set<const FQName> &set) const override;
+
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
     std::string getJavaType() const override;
 
     void emitReaderWriter(
diff --git a/Interface.cpp b/Interface.cpp
index 52d960e..7bc32a8 100644
--- a/Interface.cpp
+++ b/Interface.cpp
@@ -61,9 +61,15 @@
     return localName().substr(1);
 }
 
-std::string Interface::getCppType(StorageMode mode, std::string *extra) const {
+std::string Interface::getCppType(StorageMode mode,
+                                  std::string *extra,
+                                  bool specifyNamespaces) const {
     extra->clear();
-    const std::string base = "::android::sp<" + fullName() + ">";
+    const std::string base =
+          std::string(specifyNamespaces ? "::android::" : "")
+        + "sp<"
+        + (specifyNamespaces ? fullName() : partialCppName())
+        + ">";
 
     switch (mode) {
         case StorageMode_Stack:
diff --git a/Interface.h b/Interface.h
index 7d57218..dc16396 100644
--- a/Interface.h
+++ b/Interface.h
@@ -48,7 +48,9 @@
 
     std::string getBaseName() const;
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
 
     std::string getJavaType() const override;
 
diff --git a/Method.cpp b/Method.cpp
index 8b592fd..8b456f5 100644
--- a/Method.cpp
+++ b/Method.cpp
@@ -52,7 +52,8 @@
 }
 
 void Method::generateCppSignature(Formatter &out,
-                                  const std::string &className) const {
+                                  const std::string &className,
+                                  bool specifyNamespaces) const {
     const bool returnsValue = !results().empty();
 
     const TypedVar *elidedReturn = canElideCallback();
@@ -72,7 +73,7 @@
 
     out << name()
         << "("
-        << GetArgSignature(args());
+        << GetArgSignature(args(), specifyNamespaces);
 
     if (returnsValue && elidedReturn == nullptr) {
         if (!args().empty()) {
@@ -86,7 +87,8 @@
 }
 
 // static
-std::string Method::GetArgSignature(const std::vector<TypedVar *> &args) {
+std::string Method::GetArgSignature(const std::vector<TypedVar *> &args,
+                                    bool specifyNamespaces) {
     bool first = true;
     std::string out;
     for (const auto &arg : args) {
@@ -95,7 +97,8 @@
         }
 
         std::string extra;
-        out += arg->type().getCppArgumentType(&extra);
+        out += arg->type().getCppArgumentType(&extra,
+                                              specifyNamespaces);
         out += " ";
         out += arg->name();
         out += extra;
diff --git a/Method.h b/Method.h
index 1bf1bff..3faab57 100644
--- a/Method.h
+++ b/Method.h
@@ -48,9 +48,11 @@
     const AnnotationVector &annotations() const;
 
     void generateCppSignature(Formatter &out,
-                              const std::string &className) const;
+                              const std::string &className,
+                              bool specifyNamespaces) const;
 
-    static std::string GetArgSignature(const std::vector<TypedVar *> &args);
+    static std::string GetArgSignature(const std::vector<TypedVar *> &args,
+                                       bool specifyNamespaces);
     static std::string GetJavaArgSignature(const std::vector<TypedVar *> &args);
 
     const TypedVar* canElideCallback() const;
diff --git a/NamedType.cpp b/NamedType.cpp
index df66717..727cca2 100644
--- a/NamedType.cpp
+++ b/NamedType.cpp
@@ -30,6 +30,10 @@
     mFullName = fullName;
 }
 
+void NamedType::addNamedTypesToSet(std::set<const FQName> &set) const {
+    set.insert(mFullName);
+}
+
 const FQName &NamedType::fqName() const {
     return mFullName;
 }
@@ -42,6 +46,10 @@
     return mFullName.cppName();
 }
 
+std::string NamedType::partialCppName() const {
+    return mFullName.cppLocalName();
+}
+
 std::string NamedType::fullJavaName() const {
     return mFullName.javaName();
 }
diff --git a/NamedType.h b/NamedType.h
index f761ae3..53988e2 100644
--- a/NamedType.h
+++ b/NamedType.h
@@ -33,9 +33,17 @@
 
     void setFullName(const FQName &fullName);
 
+    void addNamedTypesToSet(std::set<const FQName> &set) const override;
+
     const FQName &fqName() const;
+
     std::string localName() const;
+
+    /* short for fqName().cppName() */
     std::string fullName() const;
+    /* short for fqName().cppLocalName() */
+    std::string partialCppName() const;
+    /* short for fqName().fullJavaName() */
     std::string fullJavaName() const;
 
 private:
diff --git a/PredefinedType.cpp b/PredefinedType.cpp
index ea557a4..72341ac 100644
--- a/PredefinedType.cpp
+++ b/PredefinedType.cpp
@@ -27,7 +27,9 @@
 }
 
 std::string PredefinedType::getCppType(
-        StorageMode mode, std::string *extra) const {
+        StorageMode mode,
+        std::string *extra,
+        bool) const {
     extra->clear();
 
     const std::string base = mName;
diff --git a/PredefinedType.h b/PredefinedType.h
index 5915eb3..95d7f71 100644
--- a/PredefinedType.h
+++ b/PredefinedType.h
@@ -25,7 +25,9 @@
 struct PredefinedType : public Type {
     PredefinedType(const char *name);
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
     std::string getJavaType() const override;
 
     void emitReaderWriter(
diff --git a/ScalarType.cpp b/ScalarType.cpp
index f751ae6..eabe86a 100644
--- a/ScalarType.cpp
+++ b/ScalarType.cpp
@@ -33,7 +33,11 @@
     return mKind >= KIND_INT8 && mKind <= KIND_UINT64;
 }
 
-std::string ScalarType::getCppType(StorageMode, std::string *extra) const {
+void ScalarType::addNamedTypesToSet(std::set<const FQName> &) const {
+    // do nothing
+}
+
+std::string ScalarType::getCppType(StorageMode, std::string *extra, bool) const {
     static const char *const kName[] = {
         "bool",
         "void *",
diff --git a/ScalarType.h b/ScalarType.h
index 06892bf..7f89cc9 100644
--- a/ScalarType.h
+++ b/ScalarType.h
@@ -44,7 +44,11 @@
 
     bool isValidEnumStorageType() const;
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    void addNamedTypesToSet(std::set<const FQName> &set) const override;
+
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
 
     std::string getJavaType() const override;
     std::string getJavaWrapperType() const override;
diff --git a/StringType.cpp b/StringType.cpp
index df4543c..ef51cd2 100644
--- a/StringType.cpp
+++ b/StringType.cpp
@@ -22,10 +22,18 @@
 
 StringType::StringType() {}
 
-std::string StringType::getCppType(StorageMode mode, std::string *extra) const {
+void StringType::addNamedTypesToSet(std::set<const FQName> &) const {
+    // do nothing
+}
+
+std::string StringType::getCppType(StorageMode mode,
+                                   std::string *extra,
+                                   bool specifyNamespaces) const {
     extra->clear();
 
-    const std::string base = "::android::hardware::hidl_string";
+    const std::string base =
+          std::string(specifyNamespaces ? "::android::hardware::" : "")
+        + "hidl_string";
 
     switch (mode) {
         case StorageMode_Stack:
diff --git a/StringType.h b/StringType.h
index f2dc0dc..9b7cb04 100644
--- a/StringType.h
+++ b/StringType.h
@@ -25,7 +25,11 @@
 struct StringType : public Type {
     StringType();
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    void addNamedTypesToSet(std::set<const FQName> &set) const override;
+
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
 
     std::string getJavaType() const override;
     std::string getJavaSuffix() const override;
diff --git a/Type.cpp b/Type.cpp
index d17d906..eca9bb7 100644
--- a/Type.cpp
+++ b/Type.cpp
@@ -64,7 +64,7 @@
     return scalarType->isValidEnumStorageType();
 }
 
-std::string Type::getCppType(StorageMode, std::string *) const {
+std::string Type::getCppType(StorageMode, std::string *, bool) const {
     CHECK(!"Should not be here");
     return std::string();
 }
@@ -266,16 +266,19 @@
     return false;
 }
 
-std::string Type::getCppType(std::string *extra) const {
-    return getCppType(StorageMode_Stack, extra);
+std::string Type::getCppType(std::string *extra,
+                             bool specifyNamespaces) const {
+    return getCppType(StorageMode_Stack, extra, specifyNamespaces);
 }
 
-std::string Type::getCppResultType(std::string *extra) const {
-    return getCppType(StorageMode_Result, extra);
+std::string Type::getCppResultType(std::string *extra,
+                                   bool specifyNamespaces) const {
+    return getCppType(StorageMode_Result, extra, specifyNamespaces);
 }
 
-std::string Type::getCppArgumentType(std::string *extra) const {
-    return getCppType(StorageMode_Argument, extra);
+std::string Type::getCppArgumentType(std::string *extra,
+                                     bool specifyNamespaces) const {
+    return getCppType(StorageMode_Argument, extra, specifyNamespaces);
 }
 
 void Type::emitJavaReaderWriterWithSuffix(
diff --git a/Type.h b/Type.h
index 59c92ad..82aaeab 100644
--- a/Type.h
+++ b/Type.h
@@ -21,11 +21,13 @@
 #include <android-base/macros.h>
 #include <string>
 #include <utils/Errors.h>
+#include <set>
 
 namespace android {
 
 struct Formatter;
 struct ScalarType;
+struct FQName;
 
 struct Type {
     Type();
@@ -50,13 +52,30 @@
         StorageMode_Result
     };
     virtual std::string getCppType(
-            StorageMode mode, std::string *extra) const;
+            StorageMode mode,
+            std::string *extra,
+            bool specifyNamespaces) const;
+
+    /* gets all hidl-defined types used when this item is
+     * printed using getCppType or getJavaType. Examples:
+     *
+     * vec<vec<vec<IFoo>>>: IFoo is added to the set
+     * (the hypothetical type pair)
+     * pair<IFoo, IBar>: IFoo and IBar are added to the set
+     * int32_t: nothing is added to the set
+     * string: nothing is added to the set
+     * IFoo: IFoo is added to the set
+     */
+    virtual void addNamedTypesToSet(std::set<const FQName> &set) const = 0;
 
     // Convenience, gets StorageMode_Stack type.
-    std::string getCppType(std::string *extra) const;
+    std::string getCppType(std::string *extra,
+                           bool specifyNamespaces = true) const;
 
-    std::string getCppResultType(std::string *extra) const;
-    std::string getCppArgumentType(std::string *extra) const;
+    std::string getCppResultType(std::string *extra,
+                                 bool specifyNamespaces = true) const;
+    std::string getCppArgumentType(std::string *extra,
+                                   bool specifyNamespaces = true) const;
 
     virtual std::string getJavaType() const = 0;
     virtual std::string getJavaWrapperType() const;
diff --git a/TypeDef.cpp b/TypeDef.cpp
index 9289e63..d3c0198 100644
--- a/TypeDef.cpp
+++ b/TypeDef.cpp
@@ -27,6 +27,10 @@
       mReferencedType(type) {
 }
 
+void TypeDef::addNamedTypesToSet(std::set<const FQName> &set) const {
+    mReferencedType->addNamedTypesToSet(set);
+}
+
 const ScalarType *TypeDef::resolveToScalarType() const {
     CHECK(!"Should not be here");
     return NULL;
diff --git a/TypeDef.h b/TypeDef.h
index 4443cfa..d71d595 100644
--- a/TypeDef.h
+++ b/TypeDef.h
@@ -27,6 +27,8 @@
 
     const ScalarType *resolveToScalarType() const override;
 
+    void addNamedTypesToSet(std::set<const FQName> &set) const override;
+
     Type *referencedType() const;
 
     bool isInterface() const override;
diff --git a/VectorType.cpp b/VectorType.cpp
index 1019424..910bc39 100644
--- a/VectorType.cpp
+++ b/VectorType.cpp
@@ -26,10 +26,17 @@
     : mElementType(elementType) {
 }
 
-std::string VectorType::getCppType(StorageMode mode, std::string *extra) const {
+void VectorType::addNamedTypesToSet(std::set<const FQName> &set) const {
+    mElementType->addNamedTypesToSet(set);
+}
+
+std::string VectorType::getCppType(StorageMode mode,
+                                   std::string *extra,
+                                   bool specifyNamespaces) const {
     const std::string base =
-        "::android::hardware::hidl_vec<"
-        + mElementType->getCppType(extra)
+          std::string(specifyNamespaces ? "::android::hardware::" : "")
+        + "hidl_vec<"
+        + mElementType->getCppType(extra, specifyNamespaces)
         + ">";
 
     CHECK(extra->empty());
diff --git a/VectorType.h b/VectorType.h
index 238929c..8bb5eb9 100644
--- a/VectorType.h
+++ b/VectorType.h
@@ -25,7 +25,11 @@
 struct VectorType : public Type {
     VectorType(Type *elementType);
 
-    std::string getCppType(StorageMode mode, std::string *extra) const override;
+    void addNamedTypesToSet(std::set<const FQName> &set) const override;
+
+    std::string getCppType(StorageMode mode,
+                           std::string *extra,
+                           bool specifyNamespaces) const override;
 
     std::string getJavaType() const override;
     std::string getJavaSuffix() const override;
diff --git a/generateCpp.cpp b/generateCpp.cpp
index 9cfb938..3668fd6 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -224,7 +224,8 @@
             out << "using "
                 << method->name()
                 << "_cb = std::function<void("
-                << Method::GetArgSignature(method->results())
+                << Method::GetArgSignature(method->results(),
+                                           true /* specify namespaces */)
                 << ")>;\n";
         }
 
@@ -248,7 +249,8 @@
 
             out << method->name()
                 << "("
-                << Method::GetArgSignature(method->args());
+                << Method::GetArgSignature(method->args(),
+                                           true /* specify namespaces */);
 
             if (returnsValue && elidedReturn == nullptr) {
                 if (!method->args().empty()) {
@@ -415,10 +417,13 @@
 
 status_t AST::generateStubMethod(Formatter &out,
                                  const std::string &className,
-                                 const Method *method) const {
+                                 const Method *method,
+                                 bool specifyNamespaces) const {
     out << "inline ";
 
-    method->generateCppSignature(out, className);
+    method->generateCppSignature(out,
+                                 className,
+                                 specifyNamespaces);
 
     const bool returnsValue = !method->results().empty();
     const TypedVar *elidedReturn = method->canElideCallback();
@@ -453,9 +458,12 @@
 
 status_t AST::generateProxyMethod(Formatter &out,
                                   const std::string &className,
-                                  const Method *method) const {
+                                  const Method *method,
+                                  bool specifyNamespaces) const {
 
-    method->generateCppSignature(out, className);
+    method->generateCppSignature(out,
+                                 className,
+                                 specifyNamespaces);
     out << " override;\n";
 
     return OK;
@@ -464,7 +472,8 @@
 status_t AST::generateMethods(
         Formatter &out,
         const std::string &className,
-        MethodLocation type) const {
+        MethodLocation type,
+        bool specifyNamespaces) const {
 
     const Interface *iface = mRootScope->getInterface();
 
@@ -487,12 +496,14 @@
                 case STUB_HEADER:
                     err = generateStubMethod(out,
                                              className,
-                                             method);
+                                             method,
+                                             specifyNamespaces);
                     break;
                 case PROXY_HEADER:
                     err = generateProxyMethod(out,
                                               className,
-                                              method);
+                                              method,
+                                              specifyNamespaces);
                     break;
                 default:
                     err = UNKNOWN_ERROR;
@@ -578,7 +589,8 @@
 
     generateMethods(out,
                     "" /* class name */,
-                    MethodLocation::STUB_HEADER);
+                    MethodLocation::STUB_HEADER,
+                    true /* specify namespaces */);
     out.unindent();
 
     out << "};\n\n";
@@ -652,7 +664,8 @@
 
     generateMethods(out,
                     "" /* class name */,
-                    MethodLocation::PROXY_HEADER);
+                    MethodLocation::PROXY_HEADER,
+                    true /* generate specify namespaces */);
 
     out.unindent();
 
@@ -816,7 +829,9 @@
         const Interface *superInterface = *it;
 
         for (const auto &method : superInterface->methods()) {
-            method->generateCppSignature(out, klassName);
+            method->generateCppSignature(out,
+                                         klassName,
+                                         true /* specify namespaces */);
 
             const bool returnsValue = !method->results().empty();
             const TypedVar *elidedReturn = method->canElideCallback();