//===--- TodoCommentCheck.cpp - clang-tidy --------------------------------===// // // 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" namespace clang { namespace tidy { namespace google { namespace readability { class TodoCommentCheck::TodoCommentHandler : public CommentHandler { public: TodoCommentHandler(TodoCommentCheck &Check, llvm::Optional User) : Check(Check), User(User ? *User : "unknown"), TodoMatch("^// *TODO *(\\(.*\\))?:?( )?(.*)$") {} bool HandleComment(Preprocessor &PP, SourceRange Range) override { StringRef Text = Lexer::getSourceText(CharSourceRange::getCharRange(Range), PP.getSourceManager(), PP.getLangOpts()); SmallVector Matches; if (!TodoMatch.match(Text, &Matches)) return false; StringRef Username = Matches[1]; StringRef Comment = Matches[3]; if (!Username.empty()) return false; std::string NewText = ("// TODO(" + Twine(User) + "): " + Comment).str(); Check.diag(Range.getBegin(), "missing username/bug in TODO") << FixItHint::CreateReplacement(CharSourceRange::getCharRange(Range), NewText); return false; } private: TodoCommentCheck &Check; std::string User; llvm::Regex TodoMatch; }; TodoCommentCheck::TodoCommentCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), Handler(std::make_unique( *this, Context->getOptions().User)) {} TodoCommentCheck::~TodoCommentCheck() = default; void TodoCommentCheck::registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) { PP->addCommentHandler(Handler.get()); } } // namespace readability } // namespace google } // namespace tidy } // namespace clang