[PATCH] D67358: [clangd] Implement semantic selections.

UTKARSH SAXENA via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 13 04:05:03 PDT 2019


usaxena95 added inline comments.


================
Comment at: clang-tools-extra/clangd/SemanticSelection.cpp:33
+  if (!Offset) {
+    llvm::errs() << "Unable to convert postion to offset";
+    return {};
----------------
sammccall wrote:
> we use log() or elog() for this, make sure you include Offset.takeError() for the original message
> 
> Alternatively, you might consider returning Expected<SemanticSelectionResult> so the error gets propagated to the client (as this really is a client error)
Returning Expected<vector<Ranges>> now to propagate the error.


================
Comment at: clang-tools-extra/clangd/SemanticSelection.cpp:39
+  SelectionTree ST(AST.getASTContext(), AST.getTokens(), *Offset);
+  for (const auto *Node = ST.commonAncestor(); Node != nullptr;
+       Node = Node->Parent) {
----------------
sammccall wrote:
> I think you probably want to bail out once you hit TranslationUnitDecl.
> 
> And maybe at namespace decls? Though I have often in my editor wondered "what's the enclosing namespace"...
Bailing out once we hit the TUDecl. I am not sure about exiting on namespace decl. I am keeping this for now. We can remove this later if the need be.


================
Comment at: clang-tools-extra/clangd/SemanticSelection.cpp:45
+    }
+    SourceLocation BeginLoc = SR.getBegin();
+    SourceLocation EndLoc =
----------------
sammccall wrote:
> Ah, this will work if the start and the end of the AST node are written directly in the file, and no macros are involved. But try `toHalfOpenFileRange` in `SourceCode.h`, which should work in a lot more cases.
> 
> In particular, this should work:
> ```
> #define INC(X) X + 1
> int a, b;
> int c = INC(a * b);
>             ^
>             ~
>             ~~~~~
>         ~~~~~~~~~~
> ~~~~~~~~~~~~~~~~~~
> ```
Interesting. This works fine in such cases. Thanks.
Though it works strangely with these ugly macros. I guess this is because it tries to follow the macro expansion.
```
#define MUL ) * (
int var = (4 + 15 MUL 6 + 10);
                ^
               ~~
           ~~~~~~
          ~~~~~~~~~~~
```


================
Comment at: clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp:115
+            [[void func() [[{
+              // int x = nsa::nsb::ccc();
+              [[[[int x = [[[[nsa::nsb::cc^c]]()]]]];]]
----------------
sammccall wrote:
> why commented out?
Since the statement contains many [[ and ]], I have added the actual statement in comments to make it more readable. 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D67358





More information about the cfe-commits mailing list