diff options
author | Adam Lesinski <adamlesinski@google.com> | 2015-08-14 14:26:04 -0700 |
---|---|---|
committer | Adam Lesinski <adamlesinski@google.com> | 2015-10-16 12:13:08 -0700 |
commit | 1ab598f46c3ff520a67f9d80194847741f3467ab (patch) | |
tree | 4846790211599fdd7a9bb35ec94df4a6ec4839d6 /tools/aapt2/ResourceValues.h | |
parent | 547c346bb34878b691fd53e54aa3a88efcc5dc6f (diff) |
AAPT2: Separate out the various steps
An early refactor. Some ideas became clearer as
development continued. Now the various phases are much
clearer and more easily reusable.
Also added a ton of tests!
Change-Id: Ic8f0a70c8222370352e63533b329c40457c0903e
Diffstat (limited to 'tools/aapt2/ResourceValues.h')
-rw-r--r-- | tools/aapt2/ResourceValues.h | 240 |
1 files changed, 43 insertions, 197 deletions
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h index ef6594e6f231..0dae091dffb4 100644 --- a/tools/aapt2/ResourceValues.h +++ b/tools/aapt2/ResourceValues.h @@ -17,6 +17,7 @@ #ifndef AAPT_RESOURCE_VALUES_H #define AAPT_RESOURCE_VALUES_H +#include "util/Maybe.h" #include "Resource.h" #include "StringPool.h" @@ -27,9 +28,7 @@ namespace aapt { -struct ValueVisitor; -struct ConstValueVisitor; -struct ValueVisitorArgs; +struct RawValueVisitor; /** * A resource value. This is an all-encompassing representation @@ -39,13 +38,15 @@ struct ValueVisitorArgs; * but it is the simplest strategy. */ struct Value { + virtual ~Value() = default; + /** * Whether or not this is an Item. */ virtual bool isItem() const; /** - * Whether this value is weak and can be overriden without + * Whether this value is weak and can be overridden without * warning or error. Default for base class is false. */ virtual bool isWeak() const; @@ -53,12 +54,7 @@ struct Value { /** * Calls the appropriate overload of ValueVisitor. */ - virtual void accept(ValueVisitor& visitor, ValueVisitorArgs&& args) = 0; - - /** - * Const version of accept(). - */ - virtual void accept(ConstValueVisitor& visitor, ValueVisitorArgs&& args) const = 0; + virtual void accept(RawValueVisitor* visitor) = 0; /** * Clone the value. @@ -68,7 +64,7 @@ struct Value { /** * Human readable printout of this value. */ - virtual void print(std::ostream& out) const = 0; + virtual void print(std::ostream* out) const = 0; }; /** @@ -76,8 +72,7 @@ struct Value { */ template <typename Derived> struct BaseValue : public Value { - virtual void accept(ValueVisitor& visitor, ValueVisitorArgs&& args) override; - virtual void accept(ConstValueVisitor& visitor, ValueVisitorArgs&& args) const override; + void accept(RawValueVisitor* visitor) override; }; /** @@ -96,9 +91,9 @@ struct Item : public Value { /** * Fills in an android::Res_value structure with this Item's binary representation. - * Returns false if an error ocurred. + * Returns false if an error occurred. */ - virtual bool flatten(android::Res_value& outValue) const = 0; + virtual bool flatten(android::Res_value* outValue) const = 0; }; /** @@ -106,8 +101,7 @@ struct Item : public Value { */ template <typename Derived> struct BaseItem : public Item { - virtual void accept(ValueVisitor& visitor, ValueVisitorArgs&& args) override; - virtual void accept(ConstValueVisitor& visitor, ValueVisitorArgs&& args) const override; + void accept(RawValueVisitor* visitor) override; }; /** @@ -122,8 +116,8 @@ struct Reference : public BaseItem<Reference> { kAttribute, }; - ResourceName name; - ResourceId id; + Maybe<ResourceName> name; + Maybe<ResourceId> id; Reference::Type referenceType; bool privateReference = false; @@ -131,9 +125,9 @@ struct Reference : public BaseItem<Reference> { Reference(const ResourceNameRef& n, Type type = Type::kResource); Reference(const ResourceId& i, Type type = Type::kResource); - bool flatten(android::Res_value& outValue) const override; + bool flatten(android::Res_value* outValue) const override; Reference* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; /** @@ -141,9 +135,9 @@ struct Reference : public BaseItem<Reference> { */ struct Id : public BaseItem<Id> { bool isWeak() const override; - bool flatten(android::Res_value& out) const override; + bool flatten(android::Res_value* out) const override; Id* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; /** @@ -156,9 +150,9 @@ struct RawString : public BaseItem<RawString> { RawString(const StringPool::Ref& ref); - bool flatten(android::Res_value& outValue) const override; + bool flatten(android::Res_value* outValue) const override; RawString* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; struct String : public BaseItem<String> { @@ -166,9 +160,9 @@ struct String : public BaseItem<String> { String(const StringPool::Ref& ref); - bool flatten(android::Res_value& outValue) const override; + bool flatten(android::Res_value* outValue) const override; String* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; struct StyledString : public BaseItem<StyledString> { @@ -176,9 +170,9 @@ struct StyledString : public BaseItem<StyledString> { StyledString(const StringPool::StyleRef& ref); - bool flatten(android::Res_value& outValue) const override; + bool flatten(android::Res_value* outValue) const override; StyledString* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; struct FileReference : public BaseItem<FileReference> { @@ -187,9 +181,9 @@ struct FileReference : public BaseItem<FileReference> { FileReference() = default; FileReference(const StringPool::Ref& path); - bool flatten(android::Res_value& outValue) const override; + bool flatten(android::Res_value* outValue) const override; FileReference* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; /** @@ -200,10 +194,11 @@ struct BinaryPrimitive : public BaseItem<BinaryPrimitive> { BinaryPrimitive() = default; BinaryPrimitive(const android::Res_value& val); + BinaryPrimitive(uint8_t dataType, uint32_t data); - bool flatten(android::Res_value& outValue) const override; + bool flatten(android::Res_value* outValue) const override; BinaryPrimitive* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; struct Attribute : public BaseValue<Attribute> { @@ -212,7 +207,7 @@ struct Attribute : public BaseValue<Attribute> { uint32_t value; }; - bool weak; + bool weak; uint32_t typeMask; uint32_t minInt; uint32_t maxInt; @@ -221,9 +216,9 @@ struct Attribute : public BaseValue<Attribute> { Attribute(bool w, uint32_t t = 0u); bool isWeak() const override; - virtual Attribute* clone(StringPool* newPool) const override; - void printMask(std::ostream& out) const; - virtual void print(std::ostream& out) const override; + Attribute* clone(StringPool* newPool) const override; + void printMask(std::ostream* out) const; + void print(std::ostream* out) const override; }; struct Style : public BaseValue<Style> { @@ -232,7 +227,7 @@ struct Style : public BaseValue<Style> { std::unique_ptr<Item> value; }; - Reference parent; + Maybe<Reference> parent; /** * If set to true, the parent was auto inferred from the @@ -243,14 +238,14 @@ struct Style : public BaseValue<Style> { std::vector<Entry> entries; Style* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; struct Array : public BaseValue<Array> { std::vector<std::unique_ptr<Item>> items; Array* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; struct Plural : public BaseValue<Plural> { @@ -267,180 +262,31 @@ struct Plural : public BaseValue<Plural> { std::array<std::unique_ptr<Item>, Count> values; Plural* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; struct Styleable : public BaseValue<Styleable> { std::vector<Reference> entries; Styleable* clone(StringPool* newPool) const override; - void print(std::ostream& out) const override; + void print(std::ostream* out) const override; }; /** * Stream operator for printing Value objects. */ inline ::std::ostream& operator<<(::std::ostream& out, const Value& value) { - value.print(out); + value.print(&out); return out; } inline ::std::ostream& operator<<(::std::ostream& out, const Attribute::Symbol& s) { - return out << s.symbol.name.entry << "=" << s.value; -} - -/** - * The argument object that gets passed through the value - * back to the ValueVisitor. Subclasses of ValueVisitor should - * subclass ValueVisitorArgs to contain the data they need - * to operate. - */ -struct ValueVisitorArgs {}; - -/** - * Visits a value and runs the appropriate method based on its type. - */ -struct ValueVisitor { - virtual void visit(Reference& reference, ValueVisitorArgs& args) { - visitItem(reference, args); - } - - virtual void visit(RawString& string, ValueVisitorArgs& args) { - visitItem(string, args); - } - - virtual void visit(String& string, ValueVisitorArgs& args) { - visitItem(string, args); - } - - virtual void visit(StyledString& string, ValueVisitorArgs& args) { - visitItem(string, args); - } - - virtual void visit(FileReference& file, ValueVisitorArgs& args) { - visitItem(file, args); - } - - virtual void visit(Id& id, ValueVisitorArgs& args) { - visitItem(id, args); - } - - virtual void visit(BinaryPrimitive& primitive, ValueVisitorArgs& args) { - visitItem(primitive, args); - } - - virtual void visit(Attribute& attr, ValueVisitorArgs& args) {} - virtual void visit(Style& style, ValueVisitorArgs& args) {} - virtual void visit(Array& array, ValueVisitorArgs& args) {} - virtual void visit(Plural& array, ValueVisitorArgs& args) {} - virtual void visit(Styleable& styleable, ValueVisitorArgs& args) {} - - virtual void visitItem(Item& item, ValueVisitorArgs& args) {} -}; - -/** - * Const version of ValueVisitor. - */ -struct ConstValueVisitor { - virtual void visit(const Reference& reference, ValueVisitorArgs& args) { - visitItem(reference, args); - } - - virtual void visit(const RawString& string, ValueVisitorArgs& args) { - visitItem(string, args); - } - - virtual void visit(const String& string, ValueVisitorArgs& args) { - visitItem(string, args); - } - - virtual void visit(const StyledString& string, ValueVisitorArgs& args) { - visitItem(string, args); - } - - virtual void visit(const FileReference& file, ValueVisitorArgs& args) { - visitItem(file, args); + if (s.symbol.name) { + out << s.symbol.name.value().entry; + } else { + out << "???"; } - - virtual void visit(const Id& id, ValueVisitorArgs& args) { - visitItem(id, args); - } - - virtual void visit(const BinaryPrimitive& primitive, ValueVisitorArgs& args) { - visitItem(primitive, args); - } - - virtual void visit(const Attribute& attr, ValueVisitorArgs& args) {} - virtual void visit(const Style& style, ValueVisitorArgs& args) {} - virtual void visit(const Array& array, ValueVisitorArgs& args) {} - virtual void visit(const Plural& array, ValueVisitorArgs& args) {} - virtual void visit(const Styleable& styleable, ValueVisitorArgs& args) {} - - virtual void visitItem(const Item& item, ValueVisitorArgs& args) {} -}; - -/** - * Convenience Visitor that forwards a specific type to a function. - * Args are not used as the function can bind variables. Do not use - * directly, use the wrapper visitFunc() method. - */ -template <typename T, typename TFunc> -struct ValueVisitorFunc : ValueVisitor { - TFunc func; - - ValueVisitorFunc(TFunc f) : func(f) { - } - - void visit(T& value, ValueVisitorArgs&) override { - func(value); - } -}; - -/** - * Const version of ValueVisitorFunc. - */ -template <typename T, typename TFunc> -struct ConstValueVisitorFunc : ConstValueVisitor { - TFunc func; - - ConstValueVisitorFunc(TFunc f) : func(f) { - } - - void visit(const T& value, ValueVisitorArgs&) override { - func(value); - } -}; - -template <typename T, typename TFunc> -void visitFunc(Value& value, TFunc f) { - ValueVisitorFunc<T, TFunc> visitor(f); - value.accept(visitor, ValueVisitorArgs{}); -} - -template <typename T, typename TFunc> -void visitFunc(const Value& value, TFunc f) { - ConstValueVisitorFunc<T, TFunc> visitor(f); - value.accept(visitor, ValueVisitorArgs{}); -} - -template <typename Derived> -void BaseValue<Derived>::accept(ValueVisitor& visitor, ValueVisitorArgs&& args) { - visitor.visit(static_cast<Derived&>(*this), args); -} - -template <typename Derived> -void BaseValue<Derived>::accept(ConstValueVisitor& visitor, ValueVisitorArgs&& args) const { - visitor.visit(static_cast<const Derived&>(*this), args); -} - -template <typename Derived> -void BaseItem<Derived>::accept(ValueVisitor& visitor, ValueVisitorArgs&& args) { - visitor.visit(static_cast<Derived&>(*this), args); -} - -template <typename Derived> -void BaseItem<Derived>::accept(ConstValueVisitor& visitor, ValueVisitorArgs&& args) const { - visitor.visit(static_cast<const Derived&>(*this), args); + return out << "=" << s.value; } } // namespace aapt |