[fidl] Record sizes in coded types

Coding tables for vectors need to know the element size for the vector.
In most cases, this size is known from the flat::Type. However, when
that type is an identifier (which has size 0), we must perform a lookup
to find the coded type for the identifier. Storing the size in the coded
type gives us the proper element size for such a vector.

TO-898 #done

Change-Id: I66213c0c910f426dd1858f24172c8f780a6c6cb2
diff --git a/system/host/fidl/include/fidl/coded_ast.h b/system/host/fidl/include/fidl/coded_ast.h
index b069b68..8d48ebb 100644
--- a/system/host/fidl/include/fidl/coded_ast.h
+++ b/system/host/fidl/include/fidl/coded_ast.h
@@ -61,11 +61,12 @@
         kVector,
     };
 
-    Type(Kind kind, std::string coded_name, CodingNeeded coding_needed)
-        : kind(kind), coded_name(std::move(coded_name)), coding_needed(coding_needed) {}
+    Type(Kind kind, std::string coded_name, uint32_t size, CodingNeeded coding_needed)
+        : kind(kind), coded_name(std::move(coded_name)), size(size), coding_needed(coding_needed) {}
 
     const Kind kind;
     const std::string coded_name;
+    uint32_t size;
     const CodingNeeded coding_needed;
 };
 
