[PATCH] D83914: [clangd] Plan features for FoldingRanges

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 22 00:12:46 PDT 2020


hokein added a comment.

just some random comments from my side.

> At least for the AST-based folds, I'd like some formalism like:

+1. I think we need some general rules (mental model) to guide us how the folding works.

Some editors (e.g. VSCode) have their builtin folding-range, it is worth to investigate how the built folding-range interacts with one provided by the language server.

>From my experience, VSCode's built folding-range kind of works though this is not perfect, would be nice to have some concrete examples see the improvements, we may want to prioritize those during the implementation.



================
Comment at: clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp:261
+
+          if (B && ([["subexpression" != "multi-line" &&
+                    1 > 0]]))
----------------
this example seems vague, it is folded because 

1. it is cross-line
2. it is wrapped by `()`
or both?


================
Comment at: clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp:284
+      )cpp",
+      // For.
+      R"cpp(
----------------
nit: for completeness, add a for-range case.


================
Comment at: clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp:326
+          int Y = 42;
+          bool B = 15;]]
+          if ([[B]]) {[[ ++X; ]]}
----------------
not sure about this case. 

if we decide to support this (btw, the test on L242 should be adjusted too), would be nice to support the following usages.

```
// forward decls
[[class A;
class B;
class C;]]

// using decls;
[[using ns::A;
using ns::B;
using ns::C;]]
```


================
Comment at: clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp:556
+      R"cpp(
+        //[[ Some documentation.
+        // @param
----------------
this `[[` seems mismatched, if I read the code correctly.

btw, this example contains too many brackets, considering split into simpler ones.


================
Comment at: clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp:598
+
+        #include [["math.h"]]
+      )cpp",
----------------
another option: we could just fold the whole preamble region, it seems easier, and provides a visible to see preamble range :), the downside is that any comments/macros will be folded together.


================
Comment at: clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp:601
+      R"cpp(
+        #define true [[false]]
+
----------------
These macros are quite simple, I'm not sure this is useful to fold them. I'd just not fold it, but if the macro body is complicated (multi-lines), it is worth folding it.


================
Comment at: clang-tools-extra/clangd/unittests/SemanticSelectionTests.cpp:679
+        struct BarStruct {[[]]};
+        struct FwdDeclaration;
+      )cpp",
----------------
looks like we're missing case of inheritance, e.g. a class inherits multiple classes

```
class B : public A,
  private C {};
```


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D83914





More information about the cfe-commits mailing list