brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 97be36a Raw
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