[PATCH] D46000: [AST] Added a helper to extract a user-friendly text of a comment.

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 26 02:32:41 PDT 2018


ilya-biryukov marked 4 inline comments as done.
ilya-biryukov added inline comments.


================
Comment at: include/clang/AST/RawCommentList.h:118
+  ///     //   Parts of it  might be indented.
+  ///     /* The comments styles might be mixed. */
+  ///  into
----------------
ioeric wrote:
> I'm trying to understand how these cases and RawComment work.
> 
> For this case, are the `// ... ` block and `/* ... */` merged in one `RawComment` by default?
Yes, `RawComment` can represent multiple merged comments of different styles.


================
Comment at: include/clang/AST/RawCommentList.h:126
+  ///      *   This is a second line. It is indented.
+  ///      * This is a third line. */
+  /// and
----------------
ioeric wrote:
> Are the `*`s in each lines automatically consumed by the lexer?
Yes, see `comments::Lexer::skipLineStartingDecorations()`


================
Comment at: lib/AST/RawCommentList.cpp:380
+        SourceMgr.getSpellingColumnNumber(Tok.getLocation(), &LocInvalid);
+    if (LocInvalid)
+      TokColumn = 0;
----------------
ioeric wrote:
> ilya-biryukov wrote:
> > ilya-biryukov wrote:
> > > ioeric wrote:
> > > > Explain when this would be invalid and why `TokColumn = 0` is used?
> > > I don't know whether this can be even be invalid, but I'm not confident enough to add an assert there.
> > > `TokColumn = 0` seems like a reasonable way to recover if we can't compute the column number, i.e. assume the line starts at the first column if SourceLocation of the line was invalid for any reason.
> > > 
> > > This whole column thing looks weird to me, maybe I should just remove it altogether and just remove the same amount of whitespace in all the lines. WDYT?
> > On a second thought, now I remember why I added this in the first place.
> > To support the following example we want to take column numbers into account:
> > 
> > ```
> > class Foo {
> >     /* A block comment
> >        spanning multiple lines
> >        has too many spaces on the all lines except the first one.
> >     */
> >     int func();
> > };
> > ```
> So I think you would want to force `MaxSkip` to 0 if token loc is invalid to make sure no comment is accidentally eaten?
Makes sense, thanks. Unfortunately I don't have any ideas on how we can test this case :-(


================
Comment at: lib/AST/RawCommentList.cpp:343
+  if (CommentText.empty())
+    return ""; // we couldn't retreive the comment.
+
----------------
ioeric wrote:
> nit: We don't really know if there was a failure or the comment is simply empty. So I'd probably leave out the comment here to avoid confusion.
`getRawTextSlow` returns empty string on error, so this comment has some ground.
Removed it anyway


================
Comment at: lib/AST/RawCommentList.cpp:349
+                    CommentText.begin(), CommentText.end(),
+                    /*ParseCommentText=*/false);
+
----------------
ioeric wrote:
> `s/ParseCommentText/ParseCommands/`?
Thanks for catching this!


================
Comment at: lib/AST/RawCommentList.cpp:393
+
+    llvm::StringRef Trimmed = TokText.drop_front(std::min(MaxSkip, WhitespaceLen));
+    Result += Trimmed;
----------------
ioeric wrote:
> I think `MaxSkip` could be removed with:
> 
> ```
> llvm::StringRef Trimmed = TokText.drop_front(IsFirstLine ? WhitespaceLen : 
>                                                  std::max((int)IndentColumn - (int)TokColumn, 0)));
> ```
I've removed `MaxSkip`, but introduced `SkipLen` instead that captures an actual numbers of chars we want to skip.
I would still keep as a separate variable, as the expression seems somewhat complex and giving a name to it, arguably, makes the code more readable.


Repository:
  rC Clang

https://reviews.llvm.org/D46000





More information about the cfe-commits mailing list