From 24aad163bc88cb10d2275385e9afc3de7f342d65 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Fri, 24 Apr 2015 19:19:30 -0700 Subject: Add namespace handling in attribute values Previously, you could only reference namespace prefixes in attribute names: table, std::shared_ptr resolver) : +Linker::Linker(std::shared_ptr table, std::shared_ptr resolver) : mTable(table), mResolver(resolver), mError(false) { } @@ -100,11 +102,15 @@ bool Linker::linkAndValidate() { } entry->entryId = nextIndex++; + std::u16string unmangledPackage = mTable->getPackage(); + std::u16string unmangledName = entry->name; + NameMangler::unmangle(&unmangledName, &unmangledPackage); + // Update callers of this resource with the right ID. auto callersIter = mGraph.find(ResourceNameRef{ - mTable->getPackage(), + unmangledPackage, type->type, - entry->name + unmangledName }); if (callersIter != std::end(mGraph)) { @@ -175,13 +181,14 @@ void Linker::processAttributeValue(const ResourceNameRef& name, const SourceLine // we called through the original value. auto onCreateReference = [&](const ResourceName& name) { - mTable->addResource(name, ConfigDescription{}, - source, util::make_unique()); + // We should never get here. All references would have been + // parsed in the parser phase. + assert(false); + //mTable->addResource(name, ConfigDescription{}, source, util::make_unique()); }; - convertedValue = ResourceParser::parseItemForAttribute( - *str.value, attr, mResolver->getDefaultPackage(), - onCreateReference); + convertedValue = ResourceParser::parseItemForAttribute(*str.value, attr, + onCreateReference); if (!convertedValue && attr.typeMask & android::ResTable_map::TYPE_STRING) { // Last effort is to parse as a string. util::StringBuilder builder; @@ -225,13 +232,13 @@ void Linker::visit(Style& style, ValueVisitorArgs& a) { } for (Style::Entry& styleEntry : style.entries) { - Maybe result = mResolver->findAttribute(styleEntry.key.name); + Maybe result = mResolver->findAttribute(styleEntry.key.name); if (!result || !result.value().attr) { addUnresolvedSymbol(styleEntry.key.name, args.source); continue; } - const Resolver::Entry& entry = result.value(); + const IResolver::Entry& entry = result.value(); if (entry.id.isValid()) { styleEntry.key.id = entry.id; } else { -- cgit v1.2.3-59-g8ed1b