[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