Make Reference::get follow const rules

Instead of having T* Reference::get() const, this change brings
const T* Reference::get() const and
      T* Reference::get()

Test: mma
Change-Id: I1c8834467acffd426c25aa9c0661c290a05d7a52
diff --git a/ArrayType.cpp b/ArrayType.cpp
index 6c65db1..34a9036 100644
--- a/ArrayType.cpp
+++ b/ArrayType.cpp
@@ -54,7 +54,7 @@
     return mElementType->canCheckEquality();
 }
 
-Type* ArrayType::getElementType() const {
+const Type* ArrayType::getElementType() const {
     return mElementType.get();
 }
 
diff --git a/ArrayType.h b/ArrayType.h
index d0498c3..175041f 100644
--- a/ArrayType.h
+++ b/ArrayType.h
@@ -36,7 +36,7 @@
     bool isArray() const override;
     bool canCheckEquality() const override;
 
-    Type* getElementType() const;
+    const Type* getElementType() const;
 
     void prependDimension(ConstantExpression *size);
     void appendDimension(ConstantExpression *size);
diff --git a/EnumType.cpp b/EnumType.cpp
index 58f5407..4826557 100644
--- a/EnumType.cpp
+++ b/EnumType.cpp
@@ -171,7 +171,7 @@
 
 BitFieldType::BitFieldType(Scope* parent) : TemplatedType(parent) {}
 
-BitFieldType* EnumType::getBitfieldType() const {
+const BitFieldType* EnumType::getBitfieldType() const {
     return mBitfieldType.get();
 }
 
@@ -803,7 +803,7 @@
     return "mask of " + mElementType->typeName();
 }
 
-bool BitFieldType::isCompatibleElementType(Type* elementType) const {
+bool BitFieldType::isCompatibleElementType(const Type* elementType) const {
     return elementType->isEnum();
 }
 
@@ -845,7 +845,7 @@
     out << "scalar_type: \""
         << mElementType->resolveToScalarType()->getVtsScalarType()
         << "\"\n";
-    out << "predefined_type: \"" << static_cast<NamedType*>(mElementType.get())->fullName()
+    out << "predefined_type: \"" << static_cast<const NamedType*>(mElementType.get())->fullName()
         << "\"\n";
     return OK;
 }
@@ -871,9 +871,9 @@
             true /* needsCast */);
 }
 
-EnumType* BitFieldType::getEnumType() const {
+const EnumType* BitFieldType::getEnumType() const {
     CHECK(mElementType->isEnum());
-    return static_cast<EnumType*>(mElementType.get());
+    return static_cast<const EnumType*>(mElementType.get());
 }
 
 // a bitfield maps to the underlying scalar type in C++, so operator<< is
diff --git a/EnumType.h b/EnumType.h
index fbcab93..d565fcd 100644
--- a/EnumType.h
+++ b/EnumType.h
@@ -58,7 +58,7 @@
     std::string getVtsType() const override;
 
     // Return the type that corresponds to bitfield<T>.
-    BitFieldType *getBitfieldType() const;
+    const BitFieldType* getBitfieldType() const;
 
     std::vector<const Reference<Type>*> getReferences() const override;
     std::vector<const ConstantExpression*> getConstantExpressions() const override;
@@ -163,7 +163,7 @@
 
     bool isBitField() const override;
 
-    bool isCompatibleElementType(Type *elementType) const override;
+    bool isCompatibleElementType(const Type* elementType) const override;
 
     bool isElidableType() const override;
 
@@ -182,7 +182,7 @@
 
     std::string getVtsType() const override;
 
-    EnumType *getEnumType() const;
+    const EnumType* getEnumType() const;
 
     status_t emitVtsAttributeType(Formatter &out) const override;
 
diff --git a/FmqType.cpp b/FmqType.cpp
index 8b5f77d..51d0bd9 100644
--- a/FmqType.cpp
+++ b/FmqType.cpp
@@ -159,7 +159,7 @@
     return true;
 }
 
