Loading tools/aapt2/ResourceTable.cpp +24 −9 Original line number Diff line number Diff line Loading @@ -190,22 +190,32 @@ static constexpr const char16_t* kValidNameMangledChars = u"._-$"; bool ResourceTable::addResource(const ResourceNameRef& name, const ConfigDescription& config, std::unique_ptr<Value> value, IDiagnostics* diag) { return addResourceImpl(name, {}, config, std::move(value), kValidNameChars, diag); return addResourceImpl(name, {}, config, std::move(value), kValidNameChars, resolveValueCollision, diag); } bool ResourceTable::addResource(const ResourceNameRef& name, const ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, IDiagnostics* diag) { return addResourceImpl(name, resId, config, std::move(value), kValidNameChars, diag); return addResourceImpl(name, resId, config, std::move(value), kValidNameChars, resolveValueCollision, diag); } bool ResourceTable::addFileReference(const ResourceNameRef& name, const ConfigDescription& config, const Source& source, const StringPiece16& path, IDiagnostics* diag) { return addFileReference(name, config, source, path, resolveValueCollision, diag); } bool ResourceTable::addFileReference(const ResourceNameRef& name, const ConfigDescription& config, const Source& source, const StringPiece16& path, std::function<int(Value*,Value*)> conflictResolver, IDiagnostics* diag) { std::unique_ptr<FileReference> fileRef = util::make_unique<FileReference>( stringPool.makeRef(path)); fileRef->setSource(source); return addResourceImpl(name, ResourceId{}, config, std::move(fileRef), kValidNameChars, diag); return addResourceImpl(name, ResourceId{}, config, std::move(fileRef), kValidNameChars, conflictResolver, diag); } bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, Loading @@ -213,7 +223,7 @@ bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, std::unique_ptr<Value> value, IDiagnostics* diag) { return addResourceImpl(name, ResourceId{}, config, std::move(value), kValidNameMangledChars, diag); resolveValueCollision, diag); } bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, Loading @@ -221,12 +231,17 @@ bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, const ConfigDescription& config, std::unique_ptr<Value> value, IDiagnostics* diag) { return addResourceImpl(name, id, config, std::move(value), kValidNameMangledChars, diag); return addResourceImpl(name, id, config, std::move(value), kValidNameMangledChars, resolveValueCollision, diag); } bool ResourceTable::addResourceImpl(const ResourceNameRef& name, const ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, const char16_t* validChars, IDiagnostics* diag) { bool ResourceTable::addResourceImpl(const ResourceNameRef& name, const ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, const char16_t* validChars, std::function<int(Value*,Value*)> conflictResolver, IDiagnostics* diag) { assert(value && "value can't be nullptr"); assert(diag && "diagnostics can't be nullptr"); Loading Loading @@ -289,7 +304,7 @@ bool ResourceTable::addResourceImpl(const ResourceNameRef& name, const ResourceI // This resource did not exist before, add it. entry->values.insert(iter, ResourceConfigValue{ config, std::move(value) }); } else { int collisionResult = resolveValueCollision(iter->value.get(), value.get()); int collisionResult = conflictResolver(iter->value.get(), value.get()); if (collisionResult > 0) { // Take the incoming value. iter->value = std::move(value); Loading tools/aapt2/ResourceTable.h +14 −4 Original line number Diff line number Diff line Loading @@ -163,7 +163,12 @@ public: IDiagnostics* diag); bool addFileReference(const ResourceNameRef& name, const ConfigDescription& config, const Source& source, const StringPiece16& path, IDiagnostics* diag); const Source& source, const StringPiece16& path, IDiagnostics* diag); bool addFileReference(const ResourceNameRef& name, const ConfigDescription& config, const Source& source, const StringPiece16& path, std::function<int(Value*,Value*)> conflictResolver, IDiagnostics* diag); /** * Same as addResource, but doesn't verify the validity of the name. This is used Loading Loading @@ -221,9 +226,14 @@ public: private: ResourceTablePackage* findOrCreatePackage(const StringPiece16& name); bool addResourceImpl(const ResourceNameRef& name, ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, const char16_t* validChars, IDiagnostics* diag); bool addResourceImpl(const ResourceNameRef& name, ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, const char16_t* validChars, std::function<int(Value*,Value*)> conflictResolver, IDiagnostics* diag); bool setSymbolStateImpl(const ResourceNameRef& name, ResourceId resId, const Symbol& symbol, const char16_t* validChars, IDiagnostics* diag); }; Loading Loading
tools/aapt2/ResourceTable.cpp +24 −9 Original line number Diff line number Diff line Loading @@ -190,22 +190,32 @@ static constexpr const char16_t* kValidNameMangledChars = u"._-$"; bool ResourceTable::addResource(const ResourceNameRef& name, const ConfigDescription& config, std::unique_ptr<Value> value, IDiagnostics* diag) { return addResourceImpl(name, {}, config, std::move(value), kValidNameChars, diag); return addResourceImpl(name, {}, config, std::move(value), kValidNameChars, resolveValueCollision, diag); } bool ResourceTable::addResource(const ResourceNameRef& name, const ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, IDiagnostics* diag) { return addResourceImpl(name, resId, config, std::move(value), kValidNameChars, diag); return addResourceImpl(name, resId, config, std::move(value), kValidNameChars, resolveValueCollision, diag); } bool ResourceTable::addFileReference(const ResourceNameRef& name, const ConfigDescription& config, const Source& source, const StringPiece16& path, IDiagnostics* diag) { return addFileReference(name, config, source, path, resolveValueCollision, diag); } bool ResourceTable::addFileReference(const ResourceNameRef& name, const ConfigDescription& config, const Source& source, const StringPiece16& path, std::function<int(Value*,Value*)> conflictResolver, IDiagnostics* diag) { std::unique_ptr<FileReference> fileRef = util::make_unique<FileReference>( stringPool.makeRef(path)); fileRef->setSource(source); return addResourceImpl(name, ResourceId{}, config, std::move(fileRef), kValidNameChars, diag); return addResourceImpl(name, ResourceId{}, config, std::move(fileRef), kValidNameChars, conflictResolver, diag); } bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, Loading @@ -213,7 +223,7 @@ bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, std::unique_ptr<Value> value, IDiagnostics* diag) { return addResourceImpl(name, ResourceId{}, config, std::move(value), kValidNameMangledChars, diag); resolveValueCollision, diag); } bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, Loading @@ -221,12 +231,17 @@ bool ResourceTable::addResourceAllowMangled(const ResourceNameRef& name, const ConfigDescription& config, std::unique_ptr<Value> value, IDiagnostics* diag) { return addResourceImpl(name, id, config, std::move(value), kValidNameMangledChars, diag); return addResourceImpl(name, id, config, std::move(value), kValidNameMangledChars, resolveValueCollision, diag); } bool ResourceTable::addResourceImpl(const ResourceNameRef& name, const ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, const char16_t* validChars, IDiagnostics* diag) { bool ResourceTable::addResourceImpl(const ResourceNameRef& name, const ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, const char16_t* validChars, std::function<int(Value*,Value*)> conflictResolver, IDiagnostics* diag) { assert(value && "value can't be nullptr"); assert(diag && "diagnostics can't be nullptr"); Loading Loading @@ -289,7 +304,7 @@ bool ResourceTable::addResourceImpl(const ResourceNameRef& name, const ResourceI // This resource did not exist before, add it. entry->values.insert(iter, ResourceConfigValue{ config, std::move(value) }); } else { int collisionResult = resolveValueCollision(iter->value.get(), value.get()); int collisionResult = conflictResolver(iter->value.get(), value.get()); if (collisionResult > 0) { // Take the incoming value. iter->value = std::move(value); Loading
tools/aapt2/ResourceTable.h +14 −4 Original line number Diff line number Diff line Loading @@ -163,7 +163,12 @@ public: IDiagnostics* diag); bool addFileReference(const ResourceNameRef& name, const ConfigDescription& config, const Source& source, const StringPiece16& path, IDiagnostics* diag); const Source& source, const StringPiece16& path, IDiagnostics* diag); bool addFileReference(const ResourceNameRef& name, const ConfigDescription& config, const Source& source, const StringPiece16& path, std::function<int(Value*,Value*)> conflictResolver, IDiagnostics* diag); /** * Same as addResource, but doesn't verify the validity of the name. This is used Loading Loading @@ -221,9 +226,14 @@ public: private: ResourceTablePackage* findOrCreatePackage(const StringPiece16& name); bool addResourceImpl(const ResourceNameRef& name, ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, const char16_t* validChars, IDiagnostics* diag); bool addResourceImpl(const ResourceNameRef& name, ResourceId resId, const ConfigDescription& config, std::unique_ptr<Value> value, const char16_t* validChars, std::function<int(Value*,Value*)> conflictResolver, IDiagnostics* diag); bool setSymbolStateImpl(const ResourceNameRef& name, ResourceId resId, const Symbol& symbol, const char16_t* validChars, IDiagnostics* diag); }; Loading