Add FmqType to templatize MQDescriptor

Also removed PredefinedType and renamed MQDescriptorSync to
fmq_sync and MQDescriptorUnsync to fmq_unsync.

Test: FMQ unit tests.
Bug: 33948735

Merged-In: I7f2802b76000a1e1a55d02381cca202530a0cd18
Change-Id: I7f2802b76000a1e1a55d02381cca202530a0cd18
diff --git a/AST.cpp b/AST.cpp
index 2d2898c..8a49512 100644
--- a/AST.cpp
+++ b/AST.cpp
@@ -22,7 +22,7 @@
 #include "HandleType.h"
 #include "Interface.h"
 #include "Location.h"
-#include "PredefinedType.h"
+#include "FmqType.h"
 #include "Scope.h"
 #include "TypeDef.h"
 
diff --git a/Android.bp b/Android.bp
index 7f32fcd..38e3287 100644
--- a/Android.bp
+++ b/Android.bp
@@ -42,7 +42,7 @@
         "Method.cpp",
         "NamedType.cpp",
         "PointerType.cpp",
-        "PredefinedType.cpp",
+        "FmqType.cpp",
         "RefType.cpp",
         "ScalarType.cpp",
         "Scope.cpp",
diff --git a/PredefinedType.cpp b/FmqType.cpp
similarity index 84%
rename from PredefinedType.cpp
rename to FmqType.cpp
index fb015a4..c22fd55 100644
--- a/PredefinedType.cpp
+++ b/FmqType.cpp
@@ -14,28 +14,28 @@
  * limitations under the License.
  */
 
