sammccall added a comment.

Sorry, didn't realize this was waiting on me! I like the feature and the 
threshold seems like a good idea. People might find it inconsistent, but we'll 
have to see.
I like placing it after the macro definition, I think the cases where expansion 
is/isn't shown feel more consistent that way.

My main hesitation is that it's nice if the members of HoverInfo are more 
generic: it ensures some coherence between different types of hovers and makes 
it easier to reason about changes to the Hoverinfo->markdown.

Concretely I wonder whether we can get away with appending this to the 
definition as a single block like:

  #define DOUBLE(X) X##X
  
  // Expands to:
  mm



================
Comment at: clang-tools-extra/clangd/Hover.cpp:679
+        // anyway.
+        std::string ExpansionTextBuffer;
+        ExpansionTextBuffer.reserve(2048);
----------------
nit: "Buffer" is redundant here


================
Comment at: clang-tools-extra/clangd/Hover.cpp:684
+          StringRef ExpandedTokText = ExpandedTok.text(SM);
+          if (ExpansionTextBuffer.size() + ExpandedTokText.size() + 1 <
+              ExpansionTextBuffer.capacity()) {
----------------
nit: the logic here seems a bit fiddly and micro-optimized - a few 
reallocations to produce a hover card don't matter.

consider just:

```
string ExpansionText;
for (tok : Expanded) {
  ExpansionText += ExpandedTok.text(SM);
  if (ExpansionText.size() > 2048) {
    ExpansionText.clear();
    break;
  }
}
```

(or even extract a function so you can early-return "", which is clearer)


================
Comment at: clang-tools-extra/clangd/Hover.cpp:1216
+  if (!MacroExpansion.empty()) {
+    Output.addRuler();
+    Output.addParagraph().appendText("Macro Expansion:");
----------------
I think the ruler  + paragraph header might appear too heavyweight, would need 
to take a look.

I think we're missing tests for present().
(If this can become part of the definition, then no need for new tests)


================
Comment at: clang-tools-extra/clangd/Hover.cpp:1217
+    Output.addRuler();
+    Output.addParagraph().appendText("Macro Expansion:");
+    Output.addCodeBlock(MacroExpansion, DefinitionLanguage);
----------------
I think "Expands to" or "Expanded text" is clearer than "macro expansion" - 
expansion names the process rather than the result.


================
Comment at: clang-tools-extra/clangd/unittests/HoverTests.cpp:481
 
-      // macro
+      // variable-like macro
+      {R"cpp(
----------------
nit: these are known as "object-like" macros, I don't really know why


================
Comment at: clang-tools-extra/clangd/unittests/HoverTests.cpp:490
+         HI.Definition = "#define MACRO 41";
+         HI.MacroExpansion = "41";
+       }},
----------------
this is redundant with the definition, ideally I think we'd omit one (the 
output is pretty heavyweight).

It's *almost* correct to omit the expansion for object-like macros, the problem 
with this is:
```
#define INDIRECT DOUBLE(y)
#define DOUBLE(X) X##X
int INDIRECT; // we *should* show expansion here
```

Still, this is probably rare enough that it's better to not show expansions for 
object-like macros on balance?

(It would be possible to actually check for nested expansions but I doubt it's 
worth the complexity, certainly not in this patch)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D127082

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

Reply via email to