hokein added inline comments.

================
Comment at: clang-tools-extra/pseudo/lib/cxx/CXX.cpp:267
 
+Token::Index recoverNextDeclaration(const RecoveryParams &P) {
+  if (P.Begin == P.Tokens.tokens().size())
----------------
I think this excludes the parameter-declaration (from the grammar spec, it is a 
different nonterminal).


================
Comment at: clang-tools-extra/pseudo/lib/cxx/CXX.cpp:267
 
+Token::Index recoverNextDeclaration(const RecoveryParams &P) {
+  if (P.Begin == P.Tokens.tokens().size())
----------------
hokein wrote:
> I think this excludes the parameter-declaration (from the grammar spec, it is 
> a different nonterminal).
The logic of implementations looks very solid. I think it would be good to have 
some unittests for it. 


================
Comment at: clang-tools-extra/pseudo/lib/cxx/CXX.cpp:282
+  //  - if the braces are missing, we don't know where to recover
+  // So We only try to detect the others.
+  bool AcceptBraces = false;
----------------
if I read the code correctly, the following case should work like

```
void foo() {}

LLVM_DISCARD int bar() {} // this is an opaque `declaration` node?

void foo2() {} // it won't work if we change void -> Foo.
```


================
Comment at: clang-tools-extra/pseudo/lib/cxx/CXX.cpp:291
+  // they appear at the beginning of a line.
+  auto LikelyStartsDeclaration = [&](tok::TokenKind K) -> bool {
+    switch (K) {
----------------
the list looks reasonable -- I think we can lookup the `Follow(declaration)` 
set to find more.


================
Comment at: clang-tools-extra/pseudo/lib/cxx/CXX.cpp:301
+    case tok::kw_union:
+    // Types & other decl-specifiers
+    case tok::kw_void:
----------------
maybe consider `tok::identifier` (if the identifier is a type specifier, it is 
a good indicator of a declaration starting) as well? And yeah, we're less 
certain about it, but since we use the indentation information, I guess it 
might probably work well?


================
Comment at: clang-tools-extra/pseudo/lib/cxx/CXX.cpp:352
+    }
+
+    // Semicolons terminate statements.
----------------
I think we miss to check the return index >= Cursor here.


================
Comment at: clang-tools-extra/pseudo/lib/cxx/cxx.bnf:313
-declaration-seq := declaration
-declaration-seq := declaration-seq declaration
 declaration := block-declaration
----------------
Just want to spell out, this causes a performance hit :(
(a pure change of this has a ~6% slowdown, 7.17 MB/s -> 6.7MB/s on 
SemaCodeComplete.cpp).

left-cursive grammar is more friendly to LR-like parsers, because the parser 
can do the reduction earlier (after a parsed a `declaration`, we can perform a 
`declaration-seq` reduce); while right-cursive grammar, the reduction starts 
from the last declaration (this means our GSS is more deeper).

> change decl-sequence to right-recursive to simplify this
I remembered we discussed this bit before, but I don't really remember the 
details now :(



================
Comment at: clang-tools-extra/pseudo/test/cxx/recovery-declarations.cpp:6
+
+int x[0];
+// CHECK:      simple-declaration := decl-specifier-seq init-declarator-list ;
----------------
nit: add some tests to cover the initializer, e.g. 

```
auto lambda = [] xxxx () xxx {};
```

 


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D130460

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

Reply via email to