Merge "Adding verbose setters and getters for diagnostics to make ResourceUtils code able to print verbose message."
This commit is contained in:
@@ -86,6 +86,17 @@ struct IDiagnostics {
|
||||
DiagMessageActual actual = message.Build();
|
||||
Log(Level::Note, actual);
|
||||
}
|
||||
|
||||
virtual void SetVerbose(bool val) {
|
||||
verbose_ = val;
|
||||
}
|
||||
|
||||
virtual bool IsVerbose() {
|
||||
return verbose_;
|
||||
}
|
||||
|
||||
private:
|
||||
bool verbose_ = false;
|
||||
};
|
||||
|
||||
class SourcePathDiagnostics : public IDiagnostics {
|
||||
@@ -105,6 +116,14 @@ class SourcePathDiagnostics : public IDiagnostics {
|
||||
return error;
|
||||
}
|
||||
|
||||
void SetVerbose(bool val) override {
|
||||
diag_->SetVerbose(val);
|
||||
}
|
||||
|
||||
bool IsVerbose() override {
|
||||
return diag_->IsVerbose();
|
||||
}
|
||||
|
||||
private:
|
||||
Source source_;
|
||||
IDiagnostics* diag_;
|
||||
|
||||
@@ -800,7 +800,7 @@ std::unique_ptr<Item> ResourceParser::ParseXml(const FlattenedXmlSubTree& xmlsub
|
||||
|
||||
// Process the raw value.
|
||||
std::unique_ptr<Item> processed_item = ResourceUtils::TryParseItemForAttribute(
|
||||
xmlsub_tree.raw_value, type_mask, on_create_reference);
|
||||
&diag, xmlsub_tree.raw_value, type_mask, on_create_reference);
|
||||
if (processed_item) {
|
||||
// Fix up the reference.
|
||||
if (auto ref = ValueCast<Reference>(processed_item.get())) {
|
||||
|
||||
@@ -619,7 +619,7 @@ uint32_t AndroidTypeToAttributeTypeMask(uint16_t type) {
|
||||
}
|
||||
|
||||
std::unique_ptr<Item> TryParseItemForAttribute(
|
||||
StringPiece value, uint32_t type_mask,
|
||||
android::IDiagnostics* diag, StringPiece value, uint32_t type_mask,
|
||||
const std::function<bool(const ResourceName&)>& on_create_reference) {
|
||||
using android::ResTable_map;
|
||||
|
||||
@@ -685,6 +685,12 @@ std::unique_ptr<Item> TryParseItemForAttribute(
|
||||
// same string is smaller than 1, otherwise return as raw string.
|
||||
if (fabs(f - d) < 1) {
|
||||
return std::move(floating_point);
|
||||
} else {
|
||||
if (diag->IsVerbose()) {
|
||||
diag->Note(android::DiagMessage()
|
||||
<< "precision lost greater than 1 while parsing float " << value
|
||||
<< ", return a raw string");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -701,12 +707,12 @@ std::unique_ptr<Item> TryParseItemForAttribute(
|
||||
* allows.
|
||||
*/
|
||||
std::unique_ptr<Item> TryParseItemForAttribute(
|
||||
StringPiece str, const Attribute* attr,
|
||||
android::IDiagnostics* diag, StringPiece str, const Attribute* attr,
|
||||
const std::function<bool(const ResourceName&)>& on_create_reference) {
|
||||
using android::ResTable_map;
|
||||
|
||||
const uint32_t type_mask = attr->type_mask;
|
||||
auto value = TryParseItemForAttribute(str, type_mask, on_create_reference);
|
||||
auto value = TryParseItemForAttribute(diag, str, type_mask, on_create_reference);
|
||||
if (value) {
|
||||
return value;
|
||||
}
|
||||
|
||||
@@ -200,11 +200,11 @@ std::unique_ptr<BinaryPrimitive> TryParseFlagSymbol(const Attribute* enum_attr,
|
||||
* reference to an ID that must be created (@+id/foo).
|
||||
*/
|
||||
std::unique_ptr<Item> TryParseItemForAttribute(
|
||||
android::StringPiece value, const Attribute* attr,
|
||||
android::IDiagnostics* diag, android::StringPiece value, const Attribute* attr,
|
||||
const std::function<bool(const ResourceName&)>& on_create_reference = {});
|
||||
|
||||
std::unique_ptr<Item> TryParseItemForAttribute(
|
||||
android::StringPiece value, uint32_t type_mask,
|
||||
android::IDiagnostics* diag, android::StringPiece value, uint32_t type_mask,
|
||||
const std::function<bool(const ResourceName&)>& on_create_reference = {});
|
||||
|
||||
uint32_t AndroidTypeToAttributeTypeMask(uint16_t type);
|
||||
|
||||
@@ -217,34 +217,43 @@ TEST(ResourceUtilsTest, EmptyIsBinaryPrimitive) {
|
||||
}
|
||||
|
||||
TEST(ResourceUtilsTest, ItemsWithWhitespaceAreParsedCorrectly) {
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(" 12\n ", ResTable_map::TYPE_INTEGER),
|
||||
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(context->GetDiagnostics(), " 12\n ",
|
||||
ResTable_map::TYPE_INTEGER),
|
||||
Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_INT_DEC, 12u))));
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(" true\n ", ResTable_map::TYPE_BOOLEAN),
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(context->GetDiagnostics(), " true\n ",
|
||||
ResTable_map::TYPE_BOOLEAN),
|
||||
Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_INT_BOOLEAN, 0xffffffffu))));
|
||||
|
||||
const float expected_float = 12.0f;
|
||||
const uint32_t expected_float_flattened = *(uint32_t*)&expected_float;
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(" 12.0\n ", ResTable_map::TYPE_FLOAT),
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(context->GetDiagnostics(), " 12.0\n ",
|
||||
ResTable_map::TYPE_FLOAT),
|
||||
Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_FLOAT, expected_float_flattened))));
|
||||
}
|
||||
|
||||
TEST(ResourceUtilsTest, FloatAndBigIntegerParsedCorrectly) {
|
||||
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
|
||||
const float expected_float = 0.125f;
|
||||
const uint32_t expected_float_flattened = *(uint32_t*)&expected_float;
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute("0.125", ResTable_map::TYPE_FLOAT),
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(context->GetDiagnostics(), "0.125",
|
||||
ResTable_map::TYPE_FLOAT),
|
||||
Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_FLOAT, expected_float_flattened))));
|
||||
|
||||
const float special_float = 1.0f;
|
||||
const uint32_t special_float_flattened = *(uint32_t*)&special_float;
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute("1.0", ResTable_map::TYPE_FLOAT),
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(context->GetDiagnostics(), "1.0",
|
||||
ResTable_map::TYPE_FLOAT),
|
||||
Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_FLOAT, special_float_flattened))));
|
||||
|
||||
EXPECT_EQ(ResourceUtils::TryParseItemForAttribute("1099511627776", ResTable_map::TYPE_INTEGER),
|
||||
EXPECT_EQ(ResourceUtils::TryParseItemForAttribute(context->GetDiagnostics(), "1099511627776",
|
||||
ResTable_map::TYPE_INTEGER),
|
||||
std::unique_ptr<Item>(nullptr));
|
||||
|
||||
const float big_float = 1099511627776.0f;
|
||||
const uint32_t big_flattened = *(uint32_t*)&big_float;
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute("1099511627776", ResTable_map::TYPE_FLOAT),
|
||||
EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(context->GetDiagnostics(), "1099511627776",
|
||||
ResTable_map::TYPE_FLOAT),
|
||||
Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_FLOAT, big_flattened))));
|
||||
}
|
||||
|
||||
|
||||
@@ -597,6 +597,7 @@ class CompileContext : public IAaptContext {
|
||||
|
||||
void SetVerbose(bool val) {
|
||||
verbose_ = val;
|
||||
diagnostics_->SetVerbose(val);
|
||||
}
|
||||
|
||||
bool IsVerbose() override {
|
||||
|
||||
@@ -112,6 +112,7 @@ class DumpContext : public IAaptContext {
|
||||
|
||||
void SetVerbose(bool val) {
|
||||
verbose_ = val;
|
||||
diagnostics_.SetVerbose(val);
|
||||
}
|
||||
|
||||
int GetMinSdkVersion() override {
|
||||
|
||||
@@ -148,6 +148,7 @@ class LinkContext : public IAaptContext {
|
||||
|
||||
void SetVerbose(bool val) {
|
||||
verbose_ = val;
|
||||
diagnostics_->SetVerbose(val);
|
||||
}
|
||||
|
||||
int GetMinSdkVersion() override {
|
||||
|
||||
@@ -101,6 +101,7 @@ class OptimizeContext : public IAaptContext {
|
||||
|
||||
void SetVerbose(bool val) {
|
||||
verbose_ = val;
|
||||
diagnostics_.SetVerbose(val);
|
||||
}
|
||||
|
||||
void SetMinSdkVersion(int sdk_version) {
|
||||
|
||||
@@ -250,6 +250,7 @@ TEST(ProtoSerializeTest, SerializeSinglePackage) {
|
||||
}
|
||||
|
||||
TEST(ProtoSerializeTest, SerializeAndDeserializeXml) {
|
||||
std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
|
||||
xml::Element element;
|
||||
element.line_number = 22;
|
||||
element.column_number = 23;
|
||||
@@ -269,8 +270,8 @@ TEST(ProtoSerializeTest, SerializeAndDeserializeXml) {
|
||||
attr.namespace_uri = xml::kSchemaAndroid;
|
||||
attr.value = "23dp";
|
||||
attr.compiled_attribute = xml::AaptAttribute(Attribute{}, ResourceId(0x01010000));
|
||||
attr.compiled_value =
|
||||
ResourceUtils::TryParseItemForAttribute(attr.value, android::ResTable_map::TYPE_DIMENSION);
|
||||
attr.compiled_value = ResourceUtils::TryParseItemForAttribute(
|
||||
context->GetDiagnostics(), attr.value, android::ResTable_map::TYPE_DIMENSION);
|
||||
attr.compiled_value->SetSource(android::Source().WithLine(25));
|
||||
element.attributes.push_back(std::move(attr));
|
||||
|
||||
|
||||
@@ -164,8 +164,8 @@ std::unique_ptr<Item> ReferenceLinkerTransformer::TransformItem(const Reference*
|
||||
std::unique_ptr<Item> ReferenceLinkerTransformer::ParseValueWithAttribute(
|
||||
std::unique_ptr<Item> value, const Attribute* attr) {
|
||||
if (RawString* raw_string = ValueCast<RawString>(value.get())) {
|
||||
std::unique_ptr<Item> transformed =
|
||||
ResourceUtils::TryParseItemForAttribute(*raw_string->value, attr);
|
||||
std::unique_ptr<Item> transformed = ResourceUtils::TryParseItemForAttribute(
|
||||
context_->GetDiagnostics(), *raw_string->value, attr);
|
||||
|
||||
// If we could not parse as any specific type, try a basic STRING.
|
||||
if (!transformed && (attr->type_mask & android::ResTable_map::TYPE_STRING)) {
|
||||
|
||||
@@ -90,7 +90,8 @@ class XmlVisitor : public xml::PackageAwareVisitor {
|
||||
attribute = &attr.compiled_attribute.value().attribute;
|
||||
}
|
||||
|
||||
attr.compiled_value = ResourceUtils::TryParseItemForAttribute(attr.value, attribute);
|
||||
attr.compiled_value = ResourceUtils::TryParseItemForAttribute(context_->GetDiagnostics(),
|
||||
attr.value, attribute);
|
||||
if (attr.compiled_value) {
|
||||
// With a compiledValue, we must resolve the reference and assign it an ID.
|
||||
attr.compiled_value->SetSource(source);
|
||||
|
||||
Reference in New Issue
Block a user