Resolve constant expressions for external constants.

* Allow constant expressions to be used as array sizes
  and as annotation values.

Bug: 31592132 allow constant expressions to be used as array sizes.
Bug: 31628863 Autofill values for enum type

Test: `make android.hardware.tests.expression@1.0` compiles
  and generates enum class Color with autofilled values.
Test: `make hidl_test_java` succeeds.
Test: `make hidl_test && adb sync && adb shell hidl_test` succeeds.
Test: `mma`

Change-Id: I57377ec608503d4741d305e98144264b07973055
diff --git a/ArrayType.h b/ArrayType.h
index a14e02c..c0adbde 100644
--- a/ArrayType.h
+++ b/ArrayType.h
@@ -24,17 +24,19 @@
 
 namespace android {
 
+struct ConstantExpression;
+
 struct ArrayType : public Type {
     // Extends existing array by adding another dimension.
-    ArrayType(ArrayType *srcArray, size_t size);
+    ArrayType(ArrayType *srcArray, ConstantExpression *size);
 
-    ArrayType(Type *elementType, size_t size);
+    ArrayType(Type *elementType, ConstantExpression *size);
 
-    static ArrayType *AddDimension(ArrayType *base, size_t size);
+    static ArrayType *AddDimension(ArrayType *base, ConstantExpression *size);
 
     bool isArray() const override;
 
-    void addDimension(size_t size);
+    void addDimension(ConstantExpression *size);
 
     std::string getCppType(StorageMode mode,
                            std::string *extra,
@@ -94,6 +96,7 @@
 private:
     Type *mElementType;
     std::vector<size_t> mSizes;
+    std::vector<std::string> mSizeComments;
 
     DISALLOW_COPY_AND_ASSIGN(ArrayType);
 };