Nested types know its parent/root/document.
AidlDefinedType::GetRootType() returns its parent type defined in a
document's root. AidlDefinedType::GetDocument() returns the document
where the type is defined.
Bug: 182508839
Test: aidl_unittest
Change-Id: I0e5e5ea304df814ca527dc3d4cdac77414c98b1b
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index a7de571..f296ce7 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -1474,6 +1474,40 @@
EXPECT_EQ("::p::IOuter::Inner", cpp::CppNameOf(nested_type, typenames_));
}
+TEST_F(AidlTest, DefinedTypeKnowsItsParentScope) {
+ const string input_path = "p/IFoo.aidl";
+ const string input =
+ "package p;\n"
+ "interface IFoo {\n"
+ " parcelable Inner {\n"
+ " enum Enum { A }\n"
+ " }\n"
+ "}";
+ CaptureStderr();
+ EXPECT_NE(nullptr, Parse(input_path, input, typenames_, Options::Language::CPP));
+ EXPECT_EQ(GetCapturedStderr(), "");
+
+ auto enum_type = typenames_.ResolveTypename("p.IFoo.Inner.Enum");
+ auto inner_type = typenames_.ResolveTypename("p.IFoo.Inner");
+ auto ifoo_type = typenames_.ResolveTypename("p.IFoo");
+ EXPECT_TRUE(enum_type.is_resolved);
+ EXPECT_TRUE(inner_type.is_resolved);
+ EXPECT_TRUE(ifoo_type.is_resolved);
+ // GetParentType()
+ EXPECT_EQ(inner_type.defined_type, enum_type.defined_type->GetParentType());
+ EXPECT_EQ(ifoo_type.defined_type, inner_type.defined_type->GetParentType());
+ EXPECT_EQ(nullptr, ifoo_type.defined_type->GetParentType());
+ // GetRootType()
+ EXPECT_EQ(ifoo_type.defined_type, enum_type.defined_type->GetRootType());
+ EXPECT_EQ(ifoo_type.defined_type, inner_type.defined_type->GetRootType());
+ EXPECT_EQ(ifoo_type.defined_type, ifoo_type.defined_type->GetRootType());
+ // GetDocument()
+ auto main_document = &typenames_.MainDocument();
+ EXPECT_EQ(main_document, &enum_type.defined_type->GetDocument());
+ EXPECT_EQ(main_document, &inner_type.defined_type->GetDocument());
+ EXPECT_EQ(main_document, &ifoo_type.defined_type->GetDocument());
+}
+
TEST_F(AidlTest, UnderstandsNestedTypesViaFullyQualifiedName) {
io_delegate_.SetFileContents("p/IOuter.aidl",
"package p;\n"