Skip to content

Commit

Permalink
Merge commit 'bc8c4bbd7973ab9527a78a20000aecde9bed652d' into llvmspir…
Browse files Browse the repository at this point in the history
…v_pulldown
  • Loading branch information
sys-ce-bb committed Dec 28, 2023
2 parents b9f2fa9 + bc8c4bb commit c99ffd5
Show file tree
Hide file tree
Showing 127 changed files with 2,416 additions and 956 deletions.
219 changes: 130 additions & 89 deletions clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "IdentifierNamingCheck.h"

#include "../GlobList.h"
#include "../utils/ASTUtils.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/Lex/PPCallbacks.h"
#include "clang/Lex/Preprocessor.h"
Expand Down Expand Up @@ -286,7 +287,9 @@ IdentifierNamingCheck::FileStyle IdentifierNamingCheck::getFileStyleFromOptions(
HPTOpt.value_or(IdentifierNamingCheck::HPT_Off));
}
bool IgnoreMainLike = Options.get("IgnoreMainLikeFunctions", false);
return {std::move(Styles), std::move(HNOption), IgnoreMainLike};
bool CheckAnonFieldInParent = Options.get("CheckAnonFieldInParent", false);
return {std::move(Styles), std::move(HNOption), IgnoreMainLike,
CheckAnonFieldInParent};
}

std::string IdentifierNamingCheck::HungarianNotation::getDeclTypeName(
Expand Down Expand Up @@ -859,6 +862,8 @@ void IdentifierNamingCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "IgnoreFailedSplit", IgnoreFailedSplit);
Options.store(Opts, "IgnoreMainLikeFunctions",
MainFileStyle->isIgnoringMainLikeFunction());
Options.store(Opts, "CheckAnonFieldInParent",
MainFileStyle->isCheckingAnonFieldInParentScope());
}

