kadircet added inline comments.

================
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:
> kadircet wrote:
> > 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.
> I've implemented your suggestion. I don't think it's simpler, but LMK, maybe 
> it can be improved.
oops, i was looking into an older revision and missed mergepragmas2, i think it 
looks quite similar to this one but we can probably get rid of the recursion as 
well and simplify a couple more cases


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