72 lines · cpp
1//===----------------------------------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "FileExtensionsUtils.h"10#include "clang/Basic/CharInfo.h"11#include "llvm/Support/Path.h"12#include <optional>13 14namespace clang::tidy::utils {15 16bool isExpansionLocInHeaderFile(SourceLocation Loc, const SourceManager &SM,17 const FileExtensionsSet &HeaderFileExtensions) {18 const SourceLocation ExpansionLoc = SM.getExpansionLoc(Loc);19 return isFileExtension(SM.getFilename(ExpansionLoc), HeaderFileExtensions);20}21 22bool isPresumedLocInHeaderFile(SourceLocation Loc, SourceManager &SM,23 const FileExtensionsSet &HeaderFileExtensions) {24 const PresumedLoc PresumedLocation = SM.getPresumedLoc(Loc);25 return isFileExtension(PresumedLocation.getFilename(), HeaderFileExtensions);26}27 28bool isSpellingLocInHeaderFile(SourceLocation Loc, SourceManager &SM,29 const FileExtensionsSet &HeaderFileExtensions) {30 const SourceLocation SpellingLoc = SM.getSpellingLoc(Loc);31 return isFileExtension(SM.getFilename(SpellingLoc), HeaderFileExtensions);32}33 34bool parseFileExtensions(StringRef AllFileExtensions,35 FileExtensionsSet &FileExtensions,36 StringRef Delimiters) {37 SmallVector<StringRef, 5> Suffixes;38 for (const char Delimiter : Delimiters) {39 if (AllFileExtensions.contains(Delimiter)) {40 AllFileExtensions.split(Suffixes, Delimiter);41 break;42 }43 }44 45 FileExtensions.clear();46 for (const StringRef Suffix : Suffixes) {47 StringRef Extension = Suffix.trim();48 if (!llvm::all_of(Extension, isAlphanumeric))49 return false;50 FileExtensions.insert(Extension);51 }52 return true;53}54 55std::optional<StringRef>56getFileExtension(StringRef FileName, const FileExtensionsSet &FileExtensions) {57 StringRef Extension = llvm::sys::path::extension(FileName);58 if (Extension.empty())59 return std::nullopt;60 // Skip "." prefix.61 if (!FileExtensions.contains(Extension.substr(1)))62 return std::nullopt;63 return Extension;64}65 66bool isFileExtension(StringRef FileName,67 const FileExtensionsSet &FileExtensions) {68 return getFileExtension(FileName, FileExtensions).has_value();69}70 71} // namespace clang::tidy::utils72