[clang] Respect PrintingPolicy::FullyQualifiedName when printing a template-id

Fixes PR50774

Differential Revision: https://reviews.llvm.org/D104619
This commit is contained in:
Nathan Ridge 2021-06-21 03:19:19 -04:00
parent 9b965b37c7
commit 08b289867b
3 changed files with 67 additions and 1 deletions

View File

@ -1459,7 +1459,7 @@ void TypePrinter::printTemplateId(const TemplateSpecializationType *T,
void TypePrinter::printTemplateSpecializationBefore(
const TemplateSpecializationType *T,
raw_ostream &OS) {
printTemplateId(T, OS, false);
printTemplateId(T, OS, Policy.FullyQualifiedName);
}
void TypePrinter::printTemplateSpecializationAfter(

View File

@ -29,6 +29,7 @@ add_clang_unittest(ASTTests
SourceLocationTest.cpp
StmtPrinterTest.cpp
StructuralEquivalenceTest.cpp
TypePrinterTest.cpp
)
clang_target_link_libraries(ASTTests

View File

@ -0,0 +1,65 @@
//===- unittests/AST/TypePrinterTest.cpp --- Type printer tests -----------===//
//
// 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
//
//===----------------------------------------------------------------------===//
//
// This file contains tests for QualType::print() and related methods.
//
//===----------------------------------------------------------------------===//
#include "ASTPrint.h"
#include "clang/AST/ASTContext.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Tooling/Tooling.h"
#include "llvm/ADT/SmallString.h"
#include "gtest/gtest.h"
using namespace clang;
using namespace ast_matchers;
using namespace tooling;
namespace {
static void PrintType(raw_ostream &Out, const ASTContext *Context,
const QualType *T,
PrintingPolicyAdjuster PolicyAdjuster) {
assert(T && !T->isNull() && "Expected non-null Type");
PrintingPolicy Policy = Context->getPrintingPolicy();
if (PolicyAdjuster)
PolicyAdjuster(Policy);
T->print(Out, Policy);
}
::testing::AssertionResult
PrintedTypeMatches(StringRef Code, const std::vector<std::string> &Args,
const DeclarationMatcher &NodeMatch,
StringRef ExpectedPrinted,
PrintingPolicyAdjuster PolicyAdjuster) {
return PrintedNodeMatches<QualType>(Code, Args, NodeMatch, ExpectedPrinted,
"", PrintType, PolicyAdjuster);
}
} // unnamed namespace
TEST(TypePrinter, TemplateId) {
std::string Code = R"cpp(
namespace N {
template <typename> struct Type {};
template <typename T>
void Foo(const Type<T> &Param);
}
)cpp";
auto Matcher = parmVarDecl(hasType(qualType().bind("id")));
ASSERT_TRUE(PrintedTypeMatches(
Code, {}, Matcher, "const Type<T> &",
[](PrintingPolicy &Policy) { Policy.FullyQualifiedName = false; }));
ASSERT_TRUE(PrintedTypeMatches(
Code, {}, Matcher, "const N::Type<T> &",
[](PrintingPolicy &Policy) { Policy.FullyQualifiedName = true; }));
}