summaryrefslogtreecommitdiff
path: root/tools/aapt2/java/AnnotationProcessor.cpp
diff options
context:
space:
mode:
authorNarayan Kamath <narayan@google.com>2020-03-30 13:22:15 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-03-30 13:22:15 +0000
commit45f8d1cf43666e6e0f00c56eb416733d6d36a895 (patch)
treecbfb17d092574c57a792924e83b498cf99aa3dd1 /tools/aapt2/java/AnnotationProcessor.cpp
parentecfd2f5cb91f4fc25dedaf3162058d47faad7261 (diff)
parent924069c2aa1d3fa64969868ccdf6dc8bf54fc670 (diff)
Merge "aapt2: Preserve annotation parameters for SystemApi." into rvc-dev am: 924069c2aa
Change-Id: Ieb278c96432a0a23d65752a2c89365b02ed936f4
Diffstat (limited to 'tools/aapt2/java/AnnotationProcessor.cpp')
-rw-r--r--tools/aapt2/java/AnnotationProcessor.cpp31
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");
}
}
}