70 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
//===--- 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<std::string> 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<StringRef, 4> 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<TodoCommentHandler>(
 | 
						|
          *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
 |