diff options
author | 2015-11-16 15:59:10 -0800 | |
---|---|---|
committer | 2015-11-16 15:59:10 -0800 | |
commit | abf83cbe4f63cd76043aab89cd0e08525560fea2 (patch) | |
tree | 1fbe581590f001d5af1c63ae8126aad1e9ea6d77 | |
parent | cf95a580149ec03588b1c75f036c924730f83615 (diff) |
AAPT2: Prevent duplicate enums/flags
Change-Id: I998cba12ac194000e9c778cb620ed7ab33003e7d
-rw-r--r-- | tools/aapt2/ResourceParser.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp index f2a1878d0dc5..d292f623a33e 100644 --- a/tools/aapt2/ResourceParser.cpp +++ b/tools/aapt2/ResourceParser.cpp @@ -747,7 +747,13 @@ bool ResourceParser::parseAttrImpl(XmlPullParser* parser, ParsedResource* outRes } } - std::vector<Attribute::Symbol> items; + struct SymbolComparator { + bool operator()(const Attribute::Symbol& a, const Attribute::Symbol& b) { + return a.symbol.name.value() < b.symbol.name.value(); + } + }; + + std::set<Attribute::Symbol, SymbolComparator> items; std::u16string comment; bool error = false; @@ -785,15 +791,27 @@ bool ResourceParser::parseAttrImpl(XmlPullParser* parser, ParsedResource* outRes } if (Maybe<Attribute::Symbol> s = parseEnumOrFlagItem(parser, elementName)) { + Attribute::Symbol& symbol = s.value(); ParsedResource childResource; - childResource.name = s.value().symbol.name.value(); + childResource.name = symbol.symbol.name.value(); childResource.source = itemSource; childResource.value = util::make_unique<Id>(); outResource->childResources.push_back(std::move(childResource)); - s.value().symbol.setComment(std::move(comment)); - s.value().symbol.setSource(itemSource); - items.push_back(std::move(s.value())); + symbol.symbol.setComment(std::move(comment)); + symbol.symbol.setSource(itemSource); + + auto insertResult = items.insert(std::move(symbol)); + if (!insertResult.second) { + const Attribute::Symbol& existingSymbol = *insertResult.first; + mDiag->error(DiagMessage(itemSource) + << "duplicate symbol '" << existingSymbol.symbol.name.value().entry + << "'"); + + mDiag->note(DiagMessage(existingSymbol.symbol.getSource()) + << "first defined here"); + error = true; + } } else { error = true; } @@ -810,7 +828,7 @@ bool ResourceParser::parseAttrImpl(XmlPullParser* parser, ParsedResource* outRes } std::unique_ptr<Attribute> attr = util::make_unique<Attribute>(weak); - attr->symbols.swap(items); + attr->symbols = std::vector<Attribute::Symbol>(items.begin(), items.end()); attr->typeMask = typeMask ? typeMask : uint32_t(android::ResTable_map::TYPE_ANY); outResource->value = std::move(attr); return true; |