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