diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp index 7103944bc12e0..f47d66ea5e87e 100644 --- a/tools/aapt2/Debug.cpp +++ b/tools/aapt2/Debug.cpp @@ -80,7 +80,7 @@ class ValueHeadlinePrinter : public ConstValueVisitor { printer_->Print(parent_name.package); printer_->Print(":"); } - printer_->Print(to_string(parent_name.type)); + printer_->Print(parent_name.type.to_string()); printer_->Print("/"); printer_->Print(parent_name.entry); if (parent_ref.id) { diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h index d394b24d9947a..b41d8514230bb 100644 --- a/tools/aapt2/Resource.h +++ b/tools/aapt2/Resource.h @@ -128,10 +128,12 @@ std::optional ParseResourceNamedType(const android::String */ struct ResourceName { std::string package; - ResourceType type = ResourceType::kRaw; + ResourceNamedType type; std::string entry; ResourceName() = default; + ResourceName(const android::StringPiece& p, const ResourceNamedTypeRef& t, + const android::StringPiece& e); ResourceName(const android::StringPiece& p, ResourceType t, const android::StringPiece& e); int compare(const ResourceName& other) const; @@ -148,13 +150,15 @@ struct ResourceName { */ struct ResourceNameRef { android::StringPiece package; - ResourceType type = ResourceType::kRaw; + ResourceNamedTypeRef type; android::StringPiece entry; ResourceNameRef() = default; ResourceNameRef(const ResourceNameRef&) = default; ResourceNameRef(ResourceNameRef&&) = default; ResourceNameRef(const ResourceName& rhs); // NOLINT(google-explicit-constructor) + ResourceNameRef(const android::StringPiece& p, const ResourceNamedTypeRef& t, + const android::StringPiece& e); ResourceNameRef(const android::StringPiece& p, ResourceType t, const android::StringPiece& e); ResourceNameRef& operator=(const ResourceNameRef& rhs) = default; ResourceNameRef& operator=(ResourceNameRef&& rhs) = default; @@ -418,14 +422,20 @@ inline ::std::ostream& operator<<(::std::ostream& out, const ResourceNamedTypeRe // ResourceName implementation. // +inline ResourceName::ResourceName(const android::StringPiece& p, const ResourceNamedTypeRef& t, + const android::StringPiece& e) + : package(p.to_string()), type(t.ToResourceNamedType()), entry(e.to_string()) { +} + inline ResourceName::ResourceName(const android::StringPiece& p, ResourceType t, const android::StringPiece& e) - : package(p.to_string()), type(t), entry(e.to_string()) {} + : ResourceName(p, ResourceNamedTypeWithDefaultName(t), e) { +} inline int ResourceName::compare(const ResourceName& other) const { int cmp = package.compare(other.package); if (cmp != 0) return cmp; - cmp = static_cast(type) - static_cast(other.type); + cmp = type.compare(other.type); if (cmp != 0) return cmp; cmp = entry.compare(other.entry); return cmp; @@ -461,9 +471,16 @@ inline ::std::ostream& operator<<(::std::ostream& out, const ResourceName& name) inline ResourceNameRef::ResourceNameRef(const ResourceName& rhs) : package(rhs.package), type(rhs.type), entry(rhs.entry) {} +inline ResourceNameRef::ResourceNameRef(const android::StringPiece& p, + const ResourceNamedTypeRef& t, + const android::StringPiece& e) + : package(p), type(t), entry(e) { +} + inline ResourceNameRef::ResourceNameRef(const android::StringPiece& p, ResourceType t, const android::StringPiece& e) - : package(p), type(t), entry(e) {} + : ResourceNameRef(p, ResourceNamedTypeWithDefaultName(t), e) { +} inline ResourceNameRef& ResourceNameRef::operator=(const ResourceName& rhs) { package = rhs.package; @@ -520,7 +537,7 @@ struct hash { size_t operator()(const aapt::ResourceName& name) const { android::hash_t h = 0; h = android::JenkinsHashMix(h, static_cast(hash()(name.package))); - h = android::JenkinsHashMix(h, static_cast(name.type)); + h = android::JenkinsHashMix(h, static_cast(hash()(name.type.name))); h = android::JenkinsHashMix(h, static_cast(hash()(name.entry))); return static_cast(h); } diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp index 792a3066f4f6f..42715f9c35922 100644 --- a/tools/aapt2/ResourceParser.cpp +++ b/tools/aapt2/ResourceParser.cpp @@ -604,7 +604,8 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser, return false; } - out_resource->name.type = ResourceType::kId; + out_resource->name.type = + ResourceNamedTypeWithDefaultName(ResourceType::kId).ToResourceNamedType(); out_resource->name.entry = maybe_name.value().to_string(); // Ids either represent a unique resource id or reference another resource id @@ -623,7 +624,7 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser, // A null reference also means there is no inner element when ids are in the form: // out_resource->value = util::make_unique(); - } else if (!ref || ref->name.value().type != ResourceType::kId) { + } else if (!ref || ref->name.value().type.type != ResourceType::kId) { // If an inner element exists, the inner element must be a reference to another resource id diag_->Error(DiagMessage(out_resource->source) << "<" << parser->element_name() @@ -640,7 +641,8 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser, return false; } - out_resource->name.type = ResourceType::kMacro; + out_resource->name.type = + ResourceNamedTypeWithDefaultName(ResourceType::kMacro).ToResourceNamedType(); out_resource->name.entry = maybe_name.value().to_string(); return ParseMacro(parser, out_resource); } @@ -656,7 +658,8 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser, return false; } - out_resource->name.type = item_iter->second.type; + out_resource->name.type = + ResourceNamedTypeWithDefaultName(item_iter->second.type).ToResourceNamedType(); out_resource->name.entry = maybe_name.value().to_string(); // Only use the implied format of the type when there is no explicit format. @@ -699,7 +702,7 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser, if (can_be_item) { // Try parsing the elementName (or type) as a resource. These shall only be // resources like 'layout' or 'xml' and they can only be references. - const ResourceType* parsed_type = ParseResourceType(resource_type); + std::optional parsed_type = ParseResourceNamedType(resource_type); if (parsed_type) { if (!maybe_name) { diag_->Error(DiagMessage(out_resource->source) @@ -708,7 +711,7 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser, return false; } - out_resource->name.type = *parsed_type; + out_resource->name.type = parsed_type->ToResourceNamedType(); out_resource->name.entry = maybe_name.value().to_string(); out_resource->value = ParseXml(parser, android::ResTable_map::TYPE_REFERENCE, kNoRawString); if (!out_resource->value) { @@ -933,7 +936,7 @@ bool ResourceParser::ParsePublic(xml::XmlPullParser* parser, ParsedResource* out return false; } - const ResourceType* parsed_type = ParseResourceType(maybe_type.value()); + std::optional parsed_type = ParseResourceNamedType(maybe_type.value()); if (!parsed_type) { diag_->Error(DiagMessage(out_resource->source) << "invalid resource type '" << maybe_type.value() @@ -941,7 +944,7 @@ bool ResourceParser::ParsePublic(xml::XmlPullParser* parser, ParsedResource* out return false; } - out_resource->name.type = *parsed_type; + out_resource->name.type = parsed_type->ToResourceNamedType(); if (std::optional maybe_id_str = xml::FindNonEmptyAttribute(parser, "id")) { std::optional maybe_id = ResourceUtils::ParseResourceId(maybe_id_str.value()); @@ -953,7 +956,7 @@ bool ResourceParser::ParsePublic(xml::XmlPullParser* parser, ParsedResource* out out_resource->id = maybe_id.value(); } - if (*parsed_type == ResourceType::kId) { + if (parsed_type->type == ResourceType::kId) { // An ID marked as public is also the definition of an ID. out_resource->value = util::make_unique(); } @@ -978,7 +981,7 @@ bool static ParseGroupImpl(xml::XmlPullParser* parser, ParsedResource* out_resou return false; } - const ResourceType* parsed_type = ParseResourceType(maybe_type.value()); + std::optional parsed_type = ParseResourceNamedType(maybe_type.value()); if (!parsed_type) { diag->Error(DiagMessage(out_resource->source) << "invalid resource type '" << maybe_type.value() << "' in <" << tag_name << ">"); @@ -1096,7 +1099,7 @@ bool ResourceParser::ParseSymbolImpl(xml::XmlPullParser* parser, return false; } - const ResourceType* parsed_type = ParseResourceType(maybe_type.value()); + std::optional parsed_type = ParseResourceNamedType(maybe_type.value()); if (!parsed_type) { diag_->Error(DiagMessage(out_resource->source) << "invalid resource type '" << maybe_type.value() << "' in <" @@ -1104,7 +1107,7 @@ bool ResourceParser::ParseSymbolImpl(xml::XmlPullParser* parser, return false; } - out_resource->name.type = *parsed_type; + out_resource->name.type = parsed_type->ToResourceNamedType(); return true; } @@ -1208,8 +1211,8 @@ bool ResourceParser::ParseOverlayable(xml::XmlPullParser* parser, ParsedResource continue; } - const ResourceType* type = ParseResourceType(item_type.value()); - if (type == nullptr) { + std::optional type = ParseResourceNamedType(item_type.value()); + if (!type) { diag_->Error(DiagMessage(element_source) << "invalid resource type '" << item_type.value() << "' in within an "); @@ -1223,7 +1226,7 @@ bool ResourceParser::ParseOverlayable(xml::XmlPullParser* parser, ParsedResource overlayable_item.source = element_source; ParsedResource child_resource{}; - child_resource.name.type = *type; + child_resource.name.type = type->ToResourceNamedType(); child_resource.name.entry = item_name.value().to_string(); child_resource.overlayable_item = overlayable_item; out_resource->child_resources.push_back(std::move(child_resource)); @@ -1289,7 +1292,8 @@ bool ResourceParser::ParseAttr(xml::XmlPullParser* parser, bool ResourceParser::ParseAttrImpl(xml::XmlPullParser* parser, ParsedResource* out_resource, bool weak) { - out_resource->name.type = ResourceType::kAttr; + out_resource->name.type = + ResourceNamedTypeWithDefaultName(ResourceType::kAttr).ToResourceNamedType(); // Attributes only end up in default configuration. if (out_resource->config != ConfigDescription::DefaultConfig()) { @@ -1475,7 +1479,8 @@ std::optional ResourceParser::ParseEnumOrFlagItem(xml::XmlPul } return Attribute::Symbol{ - Reference(ResourceNameRef({}, ResourceType::kId, maybe_name.value())), + Reference(ResourceNameRef({}, ResourceNamedTypeWithDefaultName(ResourceType::kId), + maybe_name.value())), val.data, val.dataType}; } @@ -1509,7 +1514,7 @@ bool ResourceParser::ParseStyleItem(xml::XmlPullParser* parser, Style* style) { bool ResourceParser::ParseStyle(const ResourceType type, xml::XmlPullParser* parser, ParsedResource* out_resource) { - out_resource->name.type = type; + out_resource->name.type = ResourceNamedTypeWithDefaultName(type).ToResourceNamedType(); std::unique_ptr