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