2020-02-26 01:41:32 +08:00
|
|
|
//===--- 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,
|
2020-03-05 00:55:03 +08:00
|
|
|
FileExtensionsSet &FileExtensions,
|
|
|
|
StringRef Delimiters) {
|
2020-02-26 01:41:32 +08:00
|
|
|
SmallVector<StringRef, 5> Suffixes;
|
2020-03-05 00:55:03 +08:00
|
|
|
for (char Delimiter : Delimiters) {
|
|
|
|
if (AllFileExtensions.contains(Delimiter)) {
|
|
|
|
AllFileExtensions.split(Suffixes, Delimiter);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-26 01:41:32 +08:00
|
|
|
FileExtensions.clear();
|
|
|
|
for (StringRef Suffix : Suffixes) {
|
|
|
|
StringRef Extension = Suffix.trim();
|
|
|
|
if (!llvm::all_of(Extension, isAlphanumeric))
|
|
|
|
return false;
|
|
|
|
FileExtensions.insert(Extension);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-03-10 22:34:34 +08:00
|
|
|
llvm::Optional<StringRef>
|
|
|
|
getFileExtension(StringRef FileName, const FileExtensionsSet &FileExtensions) {
|
2020-02-26 01:41:32 +08:00
|
|
|
StringRef Extension = llvm::sys::path::extension(FileName);
|
|
|
|
if (Extension.empty())
|
2020-03-10 22:34:34 +08:00
|
|
|
return llvm::None;
|
2020-02-26 01:41:32 +08:00
|
|
|
// Skip "." prefix.
|
2020-03-10 22:34:34 +08:00
|
|
|
if (!FileExtensions.count(Extension.substr(1)))
|
|
|
|
return llvm::None;
|
|
|
|
return Extension;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool isFileExtension(StringRef FileName,
|
|
|
|
const FileExtensionsSet &FileExtensions) {
|
|
|
|
return getFileExtension(FileName, FileExtensions).hasValue();
|
2020-02-26 01:41:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace utils
|
|
|
|
} // namespace tidy
|
|
|
|
} // namespace clang
|