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