From e94666444591bf82a39aa486471c63bf82b1793b Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Fri, 30 May 2014 22:16:51 +0000 Subject: Take PrintingPolicy::SuppressUnwrittenScope into account when printing the qualified name of a NamedDecl. Patch by Volodymyr Sapsai! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@209924 91177308-0d34-0410-b5e6-96231b3b80d8 --- unittests/AST/CMakeLists.txt | 1 + unittests/AST/NamedDeclPrinterTest.cpp | 133 +++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 unittests/AST/NamedDeclPrinterTest.cpp (limited to 'unittests/AST') diff --git a/unittests/AST/CMakeLists.txt b/unittests/AST/CMakeLists.txt index 9a55626ae4..2fa1078a5e 100644 --- a/unittests/AST/CMakeLists.txt +++ b/unittests/AST/CMakeLists.txt @@ -12,6 +12,7 @@ add_clang_unittest(ASTTests DeclTest.cpp EvaluateAsRValueTest.cpp ExternalASTSourceTest.cpp + NamedDeclPrinterTest.cpp SourceLocationTest.cpp StmtPrinterTest.cpp ) diff --git a/unittests/AST/NamedDeclPrinterTest.cpp b/unittests/AST/NamedDeclPrinterTest.cpp new file mode 100644 index 0000000000..4823b44862 --- /dev/null +++ b/unittests/AST/NamedDeclPrinterTest.cpp @@ -0,0 +1,133 @@ +//===- unittests/AST/NamedDeclPrinterTest.cpp --- NamedDecl printer tests -===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains tests for NamedDecl::printQualifiedName(). +// +// These tests have a coding convention: +// * declaration to be printed is named 'A' unless it should have some special +// name (e.g., 'operator+'); +// * additional helper declarations are 'Z', 'Y', 'X' and so on. +// +//===----------------------------------------------------------------------===// + +#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 { + +class PrintMatch : public MatchFinder::MatchCallback { + SmallString<1024> Printed; + unsigned NumFoundDecls; + bool SuppressUnwrittenScope; + +public: + explicit PrintMatch(bool suppressUnwrittenScope) + : NumFoundDecls(0), SuppressUnwrittenScope(suppressUnwrittenScope) {} + + virtual void run(const MatchFinder::MatchResult &Result) { + const NamedDecl *ND = Result.Nodes.getNodeAs("id"); + if (!ND) + return; + NumFoundDecls++; + if (NumFoundDecls > 1) + return; + + llvm::raw_svector_ostream Out(Printed); + PrintingPolicy Policy = Result.Context->getPrintingPolicy(); + Policy.SuppressUnwrittenScope = SuppressUnwrittenScope; + ND->printQualifiedName(Out, Policy); + } + + StringRef getPrinted() const { + return Printed; + } + + unsigned getNumFoundDecls() const { + return NumFoundDecls; + } +}; + +::testing::AssertionResult +PrintedNamedDeclMatches(StringRef Code, const std::vector &Args, + bool SuppressUnwrittenScope, + const DeclarationMatcher &NodeMatch, + StringRef ExpectedPrinted, StringRef FileName) { + PrintMatch Printer(SuppressUnwrittenScope); + MatchFinder Finder; + Finder.addMatcher(NodeMatch, &Printer); + std::unique_ptr Factory( + newFrontendActionFactory(&Finder)); + + if (!runToolOnCodeWithArgs(Factory->create(), Code, Args, FileName)) + return testing::AssertionFailure() + << "Parsing error in \"" << Code.str() << "\""; + + if (Printer.getNumFoundDecls() == 0) + return testing::AssertionFailure() + << "Matcher didn't find any named declarations"; + + if (Printer.getNumFoundDecls() > 1) + return testing::AssertionFailure() + << "Matcher should match only one named declaration " + "(found " << Printer.getNumFoundDecls() << ")"; + + if (Printer.getPrinted() != ExpectedPrinted) + return ::testing::AssertionFailure() + << "Expected \"" << ExpectedPrinted.str() << "\", " + "got \"" << Printer.getPrinted().str() << "\""; + + return ::testing::AssertionSuccess(); +} + +::testing::AssertionResult +PrintedNamedDeclCXX98Matches(StringRef Code, StringRef DeclName, + StringRef ExpectedPrinted) { + std::vector Args(1, "-std=c++98"); + return PrintedNamedDeclMatches(Code, + Args, + /*SuppressUnwrittenScope*/ false, + namedDecl(hasName(DeclName)).bind("id"), + ExpectedPrinted, + "input.cc"); +} + +::testing::AssertionResult +PrintedWrittenNamedDeclCXX11Matches(StringRef Code, StringRef DeclName, + StringRef ExpectedPrinted) { + std::vector Args(1, "-std=c++11"); + return PrintedNamedDeclMatches(Code, + Args, + /*SuppressUnwrittenScope*/ true, + namedDecl(hasName(DeclName)).bind("id"), + ExpectedPrinted, + "input.cc"); +} + +} // unnamed namespace + +TEST(NamedDeclPrinter, TestNamespace1) { + ASSERT_TRUE(PrintedNamedDeclCXX98Matches( + "namespace { int A; }", + "A", + "(anonymous namespace)::A")); +} + +TEST(NamedDeclPrinter, TestNamespace2) { + ASSERT_TRUE(PrintedWrittenNamedDeclCXX11Matches( + "inline namespace Z { namespace { int A; } }", + "A", + "A")); +} -- cgit v1.2.3