kadircet added inline comments.

================
Comment at: clang-tools-extra/clangd/ClangdServer.cpp:752
   auto Action = [File = File.str(), Sel, TweakID = TweakID.str(),
-                 CB = std::move(CB),
+                 CB = std::move(CB), ActionKinds,
                  this](Expected<InputsAndAST> InpAST) mutable {
----------------
we're capturing `ActionKinds` as a reference, but Action is going to execute 
async. you can instead change the input to be `llvm::ArrayRef<std::string> 
ActionKinds` and capture it by value with `ActionKinds = ActionKinds.vec()`

nit: even better if you just changed the signature here to look like 
`applyTweak(std::string TweakID, CodeActionInputs Inputs, 
Callback<Tweak::Effect> CB)`, as we want to consume all of these by value 
anyways. Then you can just move `TweakID` and `Inputs` into the `Action`.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/OrganizeImports.cpp:49
+bool OrganizeImports::prepare(const Tweak::Selection &Inputs) {
+  if (std::find(Inputs.RequestedActionKinds.begin(),
+                Inputs.RequestedActionKinds.end(),
----------------
can we also bail out for ObjC


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/OrganizeImports.cpp:56
+    return false;
+  Range PreambleRange;
+  PreambleRange.start =
----------------
relying on `MainFileIncludes` for preamble range is not correct in general. we 
can have includes way down inside the main file that'll be part of this vector, 
but not preamble (also it's not sorted explicitly).

we should instead use `ComputePreambleBounds` (nit: we can also store it in 
ParsedAST, instead of relexing the file one more time with each CodeAction 
request)


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/OrganizeImports.cpp:56
+    return false;
+  Range PreambleRange;
+  PreambleRange.start =
----------------
kadircet wrote:
> relying on `MainFileIncludes` for preamble range is not correct in general. 
> we can have includes way down inside the main file that'll be part of this 
> vector, but not preamble (also it's not sorted explicitly).
> 
> we should instead use `ComputePreambleBounds` (nit: we can also store it in 
> ParsedAST, instead of relexing the file one more time with each CodeAction 
> request)
Having a comment for reason would also be helpful, something like `To 
accommodate clients without knowledge of source actions, we trigger without 
checking code action kinds when inside the preamble region`.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/OrganizeImports.cpp:63
+            offsetToPosition(Inputs.Code, Inputs.SelectionEnd)};
+  return SelectionRange.start <= PreambleRange.end &&
+         PreambleRange.start <= SelectionRange.end;
----------------
we should also make sure that `RequestedActionKinds` is empty in this case. 
Because we don't want to offer a code action of kind Source, if user is 
explicitly asking for some other kind(s).


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/OrganizeImports.cpp:72
+  for (const auto *Inc : Findings.UnusedIncludes)
+    if (auto Err = Replacements.add(
+            tooling::Replacement{MainFilePath, UINT_MAX, 1, Inc->Written}))
----------------
nit: insertions of Replacements with offset `UINT_MAX` can't fail. so you just 
wrap this inside `llvm::cantFail` instead.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/OrganizeImports.cpp:87
+         SM.getFileEntryForID(SM.getMainFileID())});
+    if (auto Err = Replacements.add(tooling::Replacement{
+            MainFilePath, UINT_MAX, 0, "#include " + Spelling}))
----------------
same here for never failing


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/OrganizeImports.cpp:92
+
+  if (Replacements.empty())
+    return Tweak::Effect{"No edits to apply.", {}};
----------------
i think we should perform this check on `Final` instead (as replacements can 
still go empty after cleanups, and empty set of replacements will result in an 
empty set anyways)


================
Comment at: 
clang-tools-extra/clangd/unittests/tweaks/OrganizeImportsTests.cpp:19
+
+TEST_F(OrganizeImportsTest, All) {
+  Header = "void foo();";
----------------
can you also add some availability tests ?


================
Comment at: clang-tools-extra/clangd/unittests/tweaks/TweakTesting.cpp:73
+        Tweak::Selection S(Index, AST, Range.Begin, Range.End, std::move(ST),
+                           FS, {std::string{CodeAction::SOURCE_KIND}});
+        if (auto T = prepareTweak(TweakID, S, nullptr)) {
----------------
ATM this is passing SOURCE_KIND for all tweaks, which is conceptually wrong. 
can you instead take this in as a parameter?

for `TweakTest::apply`, we can default it to be an empty vector, and just 
update `OrganizeImportsTests` to pass `{CodeAction::SOURCE_KIND}`;
for `TweakTest::isAvailable`, we can update `EXPECT_AVAILABLE_` to pass in `{}` 
and call `isAvailable` directly in `OrganizeImportsTests` with `SOURCE_KIND`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D153769

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

Reply via email to