annotate clang/lib/Format/NamespaceEndCommentsFixer.cpp @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- NamespaceEndCommentsFixer.cpp --------------------------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 ///
anatofuz
parents:
diff changeset
9 /// \file
anatofuz
parents:
diff changeset
10 /// This file implements NamespaceEndCommentsFixer, a TokenAnalyzer that
anatofuz
parents:
diff changeset
11 /// fixes namespace end comments.
anatofuz
parents:
diff changeset
12 ///
anatofuz
parents:
diff changeset
13 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 #include "NamespaceEndCommentsFixer.h"
anatofuz
parents:
diff changeset
16 #include "llvm/Support/Debug.h"
anatofuz
parents:
diff changeset
17 #include "llvm/Support/Regex.h"
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 #define DEBUG_TYPE "namespace-end-comments-fixer"
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 namespace clang {
anatofuz
parents:
diff changeset
22 namespace format {
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 namespace {
anatofuz
parents:
diff changeset
25 // The maximal number of unwrapped lines that a short namespace spans.
anatofuz
parents:
diff changeset
26 // Short namespaces don't need an end comment.
anatofuz
parents:
diff changeset
27 static const int kShortNamespaceMaxLines = 1;
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 // Computes the name of a namespace given the namespace token.
anatofuz
parents:
diff changeset
30 // Returns "" for anonymous namespace.
anatofuz
parents:
diff changeset
31 std::string computeName(const FormatToken *NamespaceTok) {
anatofuz
parents:
diff changeset
32 assert(NamespaceTok &&
anatofuz
parents:
diff changeset
33 NamespaceTok->isOneOf(tok::kw_namespace, TT_NamespaceMacro) &&
anatofuz
parents:
diff changeset
34 "expecting a namespace token");
anatofuz
parents:
diff changeset
35 std::string name = "";
anatofuz
parents:
diff changeset
36 const FormatToken *Tok = NamespaceTok->getNextNonComment();
anatofuz
parents:
diff changeset
37 if (NamespaceTok->is(TT_NamespaceMacro)) {
anatofuz
parents:
diff changeset
38 // Collects all the non-comment tokens between opening parenthesis
anatofuz
parents:
diff changeset
39 // and closing parenthesis or comma.
anatofuz
parents:
diff changeset
40 assert(Tok && Tok->is(tok::l_paren) && "expected an opening parenthesis");
anatofuz
parents:
diff changeset
41 Tok = Tok->getNextNonComment();
anatofuz
parents:
diff changeset
42 while (Tok && !Tok->isOneOf(tok::r_paren, tok::comma)) {
anatofuz
parents:
diff changeset
43 name += Tok->TokenText;
anatofuz
parents:
diff changeset
44 Tok = Tok->getNextNonComment();
anatofuz
parents:
diff changeset
45 }
anatofuz
parents:
diff changeset
46 } else {
anatofuz
parents:
diff changeset
47 // For `namespace [[foo]] A::B::inline C {` or
anatofuz
parents:
diff changeset
48 // `namespace MACRO1 MACRO2 A::B::inline C {`, returns "A::B::inline C".
anatofuz
parents:
diff changeset
49 // Peek for the first '::' (or '{') and then return all tokens from one
anatofuz
parents:
diff changeset
50 // token before that up until the '{'.
anatofuz
parents:
diff changeset
51 const FormatToken *FirstNSTok = Tok;
anatofuz
parents:
diff changeset
52 while (Tok && !Tok->is(tok::l_brace) && !Tok->is(tok::coloncolon)) {
anatofuz
parents:
diff changeset
53 FirstNSTok = Tok;
anatofuz
parents:
diff changeset
54 Tok = Tok->getNextNonComment();
anatofuz
parents:
diff changeset
55 }
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 Tok = FirstNSTok;
anatofuz
parents:
diff changeset
58 while (Tok && !Tok->is(tok::l_brace)) {
anatofuz
parents:
diff changeset
59 name += Tok->TokenText;
anatofuz
parents:
diff changeset
60 if (Tok->is(tok::kw_inline))
anatofuz
parents:
diff changeset
61 name += " ";
anatofuz
parents:
diff changeset
62 Tok = Tok->getNextNonComment();
anatofuz
parents:
diff changeset
63 }
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65 return name;
anatofuz
parents:
diff changeset
66 }
anatofuz
parents:
diff changeset
67
anatofuz
parents:
diff changeset
68 std::string computeEndCommentText(StringRef NamespaceName, bool AddNewline,
anatofuz
parents:
diff changeset
69 const FormatToken *NamespaceTok) {
anatofuz
parents:
diff changeset
70 std::string text = "// ";
anatofuz
parents:
diff changeset
71 text += NamespaceTok->TokenText;
anatofuz
parents:
diff changeset
72 if (NamespaceTok->is(TT_NamespaceMacro))
anatofuz
parents:
diff changeset
73 text += "(";
anatofuz
parents:
diff changeset
74 else if (!NamespaceName.empty())
anatofuz
parents:
diff changeset
75 text += ' ';
anatofuz
parents:
diff changeset
76 text += NamespaceName;
anatofuz
parents:
diff changeset
77 if (NamespaceTok->is(TT_NamespaceMacro))
anatofuz
parents:
diff changeset
78 text += ")";
anatofuz
parents:
diff changeset
79 if (AddNewline)
anatofuz
parents:
diff changeset
80 text += '\n';
anatofuz
parents:
diff changeset
81 return text;
anatofuz
parents:
diff changeset
82 }
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 bool hasEndComment(const FormatToken *RBraceTok) {
anatofuz
parents:
diff changeset
85 return RBraceTok->Next && RBraceTok->Next->is(tok::comment);
anatofuz
parents:
diff changeset
86 }
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 bool validEndComment(const FormatToken *RBraceTok, StringRef NamespaceName,
anatofuz
parents:
diff changeset
89 const FormatToken *NamespaceTok) {
anatofuz
parents:
diff changeset
90 assert(hasEndComment(RBraceTok));
anatofuz
parents:
diff changeset
91 const FormatToken *Comment = RBraceTok->Next;
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 // Matches a valid namespace end comment.
anatofuz
parents:
diff changeset
94 // Valid namespace end comments don't need to be edited.
anatofuz
parents:
diff changeset
95 static const llvm::Regex NamespaceCommentPattern =
anatofuz
parents:
diff changeset
96 llvm::Regex("^/[/*] *(end (of )?)? *(anonymous|unnamed)? *"
anatofuz
parents:
diff changeset
97 "namespace( +([a-zA-Z0-9:_]+))?\\.? *(\\*/)?$",
anatofuz
parents:
diff changeset
98 llvm::Regex::IgnoreCase);
anatofuz
parents:
diff changeset
99 static const llvm::Regex NamespaceMacroCommentPattern =
anatofuz
parents:
diff changeset
100 llvm::Regex("^/[/*] *(end (of )?)? *(anonymous|unnamed)? *"
anatofuz
parents:
diff changeset
101 "([a-zA-Z0-9_]+)\\(([a-zA-Z0-9:_]*)\\)\\.? *(\\*/)?$",
anatofuz
parents:
diff changeset
102 llvm::Regex::IgnoreCase);
anatofuz
parents:
diff changeset
103
anatofuz
parents:
diff changeset
104 SmallVector<StringRef, 8> Groups;
anatofuz
parents:
diff changeset
105 if (NamespaceTok->is(TT_NamespaceMacro) &&
anatofuz
parents:
diff changeset
106 NamespaceMacroCommentPattern.match(Comment->TokenText, &Groups)) {
anatofuz
parents:
diff changeset
107 StringRef NamespaceTokenText = Groups.size() > 4 ? Groups[4] : "";
anatofuz
parents:
diff changeset
108 // The name of the macro must be used.
anatofuz
parents:
diff changeset
109 if (NamespaceTokenText != NamespaceTok->TokenText)
anatofuz
parents:
diff changeset
110 return false;
anatofuz
parents:
diff changeset
111 } else if (NamespaceTok->isNot(tok::kw_namespace) ||
anatofuz
parents:
diff changeset
112 !NamespaceCommentPattern.match(Comment->TokenText, &Groups)) {
anatofuz
parents:
diff changeset
113 // Comment does not match regex.
anatofuz
parents:
diff changeset
114 return false;
anatofuz
parents:
diff changeset
115 }
anatofuz
parents:
diff changeset
116 StringRef NamespaceNameInComment = Groups.size() > 5 ? Groups[5] : "";
anatofuz
parents:
diff changeset
117 // Anonymous namespace comments must not mention a namespace name.
anatofuz
parents:
diff changeset
118 if (NamespaceName.empty() && !NamespaceNameInComment.empty())
anatofuz
parents:
diff changeset
119 return false;
anatofuz
parents:
diff changeset
120 StringRef AnonymousInComment = Groups.size() > 3 ? Groups[3] : "";
anatofuz
parents:
diff changeset
121 // Named namespace comments must not mention anonymous namespace.
anatofuz
parents:
diff changeset
122 if (!NamespaceName.empty() && !AnonymousInComment.empty())
anatofuz
parents:
diff changeset
123 return false;
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
124 if (NamespaceNameInComment == NamespaceName)
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
125 return true;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
126
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
127 // Has namespace comment flowed onto the next line.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
128 // } // namespace
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
129 // // verylongnamespacenamethatdidnotfitonthepreviouscommentline
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
130 if (!(Comment->Next && Comment->Next->is(TT_LineComment)))
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
131 return false;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
132
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
133 static const llvm::Regex CommentPattern = llvm::Regex(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
134 "^/[/*] *( +([a-zA-Z0-9:_]+))?\\.? *(\\*/)?$", llvm::Regex::IgnoreCase);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
135
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
136 // Pull out just the comment text.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
137 if (!CommentPattern.match(Comment->Next->TokenText, &Groups)) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
138 return false;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
139 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
140 NamespaceNameInComment = Groups.size() > 2 ? Groups[2] : "";
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
141
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
142 return (NamespaceNameInComment == NamespaceName);
150
anatofuz
parents:
diff changeset
143 }
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 void addEndComment(const FormatToken *RBraceTok, StringRef EndCommentText,
anatofuz
parents:
diff changeset
146 const SourceManager &SourceMgr,
anatofuz
parents:
diff changeset
147 tooling::Replacements *Fixes) {
anatofuz
parents:
diff changeset
148 auto EndLoc = RBraceTok->Tok.getEndLoc();
anatofuz
parents:
diff changeset
149 auto Range = CharSourceRange::getCharRange(EndLoc, EndLoc);
anatofuz
parents:
diff changeset
150 auto Err = Fixes->add(tooling::Replacement(SourceMgr, Range, EndCommentText));
anatofuz
parents:
diff changeset
151 if (Err) {
anatofuz
parents:
diff changeset
152 llvm::errs() << "Error while adding namespace end comment: "
anatofuz
parents:
diff changeset
153 << llvm::toString(std::move(Err)) << "\n";
anatofuz
parents:
diff changeset
154 }
anatofuz
parents:
diff changeset
155 }
anatofuz
parents:
diff changeset
156
anatofuz
parents:
diff changeset
157 void updateEndComment(const FormatToken *RBraceTok, StringRef EndCommentText,
anatofuz
parents:
diff changeset
158 const SourceManager &SourceMgr,
anatofuz
parents:
diff changeset
159 tooling::Replacements *Fixes) {
anatofuz
parents:
diff changeset
160 assert(hasEndComment(RBraceTok));
anatofuz
parents:
diff changeset
161 const FormatToken *Comment = RBraceTok->Next;
anatofuz
parents:
diff changeset
162 auto Range = CharSourceRange::getCharRange(Comment->getStartOfNonWhitespace(),
anatofuz
parents:
diff changeset
163 Comment->Tok.getEndLoc());
anatofuz
parents:
diff changeset
164 auto Err = Fixes->add(tooling::Replacement(SourceMgr, Range, EndCommentText));
anatofuz
parents:
diff changeset
165 if (Err) {
anatofuz
parents:
diff changeset
166 llvm::errs() << "Error while updating namespace end comment: "
anatofuz
parents:
diff changeset
167 << llvm::toString(std::move(Err)) << "\n";
anatofuz
parents:
diff changeset
168 }
anatofuz
parents:
diff changeset
169 }
anatofuz
parents:
diff changeset
170 } // namespace
anatofuz
parents:
diff changeset
171
anatofuz
parents:
diff changeset
172 const FormatToken *
anatofuz
parents:
diff changeset
173 getNamespaceToken(const AnnotatedLine *Line,
anatofuz
parents:
diff changeset
174 const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
anatofuz
parents:
diff changeset
175 if (!Line->Affected || Line->InPPDirective || !Line->startsWith(tok::r_brace))
anatofuz
parents:
diff changeset
176 return nullptr;
anatofuz
parents:
diff changeset
177 size_t StartLineIndex = Line->MatchingOpeningBlockLineIndex;
anatofuz
parents:
diff changeset
178 if (StartLineIndex == UnwrappedLine::kInvalidIndex)
anatofuz
parents:
diff changeset
179 return nullptr;
anatofuz
parents:
diff changeset
180 assert(StartLineIndex < AnnotatedLines.size());
anatofuz
parents:
diff changeset
181 const FormatToken *NamespaceTok = AnnotatedLines[StartLineIndex]->First;
anatofuz
parents:
diff changeset
182 if (NamespaceTok->is(tok::l_brace)) {
anatofuz
parents:
diff changeset
183 // "namespace" keyword can be on the line preceding '{', e.g. in styles
anatofuz
parents:
diff changeset
184 // where BraceWrapping.AfterNamespace is true.
anatofuz
parents:
diff changeset
185 if (StartLineIndex > 0)
anatofuz
parents:
diff changeset
186 NamespaceTok = AnnotatedLines[StartLineIndex - 1]->First;
anatofuz
parents:
diff changeset
187 }
anatofuz
parents:
diff changeset
188 return NamespaceTok->getNamespaceToken();
anatofuz
parents:
diff changeset
189 }
anatofuz
parents:
diff changeset
190
anatofuz
parents:
diff changeset
191 StringRef
anatofuz
parents:
diff changeset
192 getNamespaceTokenText(const AnnotatedLine *Line,
anatofuz
parents:
diff changeset
193 const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
anatofuz
parents:
diff changeset
194 const FormatToken *NamespaceTok = getNamespaceToken(Line, AnnotatedLines);
anatofuz
parents:
diff changeset
195 return NamespaceTok ? NamespaceTok->TokenText : StringRef();
anatofuz
parents:
diff changeset
196 }
anatofuz
parents:
diff changeset
197
anatofuz
parents:
diff changeset
198 NamespaceEndCommentsFixer::NamespaceEndCommentsFixer(const Environment &Env,
anatofuz
parents:
diff changeset
199 const FormatStyle &Style)
anatofuz
parents:
diff changeset
200 : TokenAnalyzer(Env, Style) {}
anatofuz
parents:
diff changeset
201
anatofuz
parents:
diff changeset
202 std::pair<tooling::Replacements, unsigned> NamespaceEndCommentsFixer::analyze(
anatofuz
parents:
diff changeset
203 TokenAnnotator &Annotator, SmallVectorImpl<AnnotatedLine *> &AnnotatedLines,
anatofuz
parents:
diff changeset
204 FormatTokenLexer &Tokens) {
anatofuz
parents:
diff changeset
205 const SourceManager &SourceMgr = Env.getSourceManager();
anatofuz
parents:
diff changeset
206 AffectedRangeMgr.computeAffectedLines(AnnotatedLines);
anatofuz
parents:
diff changeset
207 tooling::Replacements Fixes;
anatofuz
parents:
diff changeset
208 std::string AllNamespaceNames = "";
anatofuz
parents:
diff changeset
209 size_t StartLineIndex = SIZE_MAX;
anatofuz
parents:
diff changeset
210 StringRef NamespaceTokenText;
anatofuz
parents:
diff changeset
211 unsigned int CompactedNamespacesCount = 0;
anatofuz
parents:
diff changeset
212 for (size_t I = 0, E = AnnotatedLines.size(); I != E; ++I) {
anatofuz
parents:
diff changeset
213 const AnnotatedLine *EndLine = AnnotatedLines[I];
anatofuz
parents:
diff changeset
214 const FormatToken *NamespaceTok =
anatofuz
parents:
diff changeset
215 getNamespaceToken(EndLine, AnnotatedLines);
anatofuz
parents:
diff changeset
216 if (!NamespaceTok)
anatofuz
parents:
diff changeset
217 continue;
anatofuz
parents:
diff changeset
218 FormatToken *RBraceTok = EndLine->First;
anatofuz
parents:
diff changeset
219 if (RBraceTok->Finalized)
anatofuz
parents:
diff changeset
220 continue;
anatofuz
parents:
diff changeset
221 RBraceTok->Finalized = true;
anatofuz
parents:
diff changeset
222 const FormatToken *EndCommentPrevTok = RBraceTok;
anatofuz
parents:
diff changeset
223 // Namespaces often end with '};'. In that case, attach namespace end
anatofuz
parents:
diff changeset
224 // comments to the semicolon tokens.
anatofuz
parents:
diff changeset
225 if (RBraceTok->Next && RBraceTok->Next->is(tok::semi)) {
anatofuz
parents:
diff changeset
226 EndCommentPrevTok = RBraceTok->Next;
anatofuz
parents:
diff changeset
227 }
anatofuz
parents:
diff changeset
228 if (StartLineIndex == SIZE_MAX)
anatofuz
parents:
diff changeset
229 StartLineIndex = EndLine->MatchingOpeningBlockLineIndex;
anatofuz
parents:
diff changeset
230 std::string NamespaceName = computeName(NamespaceTok);
anatofuz
parents:
diff changeset
231 if (Style.CompactNamespaces) {
anatofuz
parents:
diff changeset
232 if (CompactedNamespacesCount == 0)
anatofuz
parents:
diff changeset
233 NamespaceTokenText = NamespaceTok->TokenText;
anatofuz
parents:
diff changeset
234 if ((I + 1 < E) &&
anatofuz
parents:
diff changeset
235 NamespaceTokenText ==
anatofuz
parents:
diff changeset
236 getNamespaceTokenText(AnnotatedLines[I + 1], AnnotatedLines) &&
anatofuz
parents:
diff changeset
237 StartLineIndex - CompactedNamespacesCount - 1 ==
anatofuz
parents:
diff changeset
238 AnnotatedLines[I + 1]->MatchingOpeningBlockLineIndex &&
anatofuz
parents:
diff changeset
239 !AnnotatedLines[I + 1]->First->Finalized) {
anatofuz
parents:
diff changeset
240 if (hasEndComment(EndCommentPrevTok)) {
anatofuz
parents:
diff changeset
241 // remove end comment, it will be merged in next one
anatofuz
parents:
diff changeset
242 updateEndComment(EndCommentPrevTok, std::string(), SourceMgr, &Fixes);
anatofuz
parents:
diff changeset
243 }
anatofuz
parents:
diff changeset
244 CompactedNamespacesCount++;
anatofuz
parents:
diff changeset
245 AllNamespaceNames = "::" + NamespaceName + AllNamespaceNames;
anatofuz
parents:
diff changeset
246 continue;
anatofuz
parents:
diff changeset
247 }
anatofuz
parents:
diff changeset
248 NamespaceName += AllNamespaceNames;
anatofuz
parents:
diff changeset
249 CompactedNamespacesCount = 0;
anatofuz
parents:
diff changeset
250 AllNamespaceNames = std::string();
anatofuz
parents:
diff changeset
251 }
anatofuz
parents:
diff changeset
252 // The next token in the token stream after the place where the end comment
anatofuz
parents:
diff changeset
253 // token must be. This is either the next token on the current line or the
anatofuz
parents:
diff changeset
254 // first token on the next line.
anatofuz
parents:
diff changeset
255 const FormatToken *EndCommentNextTok = EndCommentPrevTok->Next;
anatofuz
parents:
diff changeset
256 if (EndCommentNextTok && EndCommentNextTok->is(tok::comment))
anatofuz
parents:
diff changeset
257 EndCommentNextTok = EndCommentNextTok->Next;
anatofuz
parents:
diff changeset
258 if (!EndCommentNextTok && I + 1 < E)
anatofuz
parents:
diff changeset
259 EndCommentNextTok = AnnotatedLines[I + 1]->First;
anatofuz
parents:
diff changeset
260 bool AddNewline = EndCommentNextTok &&
anatofuz
parents:
diff changeset
261 EndCommentNextTok->NewlinesBefore == 0 &&
anatofuz
parents:
diff changeset
262 EndCommentNextTok->isNot(tok::eof);
anatofuz
parents:
diff changeset
263 const std::string EndCommentText =
anatofuz
parents:
diff changeset
264 computeEndCommentText(NamespaceName, AddNewline, NamespaceTok);
anatofuz
parents:
diff changeset
265 if (!hasEndComment(EndCommentPrevTok)) {
anatofuz
parents:
diff changeset
266 bool isShort = I - StartLineIndex <= kShortNamespaceMaxLines + 1;
anatofuz
parents:
diff changeset
267 if (!isShort)
anatofuz
parents:
diff changeset
268 addEndComment(EndCommentPrevTok, EndCommentText, SourceMgr, &Fixes);
anatofuz
parents:
diff changeset
269 } else if (!validEndComment(EndCommentPrevTok, NamespaceName,
anatofuz
parents:
diff changeset
270 NamespaceTok)) {
anatofuz
parents:
diff changeset
271 updateEndComment(EndCommentPrevTok, EndCommentText, SourceMgr, &Fixes);
anatofuz
parents:
diff changeset
272 }
anatofuz
parents:
diff changeset
273 StartLineIndex = SIZE_MAX;
anatofuz
parents:
diff changeset
274 }
anatofuz
parents:
diff changeset
275 return {Fixes, 0};
anatofuz
parents:
diff changeset
276 }
anatofuz
parents:
diff changeset
277
anatofuz
parents:
diff changeset
278 } // namespace format
anatofuz
parents:
diff changeset
279 } // namespace clang