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 <string> 21761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski#include <unordered_map> 22761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski#include <vector> 23ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 24ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "android-base/macros.h" 25d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski#include "androidfw/StringPiece.h" 26ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 276cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski#include "Resource.h" 286cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski#include "java/AnnotationProcessor.h" 29a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski#include "text/Printer.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 42f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski AnnotationProcessor* GetCommentBuilder() { 43f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski return &processor_; 44f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 456cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski virtual bool empty() const = 0; 476cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 48f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski virtual const std::string& GetName() const = 0; 49f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski 50a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski // Writes the class member to the Printer. 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. 53a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski virtual void Print(bool final, text::Printer* printer) const; 546cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 55cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 56ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski AnnotationProcessor processor_; 576cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 586cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 596cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskitemplate <typename T> 606cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass PrimitiveMember : public ClassMember { 61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 62d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski PrimitiveMember(const android::StringPiece& name, const T& val) 63d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski : name_(name.to_string()), val_(val) {} 646cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 65f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski bool empty() const override { 66f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski return false; 67f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 68f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski 69f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski const std::string& GetName() const override { 70f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski return name_; 71f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 726cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 73a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski void Print(bool final, text::Printer* printer) const override { 74a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski using std::to_string; 75a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski 76a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski ClassMember::Print(final, printer); 77a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski 78a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print("public static "); 79a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski if (final) { 80a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print("final "); 81a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski } 82a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print("int ").Print(name_).Print("=").Print(to_string(val_)).Print(";"); 83cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 846cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 85cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 86761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski DISALLOW_COPY_AND_ASSIGN(PrimitiveMember); 87761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski 88ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string name_; 89ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski T val_; 906cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 916cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 92761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski// Specialization for strings so they get the right type and are quoted with "". 936cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskitemplate <> 946cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass PrimitiveMember<std::string> : public ClassMember { 95cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 96d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski PrimitiveMember(const android::StringPiece& name, const std::string& val) 97d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski : name_(name.to_string()), val_(val) {} 986cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 99f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski bool empty() const override { 100f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski return false; 101f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 102f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski 103f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski const std::string& GetName() const override { 104f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski return name_; 105f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 1066cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 107a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski void Print(bool final, text::Printer* printer) const override { 108a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski ClassMember::Print(final, printer); 1096cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 110a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print("public static "); 111a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski if (final) { 112a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print("final "); 113a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski } 114a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print("String ").Print(name_).Print("=\"").Print(val_).Print("\";"); 115cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 1166cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 117cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 118761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski DISALLOW_COPY_AND_ASSIGN(PrimitiveMember); 119761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski 120ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string name_; 121ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string val_; 1226cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 1236cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 1246cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiusing IntMember = PrimitiveMember<uint32_t>; 1256cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiusing ResourceMember = PrimitiveMember<ResourceId>; 1266cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiusing StringMember = PrimitiveMember<std::string>; 1276cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 1286cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskitemplate <typename T> 1296cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass PrimitiveArrayMember : public ClassMember { 130cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 131d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski explicit PrimitiveArrayMember(const android::StringPiece& name) : name_(name.to_string()) {} 1326cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 133f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski void AddElement(const T& val) { 134f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski elements_.push_back(val); 135f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 1366cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 137f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski bool empty() const override { 138f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski return false; 139f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 140f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski 141f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski const std::string& GetName() const override { 142f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski return name_; 143f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 1446cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 145a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski void Print(bool final, text::Printer* printer) const override { 146a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski ClassMember::Print(final, printer); 1476cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 148a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print("public static final int[] ").Print(name_).Print("={"); 149a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Indent(); 1506cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 151ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const auto begin = elements_.begin(); 152ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const auto end = elements_.end(); 153cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski for (auto current = begin; current != end; ++current) { 154cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski if (std::distance(begin, current) % kAttribsPerLine == 0) { 155a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Println(); 156cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 1576cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 158a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print(to_string(*current)); 159cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski if (std::distance(current, end) > 1) { 160a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print(", "); 161cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 1626cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski } 163a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Println(); 164a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Undent(); 165a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski printer->Print("};"); 166cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 1676cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 168cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 169761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski DISALLOW_COPY_AND_ASSIGN(PrimitiveArrayMember); 170761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski 171ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string name_; 172ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::vector<T> elements_; 1736cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 1746cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 1756cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiusing ResourceArrayMember = PrimitiveArrayMember<ResourceId>; 1766cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 177ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski// Represents a method in a class. 178ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinskiclass MethodDefinition : public ClassMember { 179ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski public: 180ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // Expected method signature example: 'public static void onResourcesLoaded(int p)'. 181ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski explicit MethodDefinition(const android::StringPiece& signature) 182ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski : signature_(signature.to_string()) {} 183ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 184ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // Appends a single statement to the method. It should include no newlines or else 185ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // formatting may be broken. 186ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski void AppendStatement(const android::StringPiece& statement); 187ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 188f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski // Not quite the same as a name, but good enough. 189f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski const std::string& GetName() const override { 190f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski return signature_; 191f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 192f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski 193ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski // Even if the method is empty, we always want to write the method signature. 194761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski bool empty() const override { 195761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski return false; 196761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski } 197ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 198a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski void Print(bool final, text::Printer* printer) const override; 199ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 200ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski private: 201761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski DISALLOW_COPY_AND_ASSIGN(MethodDefinition); 202761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski 203ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski std::string signature_; 204ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski std::vector<std::string> statements_; 205ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski}; 206ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski 207ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinskienum class ClassQualifier { kNone, kStatic }; 2086cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 2096cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskiclass ClassDefinition : public ClassMember { 210cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public: 211a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski static void WriteJavaFile(const ClassDefinition* def, const android::StringPiece& package, 212a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski bool final, io::OutputStream* out); 213cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 214d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski ClassDefinition(const android::StringPiece& name, ClassQualifier qualifier, bool createIfEmpty) 215d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski : name_(name.to_string()), qualifier_(qualifier), create_if_empty_(createIfEmpty) {} 216cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 217f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski enum class Result { 218f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski kAdded, 219f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski kOverridden, 220f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski }; 221f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski 222f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski Result AddMember(std::unique_ptr<ClassMember> member); 223cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 224cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski bool empty() const override; 225f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski 226f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski const std::string& GetName() const override { 227f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski return name_; 228f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski } 229f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski 230a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski void Print(bool final, text::Printer* printer) const override; 231cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 232cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private: 233761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski DISALLOW_COPY_AND_ASSIGN(ClassDefinition); 234f852dd0eb86e461f1f039f6a292e62123757dad8Adam Lesinski 235ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string name_; 236ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ClassQualifier qualifier_; 237ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski bool create_if_empty_; 238761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski std::vector<std::unique_ptr<ClassMember>> ordered_members_; 239761d4341fcbb711f55d73a31e79098837146236dAdam Lesinski std::unordered_map<android::StringPiece, size_t> indexed_members_; 2406cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski}; 2416cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 242cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 2436cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski 2446cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinski#endif /* AAPT_JAVA_CLASSDEFINITION_H */ 245