robot planned changes to this revision.
robot marked 3 inline comments as done.
robot added a comment.

I'm working on the comments, but it will take a while.



================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DeclarePureVirtuals.cpp:58
+
+  const llvm::ArrayRef<syntax::Token> Tokens =
+      TokBuf.expandedTokens(MethodDeclRange);
----------------
sammccall wrote:
> copying the tokens directly seems brittle, for example we shouldn't be 
> emitting "virtual" but its's hard to avoid doing so.
> (Also, surprising that getEndLoc() doesn't cover the `= 0`!)
> 
> D122827 has a reprint() function that seems to work
My original idea was to take the AST node, clone it, remove the pure-specifier, 
and print that. To me, that seemed like the obvious (object-oriented) way how a 
tweak would manipulate or generate text.
Alas, I was rather stumped that there didn't seem to be support for this 
already, and it was rather hard to do. I gave up when default arguments came 
into play.

I've got the idea of manipulating the tokens from the "extract function" tweak 
(DefineOutline.cpp / getFunctionSourceCode).

I've tried the reprint function and it does not copy `noexcept`. That is simple 
to fix but my guess is there are more issues. The idea of token manipulation 
was to rather copy too much than too little. I have no intuition how many 
issues could arise from that :)

When I try to naively remove the `virtual` I currently print (`virtual void 
foo() override;`) in the token manipulation approach by skipping the first 
tokens, I end up skipping any attributes that precede the `virtual` as well. So 
I wrote a test for that, and reprint also doesn't copy attributes at the 
moment. It is not obvious to me if attributes should be copied, e.g. 
`[[noreturn]]`.

I have a slight preference for my original approach but it's probably too 
complicated if this is the only use case. Therefore I'll just implement 
whatever looks most promising to you.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/DeclarePureVirtuals.cpp:153
+  llvm::StringLiteral kind() const override {
+    return CodeAction::QUICKFIX_KIND;
+  }
----------------
sammccall wrote:
> I don't think this is a quick-fix, which should address a diagnostic or so.
> 
> Really there doesn't seem to be a standard kind that fits here. Maybe we 
> should add a new constant "generate"?
For reference:
rust-analyser shows a "Quick Fix" in VSCode for implementing the functions in a 
trait.
The go extension shows a "Rewrite" (which is an entirely different action?) in 
VSCode for filling a structure object (inserting code which explicitly 
initializes each member with its null value).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D153152

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

Reply via email to