1ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski/* 2ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * Copyright (C) 2015 The Android Open Source Project 3ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * 4ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * you may not use this file except in compliance with the License. 6ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * You may obtain a copy of the License at 7ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * 8ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * 10ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * Unless required by applicable law or agreed to in writing, software 11ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * See the License for the specific language governing permissions and 14ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * limitations under the License. 15ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski */ 16ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 17ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski#include "java/AnnotationProcessor.h" 18ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 19ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski#include <algorithm> 20ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 21ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "util/Util.h" 22ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski 23d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiusing android::StringPiece; 24d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski 25ca5638fd85098c3d0a699492751043545f75553aAdam Lesinskinamespace aapt { 26ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 27ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskivoid AnnotationProcessor::AppendCommentLine(std::string& comment) { 28ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski static const std::string sDeprecated = "@deprecated"; 29ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski static const std::string sSystemApi = "@SystemApi"; 30ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 31ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (comment.find(sDeprecated) != std::string::npos) { 32ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski annotation_bit_mask_ |= kDeprecated; 33ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 34ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 35ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string::size_type idx = comment.find(sSystemApi); 36ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (idx != std::string::npos) { 37ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski annotation_bit_mask_ |= kSystemApi; 38ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski comment.erase(comment.begin() + idx, 39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski comment.begin() + idx + sSystemApi.size()); 40ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 41626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski 42ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (util::TrimWhitespace(comment).empty()) { 43ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return; 44ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 45ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 46ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!has_comments_) { 47ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski has_comments_ = true; 48ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski comment_ << "/**"; 49ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 50ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 51ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski comment_ << "\n * " << std::move(comment); 52ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski} 53ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 54ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskivoid AnnotationProcessor::AppendComment(const StringPiece& comment) { 55ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski // We need to process line by line to clean-up whitespace and append prefixes. 56ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski for (StringPiece line : util::Tokenize(comment, '\n')) { 57ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski line = util::TrimWhitespace(line); 58ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (!line.empty()) { 59d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski std::string lineCopy = line.to_string(); 60ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski AppendCommentLine(lineCopy); 61ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski } 62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 63ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski} 64ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 65ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskivoid AnnotationProcessor::AppendNewLine() { comment_ << "\n *"; } 667656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski 67ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskivoid AnnotationProcessor::WriteToStream(std::ostream* out, 68ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski const StringPiece& prefix) const { 69ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (has_comments_) { 70ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::string result = comment_.str(); 71ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski for (StringPiece line : util::Tokenize(result, '\n')) { 72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski *out << prefix << line << "\n"; 733b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski } 74ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski *out << prefix << " */" 75ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski << "\n"; 76ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 77ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 78ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (annotation_bit_mask_ & kDeprecated) { 79ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski *out << prefix << "@Deprecated\n"; 80ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 81b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski 82ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (annotation_bit_mask_ & kSystemApi) { 83ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski *out << prefix << "@android.annotation.SystemApi\n"; 84ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski } 85ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski} 86ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 87ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski} // namespace aapt 88