kadircet added inline comments.

================
Comment at: clang-tools-extra/clangd/CollectMacros.cpp:13
 
+namespace {
+class CollectPragmaMarks : public clang::PPCallbacks {
----------------
can you nest this inside `clang::clangd` and drop the qualifiers ?


================
Comment at: clang-tools-extra/clangd/CollectMacros.cpp:20
+  void PragmaMark(clang::SourceLocation Loc, clang::StringRef Trivia) override 
{
+    if (clang::clangd::isInsideMainFile(Loc, SM)) {
+      clang::StringRef Name = Trivia.trim();
----------------
nit: drop braces


================
Comment at: clang-tools-extra/clangd/CollectMacros.h:106
+struct PragmaMark {
+  SourceLocation Loc;
+  std::string Text;
----------------
sammccall wrote:
> Line number is enough, right?
> Column is not interesting, and pragma marks expanded from macros are not 
> possible (and wouldn't be in the main file for our purposes)
okay then let's store a `Range` here instead, and get rid of the dependency on 
a SourceManager for rendering it maybe?


================
Comment at: clang-tools-extra/clangd/FindSymbols.cpp:682
+  // here since editors won't properly render the symbol otherwise.
+  StringRef MaybeGroupName = Name;
+  if (MaybeGroupName.consume_front("-") &&
----------------
I think this reads easier:

```
bool IsGroup = Name.consume_front("-");
Name = Name.ltrim();
if (Name.empty())
  Name = IsGroup ? "unnamed group" : ...;
```


================
Comment at: clang-tools-extra/clangd/FindSymbols.cpp:535
+/// by range.
+std::vector<DocumentSymbol> mergePragmas(std::vector<DocumentSymbol> &Syms,
+                                         std::vector<PragmaMarkSymbol> 
&Pragmas,
----------------
dgoldman wrote:
> sammccall wrote:
> > FWIW the flow control/how we make progress seem hard to follow here to me.
> > 
> > In particular I think I'm struggling with the statefulness of "is there an 
> > open mark group".
> > 
> > Possible simplifications:
> >  - define a dummy root symbol, which seems clearer than the vector<symbols> 
> > + range
> >  - avoid reverse-sorting the list of pragma symbols, and just consume from 
> > the front of an ArrayRef instead
> >  - make the outer loop over pragmas, rather than symbols. It would first 
> > check if the pragma belongs directly here or not, and if so, loop over 
> > symbols to work out which should become children. This seems very likely to 
> > be efficient enough in practice (few pragmas, or most children are grouped 
> > into pragmas)
> > define a dummy root symbol, which seems clearer than the vector<symbols> + 
> > range
> 
> I guess? Then we'd take in a `DocumentSymbol & and a 
> ArrayRef<PragmaMarkSymbol> & (or just by value and then return it as well). 
> The rest would be the same though
> 
> > In particular I think I'm struggling with the statefulness of "is there an 
> > open mark group".
> 
> We need to track the current open group if there is one in order to move 
> children to it.
> 
> > make the outer loop over pragmas, rather than symbols. It would first check 
> > if the pragma belongs directly here or not, and if so, loop over symbols to 
> > work out which should become children. This seems very likely to be 
> > efficient enough in practice (few pragmas, or most children are grouped 
> > into pragmas)
> 
> The important thing here is knowing where the pragma mark ends - if it 
> doesn't, it actually gets all of the children. So we'd have to peak at the 
> next pragma mark, add all symbols before it to us as children, and then 
> potentially recurse to nest it inside of a symbol. I'll try it out and see if 
> it's simpler.
> 
> 
```
while(Pragmas) {
// We'll figure out where the Pragmas.front() should go.
Pragma P = Pragmas.front();
DocumentSymbol *Cur = Root;
while(Cur->contains(P)) {
  auto *OldCur = Cur;
  for(auto *C : Cur->children) {
     // We assume at most 1 child can contain the pragma (as pragmas are on a 
single line, and children have disjoint ranges)
     if (C->contains(P)) {
         Cur = C;
         break;
     }
  }
  // Cur is immediate parent of P
  if (OldCur == Cur) {
    // Just insert P into children if it is not a group and we are done.
    // Otherwise we need to figure out when current pragma is terminated:
// if next pragma is not contained in Cur, or is contained in one of the 
children, It is at the end of Cur, nest all the children that appear after P 
under the symbol node for P.
// Otherwise nest all the children that appear after P but before next pragma 
under the symbol node for P.
// Pop Pragmas and break
  }
}
}
```

Does that make sense, i hope i am not missing something obvious? 
Complexity-wise in the worst case we'll go all the way down to a leaf once per 
pragma, since there will only be a handful of pragmas most of the time it 
shouldn't be too bad.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105904

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

Reply via email to