[clang-tools-extra] [clang-doc] Refactor error handling to use ExitOnError (PR #141699)
Samarth Narang via cfe-commits
cfe-commits at lists.llvm.org
Thu May 29 03:29:47 PDT 2025
https://github.com/snarang181 updated https://github.com/llvm/llvm-project/pull/141699
>From b2dc4f8a50d86ecdc5fd27fedd7efde5c6882df5 Mon Sep 17 00:00:00 2001
From: Samarth Narang <snarang at umass.edu>
Date: Tue, 27 May 2025 21:32:41 -0400
Subject: [PATCH 1/6] [clang-doc] Refactor error handling to use ExitOnError
This patch replaces manual error checks and exit() calls in clang-doc
with llvm::ExitOnError for consistency and maintainability.
No functional changes to outputs or APIs.
---
.../clang-doc/tool/ClangDocMain.cpp | 32 ++++++-------------
1 file changed, 10 insertions(+), 22 deletions(-)
diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
index 8e8f7053a8f87..e7efa4b15d80f 100644
--- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
+++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
@@ -49,6 +49,7 @@
using namespace clang::ast_matchers;
using namespace clang::tooling;
using namespace clang;
+static llvm::ExitOnError ExitOnErr;
static llvm::cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
static llvm::cl::OptionCategory ClangDocCategory("clang-doc options");
@@ -236,6 +237,8 @@ int main(int argc, const char **argv) {
llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);
std::error_code OK;
+ ExitOnErr.setBanner("clang-doc error: ");
+
const char *Overview =
R"(Generates documentation from source code and comments.
@@ -259,11 +262,7 @@ Example usage for a project using a compile commands database:
// Fail early if an invalid format was provided.
std::string Format = getFormatString();
llvm::outs() << "Emiting docs in " << Format << " format.\n";
- auto G = doc::findGeneratorByName(Format);
- if (!G) {
- llvm::errs() << toString(G.takeError()) << "\n";
- return 1;
- }
+ auto G = ExitOnErr(doc::findGeneratorByName(Format));
ArgumentsAdjuster ArgAdjuster;
if (!DoxygenOnly)
@@ -284,10 +283,7 @@ Example usage for a project using a compile commands database:
{UserStylesheets.begin(), UserStylesheets.end()}};
if (Format == "html") {
- if (auto Err = getHtmlAssetFiles(argv[0], CDCtx)) {
- llvm::errs() << toString(std::move(Err)) << "\n";
- return 1;
- }
+ ExitOnErr(getHtmlAssetFiles(argv[0], CDCtx));
}
// Mapping phase
@@ -300,7 +296,7 @@ Example usage for a project using a compile commands database:
"these files and continue:\n"
<< toString(std::move(Err)) << "\n";
else {
- llvm::errs() << toString(std::move(Err)) << "\n";
+ ExitOnErr(std::move(Err));
return 1;
}
}
@@ -371,22 +367,14 @@ Example usage for a project using a compile commands database:
sortUsrToInfo(USRToInfo);
// Ensure the root output directory exists.
- if (std::error_code Err = llvm::sys::fs::create_directories(OutDirectory);
- Err != std::error_code()) {
- llvm::errs() << "Failed to create directory '" << OutDirectory << "'\n";
- return 1;
- }
+ ExitOnErr(
+ llvm::errorCodeToError(llvm::sys::fs::create_directories(OutDirectory)));
// Run the generator.
llvm::outs() << "Generating docs...\n";
- if (auto Err =
- G->get()->generateDocs(OutDirectory, std::move(USRToInfo), CDCtx)) {
- llvm::errs() << toString(std::move(Err)) << "\n";
- return 1;
- }
-
+ ExitOnErr(G->generateDocs(OutDirectory, std::move(USRToInfo), CDCtx));
llvm::outs() << "Generating assets for docs...\n";
- Err = G->get()->createResources(CDCtx);
+ Err = G->createResources(CDCtx);
if (Err) {
llvm::outs() << "warning: " << toString(std::move(Err)) << "\n";
}
>From 51238bcaf1a6450eb2b7dfbc259a1d7c4bba0a17 Mon Sep 17 00:00:00 2001
From: Samarth Narang <snarang at umass.edu>
Date: Wed, 28 May 2025 18:47:17 -0400
Subject: [PATCH 2/6] Addressing PR feedback
---
clang-tools-extra/clang-doc/tool/ClangDocMain.cpp | 12 +++++++++---
.../test/clang-doc/invalid-file-error.test | 4 ++++
2 files changed, 13 insertions(+), 3 deletions(-)
create mode 100644 clang-tools-extra/test/clang-doc/invalid-file-error.test
diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
index e7efa4b15d80f..78ad1521397e6 100644
--- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
+++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
@@ -49,7 +49,6 @@
using namespace clang::ast_matchers;
using namespace clang::tooling;
using namespace clang;
-static llvm::ExitOnError ExitOnErr;
static llvm::cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
static llvm::cl::OptionCategory ClangDocCategory("clang-doc options");
@@ -128,6 +127,8 @@ static llvm::cl::opt<OutputFormatTy>
llvm::cl::init(OutputFormatTy::yaml),
llvm::cl::cat(ClangDocCategory));
+static llvm::ExitOnError ExitOnErr;
+
static std::string getFormatString() {
switch (FormatEnum) {
case OutputFormatTy::yaml:
@@ -367,8 +368,13 @@ Example usage for a project using a compile commands database:
sortUsrToInfo(USRToInfo);
// Ensure the root output directory exists.
- ExitOnErr(
- llvm::errorCodeToError(llvm::sys::fs::create_directories(OutDirectory)));
+ if (std::error_code Err = llvm::sys::fs::create_directories(OutDirectory);
+ Err != std::error_code()) {
+ ExitOnErr(llvm::createStringError(
+ llvm::inconvertibleErrorCode(), "Failed to create directory '%s': %s",
+ OutDirectory.c_str(), Err.message().c_str()));
+ }
+
// Run the generator.
llvm::outs() << "Generating docs...\n";
diff --git a/clang-tools-extra/test/clang-doc/invalid-file-error.test b/clang-tools-extra/test/clang-doc/invalid-file-error.test
new file mode 100644
index 0000000000000..8d391842aa452
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/invalid-file-error.test
@@ -0,0 +1,4 @@
+// RUN: not clang-doc %S/Inputs/basic-project/src/Circle.cpp -output=/root/docs 2>&1 | FileCheck %s
+
+// CHECK: clang-doc error: Failed to create directory
+
>From 3c6cf89a790a6915eb55727a0a2045165fb3e43a Mon Sep 17 00:00:00 2001
From: Samarth Narang <snarang at umass.edu>
Date: Wed, 28 May 2025 20:24:36 -0400
Subject: [PATCH 3/6] Clang-format fixes
---
clang-tools-extra/clang-doc/tool/ClangDocMain.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
index 78ad1521397e6..d7f44a9e6ea8f 100644
--- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
+++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
@@ -375,7 +375,6 @@ Example usage for a project using a compile commands database:
OutDirectory.c_str(), Err.message().c_str()));
}
-
// Run the generator.
llvm::outs() << "Generating docs...\n";
ExitOnErr(G->generateDocs(OutDirectory, std::move(USRToInfo), CDCtx));
>From c69ba9b263f0f915ec0cc818ca56b395139e265b Mon Sep 17 00:00:00 2001
From: Samarth Narang <snarang at umass.edu>
Date: Thu, 29 May 2025 06:26:07 -0400
Subject: [PATCH 4/6] Use more relevant file system API for error handling
Address issue with the lit tests
---
clang-tools-extra/clang-doc/tool/ClangDocMain.cpp | 7 ++-----
.../test/clang-doc/invalid-file-error.test | 12 ++++++++++--
2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
index d7f44a9e6ea8f..652bf619e274e 100644
--- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
+++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
@@ -368,11 +368,8 @@ Example usage for a project using a compile commands database:
sortUsrToInfo(USRToInfo);
// Ensure the root output directory exists.
- if (std::error_code Err = llvm::sys::fs::create_directories(OutDirectory);
- Err != std::error_code()) {
- ExitOnErr(llvm::createStringError(
- llvm::inconvertibleErrorCode(), "Failed to create directory '%s': %s",
- OutDirectory.c_str(), Err.message().c_str()));
+ if (std::error_code Err = llvm::sys::fs::create_directories(OutDirectory)) {
+ ExitOnErr(llvm::createFileError(OutDirectory, Err));
}
// Run the generator.
diff --git a/clang-tools-extra/test/clang-doc/invalid-file-error.test b/clang-tools-extra/test/clang-doc/invalid-file-error.test
index 8d391842aa452..8c045e9819b71 100644
--- a/clang-tools-extra/test/clang-doc/invalid-file-error.test
+++ b/clang-tools-extra/test/clang-doc/invalid-file-error.test
@@ -1,4 +1,12 @@
-// RUN: not clang-doc %S/Inputs/basic-project/src/Circle.cpp -output=/root/docs 2>&1 | FileCheck %s
+// Test: Invalid output path (%t is a file, not a directory)
+// RUN: rm -rf %t && echo "not a dir" > %t
+// RUN: not clang-doc %s -output=%t/subdir 2>&1 | FileCheck --check-prefix=BAD-OUTPUT %s
-// CHECK: clang-doc error: Failed to create directory
+// BAD-OUTPUT: clang-doc error:
+// BAD-OUTPUT: Not a directory
+//
+// Test: Invalid format option
+// RUN: not clang-doc %s -format=badformat 2>&1 | FileCheck --check-prefix=BAD-FORMAT %s
+
+// BAD-FORMAT: clang-doc: for the --format option: Cannot find option named 'badformat'!
\ No newline at end of file
>From 797e7cacb4ddf44008d9d5763820cfdf9feef78d Mon Sep 17 00:00:00 2001
From: Samarth Narang <snarang at umass.edu>
Date: Thu, 29 May 2025 06:27:23 -0400
Subject: [PATCH 5/6] Formatting commit
---
clang-tools-extra/clang-doc/tool/ClangDocMain.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
index 652bf619e274e..b42fe86f95d62 100644
--- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
+++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp
@@ -369,7 +369,7 @@ Example usage for a project using a compile commands database:
// Ensure the root output directory exists.
if (std::error_code Err = llvm::sys::fs::create_directories(OutDirectory)) {
- ExitOnErr(llvm::createFileError(OutDirectory, Err));
+ ExitOnErr(llvm::createFileError(OutDirectory, Err));
}
// Run the generator.
>From 8f8651f9d4b558551fdb21e2a711f832d6f62343 Mon Sep 17 00:00:00 2001
From: Samarth Narang <snarang at umass.edu>
Date: Thu, 29 May 2025 06:29:03 -0400
Subject: [PATCH 6/6] Rename test file to reflect multiple test cases
---
.../clang-doc/{invalid-file-error.test => invalid-options.cpp} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename clang-tools-extra/test/clang-doc/{invalid-file-error.test => invalid-options.cpp} (100%)
diff --git a/clang-tools-extra/test/clang-doc/invalid-file-error.test b/clang-tools-extra/test/clang-doc/invalid-options.cpp
similarity index 100%
rename from clang-tools-extra/test/clang-doc/invalid-file-error.test
rename to clang-tools-extra/test/clang-doc/invalid-options.cpp
More information about the cfe-commits
mailing list