summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
author Michael Wachenschwanz <mwachens@google.com> 2017-10-30 19:06:23 -0700
committer Tenghui Zhu <ztenghui@google.com> 2017-10-31 23:13:03 +0000
commitc8f5fc284cc635f7056307e55121e439b21ac83a (patch)
tree5076d7cc590aa4cb8d7bada63302642d49acc421 /tools
parent49767aa7f70462cf4b6a1bcdf3832eb6e74f9d65 (diff)
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 7b6b02bd13aea90b938c3ab3b1eaa3fb5043f931)
Diffstat (limited to 'tools')
-rw-r--r--tools/aapt2/compile/InlineXmlFormatParser.cpp4
-rw-r--r--tools/aapt2/compile/InlineXmlFormatParser_test.cpp43
2 files changed, 47 insertions, 0 deletions
diff --git a/tools/aapt2/compile/InlineXmlFormatParser.cpp b/tools/aapt2/compile/InlineXmlFormatParser.cpp
index 857cdd5365a0..73a90da6baf0 100644
--- a/tools/aapt2/compile/InlineXmlFormatParser.cpp
+++ b/tools/aapt2/compile/InlineXmlFormatParser.cpp
@@ -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());
}
}
diff --git a/tools/aapt2/compile/InlineXmlFormatParser_test.cpp b/tools/aapt2/compile/InlineXmlFormatParser_test.cpp
index de7739ada407..a4c602c29b86 100644
--- a/tools/aapt2/compile/InlineXmlFormatParser_test.cpp
+++ b/tools/aapt2/compile/InlineXmlFormatParser_test.cpp
@@ -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