Merge "Adding verbose setters and getters for diagnostics to make ResourceUtils code able to print verbose message."

This commit is contained in:
Brandon Liu
2023-05-08 19:58:25 +00:00
committed by Android (Google) Code Review
12 changed files with 58 additions and 18 deletions

View File

@@ -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_;

View File

@@ -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())) {

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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))));
}

View File

@@ -597,6 +597,7 @@ class CompileContext : public IAaptContext {
void SetVerbose(bool val) {
verbose_ = val;
diagnostics_->SetVerbose(val);
}
bool IsVerbose() override {

View File

@@ -112,6 +112,7 @@ class DumpContext : public IAaptContext {
void SetVerbose(bool val) {
verbose_ = val;
diagnostics_.SetVerbose(val);
}
int GetMinSdkVersion() override {

View File

@@ -148,6 +148,7 @@ class LinkContext : public IAaptContext {
void SetVerbose(bool val) {
verbose_ = val;
diagnostics_->SetVerbose(val);
}
int GetMinSdkVersion() override {

View File

@@ -101,6 +101,7 @@ class OptimizeContext : public IAaptContext {
void SetVerbose(bool val) {
verbose_ = val;
diagnostics_.SetVerbose(val);
}
void SetMinSdkVersion(int sdk_version) {

View File

@@ -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));

View File

@@ -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)) {

View File

@@ -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);