diff options
-rw-r--r-- | tools/stats_log_api_gen/Collation.cpp | 52 | ||||
-rw-r--r-- | tools/stats_log_api_gen/Collation.h | 27 | ||||
-rw-r--r-- | tools/stats_log_api_gen/atoms_info_writer.cpp | 72 | ||||
-rw-r--r-- | tools/stats_log_api_gen/java_writer.cpp | 80 | ||||
-rw-r--r-- | tools/stats_log_api_gen/java_writer_q.cpp | 5 | ||||
-rw-r--r-- | tools/stats_log_api_gen/java_writer_q.h | 5 | ||||
-rw-r--r-- | tools/stats_log_api_gen/native_writer.cpp | 100 | ||||
-rw-r--r-- | tools/stats_log_api_gen/test_collation.cpp | 226 | ||||
-rw-r--r-- | tools/stats_log_api_gen/utils.cpp | 66 | ||||
-rw-r--r-- | tools/stats_log_api_gen/utils.h | 6 |
10 files changed, 373 insertions, 266 deletions
diff --git a/tools/stats_log_api_gen/Collation.cpp b/tools/stats_log_api_gen/Collation.cpp index bf390935455a..1387bb5f7bc6 100644 --- a/tools/stats_log_api_gen/Collation.cpp +++ b/tools/stats_log_api_gen/Collation.cpp @@ -454,16 +454,12 @@ bool get_non_chained_node(const Descriptor* atom, AtomDecl* atomDecl, return has_attribution_node; } -static void populateFieldNumberToAnnotations(const AtomDecl& atomDecl, - FieldNumberToAnnotations* fieldNumberToAnnotations) { - for (FieldNumberToAnnotations::const_iterator it = atomDecl.fieldNumberToAnnotations.begin(); - it != atomDecl.fieldNumberToAnnotations.end(); it++) { +static void populateFieldNumberToAtomDeclSet(const shared_ptr<AtomDecl>& atomDecl, + FieldNumberToAtomDeclSet* fieldNumberToAtomDeclSet) { + for (FieldNumberToAnnotations::const_iterator it = atomDecl->fieldNumberToAnnotations.begin(); + it != atomDecl->fieldNumberToAnnotations.end(); it++) { const int fieldNumber = it->first; - const set<shared_ptr<Annotation>>& insertAnnotationsSource = it->second; - set<shared_ptr<Annotation>>& insertAnnotationsTarget = - (*fieldNumberToAnnotations)[fieldNumber]; - insertAnnotationsTarget.insert(insertAnnotationsSource.begin(), - insertAnnotationsSource.end()); + (*fieldNumberToAtomDeclSet)[fieldNumber].insert(atomDecl); } } @@ -513,18 +509,19 @@ int collate_atoms(const Descriptor* descriptor, const string& moduleName, Atoms* } const Descriptor* atom = atomField->message_type(); - AtomDecl atomDecl(atomField->number(), atomField->name(), atom->name()); + shared_ptr<AtomDecl> atomDecl = + make_shared<AtomDecl>(atomField->number(), atomField->name(), atom->name()); if (atomField->options().GetExtension(os::statsd::allow_from_any_uid) == true) { - atomDecl.whitelisted = true; + atomDecl->whitelisted = true; if (dbg) { printf("%s is whitelisted\n", atomField->name().c_str()); } } - if (atomDecl.code < PULL_ATOM_START_ID && + if (atomDecl->code < PULL_ATOM_START_ID && atomField->options().GetExtension(os::statsd::truncate_timestamp)) { - addAnnotationToAtomDecl(&atomDecl, ATOM_ID_FIELD_NUMBER, + addAnnotationToAtomDecl(atomDecl.get(), ATOM_ID_FIELD_NUMBER, ANNOTATION_ID_TRUNCATE_TIMESTAMP, ANNOTATION_TYPE_BOOL, AnnotationValue(true)); if (dbg) { @@ -533,29 +530,33 @@ int collate_atoms(const Descriptor* descriptor, const string& moduleName, Atoms* } vector<java_type_t> signature; - errorCount += collate_atom(atom, &atomDecl, &signature); - if (atomDecl.primaryFields.size() != 0 && atomDecl.exclusiveField == 0) { + errorCount += collate_atom(atom, atomDecl.get(), &signature); + if (atomDecl->primaryFields.size() != 0 && atomDecl->exclusiveField == 0) { print_error(atomField, "Cannot have a primary field without an exclusive field: %s\n", atomField->name().c_str()); errorCount++; continue; } + FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = atoms->signatureInfoMap[signature]; + populateFieldNumberToAtomDeclSet(atomDecl, &fieldNumberToAtomDeclSet); + atoms->decls.insert(atomDecl); - FieldNumberToAnnotations& fieldNumberToAnnotations = atoms->signatureInfoMap[signature]; - populateFieldNumberToAnnotations(atomDecl, &fieldNumberToAnnotations); - AtomDecl nonChainedAtomDecl(atomField->number(), atomField->name(), atom->name()); + shared_ptr<AtomDecl> nonChainedAtomDecl = + make_shared<AtomDecl>(atomField->number(), atomField->name(), atom->name()); vector<java_type_t> nonChainedSignature; - if (get_non_chained_node(atom, &nonChainedAtomDecl, &nonChainedSignature)) { - atoms->non_chained_decls.insert(nonChainedAtomDecl); - FieldNumberToAnnotations& fieldNumberToAnnotations = + if (get_non_chained_node(atom, nonChainedAtomDecl.get(), &nonChainedSignature)) { + FieldNumberToAtomDeclSet& nonChainedFieldNumberToAtomDeclSet = atoms->nonChainedSignatureInfoMap[nonChainedSignature]; - populateFieldNumberToAnnotations(atomDecl, &fieldNumberToAnnotations); + populateFieldNumberToAtomDeclSet(nonChainedAtomDecl, + &nonChainedFieldNumberToAtomDeclSet); + + atoms->non_chained_decls.insert(nonChainedAtomDecl); } - if (atomDecl.code < PULL_ATOM_START_ID && atomDecl.code > maxPushedAtomId) { - maxPushedAtomId = atomDecl.code; + if (atomDecl->code < PULL_ATOM_START_ID && atomDecl->code > maxPushedAtomId) { + maxPushedAtomId = atomDecl->code; } } @@ -563,8 +564,7 @@ int collate_atoms(const Descriptor* descriptor, const string& moduleName, Atoms* if (dbg) { printf("signatures = [\n"); - for (map<vector<java_type_t>, FieldNumberToAnnotations>::const_iterator it = - atoms->signatureInfoMap.begin(); + for (SignatureInfoMap::const_iterator it = atoms->signatureInfoMap.begin(); it != atoms->signatureInfoMap.end(); it++) { printf(" "); for (vector<java_type_t>::const_iterator jt = it->first.begin(); jt != it->first.end(); diff --git a/tools/stats_log_api_gen/Collation.h b/tools/stats_log_api_gen/Collation.h index 2aedb216b9c1..b1cf1347a98d 100644 --- a/tools/stats_log_api_gen/Collation.h +++ b/tools/stats_log_api_gen/Collation.h @@ -110,7 +110,16 @@ struct Annotation { } }; -using FieldNumberToAnnotations = map<int, set<shared_ptr<Annotation>>>; +struct SharedComparator { + template <typename T> + inline bool operator()(const shared_ptr<T>& lhs, const shared_ptr<T>& rhs) const { + return (*lhs) < (*rhs); + } +}; + +using AnnotationSet = set<shared_ptr<Annotation>, SharedComparator>; + +using FieldNumberToAnnotations = map<int, AnnotationSet>; /** * The name and type for an atom field. @@ -169,11 +178,19 @@ struct AtomDecl { } }; +using AtomDeclSet = set<shared_ptr<AtomDecl>, SharedComparator>; + +// Maps a field number to a set of atoms that have annotation(s) for their field with that field +// number. +using FieldNumberToAtomDeclSet = map<int, AtomDeclSet>; + +using SignatureInfoMap = map<vector<java_type_t>, FieldNumberToAtomDeclSet>; + struct Atoms { - map<vector<java_type_t>, FieldNumberToAnnotations> signatureInfoMap; - set<AtomDecl> decls; - set<AtomDecl> non_chained_decls; - map<vector<java_type_t>, FieldNumberToAnnotations> nonChainedSignatureInfoMap; + SignatureInfoMap signatureInfoMap; + AtomDeclSet decls; + AtomDeclSet non_chained_decls; + SignatureInfoMap nonChainedSignatureInfoMap; int maxPushedAtomId; }; diff --git a/tools/stats_log_api_gen/atoms_info_writer.cpp b/tools/stats_log_api_gen/atoms_info_writer.cpp index 69447527efc8..862fed4656b4 100644 --- a/tools/stats_log_api_gen/atoms_info_writer.cpp +++ b/tools/stats_log_api_gen/atoms_info_writer.cpp @@ -62,11 +62,11 @@ static void write_atoms_info_cpp_body(FILE* out, const Atoms& atoms) { fprintf(out, "const std::set<int> " "AtomsInfo::kTruncatingTimestampAtomBlackList = {\n"); - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); - atom++) { - if (kTruncatingAtomNames.find(atom->name) != kTruncatingAtomNames.end()) { - const string constant = make_constant_name(atom->name); - fprintf(out, " %d, // %s\n", atom->code, constant.c_str()); + for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end(); + atomIt++) { + if (kTruncatingAtomNames.find((*atomIt)->name) != kTruncatingAtomNames.end()) { + const string constant = make_constant_name((*atomIt)->name); + fprintf(out, " %d, // %s\n", (*atomIt)->code, constant.c_str()); } } @@ -74,13 +74,13 @@ static void write_atoms_info_cpp_body(FILE* out, const Atoms& atoms) { fprintf(out, "\n"); fprintf(out, "const std::set<int> AtomsInfo::kAtomsWithAttributionChain = {\n"); - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); - atom++) { - for (vector<AtomField>::const_iterator field = atom->fields.begin(); - field != atom->fields.end(); field++) { + for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end(); + atomIt++) { + for (vector<AtomField>::const_iterator field = (*atomIt)->fields.begin(); + field != (*atomIt)->fields.end(); field++) { if (field->javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) { - const string constant = make_constant_name(atom->name); - fprintf(out, " %d, // %s\n", atom->code, constant.c_str()); + const string constant = make_constant_name((*atomIt)->name); + fprintf(out, " %d, // %s\n", (*atomIt)->code, constant.c_str()); break; } } @@ -90,11 +90,11 @@ static void write_atoms_info_cpp_body(FILE* out, const Atoms& atoms) { fprintf(out, "\n"); fprintf(out, "const std::set<int> AtomsInfo::kWhitelistedAtoms = {\n"); - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); - atom++) { - if (atom->whitelisted) { - const string constant = make_constant_name(atom->name); - fprintf(out, " %d, // %s\n", atom->code, constant.c_str()); + for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end(); + atomIt++) { + if ((*atomIt)->whitelisted) { + const string constant = make_constant_name((*atomIt)->name); + fprintf(out, " %d, // %s\n", (*atomIt)->code, constant.c_str()); } } @@ -103,17 +103,17 @@ static void write_atoms_info_cpp_body(FILE* out, const Atoms& atoms) { fprintf(out, "static std::map<int, int> getAtomUidField() {\n"); fprintf(out, " std::map<int, int> uidField;\n"); - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); - atom++) { - if (atom->uidField == 0) { + for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end(); + atomIt++) { + if ((*atomIt)->uidField == 0) { continue; } fprintf(out, "\n // Adding uid field for atom " "(%d)%s\n", - atom->code, atom->name.c_str()); - fprintf(out, " uidField[%d /* %s */] = %d;\n", atom->code, - make_constant_name(atom->name).c_str(), atom->uidField); + (*atomIt)->code, (*atomIt)->name.c_str()); + fprintf(out, " uidField[%d /* %s */] = %d;\n", (*atomIt)->code, + make_constant_name((*atomIt)->name).c_str(), (*atomIt)->uidField); } fprintf(out, " return uidField;\n"); @@ -128,35 +128,35 @@ static void write_atoms_info_cpp_body(FILE* out, const Atoms& atoms) { "getStateAtomFieldOptions() {\n"); fprintf(out, " std::map<int, StateAtomFieldOptions> options;\n"); fprintf(out, " StateAtomFieldOptions* opt;\n"); - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); - atom++) { - if (atom->primaryFields.size() == 0 && atom->exclusiveField == 0) { + for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end(); + atomIt++) { + if ((*atomIt)->primaryFields.size() == 0 && (*atomIt)->exclusiveField == 0) { continue; } fprintf(out, "\n // Adding primary and exclusive fields for atom " "(%d)%s\n", - atom->code, atom->name.c_str()); - fprintf(out, " opt = &(options[%d /* %s */]);\n", atom->code, - make_constant_name(atom->name).c_str()); - fprintf(out, " opt->primaryFields.reserve(%lu);\n", atom->primaryFields.size()); - for (const auto& field : atom->primaryFields) { + (*atomIt)->code, (*atomIt)->name.c_str()); + fprintf(out, " opt = &(options[%d /* %s */]);\n", (*atomIt)->code, + make_constant_name((*atomIt)->name).c_str()); + fprintf(out, " opt->primaryFields.reserve(%lu);\n", (*atomIt)->primaryFields.size()); + for (const auto& field : (*atomIt)->primaryFields) { fprintf(out, " opt->primaryFields.push_back(%d);\n", field); } - fprintf(out, " opt->exclusiveField = %d;\n", atom->exclusiveField); - if (atom->defaultState != INT_MAX) { - fprintf(out, " opt->defaultState = %d;\n", atom->defaultState); + fprintf(out, " opt->exclusiveField = %d;\n", (*atomIt)->exclusiveField); + if ((*atomIt)->defaultState != INT_MAX) { + fprintf(out, " opt->defaultState = %d;\n", (*atomIt)->defaultState); } else { fprintf(out, " opt->defaultState = UNSET_VALUE;\n"); } - if (atom->resetState != INT_MAX) { - fprintf(out, " opt->resetState = %d;\n", atom->resetState); + if ((*atomIt)->resetState != INT_MAX) { + fprintf(out, " opt->resetState = %d;\n", (*atomIt)->resetState); } else { fprintf(out, " opt->resetState = UNSET_VALUE;\n"); } - fprintf(out, " opt->nested = %d;\n", atom->nested); + fprintf(out, " opt->nested = %d;\n", (*atomIt)->nested); } fprintf(out, " return options;\n"); diff --git a/tools/stats_log_api_gen/java_writer.cpp b/tools/stats_log_api_gen/java_writer.cpp index 5a22b5c4cd6b..3eabb14e3fd4 100644 --- a/tools/stats_log_api_gen/java_writer.cpp +++ b/tools/stats_log_api_gen/java_writer.cpp @@ -22,9 +22,8 @@ namespace android { namespace stats_log_api_gen { -static int write_java_q_logger_class( - FILE* out, const map<vector<java_type_t>, FieldNumberToAnnotations>& signatureInfoMap, - const AtomDecl& attributionDecl) { +static int write_java_q_logger_class(FILE* out, const SignatureInfoMap& signatureInfoMap, + const AtomDecl& attributionDecl) { fprintf(out, "\n"); fprintf(out, " // Write logging helper methods for statsd in Q and earlier.\n"); fprintf(out, " private static class QLogger {\n"); @@ -41,47 +40,64 @@ static int write_java_q_logger_class( } static void write_annotations(FILE* out, int argIndex, - const FieldNumberToAnnotations& fieldNumberToAnnotations) { - auto it = fieldNumberToAnnotations.find(argIndex); - if (it == fieldNumberToAnnotations.end()) { + const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet) { + FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt = + fieldNumberToAtomDeclSet.find(argIndex); + if (fieldNumberToAtomDeclSet.end() == fieldNumberToAtomDeclSetIt) { return; } - const set<shared_ptr<Annotation>>& annotations = it->second; - for (auto& annotation : annotations) { - // TODO(b/151744250): Group annotations for same atoms. - // TODO(b/151786433): Write atom constant name instead of atom id literal. - fprintf(out, " if (code == %d) {\n", annotation->atomId); - switch (annotation->type) { - case ANNOTATION_TYPE_INT: + const AtomDeclSet& atomDeclSet = fieldNumberToAtomDeclSetIt->second; + for (const shared_ptr<AtomDecl>& atomDecl : atomDeclSet) { + fprintf(out, " if (code == %d) {\n", atomDecl->code); + const AnnotationSet& annotations = atomDecl->fieldNumberToAnnotations.at(argIndex); + int resetState = -1; + int defaultState = -1; + for (const shared_ptr<Annotation>& annotation : annotations) { + // TODO(b/151786433): Write atom constant name instead of atom id literal. + switch (annotation->type) { // TODO(b/151776731): Check for reset state annotation and only include // reset state when field value == default state annotation value. - // TODO(b/151786433): Write annotation constant name instead of - // annotation id literal. - fprintf(out, " builder.addIntAnnotation((byte) %d, %d);\n", - annotation->annotationId, annotation->value.intValue); - break; - case ANNOTATION_TYPE_BOOL: - // TODO(b/151786433): Write annotation constant name instead of - // annotation id literal. - fprintf(out, " builder.addBooleanAnnotation((byte) %d, %s);\n", - annotation->annotationId, annotation->value.boolValue ? "true" : "false"); - break; - default: - break; + case ANNOTATION_TYPE_INT: + // TODO(b/151786433): Write annotation constant name instead of + // annotation id literal. + if (ANNOTATION_ID_RESET_STATE == annotation->annotationId) { + resetState = annotation->value.intValue; + } else if (ANNOTATION_ID_DEFAULT_STATE == annotation->annotationId) { + defaultState = annotation->value.intValue; + } else { + fprintf(out, " builder.addIntAnnotation((byte) %d, %d);\n", + annotation->annotationId, annotation->value.intValue); + } + break; + case ANNOTATION_TYPE_BOOL: + // TODO(b/151786433): Write annotation constant name instead of + // annotation id literal. + fprintf(out, " builder.addBooleanAnnotation((byte) %d, %s);\n", + annotation->annotationId, + annotation->value.boolValue ? "true" : "false"); + break; + default: + break; + } + } + if (defaultState != -1 && resetState != -1) { + fprintf(out, " if (arg%d == %d) {\n", argIndex, resetState); + fprintf(out, " builder.addIntAnnotation((byte) %d, %d);\n", + ANNOTATION_ID_RESET_STATE, defaultState); + fprintf(out, " }\n"); } fprintf(out, " }\n"); } } -static int write_java_methods( - FILE* out, const map<vector<java_type_t>, FieldNumberToAnnotations>& signatureInfoMap, - const AtomDecl& attributionDecl, const bool supportQ) { +static int write_java_methods(FILE* out, const SignatureInfoMap& signatureInfoMap, + const AtomDecl& attributionDecl, const bool supportQ) { for (auto signatureInfoMapIt = signatureInfoMap.begin(); signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) { // Print method signature. fprintf(out, " public static void write(int code"); const vector<java_type_t>& signature = signatureInfoMapIt->first; - const FieldNumberToAnnotations& fieldNumberToAnnotations = signatureInfoMapIt->second; + const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = signatureInfoMapIt->second; int argIndex = 1; for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end(); arg++) { @@ -120,7 +136,7 @@ static int write_java_methods( // Write atom code. fprintf(out, "%s builder.setAtomId(code);\n", indent.c_str()); - write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAnnotations); + write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet); // Write the args. argIndex = 1; @@ -231,7 +247,7 @@ static int write_java_methods( fprintf(stderr, "Encountered unsupported type."); return 1; } - write_annotations(out, argIndex, fieldNumberToAnnotations); + write_annotations(out, argIndex, fieldNumberToAtomDeclSet); argIndex++; } diff --git a/tools/stats_log_api_gen/java_writer_q.cpp b/tools/stats_log_api_gen/java_writer_q.cpp index 7d225834aba2..d21e2708b724 100644 --- a/tools/stats_log_api_gen/java_writer_q.cpp +++ b/tools/stats_log_api_gen/java_writer_q.cpp @@ -53,9 +53,8 @@ void write_java_q_logging_constants(FILE* out, const string& indent) { fprintf(out, "%sprivate static final int LIST_TYPE_OVERHEAD = 2;\n", indent.c_str()); } -int write_java_methods_q_schema( - FILE* out, const map<vector<java_type_t>, FieldNumberToAnnotations>& signatureInfoMap, - const AtomDecl& attributionDecl, const string& indent) { +int write_java_methods_q_schema(FILE* out, const SignatureInfoMap& signatureInfoMap, + const AtomDecl& attributionDecl, const string& indent) { int requiredHelpers = 0; for (auto signatureInfoMapIt = signatureInfoMap.begin(); signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) { diff --git a/tools/stats_log_api_gen/java_writer_q.h b/tools/stats_log_api_gen/java_writer_q.h index f1cfc44494e5..c511a8436416 100644 --- a/tools/stats_log_api_gen/java_writer_q.h +++ b/tools/stats_log_api_gen/java_writer_q.h @@ -32,9 +32,8 @@ using namespace std; void write_java_q_logging_constants(FILE* out, const string& indent); -int write_java_methods_q_schema( - FILE* out, const map<vector<java_type_t>, FieldNumberToAnnotations>& signatureInfoMap, - const AtomDecl& attributionDecl, const string& indent); +int write_java_methods_q_schema(FILE* out, const SignatureInfoMap& signatureInfoMap, + const AtomDecl& attributionDecl, const string& indent); void write_java_helpers_for_q_schema_methods(FILE* out, const AtomDecl& attributionDecl, const int requiredHelpers, const string& indent); diff --git a/tools/stats_log_api_gen/native_writer.cpp b/tools/stats_log_api_gen/native_writer.cpp index 0cf3225e7708..c0d73fa6261f 100644 --- a/tools/stats_log_api_gen/native_writer.cpp +++ b/tools/stats_log_api_gen/native_writer.cpp @@ -22,35 +22,53 @@ namespace android { namespace stats_log_api_gen { static void write_annotations(FILE* out, int argIndex, - const FieldNumberToAnnotations& fieldNumberToAnnotations, + const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet, const string& methodPrefix, const string& methodSuffix) { - auto fieldNumberToAnnotationsIt = fieldNumberToAnnotations.find(argIndex); - if (fieldNumberToAnnotationsIt == fieldNumberToAnnotations.end()) { + FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt = + fieldNumberToAtomDeclSet.find(argIndex); + if (fieldNumberToAtomDeclSet.end() == fieldNumberToAtomDeclSetIt) { return; } - const set<shared_ptr<Annotation>>& annotations = fieldNumberToAnnotationsIt->second; - for (const shared_ptr<Annotation>& annotation : annotations) { - // TODO(b/151744250): Group annotations for same atoms. - // TODO(b/151786433): Write atom constant name instead of atom id literal. - fprintf(out, " if (code == %d) {\n", annotation->atomId); - switch (annotation->type) { - // TODO(b/151776731): Check for reset state annotation and only include - // reset state when field value == default state annotation value. - case ANNOTATION_TYPE_INT: - // TODO(b/151786433): Write annotation constant name instead of - // annotation id literal. - fprintf(out, " %saddInt32Annotation(%s%d, %d);\n", methodPrefix.c_str(), - methodSuffix.c_str(), annotation->annotationId, annotation->value.intValue); - break; - case ANNOTATION_TYPE_BOOL: - // TODO(b/151786433): Write annotation constant name instead of - // annotation id literal. - fprintf(out, " %saddBoolAnnotation(%s%d, %s);\n", methodPrefix.c_str(), - methodSuffix.c_str(), annotation->annotationId, - annotation->value.boolValue ? "true" : "false"); - break; - default: - break; + const AtomDeclSet& atomDeclSet = fieldNumberToAtomDeclSetIt->second; + for (const shared_ptr<AtomDecl>& atomDecl : atomDeclSet) { + fprintf(out, " if (code == %d) {\n", atomDecl->code); + const AnnotationSet& annotations = atomDecl->fieldNumberToAnnotations.at(argIndex); + int resetState = -1; + int defaultState = -1; + for (const shared_ptr<Annotation>& annotation : annotations) { + // TODO(b/151786433): Write atom constant name instead of atom id literal. + switch (annotation->type) { + // TODO(b/151776731): Check for reset state annotation and only include + // reset state when field value == default state annotation value. + case ANNOTATION_TYPE_INT: + // TODO(b/151786433): Write annotation constant name instead of + // annotation id literal. + if (ANNOTATION_ID_RESET_STATE == annotation->annotationId) { + resetState = annotation->value.intValue; + } else if (ANNOTATION_ID_DEFAULT_STATE == annotation->annotationId) { + defaultState = annotation->value.intValue; + } else { + fprintf(out, " %saddInt32Annotation(%s%d, %d);\n", + methodPrefix.c_str(), methodSuffix.c_str(), + annotation->annotationId, annotation->value.intValue); + } + break; + case ANNOTATION_TYPE_BOOL: + // TODO(b/151786433): Write annotation constant name instead of + // annotation id literal. + fprintf(out, " %saddBoolAnnotation(%s%d, %s);\n", methodPrefix.c_str(), + methodSuffix.c_str(), annotation->annotationId, + annotation->value.boolValue ? "true" : "false"); + break; + default: + break; + } + } + if (defaultState != -1 && resetState != -1) { + fprintf(out, " if (arg%d == %d) {\n", argIndex, resetState); + fprintf(out, " %saddInt32Annotation(%s%d, %d);\n", methodPrefix.c_str(), + methodSuffix.c_str(), ANNOTATION_ID_RESET_STATE, defaultState); + fprintf(out, " }\n"); } fprintf(out, " }\n"); } @@ -62,7 +80,7 @@ static int write_native_stats_write_methods(FILE* out, const Atoms& atoms, for (auto signatureInfoMapIt = atoms.signatureInfoMap.begin(); signatureInfoMapIt != atoms.signatureInfoMap.end(); signatureInfoMapIt++) { vector<java_type_t> signature = signatureInfoMapIt->first; - const FieldNumberToAnnotations& fieldNumberToAnnotations = signatureInfoMapIt->second; + const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = signatureInfoMapIt->second; // Key value pairs not supported in native. if (find(signature.begin(), signature.end(), JAVA_TYPE_KEY_VALUE_PAIR) != signature.end()) { continue; @@ -73,7 +91,7 @@ static int write_native_stats_write_methods(FILE* out, const Atoms& atoms, if (supportQ) { fprintf(out, " StatsEventCompat event;\n"); fprintf(out, " event.setAtomId(code);\n"); - write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAnnotations, "event.", ""); + write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet, "event.", ""); for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end(); arg++) { switch (*arg) { @@ -109,14 +127,14 @@ static int write_native_stats_write_methods(FILE* out, const Atoms& atoms, fprintf(stderr, "Encountered unsupported type."); return 1; } - write_annotations(out, argIndex, fieldNumberToAnnotations, "event.", ""); + write_annotations(out, argIndex, fieldNumberToAtomDeclSet, "event.", ""); argIndex++; } fprintf(out, " return event.writeToSocket();\n"); } else { fprintf(out, " AStatsEvent* event = AStatsEvent_obtain();\n"); fprintf(out, " AStatsEvent_setAtomId(event, code);\n"); - write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAnnotations, "AStatsEvent_", + write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet, "AStatsEvent_", "event, "); for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end(); arg++) { @@ -159,7 +177,7 @@ static int write_native_stats_write_methods(FILE* out, const Atoms& atoms, fprintf(stderr, "Encountered unsupported type."); return 1; } - write_annotations(out, argIndex, fieldNumberToAnnotations, "AStatsEvent_", + write_annotations(out, argIndex, fieldNumberToAtomDeclSet, "AStatsEvent_", "event, "); argIndex++; } @@ -209,10 +227,9 @@ static void write_native_stats_write_non_chained_methods(FILE* out, const Atoms& } } -static void write_native_method_header( - FILE* out, const string& methodName, - const map<vector<java_type_t>, FieldNumberToAnnotations>& signatureInfoMap, - const AtomDecl& attributionDecl) { +static void write_native_method_header(FILE* out, const string& methodName, + const SignatureInfoMap& signatureInfoMap, + const AtomDecl& attributionDecl) { for (auto signatureInfoMapIt = signatureInfoMap.begin(); signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) { vector<java_type_t> signature = signatureInfoMapIt->first; @@ -278,16 +295,17 @@ int write_stats_log_header(FILE* out, const Atoms& atoms, const AtomDecl& attrib fprintf(out, "//\n"); fprintf(out, "// Constants for enum values\n"); fprintf(out, "//\n\n"); - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); - atom++) { - for (vector<AtomField>::const_iterator field = atom->fields.begin(); - field != atom->fields.end(); field++) { + for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end(); + atomIt++) { + for (vector<AtomField>::const_iterator field = (*atomIt)->fields.begin(); + field != (*atomIt)->fields.end(); field++) { if (field->javaType == JAVA_TYPE_ENUM) { - fprintf(out, "// Values for %s.%s\n", atom->message.c_str(), field->name.c_str()); + fprintf(out, "// Values for %s.%s\n", (*atomIt)->message.c_str(), + field->name.c_str()); for (map<int, string>::const_iterator value = field->enumValues.begin(); value != field->enumValues.end(); value++) { fprintf(out, "const int32_t %s__%s__%s = %d;\n", - make_constant_name(atom->message).c_str(), + make_constant_name((*atomIt)->message).c_str(), make_constant_name(field->name).c_str(), make_constant_name(value->second).c_str(), value->first); } diff --git a/tools/stats_log_api_gen/test_collation.cpp b/tools/stats_log_api_gen/test_collation.cpp index 9878926bb045..c654a1b03051 100644 --- a/tools/stats_log_api_gen/test_collation.cpp +++ b/tools/stats_log_api_gen/test_collation.cpp @@ -30,8 +30,7 @@ using std::vector; /** * Return whether the map contains a vector of the elements provided. */ -static bool map_contains_vector(const map<vector<java_type_t>, FieldNumberToAnnotations>& s, - int count, ...) { +static bool map_contains_vector(const SignatureInfoMap& s, int count, ...) { va_list args; vector<java_type_t> v; @@ -110,35 +109,37 @@ TEST(CollationTest, CollateStats) { JAVA_TYPE_LONG // sint64 ); - set<AtomDecl>::const_iterator atom = atoms.decls.begin(); - EXPECT_EQ(1, atom->code); - EXPECT_EQ("int_atom", atom->name); - EXPECT_EQ("IntAtom", atom->message); - EXPECT_NO_ENUM_FIELD(atom); - atom++; - - EXPECT_EQ(2, atom->code); - EXPECT_EQ("out_of_order_atom", atom->name); - EXPECT_EQ("OutOfOrderAtom", atom->message); - EXPECT_NO_ENUM_FIELD(atom); - atom++; - - EXPECT_EQ(3, atom->code); - EXPECT_EQ("another_int_atom", atom->name); - EXPECT_EQ("AnotherIntAtom", atom->message); - EXPECT_NO_ENUM_FIELD(atom); - atom++; - - EXPECT_EQ(4, atom->code); - EXPECT_EQ("all_types_atom", atom->name); - EXPECT_EQ("AllTypesAtom", atom->message); + EXPECT_EQ(4ul, atoms.decls.size()); + + AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); + EXPECT_EQ(1, (*atomIt)->code); + EXPECT_EQ("int_atom", (*atomIt)->name); + EXPECT_EQ("IntAtom", (*atomIt)->message); + EXPECT_NO_ENUM_FIELD((*atomIt)); + atomIt++; + + EXPECT_EQ(2, (*atomIt)->code); + EXPECT_EQ("out_of_order_atom", (*atomIt)->name); + EXPECT_EQ("OutOfOrderAtom", (*atomIt)->message); + EXPECT_NO_ENUM_FIELD((*atomIt)); + atomIt++; + + EXPECT_EQ(3, (*atomIt)->code); + EXPECT_EQ("another_int_atom", (*atomIt)->name); + EXPECT_EQ("AnotherIntAtom", (*atomIt)->message); + EXPECT_NO_ENUM_FIELD((*atomIt)); + atomIt++; + + EXPECT_EQ(4, (*atomIt)->code); + EXPECT_EQ("all_types_atom", (*atomIt)->name); + EXPECT_EQ("AllTypesAtom", (*atomIt)->message); map<int, string> enumValues; enumValues[0] = "VALUE0"; enumValues[1] = "VALUE1"; - EXPECT_HAS_ENUM_FIELD(atom, "enum_field", enumValues); - atom++; + EXPECT_HAS_ENUM_FIELD((*atomIt), "enum_field", enumValues); + atomIt++; - EXPECT_TRUE(atom == atoms.decls.end()); + EXPECT_EQ(atoms.decls.end(), atomIt); } /** @@ -235,10 +236,10 @@ TEST(CollationTest, RecogniseWhitelistedAtom) { Atoms atoms; collate_atoms(ListedAtoms::descriptor(), DEFAULT_MODULE_NAME, &atoms); for (const auto& atomDecl : atoms.decls) { - if (atomDecl.code == 1) { - EXPECT_TRUE(atomDecl.whitelisted); + if (atomDecl->code == 1) { + EXPECT_TRUE(atomDecl->whitelisted); } else { - EXPECT_FALSE(atomDecl.whitelisted); + EXPECT_FALSE(atomDecl->whitelisted); } } } @@ -258,33 +259,66 @@ TEST(CollationTest, RecognizeModuleAtom) { EXPECT_EQ(atoms.signatureInfoMap.size(), 2u); EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_INT); EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_STRING); - for (auto signatureInfoMapIt : atoms.signatureInfoMap) { - vector<java_type_t> signature = signatureInfoMapIt.first; - const FieldNumberToAnnotations& fieldNumberToAnnotations = signatureInfoMapIt.second; - if (signature[0] == JAVA_TYPE_STRING) { - EXPECT_EQ(0u, fieldNumberToAnnotations.size()); - } else if (signature[0] == JAVA_TYPE_INT) { - EXPECT_EQ(1u, fieldNumberToAnnotations.size()); - EXPECT_NE(fieldNumberToAnnotations.end(), fieldNumberToAnnotations.find(1)); - const set<shared_ptr<Annotation>>& annotations = fieldNumberToAnnotations.at(1); - EXPECT_EQ(2u, annotations.size()); - for (const shared_ptr<Annotation> annotation : annotations) { - EXPECT_TRUE(annotation->annotationId == ANNOTATION_ID_IS_UID || - annotation->annotationId == ANNOTATION_ID_STATE_OPTION); - if (ANNOTATION_ID_IS_UID == annotation->annotationId) { - EXPECT_EQ(1, annotation->atomId); - EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type); - EXPECT_TRUE(annotation->value.boolValue); - } - - if (ANNOTATION_ID_STATE_OPTION == annotation->annotationId) { - EXPECT_EQ(3, annotation->atomId); - EXPECT_EQ(ANNOTATION_TYPE_INT, annotation->type); - EXPECT_EQ(os::statsd::StateField::EXCLUSIVE_STATE, annotation->value.intValue); - } - } - } - } + + SignatureInfoMap::const_iterator signatureInfoMapIt; + const vector<java_type_t>* signature; + const FieldNumberToAtomDeclSet* fieldNumberToAtomDeclSet; + FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt; + const AtomDeclSet* atomDeclSet; + AtomDeclSet::const_iterator atomDeclSetIt; + AtomDecl* atomDecl; + FieldNumberToAnnotations* fieldNumberToAnnotations; + FieldNumberToAnnotations::const_iterator fieldNumberToAnnotationsIt; + const AnnotationSet* annotationSet; + AnnotationSet::const_iterator annotationSetIt; + Annotation* annotation; + + signatureInfoMapIt = atoms.signatureInfoMap.begin(); + signature = &(signatureInfoMapIt->first); + fieldNumberToAtomDeclSet = &signatureInfoMapIt->second; + EXPECT_EQ(1ul, signature->size()); + EXPECT_EQ(JAVA_TYPE_INT, signature->at(0)); + EXPECT_EQ(1ul, fieldNumberToAtomDeclSet->size()); + fieldNumberToAtomDeclSetIt = fieldNumberToAtomDeclSet->begin(); + EXPECT_EQ(1, fieldNumberToAtomDeclSetIt->first); + atomDeclSet = &fieldNumberToAtomDeclSetIt->second; + EXPECT_EQ(2ul, atomDeclSet->size()); + atomDeclSetIt = atomDeclSet->begin(); + atomDecl = atomDeclSetIt->get(); + EXPECT_EQ(1, atomDecl->code); + fieldNumberToAnnotations = &atomDecl->fieldNumberToAnnotations; + fieldNumberToAnnotationsIt = fieldNumberToAnnotations->find(1); + EXPECT_NE(fieldNumberToAnnotations->end(), fieldNumberToAnnotationsIt); + annotationSet = &fieldNumberToAnnotationsIt->second; + EXPECT_EQ(1ul, annotationSet->size()); + annotationSetIt = annotationSet->begin(); + annotation = annotationSetIt->get(); + EXPECT_EQ(ANNOTATION_ID_IS_UID, annotation->annotationId); + EXPECT_EQ(1, annotation->atomId); + EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type); + EXPECT_TRUE(annotation->value.boolValue); + + atomDeclSetIt++; + atomDecl = atomDeclSetIt->get(); + EXPECT_EQ(3, atomDecl->code); + fieldNumberToAnnotations = &atomDecl->fieldNumberToAnnotations; + fieldNumberToAnnotationsIt = fieldNumberToAnnotations->find(1); + EXPECT_NE(fieldNumberToAnnotations->end(), fieldNumberToAnnotationsIt); + annotationSet = &fieldNumberToAnnotationsIt->second; + EXPECT_EQ(1ul, annotationSet->size()); + annotationSetIt = annotationSet->begin(); + annotation = annotationSetIt->get(); + EXPECT_EQ(ANNOTATION_ID_STATE_OPTION, annotation->annotationId); + EXPECT_EQ(3, annotation->atomId); + EXPECT_EQ(ANNOTATION_TYPE_INT, annotation->type); + EXPECT_EQ(os::statsd::StateField::EXCLUSIVE_STATE, annotation->value.intValue); + + signatureInfoMapIt++; + signature = &signatureInfoMapIt->first; + fieldNumberToAtomDeclSet = &signatureInfoMapIt->second; + EXPECT_EQ(1ul, signature->size()); + EXPECT_EQ(JAVA_TYPE_STRING, signature->at(0)); + EXPECT_EQ(0ul, fieldNumberToAtomDeclSet->size()); } TEST(CollationTest, RecognizeModule1Atom) { @@ -295,31 +329,59 @@ TEST(CollationTest, RecognizeModule1Atom) { EXPECT_EQ(atoms.decls.size(), 2ul); EXPECT_EQ(atoms.signatureInfoMap.size(), 1u); EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_INT); - for (auto signatureInfoMapIt : atoms.signatureInfoMap) { - vector<java_type_t> signature = signatureInfoMapIt.first; - const FieldNumberToAnnotations& fieldNumberToAnnotations = signatureInfoMapIt.second; - EXPECT_EQ(JAVA_TYPE_INT, signature[0]); - EXPECT_EQ(1u, fieldNumberToAnnotations.size()); - int fieldNumber = 1; - EXPECT_NE(fieldNumberToAnnotations.end(), fieldNumberToAnnotations.find(fieldNumber)); - const set<shared_ptr<Annotation>>& annotations = fieldNumberToAnnotations.at(fieldNumber); - EXPECT_EQ(2u, annotations.size()); - for (const shared_ptr<Annotation> annotation : annotations) { - EXPECT_TRUE(annotation->annotationId == ANNOTATION_ID_IS_UID || - annotation->annotationId == ANNOTATION_ID_STATE_OPTION); - if (ANNOTATION_ID_IS_UID == annotation->annotationId) { - EXPECT_EQ(1, annotation->atomId); - EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type); - EXPECT_TRUE(annotation->value.boolValue); - } - - if (ANNOTATION_ID_STATE_OPTION == annotation->annotationId) { - EXPECT_EQ(3, annotation->atomId); - EXPECT_EQ(ANNOTATION_TYPE_INT, annotation->type); - EXPECT_EQ(os::statsd::StateField::EXCLUSIVE_STATE, annotation->value.intValue); - } - } - } + + SignatureInfoMap::const_iterator signatureInfoMapIt; + const vector<java_type_t>* signature; + const FieldNumberToAtomDeclSet* fieldNumberToAtomDeclSet; + FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt; + const AtomDeclSet* atomDeclSet; + AtomDeclSet::const_iterator atomDeclSetIt; + AtomDecl* atomDecl; + FieldNumberToAnnotations* fieldNumberToAnnotations; + FieldNumberToAnnotations::const_iterator fieldNumberToAnnotationsIt; + const AnnotationSet* annotationSet; + AnnotationSet::const_iterator annotationSetIt; + Annotation* annotation; + + signatureInfoMapIt = atoms.signatureInfoMap.begin(); + signature = &(signatureInfoMapIt->first); + fieldNumberToAtomDeclSet = &signatureInfoMapIt->second; + EXPECT_EQ(1ul, signature->size()); + EXPECT_EQ(JAVA_TYPE_INT, signature->at(0)); + EXPECT_EQ(1ul, fieldNumberToAtomDeclSet->size()); + fieldNumberToAtomDeclSetIt = fieldNumberToAtomDeclSet->begin(); + EXPECT_EQ(1, fieldNumberToAtomDeclSetIt->first); + atomDeclSet = &fieldNumberToAtomDeclSetIt->second; + EXPECT_EQ(2ul, atomDeclSet->size()); + atomDeclSetIt = atomDeclSet->begin(); + atomDecl = atomDeclSetIt->get(); + EXPECT_EQ(1, atomDecl->code); + fieldNumberToAnnotations = &atomDecl->fieldNumberToAnnotations; + fieldNumberToAnnotationsIt = fieldNumberToAnnotations->find(1); + EXPECT_NE(fieldNumberToAnnotations->end(), fieldNumberToAnnotationsIt); + annotationSet = &fieldNumberToAnnotationsIt->second; + EXPECT_EQ(1ul, annotationSet->size()); + annotationSetIt = annotationSet->begin(); + annotation = annotationSetIt->get(); + EXPECT_EQ(ANNOTATION_ID_IS_UID, annotation->annotationId); + EXPECT_EQ(1, annotation->atomId); + EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type); + EXPECT_TRUE(annotation->value.boolValue); + + atomDeclSetIt++; + atomDecl = atomDeclSetIt->get(); + EXPECT_EQ(3, atomDecl->code); + fieldNumberToAnnotations = &atomDecl->fieldNumberToAnnotations; + fieldNumberToAnnotationsIt = fieldNumberToAnnotations->find(1); + EXPECT_NE(fieldNumberToAnnotations->end(), fieldNumberToAnnotationsIt); + annotationSet = &fieldNumberToAnnotationsIt->second; + EXPECT_EQ(1ul, annotationSet->size()); + annotationSetIt = annotationSet->begin(); + annotation = annotationSetIt->get(); + EXPECT_EQ(ANNOTATION_ID_STATE_OPTION, annotation->annotationId); + EXPECT_EQ(3, annotation->atomId); + EXPECT_EQ(ANNOTATION_TYPE_INT, annotation->type); + EXPECT_EQ(os::statsd::StateField::EXCLUSIVE_STATE, annotation->value.intValue); } } // namespace stats_log_api_gen diff --git a/tools/stats_log_api_gen/utils.cpp b/tools/stats_log_api_gen/utils.cpp index 0262488e8501..abb89133e58e 100644 --- a/tools/stats_log_api_gen/utils.cpp +++ b/tools/stats_log_api_gen/utils.cpp @@ -22,10 +22,10 @@ namespace android { namespace stats_log_api_gen { static void build_non_chained_decl_map(const Atoms& atoms, - std::map<int, set<AtomDecl>::const_iterator>* decl_map) { - for (set<AtomDecl>::const_iterator atom = atoms.non_chained_decls.begin(); - atom != atoms.non_chained_decls.end(); atom++) { - decl_map->insert(std::make_pair(atom->code, atom)); + std::map<int, AtomDeclSet::const_iterator>* decl_map) { + for (AtomDeclSet::const_iterator atomIt = atoms.non_chained_decls.begin(); + atomIt != atoms.non_chained_decls.end(); atomIt++) { + decl_map->insert(std::make_pair((*atomIt)->code, atomIt)); } } @@ -117,11 +117,11 @@ void write_closing_namespace(FILE* out, const string& cppNamespaces) { } static void write_cpp_usage(FILE* out, const string& method_name, const string& atom_code_name, - const AtomDecl& atom, const AtomDecl& attributionDecl) { + const shared_ptr<AtomDecl> atom, const AtomDecl& attributionDecl) { fprintf(out, " * Usage: %s(StatsLog.%s", method_name.c_str(), atom_code_name.c_str()); - for (vector<AtomField>::const_iterator field = atom.fields.begin(); field != atom.fields.end(); - field++) { + for (vector<AtomField>::const_iterator field = atom->fields.begin(); + field != atom->fields.end(); field++) { if (field->javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) { for (auto chainField : attributionDecl.fields) { if (chainField.javaType == JAVA_TYPE_STRING) { @@ -154,27 +154,27 @@ void write_native_atom_constants(FILE* out, const Atoms& atoms, const AtomDecl& fprintf(out, " */\n"); fprintf(out, "enum {\n"); - std::map<int, set<AtomDecl>::const_iterator> atom_code_to_non_chained_decl_map; + std::map<int, AtomDeclSet::const_iterator> atom_code_to_non_chained_decl_map; build_non_chained_decl_map(atoms, &atom_code_to_non_chained_decl_map); size_t i = 0; // Print atom constants - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); - atom++) { - string constant = make_constant_name(atom->name); + for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end(); + atomIt++) { + string constant = make_constant_name((*atomIt)->name); fprintf(out, "\n"); fprintf(out, " /**\n"); - fprintf(out, " * %s %s\n", atom->message.c_str(), atom->name.c_str()); - write_cpp_usage(out, "stats_write", constant, *atom, attributionDecl); + fprintf(out, " * %s %s\n", (*atomIt)->message.c_str(), (*atomIt)->name.c_str()); + write_cpp_usage(out, "stats_write", constant, *atomIt, attributionDecl); - auto non_chained_decl = atom_code_to_non_chained_decl_map.find(atom->code); + auto non_chained_decl = atom_code_to_non_chained_decl_map.find((*atomIt)->code); if (non_chained_decl != atom_code_to_non_chained_decl_map.end()) { write_cpp_usage(out, "stats_write_non_chained", constant, *non_chained_decl->second, attributionDecl); } fprintf(out, " */\n"); char const* const comma = (i == atoms.decls.size() - 1) ? "" : ","; - fprintf(out, " %s = %d%s\n", constant.c_str(), atom->code, comma); + fprintf(out, " %s = %d%s\n", constant.c_str(), (*atomIt)->code, comma); i++; } fprintf(out, "\n"); @@ -245,40 +245,40 @@ void write_native_method_call(FILE* out, const string& methodName, void write_java_atom_codes(FILE* out, const Atoms& atoms) { fprintf(out, " // Constants for atom codes.\n"); - std::map<int, set<AtomDecl>::const_iterator> atom_code_to_non_chained_decl_map; + std::map<int, AtomDeclSet::const_iterator> atom_code_to_non_chained_decl_map; build_non_chained_decl_map(atoms, &atom_code_to_non_chained_decl_map); // Print constants for the atom codes. - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); - atom++) { - string constant = make_constant_name(atom->name); + for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end(); + atomIt++) { + string constant = make_constant_name((*atomIt)->name); fprintf(out, "\n"); fprintf(out, " /**\n"); - fprintf(out, " * %s %s<br>\n", atom->message.c_str(), atom->name.c_str()); - write_java_usage(out, "write", constant, *atom); - auto non_chained_decl = atom_code_to_non_chained_decl_map.find(atom->code); + fprintf(out, " * %s %s<br>\n", (*atomIt)->message.c_str(), (*atomIt)->name.c_str()); + write_java_usage(out, "write", constant, **atomIt); + auto non_chained_decl = atom_code_to_non_chained_decl_map.find((*atomIt)->code); if (non_chained_decl != atom_code_to_non_chained_decl_map.end()) { - write_java_usage(out, "write_non_chained", constant, *non_chained_decl->second); + write_java_usage(out, "write_non_chained", constant, **(non_chained_decl->second)); } fprintf(out, " */\n"); - fprintf(out, " public static final int %s = %d;\n", constant.c_str(), atom->code); + fprintf(out, " public static final int %s = %d;\n", constant.c_str(), (*atomIt)->code); } fprintf(out, "\n"); } void write_java_enum_values(FILE* out, const Atoms& atoms) { fprintf(out, " // Constants for enum values.\n\n"); - for (set<AtomDecl>::const_iterator atom = atoms.decls.begin(); atom != atoms.decls.end(); - atom++) { - for (vector<AtomField>::const_iterator field = atom->fields.begin(); - field != atom->fields.end(); field++) { + for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end(); + atomIt++) { + for (vector<AtomField>::const_iterator field = (*atomIt)->fields.begin(); + field != (*atomIt)->fields.end(); field++) { if (field->javaType == JAVA_TYPE_ENUM) { - fprintf(out, " // Values for %s.%s\n", atom->message.c_str(), + fprintf(out, " // Values for %s.%s\n", (*atomIt)->message.c_str(), field->name.c_str()); for (map<int, string>::const_iterator value = field->enumValues.begin(); value != field->enumValues.end(); value++) { fprintf(out, " public static final int %s__%s__%s = %d;\n", - make_constant_name(atom->message).c_str(), + make_constant_name((*atomIt)->message).c_str(), make_constant_name(field->name).c_str(), make_constant_name(value->second).c_str(), value->first); } @@ -307,8 +307,7 @@ void write_java_usage(FILE* out, const string& method_name, const string& atom_c fprintf(out, ");<br>\n"); } -int write_java_non_chained_methods( - FILE* out, const map<vector<java_type_t>, FieldNumberToAnnotations>& signatureInfoMap) { +int write_java_non_chained_methods(FILE* out, const SignatureInfoMap& signatureInfoMap) { for (auto signatureInfoMapIt = signatureInfoMap.begin(); signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) { // Print method signature. @@ -351,8 +350,7 @@ int write_java_non_chained_methods( return 0; } -int write_java_work_source_methods( - FILE* out, const map<vector<java_type_t>, FieldNumberToAnnotations>& signatureInfoMap) { +int write_java_work_source_methods(FILE* out, const SignatureInfoMap& signatureInfoMap) { fprintf(out, " // WorkSource methods.\n"); for (auto signatureInfoMapIt = signatureInfoMap.begin(); signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) { diff --git a/tools/stats_log_api_gen/utils.h b/tools/stats_log_api_gen/utils.h index 468f3233d77f..57b6f6254562 100644 --- a/tools/stats_log_api_gen/utils.h +++ b/tools/stats_log_api_gen/utils.h @@ -67,11 +67,9 @@ void write_java_enum_values(FILE* out, const Atoms& atoms); void write_java_usage(FILE* out, const string& method_name, const string& atom_code_name, const AtomDecl& atom); -int write_java_non_chained_methods( - FILE* out, const map<vector<java_type_t>, FieldNumberToAnnotations>& signatureInfoMap); +int write_java_non_chained_methods(FILE* out, const SignatureInfoMap& signatureInfoMap); -int write_java_work_source_methods( - FILE* out, const map<vector<java_type_t>, FieldNumberToAnnotations>& signatureInfoMap); +int write_java_work_source_methods(FILE* out, const SignatureInfoMap& signatureInfoMap); } // namespace stats_log_api_gen } // namespace android |