ilya-biryukov marked an inline comment as done.
ilya-biryukov added inline comments.


================
Comment at: clang-tools-extra/clangd/FormattedString.cpp:41
+
+void FormattedString::appendCodeBlock(std::string Code) {
+  Chunk C;
----------------
sammccall wrote:
> you may want to take the language name, and default it to either cpp or 
> nothing.
> Including it in the triple-backtick block can trigger syntax highlighting, 
> and editors are probably somewhat likely to actually implement this.
Done. Defaulting to 'cpp'.
VSCode actually does syntax highlighting there and it looks nice.


================
Comment at: clang-tools-extra/clangd/FormattedString.cpp:63
+    case ChunkKind::InlineCodeBlock:
+      R += " `";
+      R += escapeBackticks(C.Contents);
----------------
sammccall wrote:
> why do we add surrounding spaces if we don't do the same for text chunks?
a leftover from my first prototype.
They don't seem to be necessary, removed them.


================
Comment at: clang-tools-extra/clangd/FormattedString.h:31
+  /// newlines.
+  void appendCodeBlock(std::string Code);
+  /// Append an inline block of C++ code. This translates to the ` block in
----------------
sammccall wrote:
> Having various methods that take strings may struggle if we want a lot of 
> composability (e.g. a bullet list whose bullet whose third word is a 
> hyperlink/bold).
> 
> (I'm not sure whether this is going to be a real problem, just thinking out 
> loud here)
> 
> One alternative extensibility would be to make "containers" methods taking a 
> lambda that renders the body.
> e.g.
> 
> ```
> FormattedString S;
> S << "std::";
> S.bold([&} S << "swap" };
> S.list(FormattedString::Numbered, [&] {
>   S.item([&] { S << "sometimes you get the wrong overload"; });
>   S.item([&] {
>     S << "watch out for ";
>     S.link("https://en.cppreference.com/w/cpp/language/adl";, [&] { S << 
> "ADL"; });
>   });
> });
> S.codeBlock([&] S << "Here is an example"; });
> ```
> 
> Not sure if this is really better, I just have it on my mind because I ended 
> up using it for the `JSON.h` streaming output. We can probably bolt it on 
> later if necessary.
Agree that the current approach won't generalize to more complicated cases 
without some design work.
The lambda-heavy code is hard to read to my personal taste, but may actually be 
a good option in practice.
I'd also try playing around with some lambda-free alternatives to see if they 
lead to better syntax without compromising extensibility or making the 
implementation overly complex.

I also think we should bolt on this until we hit more use-cases with more 
extensive needs for formatting markdown. 


================
Comment at: clang-tools-extra/clangd/FormattedString.h:39
+  std::string renderAsPlainText() const;
+
+private:
----------------
sammccall wrote:
> I think we want renderForDebugging() or so which would print the chunks 
> explicitly, a la CodeCompletionString.
> 
> This is useful for actual debugging, and for testing methods that return 
> FormattedString (as opposed to the FormattedString->markdown translation)
That would be a useful addition. I've added a FIXME for now and testing 
plaintext in XRefs.
I'd suggest adding debug representation in a follow-up change, but also happy 
to do it now if you feel that's necessary.

That would need updates to all hover tests and that's a big enough to go into a 
separate change, from my perspective.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D58547



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to