1 //===--- FileExtensionsUtils.cpp - clang-tidy -------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #include "FileExtensionsUtils.h"
10 #include "clang/Basic/CharInfo.h"
11 #include "llvm/Support/Path.h"
14 namespace clang::tidy::utils
{
16 bool isExpansionLocInHeaderFile(SourceLocation Loc
, const SourceManager
&SM
,
17 const FileExtensionsSet
&HeaderFileExtensions
) {
18 SourceLocation ExpansionLoc
= SM
.getExpansionLoc(Loc
);
19 return isFileExtension(SM
.getFilename(ExpansionLoc
), HeaderFileExtensions
);
22 bool isPresumedLocInHeaderFile(SourceLocation Loc
, SourceManager
&SM
,
23 const FileExtensionsSet
&HeaderFileExtensions
) {
24 PresumedLoc PresumedLocation
= SM
.getPresumedLoc(Loc
);
25 return isFileExtension(PresumedLocation
.getFilename(), HeaderFileExtensions
);
28 bool isSpellingLocInHeaderFile(SourceLocation Loc
, SourceManager
&SM
,
29 const FileExtensionsSet
&HeaderFileExtensions
) {
30 SourceLocation SpellingLoc
= SM
.getSpellingLoc(Loc
);
31 return isFileExtension(SM
.getFilename(SpellingLoc
), HeaderFileExtensions
);
34 bool parseFileExtensions(StringRef AllFileExtensions
,
35 FileExtensionsSet
&FileExtensions
,
36 StringRef Delimiters
) {
37 SmallVector
<StringRef
, 5> Suffixes
;
38 for (char Delimiter
: Delimiters
) {
39 if (AllFileExtensions
.contains(Delimiter
)) {
40 AllFileExtensions
.split(Suffixes
, Delimiter
);
45 FileExtensions
.clear();
46 for (StringRef Suffix
: Suffixes
) {
47 StringRef Extension
= Suffix
.trim();
48 if (!llvm::all_of(Extension
, isAlphanumeric
))
50 FileExtensions
.insert(Extension
);
55 std::optional
<StringRef
>
56 getFileExtension(StringRef FileName
, const FileExtensionsSet
&FileExtensions
) {
57 StringRef Extension
= llvm::sys::path::extension(FileName
);
58 if (Extension
.empty())
61 if (!FileExtensions
.count(Extension
.substr(1)))
66 bool isFileExtension(StringRef FileName
,
67 const FileExtensionsSet
&FileExtensions
) {
68 return getFileExtension(FileName
, FileExtensions
).has_value();
71 } // namespace clang::tidy::utils