| //===--- FileExtensionsUtils.cpp - clang-tidy -------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "FileExtensionsUtils.h" |
| #include "clang/Basic/CharInfo.h" |
| #include "llvm/Support/Path.h" |
| |
| namespace clang { |
| namespace tidy { |
| namespace utils { |
| |
| bool isExpansionLocInHeaderFile(SourceLocation Loc, const SourceManager &SM, |
| const FileExtensionsSet &HeaderFileExtensions) { |
| SourceLocation ExpansionLoc = SM.getExpansionLoc(Loc); |
| return isFileExtension(SM.getFilename(ExpansionLoc), HeaderFileExtensions); |
| } |
| |
| bool isPresumedLocInHeaderFile(SourceLocation Loc, SourceManager &SM, |
| const FileExtensionsSet &HeaderFileExtensions) { |
| PresumedLoc PresumedLocation = SM.getPresumedLoc(Loc); |
| return isFileExtension(PresumedLocation.getFilename(), HeaderFileExtensions); |
| } |
| |
| bool isSpellingLocInHeaderFile(SourceLocation Loc, SourceManager &SM, |
| const FileExtensionsSet &HeaderFileExtensions) { |
| SourceLocation SpellingLoc = SM.getSpellingLoc(Loc); |
| return isFileExtension(SM.getFilename(SpellingLoc), HeaderFileExtensions); |
| } |
| |
| bool parseFileExtensions(StringRef AllFileExtensions, |
| FileExtensionsSet &FileExtensions, |
| StringRef Delimiters) { |
| SmallVector<StringRef, 5> Suffixes; |
| for (char Delimiter : Delimiters) { |
| if (AllFileExtensions.contains(Delimiter)) { |
| AllFileExtensions.split(Suffixes, Delimiter); |
| break; |
| } |
| } |
| |
| FileExtensions.clear(); |
| for (StringRef Suffix : Suffixes) { |
| StringRef Extension = Suffix.trim(); |
| if (!llvm::all_of(Extension, isAlphanumeric)) |
| return false; |
| FileExtensions.insert(Extension); |
| } |
| return true; |
| } |
| |
| llvm::Optional<StringRef> |
| getFileExtension(StringRef FileName, const FileExtensionsSet &FileExtensions) { |
| StringRef Extension = llvm::sys::path::extension(FileName); |
| if (Extension.empty()) |
| return llvm::None; |
| // Skip "." prefix. |
| if (!FileExtensions.count(Extension.substr(1))) |
| return llvm::None; |
| return Extension; |
| } |
| |
| bool isFileExtension(StringRef FileName, |
| const FileExtensionsSet &FileExtensions) { |
| return getFileExtension(FileName, FileExtensions).hasValue(); |
| } |
| |
| } // namespace utils |
| } // namespace tidy |
| } // namespace clang |