11#include "clang/Basic/SourceManager.h"
12#include "clang/Lex/PPCallbacks.h"
13#include "clang/Lex/Preprocessor.h"
14#include "llvm/ADT/StringRef.h"
20class PragmaOnceCallbacks :
public PPCallbacks {
22 PragmaOnceCallbacks(AvoidPragmaOnceCheck *Check,
const SourceManager &SM)
23 : Check(Check), SM(SM) {}
24 void PragmaDirective(SourceLocation Loc,
25 PragmaIntroducerKind Introducer)
override {
26 auto Str = StringRef(SM.getCharacterData(Loc));
27 if (!Str.consume_front(
"#"))
30 if (!Str.consume_front(
"pragma"))
33 if (Str.starts_with(
"once"))
35 "avoid 'pragma once' directive; use include guards instead");
39 AvoidPragmaOnceCheck *Check;
40 const SourceManager &SM;
47 Preprocessor *ModuleExpanderPP) {
48 PP->addPPCallbacks(std::make_unique<PragmaOnceCallbacks>(
this, SM));
void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) override