16cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski/* 26cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 36cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * 46cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 56cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * you may not use this file except in compliance with the License. 66cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * You may obtain a copy of the License at 76cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * 86cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 96cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * 106cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * Unless required by applicable law or agreed to in writing, software 116cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 126cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * See the License for the specific language governing permissions and 146cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski * limitations under the License. 156cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski */ 166cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 176cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski#ifndef AAPT_JAVA_CLASSDEFINITION_H 186cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski#define AAPT_JAVA_CLASSDEFINITION_H 196cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 20ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <ostream> 21ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include <string> 221ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski#include <unordered_map> 231ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski#include <vector> 24ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 25ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "android-base/macros.h" 26d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski#include "androidfw/StringPiece.h" 27ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 286cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski#include "Resource.h" 296cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski#include "java/AnnotationProcessor.h" 306cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski#include "util/Util.h" 316cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 326cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskinamespace aapt { 336cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 346cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski// The number of attributes to emit per line in a Styleable array. 356cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiconstexpr static size_t kAttribsPerLine = 4; 366cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiconstexpr static const char* kIndent = " "; 376cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 386cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass ClassMember { 39cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 40cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski virtual ~ClassMember() = default; 416cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 426e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski AnnotationProcessor* GetCommentBuilder() { 436e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski return &processor_; 446e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 456cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski virtual bool empty() const = 0; 476cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 486e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski virtual const std::string& GetName() const = 0; 496e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski 50ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // Writes the class member to the out stream. Subclasses should derive this method 51ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // to write their own data. Call this base method from the subclass to write out 52ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // this member's comments/annotations. 53d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski virtual void WriteToStream(const android::StringPiece& prefix, bool final, 54ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski std::ostream* out) const; 556cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 57ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski AnnotationProcessor processor_; 586cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 596cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 606cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskitemplate <typename T> 616cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass PrimitiveMember : public ClassMember { 62cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 63d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski PrimitiveMember(const android::StringPiece& name, const T& val) 64d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski : name_(name.to_string()), val_(val) {} 656cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 666e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski bool empty() const override { 676e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski return false; 686e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 696e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski 706e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski const std::string& GetName() const override { 716e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski return name_; 726e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 736cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 74d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski void WriteToStream(const android::StringPiece& prefix, bool final, 75cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::ostream* out) const override { 76ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ClassMember::WriteToStream(prefix, final, out); 771ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski *out << prefix << "public static " << (final ? "final " : "") << "int " << name_ << "=" << val_ 781ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski << ";"; 79cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 806cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 81cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 821ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski DISALLOW_COPY_AND_ASSIGN(PrimitiveMember); 831ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski 84ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string name_; 85ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski T val_; 866cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 876cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 881ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski// Specialization for strings so they get the right type and are quoted with "". 896cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskitemplate <> 906cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass PrimitiveMember<std::string> : public ClassMember { 91cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 92d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski PrimitiveMember(const android::StringPiece& name, const std::string& val) 93d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski : name_(name.to_string()), val_(val) {} 946cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 956e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski bool empty() const override { 966e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski return false; 976e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 986e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski 996e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski const std::string& GetName() const override { 1006e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski return name_; 1016e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 1026cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 103d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski void WriteToStream(const android::StringPiece& prefix, bool final, 104cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::ostream* out) const override { 105ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ClassMember::WriteToStream(prefix, final, out); 1066cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 107cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski *out << prefix << "public static " << (final ? "final " : "") << "String " 108ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski << name_ << "=\"" << val_ << "\";"; 109cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 1106cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 111cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 1121ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski DISALLOW_COPY_AND_ASSIGN(PrimitiveMember); 1131ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski 114ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string name_; 115ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string val_; 1166cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 1176cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 1186cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiusing IntMember = PrimitiveMember<uint32_t>; 1196cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiusing ResourceMember = PrimitiveMember<ResourceId>; 1206cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiusing StringMember = PrimitiveMember<std::string>; 1216cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 1226cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskitemplate <typename T> 1236cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass PrimitiveArrayMember : public ClassMember { 124cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 125d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski explicit PrimitiveArrayMember(const android::StringPiece& name) : name_(name.to_string()) {} 1266cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 1276e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski void AddElement(const T& val) { 1286e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski elements_.push_back(val); 1296e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 1306cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 1316e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski bool empty() const override { 1326e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski return false; 1336e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 1346e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski 1356e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski const std::string& GetName() const override { 1366e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski return name_; 1376e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 1386cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 139d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski void WriteToStream(const android::StringPiece& prefix, bool final, 140cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::ostream* out) const override { 141ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ClassMember::WriteToStream(prefix, final, out); 1426cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 143ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski *out << prefix << "public static final int[] " << name_ << "={"; 1446cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 145ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const auto begin = elements_.begin(); 146ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const auto end = elements_.end(); 147cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski for (auto current = begin; current != end; ++current) { 148cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski if (std::distance(begin, current) % kAttribsPerLine == 0) { 149cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski *out << "\n" << prefix << kIndent << kIndent; 150cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 1516cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 152cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski *out << *current; 153cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski if (std::distance(current, end) > 1) { 154cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski *out << ", "; 155cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 1566cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski } 157cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski *out << "\n" << prefix << kIndent << "};"; 158cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 1596cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 160cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 1611ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski DISALLOW_COPY_AND_ASSIGN(PrimitiveArrayMember); 1621ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski 163ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string name_; 164ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::vector<T> elements_; 1656cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 1666cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 1676cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiusing ResourceArrayMember = PrimitiveArrayMember<ResourceId>; 1686cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 169ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski// Represents a method in a class. 170ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinskiclass MethodDefinition : public ClassMember { 171ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski public: 172ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // Expected method signature example: 'public static void onResourcesLoaded(int p)'. 173ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski explicit MethodDefinition(const android::StringPiece& signature) 174ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski : signature_(signature.to_string()) {} 175ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 176ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // Appends a single statement to the method. It should include no newlines or else 177ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // formatting may be broken. 178ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski void AppendStatement(const android::StringPiece& statement); 179ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 1806e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski // Not quite the same as a name, but good enough. 1816e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski const std::string& GetName() const override { 1826e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski return signature_; 1836e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 1846e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski 185ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // Even if the method is empty, we always want to write the method signature. 1861ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski bool empty() const override { 1871ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski return false; 1881ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski } 189ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 190ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski void WriteToStream(const android::StringPiece& prefix, bool final, 191ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski std::ostream* out) const override; 192ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 193ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski private: 1941ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski DISALLOW_COPY_AND_ASSIGN(MethodDefinition); 1951ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski 196ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski std::string signature_; 197ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski std::vector<std::string> statements_; 198ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski}; 199ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 200ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinskienum class ClassQualifier { kNone, kStatic }; 2016cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 2026cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass ClassDefinition : public ClassMember { 203cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 204d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski static bool WriteJavaFile(const ClassDefinition* def, const android::StringPiece& package, 205d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski bool final, std::ostream* out); 206cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 207d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski ClassDefinition(const android::StringPiece& name, ClassQualifier qualifier, bool createIfEmpty) 208d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski : name_(name.to_string()), qualifier_(qualifier), create_if_empty_(createIfEmpty) {} 209cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 2106e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski enum class Result { 2116e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski kAdded, 2126e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski kOverridden, 2136e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski }; 2146e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski 2156e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski Result AddMember(std::unique_ptr<ClassMember> member); 216cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 217cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski bool empty() const override; 2186e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski 2196e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski const std::string& GetName() const override { 2206e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski return name_; 2216e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski } 2226e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski 223d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski void WriteToStream(const android::StringPiece& prefix, bool final, 224cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::ostream* out) const override; 225cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 226cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 2271ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski DISALLOW_COPY_AND_ASSIGN(ClassDefinition); 2286e241e7e5408aae655362905a78d29e6c52ca305Adam Lesinski 229ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string name_; 230ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ClassQualifier qualifier_; 231ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski bool create_if_empty_; 2321ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski std::vector<std::unique_ptr<ClassMember>> ordered_members_; 2331ee1a106c5b8d41597a889224b1125b568b6a3a3Adam Lesinski std::unordered_map<android::StringPiece, size_t> indexed_members_; 2346cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 2356cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 236cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 2376cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 2386cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski#endif /* AAPT_JAVA_CLASSDEFINITION_H */ 239