Resolve AidlTypeSpecifier with AidlDefinedType

After resolving, AidlTypeSpecifier has the reference
to associated AidlDefinedType.

Bug: n/a
Test: aidl_integration_test
Change-Id: I3520a60f38395ed3a2eab365ead4484df7ec4907
diff --git a/aidl_language.cpp b/aidl_language.cpp
index 728eb7f..33f6a2b 100644
--- a/aidl_language.cpp
+++ b/aidl_language.cpp
@@ -458,10 +458,15 @@
   if (result.is_resolved) {
     fully_qualified_name_ = result.canonical_name;
     split_name_ = Split(fully_qualified_name_, ".");
+    defined_type_ = result.defined_type;
   }
   return result.is_resolved;
 }
 
+const AidlDefinedType* AidlTypeSpecifier::GetDefinedType() const {
+  return defined_type_;
+}
+
 std::set<AidlAnnotation::Type> AidlTypeSpecifier::GetSupportedAnnotations() const {
   // kHide and kUnsupportedAppUsage are both method return annotations
   // which we don't distinguish from other type specifiers.
diff --git a/aidl_language.h b/aidl_language.h
index 7bc249b..53616b7 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -314,6 +314,8 @@
   bool LanguageSpecificCheckValid(const AidlTypenames& typenames, Options::Language lang) const;
   const AidlNode& AsAidlNode() const override { return *this; }
 
+  const AidlDefinedType* GetDefinedType() const;
+
  private:
   AidlTypeSpecifier(const AidlTypeSpecifier&) = default;
 
@@ -322,6 +324,7 @@
   bool is_array_;
   string comments_;
   vector<string> split_name_;
+  const AidlDefinedType* defined_type_;  // set when Resolve() for defined types
   mutable shared_ptr<AidlTypeSpecifier> array_base_;
 };
 
diff --git a/aidl_typenames.cpp b/aidl_typenames.cpp
index d431056..cd0a36d 100644
--- a/aidl_typenames.cpp
+++ b/aidl_typenames.cpp
@@ -215,15 +215,15 @@
   if (IsBuiltinTypename(type_name)) {
     auto found = kJavaLikeTypeToAidlType.find(type_name);
     if (found != kJavaLikeTypeToAidlType.end()) {
-      return {found->second, true};
+      return {found->second, true, nullptr};
     }
-    return {type_name, true};
+    return {type_name, true, nullptr};
   }
   const AidlDefinedType* defined_type = TryGetDefinedType(type_name);
   if (defined_type != nullptr) {
-    return {defined_type->GetCanonicalName(), true};
+    return {defined_type->GetCanonicalName(), true, defined_type};
   } else {
-    return {type_name, false};
+    return {type_name, false, nullptr};
   }
 }
 
diff --git a/aidl_typenames.h b/aidl_typenames.h
index 43ac82f..bd85530 100644
--- a/aidl_typenames.h
+++ b/aidl_typenames.h
@@ -69,6 +69,7 @@
   struct ResolvedTypename {
     std::string canonical_name;
     bool is_resolved;
+    const AidlDefinedType* defined_type;
   };
   ResolvedTypename ResolveTypename(const string& type_name) const;
   pair<bool, string> CanBeOutParameter(const AidlTypeSpecifier& type) const;
@@ -97,7 +98,7 @@
     const bool from_preprocessed;
   };
   DefinedImplResult TryGetDefinedTypeImpl(const string& type_name) const;
-  map<string, const AidlDefinedType*> defined_types_;
+  map<string, AidlDefinedType*> defined_types_;
   map<string, unique_ptr<AidlDefinedType>> preprocessed_types_;
   std::vector<std::unique_ptr<AidlDocument>> documents_;
 };