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_;
};