-bool FmqType::isCompatibleElementType(Type *elementType) const {
+bool FmqType::isCompatibleElementType(const Type* elementType) const {
     return (!elementType->isInterface() && !elementType->needsEmbeddedReadWrite());
 }
 
diff --git a/FmqType.h b/FmqType.h
index 27bb1ac..88b991a 100644
--- a/FmqType.h
+++ b/FmqType.h
@@ -60,7 +60,7 @@
 
     bool needsEmbeddedReadWrite() const override;
     bool resultNeedsDeref() const override;
-    bool isCompatibleElementType(Type *elementType) const override;
+    bool isCompatibleElementType(const Type* elementType) const override;
 
     std::string getVtsType() const override;
     std::string getVtsValueName() const override;
diff --git a/Interface.cpp b/Interface.cpp
index 7f33928..1ae6638 100644
--- a/Interface.cpp
+++ b/Interface.cpp
@@ -610,7 +610,7 @@
         // that would be caught in validate
         return nullptr;
     }
-    return static_cast<Interface*>(mSuperType.get());
+    return static_cast<const Interface*>(mSuperType.get());
 }
 
 std::vector<const Interface *> Interface::typeChain() const {
diff --git a/RefType.cpp b/RefType.cpp
index cba02b2..441a38f 100644
--- a/RefType.cpp
+++ b/RefType.cpp
@@ -42,7 +42,7 @@
     return "ref_value";
 }
 
