diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp index cbb652ed9a1a2..1d122db9990fc 100644 --- a/tools/aapt2/xml/XmlDom.cpp +++ b/tools/aapt2/xml/XmlDom.cpp @@ -274,6 +274,8 @@ std::unique_ptr Inflate(const void* data, size_t data_len, IDiagnos switch (code) { case ResXMLParser::START_NAMESPACE: { NamespaceDecl decl; + decl.line_number = tree.getLineNumber(); + size_t len; const char16_t* str16 = tree.getNamespacePrefix(&len); if (str16) { @@ -288,6 +290,7 @@ std::unique_ptr Inflate(const void* data, size_t data_len, IDiagnos if (pending_element == nullptr) { pending_element = util::make_unique(); } + pending_element->namespace_decls.push_back(std::move(decl)); break; } @@ -297,8 +300,8 @@ std::unique_ptr Inflate(const void* data, size_t data_len, IDiagnos el = std::move(pending_element); } else { el = util::make_unique(); - ; } + el->line_number = tree.getLineNumber(); size_t len; const char16_t* str16 = tree.getElementNamespace(&len); diff --git a/tools/aapt2/xml/XmlDom_test.cpp b/tools/aapt2/xml/XmlDom_test.cpp index 6ed2d616f7828..b501cfd4b8b98 100644 --- a/tools/aapt2/xml/XmlDom_test.cpp +++ b/tools/aapt2/xml/XmlDom_test.cpp @@ -18,6 +18,7 @@ #include +#include "flatten/XmlFlattener.h" #include "io/StringInputStream.h" #include "test/Test.h" @@ -51,6 +52,36 @@ TEST(XmlDomTest, Inflate) { EXPECT_THAT(el->namespace_decls[0].prefix, StrEq("android")); } +TEST(XmlDomTest, BinaryInflate) { + std::unique_ptr context = test::ContextBuilder().Build(); + std::unique_ptr doc = util::make_unique(); + doc->root = util::make_unique(); + doc->root->name = "Layout"; + doc->root->line_number = 2u; + + NamespaceDecl decl; + decl.uri = kSchemaAndroid; + decl.prefix = "android"; + decl.line_number = 2u; + doc->root->namespace_decls.push_back(decl); + + BigBuffer buffer(4096); + XmlFlattener flattener(&buffer, {}); + ASSERT_TRUE(flattener.Consume(context.get(), doc.get())); + + auto block = util::Copy(buffer); + std::unique_ptr new_doc = + Inflate(block.get(), buffer.size(), context->GetDiagnostics(), Source("test.xml")); + ASSERT_THAT(new_doc, NotNull()); + + EXPECT_THAT(new_doc->root->name, StrEq("Layout")); + EXPECT_THAT(new_doc->root->line_number, Eq(2u)); + ASSERT_THAT(new_doc->root->namespace_decls, SizeIs(1u)); + EXPECT_THAT(new_doc->root->namespace_decls[0].uri, StrEq(kSchemaAndroid)); + EXPECT_THAT(new_doc->root->namespace_decls[0].prefix, StrEq("android")); + EXPECT_THAT(new_doc->root->namespace_decls[0].line_number, Eq(2u)); +} + // Escaping is handled after parsing of the values for resource-specific values. TEST(XmlDomTest, ForwardEscapes) { std::unique_ptr doc = test::BuildXmlDom(R"(