bool IdentifierNamingCheck::matchesStyle(
Expand Down Expand Up @@ -1111,7 +1116,7 @@ std::string IdentifierNamingCheck::fixupWithStyle(
StyleKind IdentifierNamingCheck::findStyleKind(
const NamedDecl *D,
ArrayRef<std::optional<IdentifierNamingCheck::NamingStyle>> NamingStyles,
bool IgnoreMainLikeFunctions) const {
bool IgnoreMainLikeFunctions, bool CheckAnonFieldInParentScope) const {
assert(D && D->getIdentifier() && !D->getName().empty() && !D->isImplicit() &&
"Decl must be an explicit identifier with a name.");

Expand Down Expand Up @@ -1185,29 +1190,14 @@ StyleKind IdentifierNamingCheck::findStyleKind(
}

if (const auto *Decl = dyn_cast<FieldDecl>(D)) {
QualType Type = Decl->getType();

if (!Type.isNull() && Type.isConstQualified()) {
if (NamingStyles[SK_ConstantMember])
return SK_ConstantMember;

if (NamingStyles[SK_Constant])
return SK_Constant;
if (CheckAnonFieldInParentScope) {
const RecordDecl *Record = Decl->getParent();
if (Record->isAnonymousStructOrUnion()) {
return findStyleKindForAnonField(Decl, NamingStyles);
}
}

if (Decl->getAccess() == AS_private && NamingStyles[SK_PrivateMember])
return SK_PrivateMember;

if (Decl->getAccess() == AS_protected && NamingStyles[SK_ProtectedMember])
return SK_ProtectedMember;

if (Decl->getAccess() == AS_public && NamingStyles[SK_PublicMember])
return SK_PublicMember;

if (NamingStyles[SK_Member])
return SK_Member;

return SK_Invalid;
return findStyleKindForField(Decl, Decl->getType(), NamingStyles);
}

if (const auto *Decl = dyn_cast<ParmVarDecl>(D)) {
Expand Down Expand Up @@ -1244,66 +1234,7 @@ StyleKind IdentifierNamingCheck::findStyleKind(
}

if (const auto *Decl = dyn_cast<VarDecl>(D)) {
QualType Type = Decl->getType();

if (Decl->isConstexpr() && NamingStyles[SK_ConstexprVariable])
return SK_ConstexprVariable;

if (!Type.isNull() && Type.isConstQualified()) {
if (Decl->isStaticDataMember() && NamingStyles[SK_ClassConstant])
return SK_ClassConstant;

if (Decl->isFileVarDecl() && Type.getTypePtr()->isAnyPointerType() &&
NamingStyles[SK_GlobalConstantPointer])
return SK_GlobalConstantPointer;

if (Decl->isFileVarDecl() && NamingStyles[SK_GlobalConstant])
return SK_GlobalConstant;

if (Decl->isStaticLocal() && NamingStyles[SK_StaticConstant])
return SK_StaticConstant;

if (Decl->isLocalVarDecl() && Type.getTypePtr()->isAnyPointerType() &&
NamingStyles[SK_LocalConstantPointer])
return SK_LocalConstantPointer;

if (Decl->isLocalVarDecl() && NamingStyles[SK_LocalConstant])
return SK_LocalConstant;

if (Decl->isFunctionOrMethodVarDecl() && NamingStyles[SK_LocalConstant])
return SK_LocalConstant;

if (NamingStyles[SK_Constant])
return SK_Constant;
}

if (Decl->isStaticDataMember() && NamingStyles[SK_ClassMember])
return SK_ClassMember;

if (Decl->isFileVarDecl() && Type.getTypePtr()->isAnyPointerType() &&
NamingStyles[SK_GlobalPointer])
return SK_GlobalPointer;

if (Decl->isFileVarDecl() && NamingStyles[SK_GlobalVariable])
return SK_GlobalVariable;

if (Decl->isStaticLocal() && NamingStyles[SK_StaticVariable])
return SK_StaticVariable;

if (Decl->isLocalVarDecl() && Type.getTypePtr()->isAnyPointerType() &&
NamingStyles[SK_LocalPointer])
return SK_LocalPointer;

if (Decl->isLocalVarDecl() && NamingStyles[SK_LocalVariable])
return SK_LocalVariable;

if (Decl->isFunctionOrMethodVarDecl() && NamingStyles[SK_LocalVariable])
return SK_LocalVariable;

if (NamingStyles[SK_Variable])
return SK_Variable;

return SK_Invalid;
return findStyleKindForVar(Decl, Decl->getType(), NamingStyles);
}

if (const auto *Decl = dyn_cast<CXXMethodDecl>(D)) {
Expand Down Expand Up @@ -1442,12 +1373,13 @@ IdentifierNamingCheck::getDeclFailureInfo(const NamedDecl *Decl,
if (!FileStyle.isActive())
return std::nullopt;

return getFailureInfo(HungarianNotation.getDeclTypeName(Decl),
Decl->getName(), Decl, Loc, FileStyle.getStyles(),
FileStyle.getHNOption(),
findStyleKind(Decl, FileStyle.getStyles(),
FileStyle.isIgnoringMainLikeFunction()),
SM, IgnoreFailedSplit);
return getFailureInfo(
HungarianNotation.getDeclTypeName(Decl), Decl->getName(), Decl, Loc,
FileStyle.getStyles(), FileStyle.getHNOption(),
findStyleKind(Decl, FileStyle.getStyles(),
FileStyle.isIgnoringMainLikeFunction(),
FileStyle.isCheckingAnonFieldInParentScope()),
SM, IgnoreFailedSplit);
}

std::optional<RenamerClangTidyCheck::FailureInfo>
Expand Down Expand Up @@ -1496,5 +1428,114 @@ IdentifierNamingCheck::getStyleForFile(StringRef FileName) const {
return It.first->getValue();
}

StyleKind IdentifierNamingCheck::findStyleKindForAnonField(
const FieldDecl *AnonField,
ArrayRef<std::optional<NamingStyle>> NamingStyles) const {
const IndirectFieldDecl *IFD =
utils::findOutermostIndirectFieldDeclForField(AnonField);
assert(IFD && "Found an anonymous record field without an IndirectFieldDecl");

QualType Type = AnonField->getType();

if (const auto *F = dyn_cast<FieldDecl>(IFD->chain().front())) {
return findStyleKindForField(F, Type, NamingStyles);
}

if (const auto *V = IFD->getVarDecl()) {
return findStyleKindForVar(V, Type, NamingStyles);
}

return SK_Invalid;
}

StyleKind IdentifierNamingCheck::findStyleKindForField(
const FieldDecl *Field, QualType Type,
ArrayRef<std::optional<NamingStyle>> NamingStyles) const {
if (!Type.isNull() && Type.isConstQualified()) {
if (NamingStyles[SK_ConstantMember])
return SK_ConstantMember;

if (NamingStyles[SK_Constant])
return SK_Constant;
}

if (Field->getAccess() == AS_private && NamingStyles[SK_PrivateMember])
return SK_PrivateMember;

if (Field->getAccess() == AS_protected && NamingStyles[SK_ProtectedMember])
return SK_ProtectedMember;

if (Field->getAccess() == AS_public && NamingStyles[SK_PublicMember])
return SK_PublicMember;

if (NamingStyles[SK_Member])
return SK_Member;

return SK_Invalid;
}

StyleKind IdentifierNamingCheck::findStyleKindForVar(
const VarDecl *Var, QualType Type,
ArrayRef<std::optional<NamingStyle>> NamingStyles) const {
if (Var->isConstexpr() && NamingStyles[SK_ConstexprVariable])
return SK_ConstexprVariable;

if (!Type.isNull() && Type.isConstQualified()) {
if (Var->isStaticDataMember() && NamingStyles[SK_ClassConstant])
return SK_ClassConstant;

if (Var->isFileVarDecl() && Type.getTypePtr()->isAnyPointerType() &&
NamingStyles[SK_GlobalConstantPointer])
return SK_GlobalConstantPointer;

if (Var->isFileVarDecl() && NamingStyles[SK_GlobalConstant])
return SK_GlobalConstant;

if (Var->isStaticLocal() && NamingStyles[SK_StaticConstant])
return SK_StaticConstant;

if (Var->isLocalVarDecl() && Type.getTypePtr()->isAnyPointerType() &&
NamingStyles[SK_LocalConstantPointer])
return SK_LocalConstantPointer;

if (Var->isLocalVarDecl() && NamingStyles[SK_LocalConstant])
return SK_LocalConstant;

if (Var->isFunctionOrMethodVarDecl() && NamingStyles[SK_LocalConstant])
return SK_LocalConstant;

if (NamingStyles[SK_Constant])
return SK_Constant;
}

if (Var->isStaticDataMember() && NamingStyles[SK_ClassMember])
return SK_ClassMember;

if (Var->isFileVarDecl() && Type.getTypePtr()->isAnyPointerType() &&
NamingStyles[SK_GlobalPointer])
return SK_GlobalPointer;

if (Var->isFileVarDecl() && NamingStyles[SK_GlobalVariable])
return SK_GlobalVariable;

if (Var->isStaticLocal() && NamingStyles[SK_StaticVariable])
return SK_StaticVariable;

if (Var->isLocalVarDecl() && Type.getTypePtr()->isAnyPointerType() &&
NamingStyles[SK_LocalPointer])
return SK_LocalPointer;

if (Var->isLocalVarDecl() && NamingStyles[SK_LocalVariable])
return SK_LocalVariable;

if (Var->isFunctionOrMethodVarDecl() && NamingStyles[SK_LocalVariable])
return SK_LocalVariable;

if (NamingStyles[SK_Variable])
return SK_Variable;

return SK_Invalid;
}

} // namespace readability
} // namespace clang::tidy
26 changes: 23 additions & 3 deletions clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,9 +127,11 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck {
struct FileStyle {
FileStyle() : IsActive(false), IgnoreMainLikeFunctions(false) {}
FileStyle(SmallVectorImpl<std::optional<NamingStyle>> &&Styles,
HungarianNotationOption HNOption, bool IgnoreMainLike)
HungarianNotationOption HNOption, bool IgnoreMainLike,
bool CheckAnonFieldInParent)
: Styles(std::move(Styles)), HNOption(std::move(HNOption)),
IsActive(true), IgnoreMainLikeFunctions(IgnoreMainLike) {}
IsActive(true), IgnoreMainLikeFunctions(IgnoreMainLike),
CheckAnonFieldInParentScope(CheckAnonFieldInParent) {}

ArrayRef<std::optional<NamingStyle>> getStyles() const {
assert(IsActive);
Expand All @@ -144,11 +146,16 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck {
bool isActive() const { return IsActive; }
bool isIgnoringMainLikeFunction() const { return IgnoreMainLikeFunctions; }

bool isCheckingAnonFieldInParentScope() const {
return CheckAnonFieldInParentScope;
}

private:
SmallVector<std::optional<NamingStyle>, 0> Styles;
HungarianNotationOption HNOption;
bool IsActive;
bool IgnoreMainLikeFunctions;
bool CheckAnonFieldInParentScope;
};

IdentifierNamingCheck::FileStyle
Expand All @@ -175,7 +182,7 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck {
StyleKind findStyleKind(
const NamedDecl *D,
ArrayRef<std::optional<IdentifierNamingCheck::NamingStyle>> NamingStyles,
bool IgnoreMainLikeFunctions) const;
bool IgnoreMainLikeFunctions, bool CheckAnonFieldInParentScope) const;

std::optional<RenamerClangTidyCheck::FailureInfo> getFailureInfo(
StringRef Type, StringRef Name, const NamedDecl *ND,
Expand All @@ -199,6 +206,19 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck {

const FileStyle &getStyleForFile(StringRef FileName) const;

/// Find the style kind of a field in an anonymous record.
StyleKind findStyleKindForAnonField(
const FieldDecl *AnonField,
ArrayRef<std::optional<NamingStyle>> NamingStyles) const;

StyleKind findStyleKindForField(
const FieldDecl *Field, QualType Type,
ArrayRef<std::optional<NamingStyle>> NamingStyles) const;

StyleKind
findStyleKindForVar(const VarDecl *Var, QualType Type,
ArrayRef<std::optional<NamingStyle>> NamingStyles) const;

/// Stores the style options as a vector, indexed by the specified \ref
/// StyleKind, for a given directory.
mutable llvm::StringMap<FileStyle> NamingStylesCache;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//

#include "MisleadingIndentationCheck.h"
#include "../utils/LexerUtils.h"
#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"

Expand Down Expand Up @@ -51,8 +52,20 @@ void MisleadingIndentationCheck::danglingElseCheck(const SourceManager &SM,
diag(ElseLoc, "different indentation for 'if' and corresponding 'else'");
}

void MisleadingIndentationCheck::missingBracesCheck(const SourceManager &SM,
const CompoundStmt *CStmt) {
static bool isAtStartOfLineIncludingEmptyMacro(SourceLocation NextLoc,
const SourceManager &SM,
const LangOptions &LangOpts) {
const SourceLocation BeforeLoc =
utils::lexer::getPreviousTokenAndStart(NextLoc, SM, LangOpts).second;
if (BeforeLoc.isInvalid())
return false;
return SM.getExpansionLineNumber(BeforeLoc) !=
SM.getExpansionLineNumber(NextLoc);
}

void MisleadingIndentationCheck::missingBracesCheck(
const SourceManager &SM, const CompoundStmt *CStmt,
const LangOptions &LangOpts) {
const static StringRef StmtNames[] = {"if", "for", "while"};
for (unsigned int I = 0; I < CStmt->size() - 1; I++) {
const Stmt *CurrentStmt = CStmt->body_begin()[I];
Expand Down Expand Up @@ -92,6 +105,8 @@ void MisleadingIndentationCheck::missingBracesCheck(const SourceManager &SM,

if (NextLoc.isInvalid() || NextLoc.isMacroID())
continue;
if (!isAtStartOfLineIncludingEmptyMacro(NextLoc, SM, LangOpts))
continue;

if (SM.getExpansionColumnNumber(InnerLoc) ==
SM.getExpansionColumnNumber(NextLoc)) {
Expand All @@ -117,7 +132,8 @@ void MisleadingIndentationCheck::check(const MatchFinder::MatchResult &Result) {
danglingElseCheck(*Result.SourceManager, Result.Context, If);

if (const auto *CStmt = Result.Nodes.getNodeAs<CompoundStmt>("compound"))
missingBracesCheck(*Result.SourceManager, CStmt);
missingBracesCheck(*Result.SourceManager, CStmt,
Result.Context->getLangOpts());
}

} // namespace clang::tidy::readability
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ class MisleadingIndentationCheck : public ClangTidyCheck {
private:
void danglingElseCheck(const SourceManager &SM, ASTContext *Context,
const IfStmt *If);
void missingBracesCheck(const SourceManager &SM, const CompoundStmt *CStmt);
void missingBracesCheck(const SourceManager &SM, const CompoundStmt *CStmt,
const LangOptions &LangOpts);
};

} // namespace clang::tidy::readability
Expand Down
Loading

0 comments on commit c99ffd5

Please sign in to comment.