-bool RefType::isCompatibleElementType(Type *elementType) const {
+bool RefType::isCompatibleElementType(const Type* elementType) const {
     if (elementType->isScalar()) {
         return true;
     }
@@ -55,15 +55,17 @@
     if (elementType->isBitField()) {
         return true;
     }
-    if (elementType->isCompoundType()
-            && static_cast<CompoundType *>(elementType)->style() == CompoundType::STYLE_STRUCT) {
+    if (elementType->isCompoundType() &&
+        static_cast<const CompoundType*>(elementType)->style() == CompoundType::STYLE_STRUCT) {
         return true;
     }
     if (elementType->isTemplatedType()) {
-        return this->isCompatibleElementType(static_cast<TemplatedType *>(elementType)->getElementType());
+        return this->isCompatibleElementType(
+            static_cast<const TemplatedType*>(elementType)->getElementType());
     }
     if (elementType->isArray()) {
-        return this->isCompatibleElementType(static_cast<ArrayType *>(elementType)->getElementType());
+        return this->isCompatibleElementType(
+            static_cast<const ArrayType*>(elementType)->getElementType());
     }
     return false;
 }
diff --git a/RefType.h b/RefType.h
index 58ed4cf..3af6424 100644
--- a/RefType.h
+++ b/RefType.h
@@ -29,7 +29,8 @@
     RefType(Scope* parent);
 
     std::string typeName() const override;
-    bool isCompatibleElementType(Type *elementType) const override;
+
+    bool isCompatibleElementType(const Type* elementType) const override;
 
     std::vector<const Reference<Type>*> getStrongReferences() const override;
 
diff --git a/Reference.h b/Reference.h
index ed60960..13f209a 100644
--- a/Reference.h
+++ b/Reference.h
@@ -48,9 +48,14 @@
        Referred type's field might be not resolved */
     bool isResolved() const { return mResolved != nullptr; }
 
-    T* operator->() const { return get(); }
+    T* operator->() { return get(); }
+    const T* operator->() const { return get(); }
 
-    T* get() const {
+    T* get() {
+        CHECK(mResolved != nullptr);
+        return mResolved;
+    }
+    const T* get() const {
         CHECK(mResolved != nullptr);
         return mResolved;
     }
diff --git a/Type.cpp b/Type.cpp
index ecaca13..82efab2 100644
--- a/Type.cpp
+++ b/Type.cpp
@@ -182,8 +182,7 @@
     }
 
     for (const auto* nextRef : getReferences()) {
-        const auto* nextType = nextRef->get();
-        err = nextType->recursivePass(func, visited);
+        err = (*nextRef)->recursivePass(func, visited);
         if (err != OK) return err;
     }
 
@@ -640,7 +639,7 @@
     mElementType = elementType;
 }
 
-Type* TemplatedType::getElementType() const {
+const Type* TemplatedType::getElementType() const {
     return mElementType.get();
 }
 
diff --git a/Type.h b/Type.h
index 57a77cf..b5b3a3e 100644
--- a/Type.h
+++ b/Type.h
@@ -314,11 +314,11 @@
 /* Base type for VectorType and RefType. */
 struct TemplatedType : public Type {
     void setElementType(const Reference<Type>& elementType);
-    Type* getElementType() const;
+    const Type* getElementType() const;
 
     bool isTemplatedType() const override;
 
-    virtual bool isCompatibleElementType(Type* elementType) const = 0;
+    virtual bool isCompatibleElementType(const Type* elementType) const = 0;
 
     std::vector<const Reference<Type>*> getReferences() const override;
 
diff --git a/TypeDef.cpp b/TypeDef.cpp
index 8ecfe54..8481cad 100644
--- a/TypeDef.cpp
+++ b/TypeDef.cpp
@@ -30,7 +30,11 @@
     return NULL;
 }
 
-Type* TypeDef::referencedType() const {
+Type* TypeDef::referencedType() {
+    return mReferencedType.get();
+}
+
+const Type* TypeDef::referencedType() const {
     return mReferencedType.get();
 }
 
diff --git a/TypeDef.h b/TypeDef.h
index e6af502..cb11997 100644
--- a/TypeDef.h
+++ b/TypeDef.h
@@ -30,7 +30,8 @@
 
     std::string typeName() const override;
 
-    Type* referencedType() const;
+    Type* referencedType();
+    const Type* referencedType() const;
 
     bool isInterface() const override;
     bool isEnum() const override;
diff --git a/VectorType.cpp b/VectorType.cpp
index e279daf..aa50fae 100644
--- a/VectorType.cpp
+++ b/VectorType.cpp
@@ -31,7 +31,7 @@
     return "vector of " + mElementType->typeName();
 }
 
-bool VectorType::isCompatibleElementType(Type *elementType) const {
+bool VectorType::isCompatibleElementType(const Type* elementType) const {
     if (elementType->isScalar()) {
         return true;
     }
@@ -44,8 +44,8 @@
     if (elementType->isBitField()) {
         return true;
     }
-    if (elementType->isCompoundType()
-            && static_cast<CompoundType *>(elementType)->style() == CompoundType::STYLE_STRUCT) {
+    if (elementType->isCompoundType() &&
+        static_cast<const CompoundType*>(elementType)->style() == CompoundType::STYLE_STRUCT) {
         return true;
     }
     if (elementType->isInterface()) {
@@ -58,11 +58,11 @@
         return true;
     }
     if (elementType->isTemplatedType()) {
-        Type *inner = static_cast<TemplatedType *>(elementType)->getElementType();
+        const Type* inner = static_cast<const TemplatedType*>(elementType)->getElementType();
         return this->isCompatibleElementType(inner) && !inner->isInterface();
     }
     if (elementType->isArray()) {
-        Type *inner = static_cast<ArrayType *>(elementType)->getElementType();
+        const Type* inner = static_cast<const ArrayType*>(elementType)->getElementType();
         return this->isCompatibleElementType(inner) && !inner->isInterface();
     }
     return false;
@@ -728,7 +728,7 @@
     }
 
     if (mElementType->isArray()) {
-        return static_cast<ArrayType*>(mElementType.get())->countDimensions() == 1;
+        return static_cast<const ArrayType*>(mElementType.get())->countDimensions() == 1;
     }
 
     if (mElementType->isVector()) {
diff --git a/VectorType.h b/VectorType.h
index edb5e1c..0623496 100644
--- a/VectorType.h
+++ b/VectorType.h
@@ -30,8 +30,9 @@
 
     bool isVector() const override;
     bool isVectorOfBinders() const;
+
     std::string typeName() const override;
-    bool isCompatibleElementType(Type *elementType) const override;
+    bool isCompatibleElementType(const Type* elementType) const override;
 
     std::vector<const Reference<Type>*> getStrongReferences() const override;