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/EnumType.h b/EnumType.h
index 39051bb..8090e92 100644
--- a/EnumType.h
+++ b/EnumType.h
@@ -19,7 +19,7 @@
 #define ENUM_TYPE_H_
 
 #include "ConstantExpression.h"
-#include "NamedType.h"
+#include "Scope.h"
 
 #include <vector>
 
@@ -27,13 +27,15 @@
 
 struct EnumValue;
 
-struct EnumType : public NamedType {
+struct EnumType : public Scope {
     EnumType(const char *localName,
-             std::vector<EnumValue *> *values,
              Type *storageType = NULL);
 
     const Type *storageType() const;
     const std::vector<EnumValue *> &values() const;
+    void addValue(EnumValue *value);
+
+    LocalIdentifier *lookupIdentifier(const std::string &name) const override;
 
     const ScalarType *resolveToScalarType() const override;
 
@@ -79,24 +81,30 @@
 
 private:
     void getTypeChain(std::vector<const EnumType *> *out) const;
-    std::vector<EnumValue *> *mValues;
+    std::vector<EnumValue *> mValues;
     Type *mStorageType;
 
     DISALLOW_COPY_AND_ASSIGN(EnumType);
 };
 
-struct EnumValue {
-    EnumValue(const char *name, const ConstantExpression *value = nullptr);
+struct EnumValue : public LocalIdentifier {
+    EnumValue(const char *name, ConstantExpression *value = nullptr);
 
     std::string name() const;
     std::string value() const;
     std::string cppValue(ScalarType::Kind castKind) const;
     std::string javaValue(ScalarType::Kind castKind) const;
     std::string comment() const;
+    void autofill(const EnumValue *prev, const ScalarType *type);
+    ConstantExpression *constExpr() const;
 
-private:
+    bool isAutoFill() const;
+    bool isEnumValue() const override;
+
+
     std::string mName;
-    const ConstantExpression *mValue;
+    ConstantExpression *mValue;
+    bool mIsAutoFill;
 
     DISALLOW_COPY_AND_ASSIGN(EnumValue);
 };