[PATCH] D59887: [Syntax] Introduce TokenBuffer, start clangToolingSyntax library

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Mar 29 08:57:05 PDT 2019


ilya-biryukov added a comment.

Still have a few comments to address in `TokenCollector` and wrt to naming. But apart from this revision is ready for another round.



================
Comment at: clang/include/clang/Tooling/Syntax/TokenBuffer.h:120
+  /// the original source file. The tranformation may not be possible if the
+  /// tokens cross macro invocations in the middle, e.g.
+  ///    #define FOO 1*2
----------------
gribozavr wrote:
> "The mapping fails if cross boundaries of macro expansions, that is, don't correspond to a complete top-level macro invocation"
> 
> Consider adding examples.
> 
> ```
> Given this source file:
> 
> #define FIRST f1 f2 f3
> #define SECOND s1 s2 3
> 
> a FIRST b SECOND c  // expansion: a f1 f2 f3 b s1 s2 s3 c
> 
> toOffsetRange will map tokens like this:
> 
> input range => output range
> a => a
> s1 s2 s3 => SECOND
> a f1 f2 f3 => a FIRST
> a f1 => can't map
> s1 s2 => s1 s2 within the macro definition
> ```
> 
> Could you add these to tests as well?
Done. Note that we never map to tokens inside macro definition (the `s1 s2` example)


================
Comment at: clang/include/clang/Tooling/Syntax/TokenBuffer.h:191
+  /// i.e. after running Execute().
+  TokenBuffer consume() &&;
+
----------------
gribozavr wrote:
> gribozavr wrote:
> > "Finalizes token collection"
> > 
> > Of course a function called "consume" consumes the result :)
> LLVM_NODISCARD?
> Of course a function called "consume" consumes the result :)

Agreed :-)


================
Comment at: clang/lib/Tooling/Syntax/TokenBuffer.cpp:295
+MacroExpansion::tokens(const TokenBuffer &B) const {
+  return B.tokens().slice(BeginExpansionToken,
+                          EndExpansionToken - BeginExpansionToken);
----------------
gribozavr wrote:
> "ExpansionTokenBegin"?  "ExpansionTokenStartIndex"?
Went with `BeginExpandedToken`, `EndExpandedToken`.


================
Comment at: clang/unittests/Tooling/Syntax/TokenBufferTest.cpp:190
+    for (unsigned I = 0; I < Actual.size(); ++I) {
+      auto &A = Actual[I];
+      auto &E = Expected[I];
----------------
Eugene.Zelenko wrote:
> Return type is not obvious, so auto should not be used.
The declarations of `Actual` and `Expected` are **really** close, both types are easy to infer


================
Comment at: clang/unittests/Tooling/Syntax/TokenBufferTest.cpp:429
+  Code = llvm::Annotations(R"cpp(
+    $all[[int $a[[a]] = $numbers[[100 + 200]];]]
+  )cpp");
----------------
gribozavr wrote:
> Could we instead use some nonsensical code like "a1 a2 a3 FIRST a3 a4 a5 SECOND a6 a7 a8", and instead of `OfKind` we can make a helper that finds the identifier with the given name?
Thanks. Much nicer with a function that finds by text.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59887/new/

https://reviews.llvm.org/D59887





More information about the cfe-commits mailing list