@@ -86,15 +87,15 @@
 }
 
 struct PrimitiveType : public Type {
-    PrimitiveType(std::string name, types::PrimitiveSubtype subtype)
-        : Type(Kind::kPrimitive, std::move(name), CodingNeeded::kNotNeeded), subtype(subtype) {}
+    PrimitiveType(std::string name, types::PrimitiveSubtype subtype, uint32_t size)
+        : Type(Kind::kPrimitive, std::move(name), size, CodingNeeded::kNotNeeded), subtype(subtype) {}
 
     const types::PrimitiveSubtype subtype;
 };
 
 struct HandleType : public Type {
     HandleType(std::string name, types::HandleSubtype subtype, types::Nullability nullability)
-        : Type(Kind::kHandle, std::move(name), CodingNeeded::kNeeded), subtype(subtype), nullability(nullability) {}
+        : Type(Kind::kHandle, std::move(name), 4u, CodingNeeded::kNeeded), subtype(subtype), nullability(nullability) {}
 
     const types::HandleSubtype subtype;
     const types::Nullability nullability;
@@ -102,52 +103,49 @@
 
 struct InterfaceHandleType : public Type {
     InterfaceHandleType(std::string name, types::Nullability nullability)
-        : Type(Kind::kInterfaceHandle, std::move(name), CodingNeeded::kNeeded), nullability(nullability) {}
+        : Type(Kind::kInterfaceHandle, std::move(name), 4u, CodingNeeded::kNeeded), nullability(nullability) {}
 
     const types::Nullability nullability;
 };
 
 struct RequestHandleType : public Type {
     RequestHandleType(std::string name, types::Nullability nullability)
-        : Type(Kind::kRequestHandle, std::move(name), CodingNeeded::kNeeded), nullability(nullability) {}
+        : Type(Kind::kRequestHandle, std::move(name), 4u, CodingNeeded::kNeeded), nullability(nullability) {}
 
     const types::Nullability nullability;
 };
 
 struct StructType : public Type {
  StructType(std::string name, std::vector<Field> fields, uint32_t size, CodingNeeded coding_needed)
-        : Type(Kind::kStruct, std::move(name), coding_needed), fields(std::move(fields)), size(size) {}
+        : Type(Kind::kStruct, std::move(name), size, coding_needed), fields(std::move(fields)) {}
 
     const std::vector<Field> fields;
-    const uint32_t size;
     bool referenced_by_pointer = false;
 };
 
 struct UnionType : public Type {
     UnionType(std::string name, std::vector<const Type*> types, uint32_t data_offset, uint32_t size)
-        : Type(Kind::kUnion, std::move(name), SomeTypeIsNeeded(types)),
-          types(std::move(types)), data_offset(data_offset), size(size) {}
+        : Type(Kind::kUnion, std::move(name), size, SomeTypeIsNeeded(types)),
+          types(std::move(types)), data_offset(data_offset) {}
 
     const std::vector<const Type*> types;
     const uint32_t data_offset;
-    const uint32_t size;
     bool referenced_by_pointer = false;
 };
 
 struct ArrayType : public Type {
     ArrayType(std::string name, const Type* element_type, uint32_t array_size,
               uint32_t element_size)
-        : Type(Kind::kArray, std::move(name), element_type->coding_needed), element_type(element_type), array_size(array_size),
+        : Type(Kind::kArray, std::move(name), array_size, element_type->coding_needed), element_type(element_type),
           element_size(element_size) {}
 
     const Type* const element_type;
-    const uint32_t array_size;
     const uint32_t element_size;
 };
 
 struct StringType : public Type {
     StringType(std::string name, uint32_t max_size, types::Nullability nullability)
-        : Type(Kind::kString, std::move(name), CodingNeeded::kNeeded), max_size(max_size), nullability(nullability) {}
+        : Type(Kind::kString, std::move(name), 16u, CodingNeeded::kNeeded), max_size(max_size), nullability(nullability) {}
 
     const uint32_t max_size;
     const types::Nullability nullability;
@@ -156,7 +154,7 @@
 struct VectorType : public Type {
     VectorType(std::string name, const Type* element_type, uint32_t max_count,
                uint32_t element_size, types::Nullability nullability)
-        : Type(Kind::kVector, std::move(name), CodingNeeded::kNeeded),
+        : Type(Kind::kVector, std::move(name), 16u, CodingNeeded::kNeeded),
           element_type(element_type), max_count(max_count),
           element_size(element_size), nullability(nullability) {}
 
diff --git a/system/host/fidl/lib/tables_generator.cpp b/system/host/fidl/lib/tables_generator.cpp
index 9bdcb73..fc60bd2 100644
--- a/system/host/fidl/lib/tables_generator.cpp
+++ b/system/host/fidl/lib/tables_generator.cpp
@@ -202,7 +202,7 @@
     Emit(&tables_file_, " = fidl_type_t(::fidl::FidlCodedArray(&");
     Emit(&tables_file_, NameTable(array_type.element_type->coded_name));
     Emit(&tables_file_, ", ");
-    Emit(&tables_file_, array_type.array_size);
+    Emit(&tables_file_, array_type.size);
     Emit(&tables_file_, ", ");
     Emit(&tables_file_, array_type.element_size);
     Emit(&tables_file_, "));\n\n");
@@ -273,7 +273,7 @@
             return iter->second;
         auto coded_element_type = Compile(vector_type->element_type.get());
         uint32_t max_count = vector_type->element_count.Value();
-        uint32_t element_size = vector_type->element_type->size;
+        uint32_t element_size = coded_element_type->size;
         StringView element_name = coded_element_type->coded_name;
         auto name = NameCodedVector(element_name, max_count, vector_type->nullability);
         auto coded_vector_type = std::make_unique<coded::VectorType>(std::move(name), coded_element_type, max_count, element_size, vector_type->nullability);
@@ -321,7 +321,7 @@
         if (iter != primitive_type_map_.end())
             return iter->second;
         auto name = NamePrimitiveSubtype(primitive_type->subtype);
-        auto coded_primitive_type = std::make_unique<coded::PrimitiveType>(std::move(name), primitive_type->subtype);
+        auto coded_primitive_type = std::make_unique<coded::PrimitiveType>(std::move(name), primitive_type->subtype, flat::PrimitiveType::SubtypeSize(primitive_type->subtype));
         primitive_type_map_[primitive_type] = coded_primitive_type.get();
         coded_types_.push_back(std::move(coded_primitive_type));
         return coded_types_.back().get();
@@ -377,7 +377,7 @@
     case flat::Decl::Kind::kEnum: {
         auto enum_decl = static_cast<const flat::Enum*>(decl);
         std::string enum_name = NameName(enum_decl->name);
-        coded_types_.push_back(std::make_unique<coded::PrimitiveType>(std::move(enum_name), enum_decl->type));
+        coded_types_.push_back(std::make_unique<coded::PrimitiveType>(std::move(enum_name), enum_decl->type, flat::PrimitiveType::SubtypeSize(enum_decl->type)));
         named_type_map_[&enum_decl->name] = coded_types_.back().get();
         break;
     }