AAPT2: Allow for nested inline xmls

Add recursion to InlineXmlFormatParser::Consume for handling nested
aapt:attr

Change-Id: Iabf98945b4f5ef22a3b8fdc4ca2bac092a377629
Fixes: 64385167
Test: make aapt2_tests
(cherry picked from commit 7b6b02bd13)
This commit is contained in:
Michael Wachenschwanz
2017-10-30 19:06:23 -07:00
committed by Tenghui Zhu
parent 49767aa7f7
commit c8f5fc284c
2 changed files with 47 additions and 0 deletions

View File

@@ -146,6 +146,10 @@ bool InlineXmlFormatParser::Consume(IAaptContext* context, xml::XmlResource* doc
} else {
new_doc->root.reset(static_cast<xml::Element*>(child.release()));
new_doc->root->parent = nullptr;
// Copy down the namespace declarations
new_doc->root->namespace_decls = doc->root->namespace_decls;
// Recurse for nested inlines
Consume(context, new_doc.get());
}
}

View File

@@ -137,4 +137,47 @@ TEST(InlineXmlFormatParserTest, ExtractTwoXmlResources) {
EXPECT_THAT(extracted_doc_drawable->root->name, StrEq("vector"));
}
TEST(InlineXmlFormatParserTest, ExtractNestedXmlResources) {
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"(
<base_root xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="inline_xml">
<inline_root>
<aapt:attr name="nested_inline_xml">
<nested_inline_root/>
</aapt:attr>
<aapt:attr name="another_nested_inline_xml">
<root/>
</aapt:attr>
</inline_root>
</aapt:attr>
<aapt:attr name="turtles">
<root1>
<aapt:attr name="all">
<root2>
<aapt:attr name="the">
<root3>
<aapt:attr name="way">
<root4>
<aapt:attr name="down">
<root5/>
</aapt:attr>
</root4>
</aapt:attr>
</root3>
</aapt:attr>
</root2>
</aapt:attr>
</root1>
</aapt:attr>
</base_root>)");
doc->file.name = test::ParseNameOrDie("layout/main");
InlineXmlFormatParser parser;
ASSERT_TRUE(parser.Consume(context.get(), doc.get()));
// Confirm that all of the nested inline xmls are parsed out.
ASSERT_THAT(parser.GetExtractedInlineXmlDocuments(), SizeIs(8u));
}
} // namespace aapt