xref: /aosp_15_r20/frameworks/base/tools/aapt2/Resource.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #include "Resource.h"
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include <map>
20*d57664e9SAndroid Build Coastguard Worker #include <sstream>
21*d57664e9SAndroid Build Coastguard Worker #include <string>
22*d57664e9SAndroid Build Coastguard Worker 
23*d57664e9SAndroid Build Coastguard Worker #include "android-base/stringprintf.h"
24*d57664e9SAndroid Build Coastguard Worker 
25*d57664e9SAndroid Build Coastguard Worker using ::android::StringPiece;
26*d57664e9SAndroid Build Coastguard Worker using ::android::base::StringPrintf;
27*d57664e9SAndroid Build Coastguard Worker 
28*d57664e9SAndroid Build Coastguard Worker namespace aapt {
29*d57664e9SAndroid Build Coastguard Worker 
to_string() const30*d57664e9SAndroid Build Coastguard Worker std::string ResourceId::to_string() const {
31*d57664e9SAndroid Build Coastguard Worker   return StringPrintf("0x%08x", id);
32*d57664e9SAndroid Build Coastguard Worker }
33*d57664e9SAndroid Build Coastguard Worker 
to_string() const34*d57664e9SAndroid Build Coastguard Worker std::string ResourceName::to_string() const {
35*d57664e9SAndroid Build Coastguard Worker   return ResourceNameRef(*this).to_string();
36*d57664e9SAndroid Build Coastguard Worker }
37*d57664e9SAndroid Build Coastguard Worker 
to_string() const38*d57664e9SAndroid Build Coastguard Worker std::string ResourceNameRef::to_string() const {
39*d57664e9SAndroid Build Coastguard Worker   std::ostringstream str_stream;
40*d57664e9SAndroid Build Coastguard Worker   if (!package.empty()) {
41*d57664e9SAndroid Build Coastguard Worker     str_stream << package << ":";
42*d57664e9SAndroid Build Coastguard Worker   }
43*d57664e9SAndroid Build Coastguard Worker   str_stream << type << "/" << entry;
44*d57664e9SAndroid Build Coastguard Worker   return str_stream.str();
45*d57664e9SAndroid Build Coastguard Worker }
46*d57664e9SAndroid Build Coastguard Worker 
to_string(ResourceType type)47*d57664e9SAndroid Build Coastguard Worker StringPiece to_string(ResourceType type) {
48*d57664e9SAndroid Build Coastguard Worker   switch (type) {
49*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kAnim:
50*d57664e9SAndroid Build Coastguard Worker       return "anim";
51*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kAnimator:
52*d57664e9SAndroid Build Coastguard Worker       return "animator";
53*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kArray:
54*d57664e9SAndroid Build Coastguard Worker       return "array";
55*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kAttr:
56*d57664e9SAndroid Build Coastguard Worker       return "attr";
57*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kAttrPrivate:
58*d57664e9SAndroid Build Coastguard Worker       return "^attr-private";
59*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kBool:
60*d57664e9SAndroid Build Coastguard Worker       return "bool";
61*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kColor:
62*d57664e9SAndroid Build Coastguard Worker       return "color";
63*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kConfigVarying:
64*d57664e9SAndroid Build Coastguard Worker       return "configVarying";
65*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kDimen:
66*d57664e9SAndroid Build Coastguard Worker       return "dimen";
67*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kDrawable:
68*d57664e9SAndroid Build Coastguard Worker       return "drawable";
69*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kFont:
70*d57664e9SAndroid Build Coastguard Worker       return "font";
71*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kFraction:
72*d57664e9SAndroid Build Coastguard Worker       return "fraction";
73*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kId:
74*d57664e9SAndroid Build Coastguard Worker       return "id";
75*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kInteger:
76*d57664e9SAndroid Build Coastguard Worker       return "integer";
77*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kInterpolator:
78*d57664e9SAndroid Build Coastguard Worker       return "interpolator";
79*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kLayout:
80*d57664e9SAndroid Build Coastguard Worker       return "layout";
81*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kMacro:
82*d57664e9SAndroid Build Coastguard Worker       return "macro";
83*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kMenu:
84*d57664e9SAndroid Build Coastguard Worker       return "menu";
85*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kMipmap:
86*d57664e9SAndroid Build Coastguard Worker       return "mipmap";
87*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kNavigation:
88*d57664e9SAndroid Build Coastguard Worker       return "navigation";
89*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kPlurals:
90*d57664e9SAndroid Build Coastguard Worker       return "plurals";
91*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kRaw:
92*d57664e9SAndroid Build Coastguard Worker       return "raw";
93*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kString:
94*d57664e9SAndroid Build Coastguard Worker       return "string";
95*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kStyle:
96*d57664e9SAndroid Build Coastguard Worker       return "style";
97*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kStyleable:
98*d57664e9SAndroid Build Coastguard Worker       return "styleable";
99*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kTransition:
100*d57664e9SAndroid Build Coastguard Worker       return "transition";
101*d57664e9SAndroid Build Coastguard Worker     case ResourceType::kXml:
102*d57664e9SAndroid Build Coastguard Worker       return "xml";
103*d57664e9SAndroid Build Coastguard Worker   }
104*d57664e9SAndroid Build Coastguard Worker   return {};
105*d57664e9SAndroid Build Coastguard Worker }
106*d57664e9SAndroid Build Coastguard Worker 
107*d57664e9SAndroid Build Coastguard Worker static const std::map<StringPiece, ResourceType> sResourceTypeMap{
108*d57664e9SAndroid Build Coastguard Worker     {"anim", ResourceType::kAnim},
109*d57664e9SAndroid Build Coastguard Worker     {"animator", ResourceType::kAnimator},
110*d57664e9SAndroid Build Coastguard Worker     {"array", ResourceType::kArray},
111*d57664e9SAndroid Build Coastguard Worker     {"attr", ResourceType::kAttr},
112*d57664e9SAndroid Build Coastguard Worker     {"^attr-private", ResourceType::kAttrPrivate},
113*d57664e9SAndroid Build Coastguard Worker     {"bool", ResourceType::kBool},
114*d57664e9SAndroid Build Coastguard Worker     {"color", ResourceType::kColor},
115*d57664e9SAndroid Build Coastguard Worker     {"configVarying", ResourceType::kConfigVarying},
116*d57664e9SAndroid Build Coastguard Worker     {"dimen", ResourceType::kDimen},
117*d57664e9SAndroid Build Coastguard Worker     {"drawable", ResourceType::kDrawable},
118*d57664e9SAndroid Build Coastguard Worker     {"font", ResourceType::kFont},
119*d57664e9SAndroid Build Coastguard Worker     {"fraction", ResourceType::kFraction},
120*d57664e9SAndroid Build Coastguard Worker     {"id", ResourceType::kId},
121*d57664e9SAndroid Build Coastguard Worker     {"integer", ResourceType::kInteger},
122*d57664e9SAndroid Build Coastguard Worker     {"interpolator", ResourceType::kInterpolator},
123*d57664e9SAndroid Build Coastguard Worker     {"layout", ResourceType::kLayout},
124*d57664e9SAndroid Build Coastguard Worker     {"macro", ResourceType::kMacro},
125*d57664e9SAndroid Build Coastguard Worker     {"menu", ResourceType::kMenu},
126*d57664e9SAndroid Build Coastguard Worker     {"mipmap", ResourceType::kMipmap},
127*d57664e9SAndroid Build Coastguard Worker     {"navigation", ResourceType::kNavigation},
128*d57664e9SAndroid Build Coastguard Worker     {"plurals", ResourceType::kPlurals},
129*d57664e9SAndroid Build Coastguard Worker     {"raw", ResourceType::kRaw},
130*d57664e9SAndroid Build Coastguard Worker     {"string", ResourceType::kString},
131*d57664e9SAndroid Build Coastguard Worker     {"style", ResourceType::kStyle},
132*d57664e9SAndroid Build Coastguard Worker     {"styleable", ResourceType::kStyleable},
133*d57664e9SAndroid Build Coastguard Worker     {"transition", ResourceType::kTransition},
134*d57664e9SAndroid Build Coastguard Worker     {"xml", ResourceType::kXml},
135*d57664e9SAndroid Build Coastguard Worker };
136*d57664e9SAndroid Build Coastguard Worker 
ResourceNamedTypeWithDefaultName(ResourceType t)137*d57664e9SAndroid Build Coastguard Worker ResourceNamedTypeRef ResourceNamedTypeWithDefaultName(ResourceType t) {
138*d57664e9SAndroid Build Coastguard Worker   return {to_string(t), t};
139*d57664e9SAndroid Build Coastguard Worker }
140*d57664e9SAndroid Build Coastguard Worker 
ParseResourceNamedType(android::StringPiece s)141*d57664e9SAndroid Build Coastguard Worker std::optional<ResourceNamedTypeRef> ParseResourceNamedType(android::StringPiece s) {
142*d57664e9SAndroid Build Coastguard Worker   auto dot = std::find(s.begin(), s.end(), '.');
143*d57664e9SAndroid Build Coastguard Worker   const ResourceType* parsedType;
144*d57664e9SAndroid Build Coastguard Worker   if (dot != s.end() && dot != std::prev(s.end())) {
145*d57664e9SAndroid Build Coastguard Worker     parsedType = ParseResourceType(android::StringPiece(s.begin(), dot - s.begin()));
146*d57664e9SAndroid Build Coastguard Worker   } else {
147*d57664e9SAndroid Build Coastguard Worker     parsedType = ParseResourceType(s);
148*d57664e9SAndroid Build Coastguard Worker   }
149*d57664e9SAndroid Build Coastguard Worker   if (parsedType == nullptr) {
150*d57664e9SAndroid Build Coastguard Worker     return std::nullopt;
151*d57664e9SAndroid Build Coastguard Worker   }
152*d57664e9SAndroid Build Coastguard Worker   return ResourceNamedTypeRef(s, *parsedType);
153*d57664e9SAndroid Build Coastguard Worker }
154*d57664e9SAndroid Build Coastguard Worker 
ParseResourceType(StringPiece str)155*d57664e9SAndroid Build Coastguard Worker const ResourceType* ParseResourceType(StringPiece str) {
156*d57664e9SAndroid Build Coastguard Worker   auto iter = sResourceTypeMap.find(str);
157*d57664e9SAndroid Build Coastguard Worker   if (iter == std::end(sResourceTypeMap)) {
158*d57664e9SAndroid Build Coastguard Worker     return nullptr;
159*d57664e9SAndroid Build Coastguard Worker   }
160*d57664e9SAndroid Build Coastguard Worker   return &iter->second;
161*d57664e9SAndroid Build Coastguard Worker }
162*d57664e9SAndroid Build Coastguard Worker 
operator <(const ResourceKey & a,const ResourceKey & b)163*d57664e9SAndroid Build Coastguard Worker bool operator<(const ResourceKey& a, const ResourceKey& b) {
164*d57664e9SAndroid Build Coastguard Worker   return std::tie(a.name, a.config) < std::tie(b.name, b.config);
165*d57664e9SAndroid Build Coastguard Worker }
166*d57664e9SAndroid Build Coastguard Worker 
operator <(const ResourceKeyRef & a,const ResourceKeyRef & b)167*d57664e9SAndroid Build Coastguard Worker bool operator<(const ResourceKeyRef& a, const ResourceKeyRef& b) {
168*d57664e9SAndroid Build Coastguard Worker   return std::tie(a.name, a.config) < std::tie(b.name, b.config);
169*d57664e9SAndroid Build Coastguard Worker }
170*d57664e9SAndroid Build Coastguard Worker 
171*d57664e9SAndroid Build Coastguard Worker }  // namespace aapt
172