diff options
author | Narayan Kamath <narayan@google.com> | 2020-03-30 13:16:06 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-03-30 13:16:06 +0000 |
commit | 924069c2aa1d3fa64969868ccdf6dc8bf54fc670 (patch) | |
tree | 85a5395138760ab43202ec46660f421fede83b50 /tools/aapt2/java/AnnotationProcessor.cpp | |
parent | 88973641ac71d091b1b14426b87abac9ab1dc7e8 (diff) | |
parent | 1c1544ff96e7f87154c2eff62c1da3aee46b569f (diff) |
Merge "aapt2: Preserve annotation parameters for SystemApi." into rvc-dev
Diffstat (limited to 'tools/aapt2/java/AnnotationProcessor.cpp')
-rw-r--r-- | tools/aapt2/java/AnnotationProcessor.cpp | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/tools/aapt2/java/AnnotationProcessor.cpp b/tools/aapt2/java/AnnotationProcessor.cpp index a4610b2575b9..cec59e75831d 100644 --- a/tools/aapt2/java/AnnotationProcessor.cpp +++ b/tools/aapt2/java/AnnotationProcessor.cpp @@ -18,6 +18,7 @@ #include <algorithm> #include <array> +#include <regex> #include "text/Unicode.h" #include "text/Utf8Iterator.h" @@ -65,14 +66,26 @@ void AnnotationProcessor::AppendCommentLine(std::string comment) { // Treat deprecated specially, since we don't remove it from the source comment. if (comment.find(sDeprecated) != std::string::npos) { - annotation_bit_mask_ |= AnnotationRule::kDeprecated; + annotation_parameter_map_[AnnotationRule::kDeprecated] = ""; } for (const AnnotationRule& rule : sAnnotationRules) { std::string::size_type idx = comment.find(rule.doc_str.data()); if (idx != std::string::npos) { - annotation_bit_mask_ |= rule.bit_mask; - comment.erase(comment.begin() + idx, comment.begin() + idx + rule.doc_str.size()); + // Captures all parameters associated with the specified annotation rule + // by matching the first pair of parantheses after the rule. + std::regex re(rule.doc_str.to_string() + "\\s*\\((.+)\\)"); + std::smatch match_result; + const bool is_match = std::regex_search(comment, match_result, re); + // We currently only capture and preserve parameters for SystemApi. + if (is_match && rule.bit_mask == AnnotationRule::kSystemApi) { + annotation_parameter_map_[rule.bit_mask] = match_result[1].str(); + comment.erase(comment.begin() + match_result.position(), + comment.begin() + match_result.position() + match_result.length()); + } else { + annotation_parameter_map_[rule.bit_mask] = ""; + comment.erase(comment.begin() + idx, comment.begin() + idx + rule.doc_str.size()); + } } } @@ -119,13 +132,19 @@ void AnnotationProcessor::Print(Printer* printer) const { printer->Println(" */"); } - if (annotation_bit_mask_ & AnnotationRule::kDeprecated) { + if (annotation_parameter_map_.find(AnnotationRule::kDeprecated) != + annotation_parameter_map_.end()) { printer->Println("@Deprecated"); } for (const AnnotationRule& rule : sAnnotationRules) { - if (annotation_bit_mask_ & rule.bit_mask) { - printer->Println(rule.annotation); + const auto& it = annotation_parameter_map_.find(rule.bit_mask); + if (it != annotation_parameter_map_.end()) { + printer->Print(rule.annotation); + if (!it->second.empty()) { + printer->Print("(").Print(it->second).Print(")"); + } + printer->Print("\n"); } } } |