Files
TheRock/compiler/amd-llvm/clang-tools-extra/clang-tidy/google/TodoCommentCheck.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

131 lines
4.3 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "TodoCommentCheck.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Lex/Preprocessor.h"
#include <optional>
namespace clang::tidy {
namespace google::readability {
namespace {
enum class StyleKind { Parentheses, Hyphen };
} // namespace
} // namespace google::readability
template <> struct OptionEnumMapping<google::readability::StyleKind> {
static ArrayRef<std::pair<google::readability::StyleKind, StringRef>>
getEnumMapping() {
static constexpr std::pair<google::readability::StyleKind, StringRef>
Mapping[] = {
{google::readability::StyleKind::Hyphen, "Hyphen"},
{google::readability::StyleKind::Parentheses, "Parentheses"},
};
return {Mapping};
}
};
} // namespace clang::tidy
namespace clang::tidy::google::readability {
class TodoCommentCheck::TodoCommentHandler : public CommentHandler {
public:
TodoCommentHandler(TodoCommentCheck &Check, std::optional<std::string> User)
: Check(Check), User(User ? *User : "unknown"),
TodoMatch(R"(^// *TODO *((\((.*)\))?:?( )?|: *(.*) *- *)?(.*)$)") {
const StringRef TodoStyleString = Check.Options.get("Style", "Hyphen");
for (const auto &[Value, Name] :
OptionEnumMapping<StyleKind>::getEnumMapping()) {
if (Name == TodoStyleString) {
TodoStyle = Value;
return;
}
}
Check.configurationDiag(
"invalid value '%0' for "
"google-readability-todo.Style; valid values are "
"'Parentheses' and 'Hyphen'. Defaulting to 'Hyphen'")
<< TodoStyleString;
}
bool HandleComment(Preprocessor &PP, SourceRange Range) override {
const StringRef Text =
Lexer::getSourceText(CharSourceRange::getCharRange(Range),
PP.getSourceManager(), PP.getLangOpts());
SmallVector<StringRef, 7> Matches;
if (!TodoMatch.match(Text, &Matches))
return false;
const StyleKind ParsedStyle =
!Matches[3].empty() ? StyleKind::Parentheses : StyleKind::Hyphen;
const StringRef Username =
ParsedStyle == StyleKind::Parentheses ? Matches[3] : Matches[5];
const StringRef Comment = Matches[6];
if (!Username.empty() &&
(ParsedStyle == StyleKind::Parentheses || !Comment.empty())) {
return false;
}
if (Username.empty()) {
Check.diag(Range.getBegin(), "missing username/bug in TODO")
<< FixItHint::CreateReplacement(
CharSourceRange::getCharRange(Range),
createReplacementString(Username, Comment));
}
if (Comment.empty())
Check.diag(Range.getBegin(), "missing details in TODO");
return false;
}
std::string createReplacementString(const StringRef Username,
const StringRef Comment) const {
if (TodoStyle == StyleKind::Parentheses) {
return ("// TODO(" + Twine(User) +
"): " + (Comment.empty() ? "some details" : Comment))
.str();
}
return ("// TODO: " + Twine(User) + " - " +
(Comment.empty() ? "some details" : Comment))
.str();
}
StyleKind getTodoStyle() const { return TodoStyle; }
private:
TodoCommentCheck &Check;
std::string User;
llvm::Regex TodoMatch;
StyleKind TodoStyle = StyleKind::Hyphen;
};
TodoCommentCheck::TodoCommentCheck(StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
Handler(std::make_unique<TodoCommentHandler>(
*this, Context->getOptions().User)) {}
TodoCommentCheck::~TodoCommentCheck() = default;
void TodoCommentCheck::registerPPCallbacks(const SourceManager &SM,
Preprocessor *PP,
Preprocessor *ModuleExpanderPP) {
PP->addCommentHandler(Handler.get());
}
void TodoCommentCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "Style", Handler->getTodoStyle());
}
} // namespace clang::tidy::google::readability