[clang] [clang-repl] adding documentation and information for %commands (PR #150348)

Aaron Danen via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 28 16:48:49 PDT 2025


https://github.com/aadanen updated https://github.com/llvm/llvm-project/pull/150348

>From 4e24cb20efa22e364d41026ae40aec470ff786aa Mon Sep 17 00:00:00 2001
From: Aaron Danen <aaron.danen at gmail.com>
Date: Wed, 23 Jul 2025 18:01:14 -0700
Subject: [PATCH 1/6] added undo to docs in same format as %quit

---
 clang/docs/ClangRepl.rst | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/clang/docs/ClangRepl.rst b/clang/docs/ClangRepl.rst
index 5399036c123fb..9ef82df28ee43 100644
--- a/clang/docs/ClangRepl.rst
+++ b/clang/docs/ClangRepl.rst
@@ -197,6 +197,13 @@ Comments:
    clang-repl> // Comments in Clang-Repl
    clang-repl> /* Comments in Clang-Repl */
 
+Undo:
+=====
+
+.. code-block:: text
+
+   clang-repl>%undo
+
 
 Closure or Termination:
 =======================

>From 752e4906b633b1343a52338027fdc0a6e36d6288 Mon Sep 17 00:00:00 2001
From: Aaron Danen <aaron.danen at gmail.com>
Date: Sat, 26 Jul 2025 10:01:30 -0700
Subject: [PATCH 2/6] implemented %help

---
 clang/tools/clang-repl/ClangRepl.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/clang/tools/clang-repl/ClangRepl.cpp b/clang/tools/clang-repl/ClangRepl.cpp
index 54b27782d3db3..c347b45306031 100644
--- a/clang/tools/clang-repl/ClangRepl.cpp
+++ b/clang/tools/clang-repl/ClangRepl.cpp
@@ -185,7 +185,7 @@ struct ReplListCompleter {
   clang::Interpreter &MainInterp;
   ReplListCompleter(clang::IncrementalCompilerBuilder &CB,
                     clang::Interpreter &Interp)
-      : CB(CB), MainInterp(Interp){};
+      : CB(CB), MainInterp(Interp) {};
 
   std::vector<llvm::LineEditor::Completion> operator()(llvm::StringRef Buffer,
                                                        size_t Pos) const;
@@ -370,6 +370,8 @@ int main(int argc, const char **argv) {
       if (Input == R"(%undo)") {
         if (auto Err = Interp->Undo())
           llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: ");
+      } else if (Input == R"(%help)") {
+        printf("clang-repl commands: { %%undo, %%quit }\n");
       } else if (Input.rfind("%lib ", 0) == 0) {
         if (auto Err = Interp->LoadDynamicLibrary(Input.data() + 5))
           llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: ");

>From 99e2421447d730e40513ed799ece85c73b6987ce Mon Sep 17 00:00:00 2001
From: Aaron Danen <aaron.danen at gmail.com>
Date: Sat, 26 Jul 2025 10:53:39 -0700
Subject: [PATCH 3/6] blurb about %help on startup. better %help format

---
 clang/tools/clang-repl/ClangRepl.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/clang/tools/clang-repl/ClangRepl.cpp b/clang/tools/clang-repl/ClangRepl.cpp
index c347b45306031..540253e377d98 100644
--- a/clang/tools/clang-repl/ClangRepl.cpp
+++ b/clang/tools/clang-repl/ClangRepl.cpp
@@ -347,7 +347,11 @@ int main(int argc, const char **argv) {
     }
   }
 
+  const char *percent_commands = "%help\tlist clang-repl %commands\n"
+                                 "%undo\tundo the previous input\n"
+                                 "%quit\texit clang-repl\n";
   if (OptInputs.empty()) {
+    printf("%%help for list of clang-repl commands\n");
     llvm::LineEditor LE("clang-repl");
     std::string Input;
     LE.setListCompleter(ReplListCompleter(CB, *Interp));
@@ -371,7 +375,7 @@ int main(int argc, const char **argv) {
         if (auto Err = Interp->Undo())
           llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: ");
       } else if (Input == R"(%help)") {
-        printf("clang-repl commands: { %%undo, %%quit }\n");
+        printf("%s\n", percent_commands);
       } else if (Input.rfind("%lib ", 0) == 0) {
         if (auto Err = Interp->LoadDynamicLibrary(Input.data() + 5))
           llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: ");

>From f1f6d9c4a951d02d65abf306b069d3102f91481e Mon Sep 17 00:00:00 2001
From: Aaron Danen <aaron.danen at gmail.com>
Date: Sat, 26 Jul 2025 10:57:41 -0700
Subject: [PATCH 4/6] small change to opener message

---
 clang/tools/clang-repl/ClangRepl.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/tools/clang-repl/ClangRepl.cpp b/clang/tools/clang-repl/ClangRepl.cpp
index 540253e377d98..c4718b208b586 100644
--- a/clang/tools/clang-repl/ClangRepl.cpp
+++ b/clang/tools/clang-repl/ClangRepl.cpp
@@ -351,7 +351,7 @@ int main(int argc, const char **argv) {
                                  "%undo\tundo the previous input\n"
                                  "%quit\texit clang-repl\n";
   if (OptInputs.empty()) {
-    printf("%%help for list of clang-repl commands\n");
+    printf("type %%help to list clang-repl commands\n");
     llvm::LineEditor LE("clang-repl");
     std::string Input;
     LE.setListCompleter(ReplListCompleter(CB, *Interp));

>From 1cd23df9a039595dbced49dd222065b0d5f7e6e2 Mon Sep 17 00:00:00 2001
From: Aaron Danen <aaron.danen at gmail.com>
Date: Mon, 28 Jul 2025 10:39:46 -0700
Subject: [PATCH 5/6] added %help to docs

---
 clang/docs/ClangRepl.rst | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/clang/docs/ClangRepl.rst b/clang/docs/ClangRepl.rst
index 9ef82df28ee43..e2b33a01b15ed 100644
--- a/clang/docs/ClangRepl.rst
+++ b/clang/docs/ClangRepl.rst
@@ -197,6 +197,13 @@ Comments:
    clang-repl> // Comments in Clang-Repl
    clang-repl> /* Comments in Clang-Repl */
 
+Help:
+=====
+
+.. code-block:: text
+
+   clang-repl>%help
+
 Undo:
 =====
 

>From cde1b98e47161b8645af29cceb2e057b2e937c66 Mon Sep 17 00:00:00 2001
From: Aaron Danen <aaron.danen at gmail.com>
Date: Mon, 28 Jul 2025 16:48:08 -0700
Subject: [PATCH 6/6] got rid of printf(), added bad % command handling

---
 clang/tools/clang-repl/ClangRepl.cpp | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/clang/tools/clang-repl/ClangRepl.cpp b/clang/tools/clang-repl/ClangRepl.cpp
index c4718b208b586..e68aabcd43e0f 100644
--- a/clang/tools/clang-repl/ClangRepl.cpp
+++ b/clang/tools/clang-repl/ClangRepl.cpp
@@ -28,6 +28,7 @@
 #include "llvm/Support/ManagedStatic.h" // llvm_shutdown
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/TargetSelect.h"
+#include "llvm/Support/raw_ostream.h"
 #include "llvm/TargetParser/Host.h"
 #include <optional>
 
@@ -347,11 +348,15 @@ int main(int argc, const char **argv) {
     }
   }
 
-  const char *percent_commands = "%help\tlist clang-repl %commands\n"
-                                 "%undo\tundo the previous input\n"
-                                 "%quit\texit clang-repl\n";
+  // if we add more % commands, there should be better architecture than this
+  const char *help_output = "%help\tlist clang-repl %commands\n"
+                            "%undo\tundo the previous input\n"
+                            "%quit\texit clang-repl\n";
+  const char *help_prompt = "type %help to list clang-repl commands\n";
+
+  llvm::raw_ostream &OS = llvm::outs();
   if (OptInputs.empty()) {
-    printf("type %%help to list clang-repl commands\n");
+    OS << help_prompt;
     llvm::LineEditor LE("clang-repl");
     std::string Input;
     LE.setListCompleter(ReplListCompleter(CB, *Interp));
@@ -375,7 +380,9 @@ int main(int argc, const char **argv) {
         if (auto Err = Interp->Undo())
           llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: ");
       } else if (Input == R"(%help)") {
-        printf("%s\n", percent_commands);
+        OS << help_output << '\n';
+      } else if (Input[0] == '%') { // make sure this is evaluated last
+        OS << "Invalid % command: \"" << Input << "\". " << help_prompt;
       } else if (Input.rfind("%lib ", 0) == 0) {
         if (auto Err = Interp->LoadDynamicLibrary(Input.data() + 5))
           llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "error: ");



More information about the cfe-commits mailing list