hokein created this revision.
hokein added a reviewer: sammccall.
Herald added a project: All.
hokein requested review of this revision.
Herald added a subscriber: alextsao1999.
Herald added a project: clang-tools-extra.

The main idea is to reuse the existing declaration recovery strategy --
extending it to cover some statement-specific bits.

Base on https://reviews.llvm.org/D130460


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D134737

Files:
  clang-tools-extra/pseudo/lib/cxx/CXX.cpp
  clang-tools-extra/pseudo/lib/cxx/Recovery.cpp
  clang-tools-extra/pseudo/lib/cxx/cxx.bnf


Index: clang-tools-extra/pseudo/lib/cxx/cxx.bnf
===================================================================
--- clang-tools-extra/pseudo/lib/cxx/cxx.bnf
+++ clang-tools-extra/pseudo/lib/cxx/cxx.bnf
@@ -283,8 +283,8 @@
 labeled-statement := DEFAULT : statement
 expression-statement := expression_opt ;
 compound-statement := { statement-seq_opt [recover=Brackets] }
-statement-seq := statement
-statement-seq := statement-seq statement
+statement-seq := statement [recover=NextStatement]
+statement-seq := statement-seq statement [recover=NextStatement]
 selection-statement := IF CONSTEXPR_opt ( init-statement_opt condition ) 
statement [guard]
 selection-statement := IF CONSTEXPR_opt ( init-statement_opt condition ) 
statement ELSE statement
 selection-statement := SWITCH ( init-statement_opt condition ) statement
Index: clang-tools-extra/pseudo/lib/cxx/Recovery.cpp
===================================================================
--- clang-tools-extra/pseudo/lib/cxx/Recovery.cpp
+++ clang-tools-extra/pseudo/lib/cxx/Recovery.cpp
@@ -31,6 +31,11 @@
   auto ConsiderForBraces = [&](tok::TokenKind K) {
     if (K == tok::kw_export || K == tok::kw_extern || K == tok::kw_namespace)
       AcceptBraces = true;
+    // Statements that don't end in semicolons:
+    //   while/switch/if/for (...) {}
+    if (K == tok::kw_for || K == tok::kw_while || K == tok::kw_if ||
+        K == tok::kw_switch)
+      AcceptBraces = true;
   };
 
   // Some tokens are pretty good indicators of a declaration starting, when
@@ -71,6 +76,15 @@
     case tok::kw_public:
     case tok::kw_private:
     case tok::kw_protected:
+    // Typical keywords for statements
+    case tok::kw_for:
+    case tok::kw_while:
+    case tok::kw_if:
+    case tok::kw_goto:
+    case tok::kw_switch:
+    case tok::kw_return:
+    case tok::kw_break:
+    case tok::kw_continue:
       return true;
     default:
       return false;
Index: clang-tools-extra/pseudo/lib/cxx/CXX.cpp
===================================================================
--- clang-tools-extra/pseudo/lib/cxx/CXX.cpp
+++ clang-tools-extra/pseudo/lib/cxx/CXX.cpp
@@ -427,6 +427,7 @@
   return {
       {Extension::Brackets, recoverBrackets},
       {Extension::NextDeclaration, recoverNextDeclaration},
+      {Extension::NextStatement, recoverNextDeclaration},
   };
 }
 


Index: clang-tools-extra/pseudo/lib/cxx/cxx.bnf
===================================================================
--- clang-tools-extra/pseudo/lib/cxx/cxx.bnf
+++ clang-tools-extra/pseudo/lib/cxx/cxx.bnf
@@ -283,8 +283,8 @@
 labeled-statement := DEFAULT : statement
 expression-statement := expression_opt ;
 compound-statement := { statement-seq_opt [recover=Brackets] }
-statement-seq := statement
-statement-seq := statement-seq statement
+statement-seq := statement [recover=NextStatement]
+statement-seq := statement-seq statement [recover=NextStatement]
 selection-statement := IF CONSTEXPR_opt ( init-statement_opt condition ) statement [guard]
 selection-statement := IF CONSTEXPR_opt ( init-statement_opt condition ) statement ELSE statement
 selection-statement := SWITCH ( init-statement_opt condition ) statement
Index: clang-tools-extra/pseudo/lib/cxx/Recovery.cpp
===================================================================
--- clang-tools-extra/pseudo/lib/cxx/Recovery.cpp
+++ clang-tools-extra/pseudo/lib/cxx/Recovery.cpp
@@ -31,6 +31,11 @@
   auto ConsiderForBraces = [&](tok::TokenKind K) {
     if (K == tok::kw_export || K == tok::kw_extern || K == tok::kw_namespace)
       AcceptBraces = true;
+    // Statements that don't end in semicolons:
+    //   while/switch/if/for (...) {}
+    if (K == tok::kw_for || K == tok::kw_while || K == tok::kw_if ||
+        K == tok::kw_switch)
+      AcceptBraces = true;
   };
 
   // Some tokens are pretty good indicators of a declaration starting, when
@@ -71,6 +76,15 @@
     case tok::kw_public:
     case tok::kw_private:
     case tok::kw_protected:
+    // Typical keywords for statements
+    case tok::kw_for:
+    case tok::kw_while:
+    case tok::kw_if:
+    case tok::kw_goto:
+    case tok::kw_switch:
+    case tok::kw_return:
+    case tok::kw_break:
+    case tok::kw_continue:
       return true;
     default:
       return false;
Index: clang-tools-extra/pseudo/lib/cxx/CXX.cpp
===================================================================
--- clang-tools-extra/pseudo/lib/cxx/CXX.cpp
+++ clang-tools-extra/pseudo/lib/cxx/CXX.cpp
@@ -427,6 +427,7 @@
   return {
       {Extension::Brackets, recoverBrackets},
       {Extension::NextDeclaration, recoverNextDeclaration},
+      {Extension::NextStatement, recoverNextDeclaration},
   };
 }
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D134737: [pseudo][wip] ... Haojian Wu via Phabricator via cfe-commits

Reply via email to