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#include "util/Util.h" 19ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 20ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski#include <algorithm> 21ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 22ca5638fd85098c3d0a699492751043545f75553aAdam Lesinskinamespace aapt { 23ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 24626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinskivoid AnnotationProcessor::appendCommentLine(std::string& comment) { 25ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski static const std::string sDeprecated = "@deprecated"; 26ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski static const std::string sSystemApi = "@SystemApi"; 27ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 28b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski if (comment.find(sDeprecated) != std::string::npos) { 29b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski mAnnotationBitMask |= kDeprecated; 30ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski } 31ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 32626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski std::string::size_type idx = comment.find(sSystemApi); 33626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski if (idx != std::string::npos) { 34b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski mAnnotationBitMask |= kSystemApi; 35626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski comment.erase(comment.begin() + idx, comment.begin() + idx + sSystemApi.size()); 36626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski } 37626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski 38626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski if (util::trimWhitespace(comment).empty()) { 39626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski return; 40ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski } 41ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 42b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski if (!mHasComments) { 43b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski mHasComments = true; 44b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski mComment << "/**"; 45ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski } 46ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 477656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski mComment << "\n * " << std::move(comment); 48ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski} 49ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 50ca5638fd85098c3d0a699492751043545f75553aAdam Lesinskivoid AnnotationProcessor::appendComment(const StringPiece16& comment) { 51ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski // We need to process line by line to clean-up whitespace and append prefixes. 52ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski for (StringPiece16 line : util::tokenize(comment, u'\n')) { 533b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski line = util::trimWhitespace(line); 543b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski if (!line.empty()) { 55626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski std::string utf8Line = util::utf16ToUtf8(line); 56626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski appendCommentLine(utf8Line); 573b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski } 583b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski } 593b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski} 603b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski 613b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinskivoid AnnotationProcessor::appendComment(const StringPiece& comment) { 623b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski for (StringPiece line : util::tokenize(comment, '\n')) { 633b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski line = util::trimWhitespace(line); 643b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski if (!line.empty()) { 65626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski std::string utf8Line = line.toString(); 66626b3dbf74f02ae630ae0089632f5962340694dcAdam Lesinski appendCommentLine(utf8Line); 673b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski } 68ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski } 69ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski} 70ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 717656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinskivoid AnnotationProcessor::appendNewLine() { 727656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski mComment << "\n *"; 737656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski} 747656554f91b40bc93bf94c89afcad4a9a8ced884Adam Lesinski 756cbfb1de493e42d937158ed57495c9656864ccbaAdam Lesinskivoid AnnotationProcessor::writeToStream(std::ostream* out, const StringPiece& prefix) const { 76b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski if (mHasComments) { 77b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski std::string result = mComment.str(); 78b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski for (StringPiece line : util::tokenize<char>(result, '\n')) { 79b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski *out << prefix << line << "\n"; 80b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski } 81b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski *out << prefix << " */" << "\n"; 823b4cd94034ff3e5567a2ba6da35d640ff61db4b9Adam Lesinski } 83ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 84b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski if (mAnnotationBitMask & kDeprecated) { 85b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski *out << prefix << "@Deprecated\n"; 86b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski } 87b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski 88b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski if (mAnnotationBitMask & kSystemApi) { 89b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski *out << prefix << "@android.annotation.SystemApi\n"; 90b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski } 91ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski} 92ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski 93ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski} // namespace aapt 94