Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion clang-tools-extra/clangd/AST.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,8 @@ std::string printQualifiedName(const NamedDecl &ND) {
Policy.SuppressScope = true;
// (unnamed struct), not (unnamed struct at /path/to/foo.cc:42:1).
// In clangd, context is usually available and paths are mostly noise.
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
ND.printQualifiedName(OS, Policy);
assert(!StringRef(QName).starts_with("::"));
return QName;
Expand Down
3 changes: 2 additions & 1 deletion clang-tools-extra/clangd/FindSymbols.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,8 @@ std::string getSymbolDetail(ASTContext &Ctx, const NamedDecl &ND) {
PrintingPolicy P(Ctx.getPrintingPolicy());
P.SuppressScope = true;
P.SuppressUnwrittenScope = true;
P.AnonymousTagLocations = false;
P.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
P.PolishForDeclaration = true;
std::string Detail;
llvm::raw_string_ostream OS(Detail);
Expand Down
3 changes: 2 additions & 1 deletion clang-tools-extra/clangd/Hover.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ namespace clangd {
namespace {

PrintingPolicy getPrintingPolicy(PrintingPolicy Base) {
Base.AnonymousTagLocations = false;
Base.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
Base.TerseOutput = true;
Base.PolishForDeclaration = true;
Base.ConstantsAsWritten = true;
Expand Down
5 changes: 3 additions & 2 deletions clang-tools-extra/clangd/InlayHints.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -390,8 +390,9 @@ class InlayHintVisitor : public RecursiveASTVisitor<InlayHintVisitor> {
MainFileBuf = Invalid ? StringRef{} : Buf;

TypeHintPolicy.SuppressScope = true; // keep type names short
TypeHintPolicy.AnonymousTagLocations =
false; // do not print lambda locations
TypeHintPolicy.AnonymousTagNameStyle = llvm::to_underlying(
PrintingPolicy::AnonymousTagMode::Plain); // do not print lambda
// location

// Not setting PrintCanonicalTypes for "auto" allows
// SuppressDefaultTemplateArgs (set by default) to have an effect.
Expand Down
22 changes: 15 additions & 7 deletions clang/include/clang/AST/PrettyPrinter.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,16 @@ class PrintingCallbacks {
struct PrintingPolicy {
enum class SuppressInlineNamespaceMode : uint8_t { None, Redundant, All };

/// Dictates how anonymous/unnamed entities are printed.
enum class AnonymousTagMode {
/// E.g., (anonymous enum)/(unnamed struct)/etc.
Plain,

/// When printing an anonymous tag name, also print the location of that
/// entity (e.g., "enum <anonymous at t.h:10:5>").
SourceLocation
};

/// Create a default printing policy for the specified language.
PrintingPolicy(const LangOptions &LO)
: Indentation(2), SuppressSpecifiers(false),
Expand All @@ -67,8 +77,9 @@ struct PrintingPolicy {
SuppressInlineNamespace(
llvm::to_underlying(SuppressInlineNamespaceMode::Redundant)),
SuppressInitializers(false), ConstantArraySizeAsWritten(false),
AnonymousTagLocations(true), SuppressStrongLifetime(false),
SuppressLifetimeQualifiers(false),
AnonymousTagNameStyle(
llvm::to_underlying(AnonymousTagMode::SourceLocation)),
SuppressStrongLifetime(false), SuppressLifetimeQualifiers(false),
SuppressTemplateArgsInCXXConstructors(false),
SuppressDefaultTemplateArgs(true), Bool(LO.Bool),
Nullptr(LO.CPlusPlus11 || LO.C23), NullptrTypeInNamespace(LO.CPlusPlus),
Expand Down Expand Up @@ -196,11 +207,8 @@ struct PrintingPolicy {
LLVM_PREFERRED_TYPE(bool)
unsigned ConstantArraySizeAsWritten : 1;

/// When printing an anonymous tag name, also print the location of that
/// entity (e.g., "enum <anonymous at t.h:10:5>"). Otherwise, just prints
/// "(anonymous)" for the name.
LLVM_PREFERRED_TYPE(bool)
unsigned AnonymousTagLocations : 1;
LLVM_PREFERRED_TYPE(AnonymousTagMode)
unsigned AnonymousTagNameStyle : 1;

/// When true, suppress printing of the __strong lifetime qualifier in ARC.
LLVM_PREFERRED_TYPE(bool)
Expand Down
6 changes: 4 additions & 2 deletions clang/lib/AST/Decl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1800,7 +1800,8 @@ void NamedDecl::printNestedNameSpecifier(raw_ostream &OS,
// suppress tag in name
Copy.SuppressTagKeyword = true;
Copy.SuppressTagKeywordInAnonNames = false;
Copy.AnonymousTagLocations = false;
Copy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
RD->printName(OS, Copy);
} else if (const auto *FD = dyn_cast<FunctionDecl>(DC)) {
const FunctionProtoType *FT = nullptr;
Expand Down Expand Up @@ -4994,7 +4995,8 @@ void TagDecl::printAnonymousTagDecl(llvm::raw_ostream &OS,
if (!SuppressTagKeywordInName)
OS << ' ' << getKindName();

if (Policy.AnonymousTagLocations) {
if (Policy.AnonymousTagNameStyle ==
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::SourceLocation)) {
PresumedLoc PLoc =
getASTContext().getSourceManager().getPresumedLoc(getLocation());
if (PLoc.isValid()) {
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/ASTMatchers/ASTMatchersInternal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,8 @@ static StringRef getNodeName(const RecordDecl &Node,
llvm::raw_svector_ostream OS(Scratch);

PrintingPolicy Copy(Node.getASTContext().getPrintingPolicy());
Copy.AnonymousTagLocations = false;
Copy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
Node.printName(OS, Copy);

return OS.str();
Expand Down
6 changes: 4 additions & 2 deletions clang/lib/ExtractAPI/ExtractAPIConsumer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,8 @@ ExtractAPIAction::CreateASTConsumer(CompilerInstance &CI, StringRef InFile) {

// Do not include location in anonymous decls.
PrintingPolicy Policy = CI.getASTContext().getPrintingPolicy();
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
CI.getASTContext().setPrintingPolicy(Policy);

if (!CI.getFrontendOpts().ExtractAPIIgnoresFileList.empty()) {
Expand Down Expand Up @@ -522,7 +523,8 @@ WrappingExtractAPIAction::CreateASTConsumer(CompilerInstance &CI,

// Do not include location in anonymous decls.
PrintingPolicy Policy = CI.getASTContext().getPrintingPolicy();
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
CI.getASTContext().setPrintingPolicy(Policy);

if (!CI.getFrontendOpts().ExtractAPIIgnoresFileList.empty()) {
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Index/USRGeneration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -659,7 +659,8 @@ static void printQualifier(llvm::raw_ostream &Out, const LangOptions &LangOpts,
PO.SuppressTagKeyword = true;
PO.SuppressUnwrittenScope = true;
PO.ConstantArraySizeAsWritten = false;
PO.AnonymousTagLocations = false;
PO.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
NNS.print(Out, PO);
}

Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Interpreter/InterpreterUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@ std::string GetFullTypeName(ASTContext &Ctx, QualType QT) {
QualType FQT = TypeName::getFullyQualifiedType(QT, Ctx);
PrintingPolicy Policy(Ctx.getPrintingPolicy());
Policy.SuppressScope = false;
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
return FQT.getAsString(Policy);
}
} // namespace clang
3 changes: 2 additions & 1 deletion clang/lib/Sema/SemaChecking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,8 @@ struct BuiltinDumpStructGenerator {
BuiltinDumpStructGenerator(Sema &S, CallExpr *TheCall)
: S(S), TheCall(TheCall), ErrorTracker(S.getDiagnostics()),
Policy(S.Context.getPrintingPolicy()) {
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
}

Expr *makeOpaqueValueExpr(Expr *Inner) {
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Sema/SemaCodeComplete.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2043,7 +2043,8 @@ static bool WantTypesInContext(SemaCodeCompletion::ParserCompletionContext CCC,
static PrintingPolicy getCompletionPrintingPolicy(const ASTContext &Context,
const Preprocessor &PP) {
PrintingPolicy Policy = Sema::getPrintingPolicy(Context, PP);
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
Policy.SuppressStrongLifetime = true;
Policy.SuppressUnwrittenScope = true;
Policy.CleanUglifiedParameters = true;
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Tooling/ASTDiff/ASTDiff.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,8 @@ struct PreorderVisitor : public RecursiveASTVisitor<PreorderVisitor> {

SyntaxTree::Impl::Impl(SyntaxTree *Parent, ASTContext &AST)
: Parent(Parent), AST(AST), TypePP(AST.getLangOpts()) {
TypePP.AnonymousTagLocations = false;
TypePP.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
}

SyntaxTree::Impl::Impl(SyntaxTree *Parent, Decl *N, ASTContext &AST)
Expand Down
8 changes: 6 additions & 2 deletions clang/tools/libclang/CIndex.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5659,7 +5659,9 @@ clang_PrintingPolicy_getProperty(CXPrintingPolicy Policy,
case CXPrintingPolicy_ConstantArraySizeAsWritten:
return P->ConstantArraySizeAsWritten;
case CXPrintingPolicy_AnonymousTagLocations:
return P->AnonymousTagLocations;
return P->AnonymousTagNameStyle ==
llvm::to_underlying(
PrintingPolicy::AnonymousTagMode::SourceLocation);
case CXPrintingPolicy_SuppressStrongLifetime:
return P->SuppressStrongLifetime;
case CXPrintingPolicy_SuppressLifetimeQualifiers:
Expand Down Expand Up @@ -5733,7 +5735,9 @@ void clang_PrintingPolicy_setProperty(CXPrintingPolicy Policy,
P->ConstantArraySizeAsWritten = Value;
return;
case CXPrintingPolicy_AnonymousTagLocations:
P->AnonymousTagLocations = Value;
P->AnonymousTagNameStyle = llvm::to_underlying(
Value ? PrintingPolicy::AnonymousTagMode::SourceLocation
: PrintingPolicy::AnonymousTagMode::Plain);
return;
case CXPrintingPolicy_SuppressStrongLifetime:
P->SuppressStrongLifetime = Value;
Expand Down
15 changes: 10 additions & 5 deletions clang/unittests/AST/TypePrinterTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -315,14 +315,16 @@ TEST(TypePrinter, NestedNameSpecifiers) {
Code, {}, varDecl(hasName("imem"), hasType(qualType().bind("id"))),
"struct (unnamed)", [](PrintingPolicy &Policy) {
Policy.FullyQualifiedName = true;
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
}));

ASSERT_TRUE(PrintedTypeMatches(
Code, {}, varDecl(hasName("imem"), hasType(qualType().bind("id"))),
"struct (unnamed)", [](PrintingPolicy &Policy) {
Policy.FullyQualifiedName = false;
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
}));

// Further levels of nesting print the entire scope.
Expand All @@ -331,14 +333,16 @@ TEST(TypePrinter, NestedNameSpecifiers) {
"union level1()::Inner::Inner(int)::(unnamed struct)::(unnamed)",
[](PrintingPolicy &Policy) {
Policy.FullyQualifiedName = true;
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
}));

ASSERT_TRUE(PrintedTypeMatches(
Code, {}, fieldDecl(hasName("u"), hasType(qualType().bind("id"))),
"union (unnamed)", [](PrintingPolicy &Policy) {
Policy.FullyQualifiedName = false;
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
}));
}

Expand All @@ -357,6 +361,7 @@ TEST(TypePrinter, NestedNameSpecifiersTypedef) {
Code, {}, fieldDecl(hasName("bar"), hasType(qualType().bind("id"))),
"struct foo::(anonymous struct)::(unnamed)", [](PrintingPolicy &Policy) {
Policy.FullyQualifiedName = true;
Policy.AnonymousTagLocations = false;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::Plain);
}));
}
3 changes: 2 additions & 1 deletion clang/unittests/Tooling/QualTypeNamesTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ struct TypeNameVisitor : TestVisitor {
if (ExpectedName != "") {
PrintingPolicy Policy(Context->getPrintingPolicy());
Policy.SuppressScope = false;
Policy.AnonymousTagLocations = true;
Policy.AnonymousTagNameStyle =
llvm::to_underlying(PrintingPolicy::AnonymousTagMode::SourceLocation);
Policy.PolishForDeclaration = true;
Policy.SuppressUnwrittenScope = true;
std::string ActualName = TypeName::getFullyQualifiedName(
Expand Down