-#include "PredefinedType.h"
+#include "FmqType.h"
 
 #include <hidl-util/Formatter.h>
 #include <android-base/logging.h>
 
 namespace android {
 
-PredefinedType::PredefinedType(const char *nsp, const char *name)
+FmqType::FmqType(const char *nsp, const char *name)
     : mNamespace(nsp), mName(name) {
 }
 
-void PredefinedType::addNamedTypesToSet(std::set<const FQName> &) const {
+void FmqType::addNamedTypesToSet(std::set<const FQName> &) const {
     // do nothing
 }
 
-std::string PredefinedType::fullName() const {
+std::string FmqType::fullName() const {
     return mNamespace +
             (mNamespace.empty() ? "" : "::") +
-            mName;
+            mName + "<" + mElementType->getCppStackType(true) + ">";
 }
 
-std::string PredefinedType::getCppType(
+std::string FmqType::getCppType(
         StorageMode mode,
         bool) const {
 
@@ -53,7 +53,7 @@
     }
 }
 
-void PredefinedType::emitReaderWriter(
+void FmqType::emitReaderWriter(
         Formatter &out,
         const std::string &name,
         const std::string &parcelObj,
@@ -117,7 +117,7 @@
             "0 /* parentOffset */");
 }
 
-void PredefinedType::emitReaderWriterEmbedded(
+void FmqType::emitReaderWriterEmbedded(
         Formatter &out,
         size_t /* depth */,
         const std::string &name,
@@ -144,17 +144,21 @@
             mNamespace);
 }
 
-bool PredefinedType::isJavaCompatible() const {
+bool FmqType::isJavaCompatible() const {
     return false;
 }
 
-bool PredefinedType::needsEmbeddedReadWrite() const {
+bool FmqType::needsEmbeddedReadWrite() const {
     return true;
 }
 
-bool PredefinedType::resultNeedsDeref() const {
+bool FmqType::resultNeedsDeref() const {
     return true;
 }
 
+bool FmqType::isCompatibleElementType(Type *elementType) const {
+    return (!elementType->isInterface() && !elementType->needsEmbeddedReadWrite());
+}
+
 }  // namespace android
 
diff --git a/PredefinedType.h b/FmqType.h
similarity index 87%
rename from PredefinedType.h
rename to FmqType.h
index a3f2e81..054a25e 100644
--- a/PredefinedType.h
+++ b/FmqType.h
@@ -14,16 +14,16 @@
  * limitations under the License.
  */
 
-#ifndef PREDEFINED_TYPE_H_
+#ifndef FMQ_TYPE_H_
 
-#define PREDEFINED_TYPE_H_
+#define FMQ_TYPE_H_
 
 #include "Type.h"
 
 namespace android {
 
-struct PredefinedType : public Type {
-    PredefinedType(const char *nsp, const char *name);
+struct FmqType : public TemplatedType {
+    FmqType(const char *nsp, const char *name);
 
     void addNamedTypesToSet(std::set<const FQName> &set) const override;
 
@@ -58,14 +58,14 @@
 
     bool needsEmbeddedReadWrite() const override;
     bool resultNeedsDeref() const override;
-
+    bool isCompatibleElementType(Type *elementType) const override;
 private:
     std::string mNamespace;
     std::string mName;
 
-    DISALLOW_COPY_AND_ASSIGN(PredefinedType);
+    DISALLOW_COPY_AND_ASSIGN(FmqType);
 };
 
 }  // namespace android
 
-#endif  // PREDEFINED_TYPE_H_
+#endif  // FMQ_TYPE_H_
diff --git a/hidl-gen_l.ll b/hidl-gen_l.ll
index e6b4bef..1fb0127 100644
--- a/hidl-gen_l.ll
+++ b/hidl-gen_l.ll
@@ -44,7 +44,7 @@
 #include "StringType.h"
 #include "VectorType.h"
 #include "RefType.h"
-#include "PredefinedType.h"
+#include "FmqType.h"
 
 #include "hidl-gen_y.h"
 
@@ -118,8 +118,8 @@
 "pointer"		{ yylval->type = new PointerType; return token::TYPE; }
 "string"		{ yylval->type = new StringType; return token::TYPE; }
 
-"MQDescriptorSync" { yylval->type = new PredefinedType("::android::hardware", "MQDescriptorSync"); return token::TYPE; }
-"MQDescriptorUnsync" { yylval->type = new PredefinedType("::android::hardware", "MQDescriptorUnsync"); return token::TYPE; }
+"fmq_sync" { yylval->type = new FmqType("::android::hardware", "MQDescriptorSync"); return token::TEMPLATED; }
+"fmq_unsync" { yylval->type = new FmqType("::android::hardware", "MQDescriptorUnsync"); return token::TEMPLATED; }
 
 "("			{ return('('); }
 ")"			{ return(')'); }
diff --git a/hidl-gen_y.yy b/hidl-gen_y.yy
index 75843c5..4548b68 100644
--- a/hidl-gen_y.yy
+++ b/hidl-gen_y.yy
@@ -90,7 +90,7 @@
         "int8_t", "int16_t", "int32_t", "int64_t", "bool", "float", "double",
         "interface", "struct", "union", "string", "vec", "enum", "ref", "handle",
         "package", "import", "typedef", "generates", "oneway", "extends",
-        "MQDescriptorSync", "MQDescriptorUnsync",
+        "fmq_sync", "fmq_unsync",
     });
     static const std::vector<std::string> cppKeywords({
         "alignas", "alignof", "and", "and_eq", "asm", "atomic_cancel", "atomic_commit",
diff --git a/test/vendor/1.0/IVendor.hal b/test/vendor/1.0/IVendor.hal
index 1ccaa0d..f888a2d 100644
--- a/test/vendor/1.0/IVendor.hal
+++ b/test/vendor/1.0/IVendor.hal
@@ -21,14 +21,14 @@
     struct StructTest {
         handle a;
         vec<uint8_t> b;
-        MQDescriptorSync c;
+        fmq_sync<uint8_t> c;
         string d;
         uint8_t[4][4] e;
     };
 
     fun1(handle a) generates(handle b);
     fun2(vec<uint8_t> a) generates(vec<uint8_t> b);
-    fun3(MQDescriptorSync a) generates(MQDescriptorSync b);
+    fun3(fmq_sync<uint8_t> a) generates(fmq_sync<uint8_t> b);
     fun4(string a) generates(string b);
     fun5(uint8_t[4][4] a) generates(uint8_t[4][4] b);