1//===--- AvoidPragmaOnceCheck.cpp - clang-tidy ----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "AvoidPragmaOnceCheck.h"
10
11#include "clang/Basic/SourceManager.h"
12#include "clang/Lex/PPCallbacks.h"
13#include "clang/Lex/Preprocessor.h"
14#include "llvm/ADT/StringRef.h"
15
16namespace clang::tidy::portability {
17
18class PragmaOnceCallbacks : public PPCallbacks {
19public:
20 PragmaOnceCallbacks(AvoidPragmaOnceCheck *Check, const SourceManager &SM)
21 : Check(Check), SM(SM) {}
22 void PragmaDirective(SourceLocation Loc,
23 PragmaIntroducerKind Introducer) override {
24 auto Str = llvm::StringRef(SM.getCharacterData(SL: Loc));
25 if (!Str.consume_front(Prefix: "#"))
26 return;
27 Str = Str.trim();
28 if (!Str.consume_front(Prefix: "pragma"))
29 return;
30 Str = Str.trim();
31 if (Str.starts_with(Prefix: "once"))
32 Check->diag(Loc,
33 Description: "avoid 'pragma once' directive; use include guards instead");
34 }
35
36private:
37 AvoidPragmaOnceCheck *Check;
38 const SourceManager &SM;
39};
40
41void AvoidPragmaOnceCheck::registerPPCallbacks(const SourceManager &SM,
42 Preprocessor *PP,
43 Preprocessor *ModuleExpanderPP) {
44 PP->addPPCallbacks(C: std::make_unique<PragmaOnceCallbacks>(args: this, args: SM));
45}
46
47} // namespace clang::tidy::portability
48

Provided by KDAB

Privacy Policy
Learn to use CMake with our Intro Training
Find out more

source code of clang-tools-extra/clang-tidy/portability/AvoidPragmaOnceCheck.cpp