Allow merging of resources with the same overlayable
If a resource is redefined with the same overlayable name, actor, and
policies, do not error.
Bug: 128843658
Test: m -j Launcher3 && aapt2_tests
Change-Id: I2c79f7d9fa7ff16b38ec41cec7e9804d39b372d5
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index a24e0d2f..c0802e6 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -138,17 +138,29 @@
if (src_entry->overlayable_item) {
if (dst_entry->overlayable_item) {
- // Do not allow a resource with an overlayable declaration to have that overlayable
- // declaration redefined
- context->GetDiagnostics()->Error(DiagMessage(src_entry->overlayable_item.value().source)
- << "duplicate overlayable declaration for resource '"
- << src_entry->name << "'");
- context->GetDiagnostics()->Error(DiagMessage(dst_entry->overlayable_item.value().source)
- << "previous declaration here");
- return false;
- } else {
- dst_entry->overlayable_item = std::move(src_entry->overlayable_item);
+ CHECK(src_entry->overlayable_item.value().overlayable != nullptr);
+ Overlayable* src_overlayable = src_entry->overlayable_item.value().overlayable.get();
+
+ CHECK(dst_entry->overlayable_item.value().overlayable != nullptr);
+ Overlayable* dst_overlayable = dst_entry->overlayable_item.value().overlayable.get();
+
+ if (src_overlayable->name != dst_overlayable->name
+ || src_overlayable->actor != dst_overlayable->actor
+ || src_entry->overlayable_item.value().policies !=
+ dst_entry->overlayable_item.value().policies) {
+
+ // Do not allow a resource with an overlayable declaration to have that overlayable
+ // declaration redefined.
+ context->GetDiagnostics()->Error(DiagMessage(src_entry->overlayable_item.value().source)
+ << "duplicate overlayable declaration for resource '"
+ << src_entry->name << "'");
+ context->GetDiagnostics()->Error(DiagMessage(dst_entry->overlayable_item.value().source)
+ << "previous declaration here");
+ return false;
+ }
}
+
+ dst_entry->overlayable_item = std::move(src_entry->overlayable_item);
}
return true;