1bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith//===--- TestVisitor.h ------------------------------------------*- C++ -*-===// 2bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith// 3bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith// The LLVM Compiler Infrastructure 4bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith// 5bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith// This file is distributed under the University of Illinois Open Source 6bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith// License. See LICENSE.TXT for details. 7bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith// 8bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith//===----------------------------------------------------------------------===// 98268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett/// 108268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett/// \file 118268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett/// \brief Defines utility templates for RecursiveASTVisitor related tests. 128268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett/// 13bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith//===----------------------------------------------------------------------===// 14bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 15bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#ifndef LLVM_CLANG_TEST_VISITOR_H 16bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#define LLVM_CLANG_TEST_VISITOR_H 17bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 18bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#include "clang/AST/ASTConsumer.h" 191050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/AST/ASTContext.h" 20bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#include "clang/AST/RecursiveASTVisitor.h" 21bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#include "clang/Frontend/CompilerInstance.h" 221050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include "clang/Frontend/FrontendAction.h" 23bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#include "clang/Tooling/Tooling.h" 24bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#include "gtest/gtest.h" 251050e8b2252d89a0004a6fd25a58dab88b5ee625Chandler Carruth#include <vector> 26bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 27bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithnamespace clang { 28bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 298f35d23977bf7e70bab98545db0f687da997f20fMatt Beaumont-Gay/// \brief Base class for simple RecursiveASTVisitor based tests. 30bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith/// 31bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith/// This is a drop-in replacement for RecursiveASTVisitor itself, with the 32bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith/// additional capability of running it over a snippet of code. 33bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith/// 344b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han/// Visits template instantiations and implicit code by default. 35bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithtemplate <typename T> 36bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithclass TestVisitor : public RecursiveASTVisitor<T> { 37bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithpublic: 38bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith TestVisitor() { } 39bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 408f35d23977bf7e70bab98545db0f687da997f20fMatt Beaumont-Gay virtual ~TestVisitor() { } 418f35d23977bf7e70bab98545db0f687da997f20fMatt Beaumont-Gay 42ef8225444452a1486bd721f3285301fe84643b00Stephen Hines enum Language { 43ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Lang_C, 44ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Lang_CXX98, 45ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Lang_CXX11, 46ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Lang_OBJC, 47ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Lang_OBJCXX11, 48ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Lang_CXX = Lang_CXX98 49ef8225444452a1486bd721f3285301fe84643b00Stephen Hines }; 5082b4550fb25ad578b6c8143b87a003fae7106caeRichard Smith 51bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith /// \brief Runs the current AST visitor over the given code. 5282b4550fb25ad578b6c8143b87a003fae7106caeRichard Smith bool runOver(StringRef Code, Language L = Lang_CXX) { 53566698851d76416129cd20ceea02bdd697934c5cNico Weber std::vector<std::string> Args; 54566698851d76416129cd20ceea02bdd697934c5cNico Weber switch (L) { 55566698851d76416129cd20ceea02bdd697934c5cNico Weber case Lang_C: Args.push_back("-std=c99"); break; 5617aa33f34e15ed6317590cfbd3bd31bb634ba4f3James Dennett case Lang_CXX98: Args.push_back("-std=c++98"); break; 5717aa33f34e15ed6317590cfbd3bd31bb634ba4f3James Dennett case Lang_CXX11: Args.push_back("-std=c++11"); break; 58ef8225444452a1486bd721f3285301fe84643b00Stephen Hines case Lang_OBJC: Args.push_back("-ObjC"); break; 59ef8225444452a1486bd721f3285301fe84643b00Stephen Hines case Lang_OBJCXX11: 60ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Args.push_back("-ObjC++"); 61ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Args.push_back("-std=c++11"); 62ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Args.push_back("-fblocks"); 63ef8225444452a1486bd721f3285301fe84643b00Stephen Hines break; 64566698851d76416129cd20ceea02bdd697934c5cNico Weber } 65566698851d76416129cd20ceea02bdd697934c5cNico Weber return tooling::runToolOnCodeWithArgs(CreateTestAction(), Code, Args); 66bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 67bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 68bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith bool shouldVisitTemplateInstantiations() const { 69bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith return true; 70bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 71bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 724b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han bool shouldVisitImplicitCode() const { 734b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han return true; 744b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han } 754b6730d40e7c603bd0e223d3fa8b56a0c88a324aMichael Han 76bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithprotected: 77bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith virtual ASTFrontendAction* CreateTestAction() { 78bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith return new TestAction(this); 79bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 80bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 81bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith class FindConsumer : public ASTConsumer { 82bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith public: 83bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith FindConsumer(TestVisitor *Visitor) : Visitor(Visitor) {} 84bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 85bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith virtual void HandleTranslationUnit(clang::ASTContext &Context) { 86e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek Visitor->Context = &Context; 87bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Visitor->TraverseDecl(Context.getTranslationUnitDecl()); 88bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 89bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 90bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith private: 91bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith TestVisitor *Visitor; 92bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith }; 93bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 94bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith class TestAction : public ASTFrontendAction { 95bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith public: 96bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith TestAction(TestVisitor *Visitor) : Visitor(Visitor) {} 97bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 98bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith virtual clang::ASTConsumer* CreateASTConsumer( 99e6df0ce08fcdf9f906556d98cca96d38ab440bbaManuel Klimek CompilerInstance&, llvm::StringRef dummy) { 100bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith /// TestConsumer will be deleted by the framework calling us. 101bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith return new FindConsumer(Visitor); 102bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 103bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 104bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith protected: 105bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith TestVisitor *Visitor; 106bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith }; 107bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 108bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith ASTContext *Context; 109bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith}; 110bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 1118268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett/// \brief A RecursiveASTVisitor to check that certain matches are (or are 1128268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett/// not) observed during visitation. 113bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith/// 1148268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett/// This is a RecursiveASTVisitor for testing the RecursiveASTVisitor itself, 1158268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett/// and allows simple creation of test visitors running matches on only a small 116bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith/// subset of the Visit* methods. 117bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithtemplate <typename T, template <typename> class Visitor = TestVisitor> 118bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithclass ExpectedLocationVisitor : public Visitor<T> { 119bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithpublic: 1208268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett /// \brief Expect 'Match' *not* to occur at the given 'Line' and 'Column'. 1218268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett /// 1228268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett /// Any number of matches can be disallowed. 1238268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett void DisallowMatch(Twine Match, unsigned Line, unsigned Column) { 1248268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett DisallowedMatches.push_back(MatchCandidate(Match, Line, Column)); 125bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 126bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 127bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith /// \brief Expect 'Match' to occur at the given 'Line' and 'Column'. 1288268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett /// 1298268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett /// Any number of expected matches can be set by calling this repeatedly. 1308268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett /// Each is expected to be matched exactly once. 131bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith void ExpectMatch(Twine Match, unsigned Line, unsigned Column) { 1328268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett ExpectedMatches.push_back(ExpectedMatch(Match, Line, Column)); 1338268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 1348268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 1358268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett /// \brief Checks that all expected matches have been found. 1368268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett virtual ~ExpectedLocationVisitor() { 1378268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett for (typename std::vector<ExpectedMatch>::const_iterator 1388268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett It = ExpectedMatches.begin(), End = ExpectedMatches.end(); 1398268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett It != End; ++It) { 1408268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett It->ExpectFound(); 1418268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 142bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 143bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 144bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithprotected: 1458268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett /// \brief Checks an actual match against expected and disallowed matches. 146bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith /// 147bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith /// Implementations are required to call this with appropriate values 148bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith /// for 'Name' during visitation. 149bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith void Match(StringRef Name, SourceLocation Location) { 1508268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett const FullSourceLoc FullLocation = this->Context->getFullLoc(Location); 1518268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 1528268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett for (typename std::vector<MatchCandidate>::const_iterator 1538268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett It = DisallowedMatches.begin(), End = DisallowedMatches.end(); 1548268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett It != End; ++It) { 1558268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett EXPECT_FALSE(It->Matches(Name, FullLocation)) 1568268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett << "Matched disallowed " << *It; 1578268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 1588268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 1598268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett for (typename std::vector<ExpectedMatch>::iterator 1608268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett It = ExpectedMatches.begin(), End = ExpectedMatches.end(); 1618268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett It != End; ++It) { 1628268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett It->UpdateFor(Name, FullLocation, this->Context->getSourceManager()); 163bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 164bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 165bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 1668268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett private: 1678268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett struct MatchCandidate { 1688268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett std::string ExpectedName; 1698268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett unsigned LineNumber; 1708268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett unsigned ColumnNumber; 1718268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 1728268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett MatchCandidate(Twine Name, unsigned LineNumber, unsigned ColumnNumber) 1738268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett : ExpectedName(Name.str()), LineNumber(LineNumber), 1748268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett ColumnNumber(ColumnNumber) { 1758268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 1768268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 1778268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett bool Matches(StringRef Name, FullSourceLoc const &Location) const { 1788268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett return MatchesName(Name) && MatchesLocation(Location); 1798268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 1808268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 1818268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett bool PartiallyMatches(StringRef Name, FullSourceLoc const &Location) const { 1828268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett return MatchesName(Name) || MatchesLocation(Location); 1838268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 1848268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 1858268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett bool MatchesName(StringRef Name) const { 1868268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett return Name == ExpectedName; 1878268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 1888268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 1898268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett bool MatchesLocation(FullSourceLoc const &Location) const { 1908268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett return Location.isValid() && 1918268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett Location.getSpellingLineNumber() == LineNumber && 1928268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett Location.getSpellingColumnNumber() == ColumnNumber; 1938268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 1948268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 1958268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett friend std::ostream &operator<<(std::ostream &Stream, 1968268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett MatchCandidate const &Match) { 1978268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett return Stream << Match.ExpectedName 1988268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett << " at " << Match.LineNumber << ":" << Match.ColumnNumber; 1998268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 2008268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett }; 2018268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 2028268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett struct ExpectedMatch { 2038268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett ExpectedMatch(Twine Name, unsigned LineNumber, unsigned ColumnNumber) 2048268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett : Candidate(Name, LineNumber, ColumnNumber), Found(false) {} 2058268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 2068268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett void UpdateFor(StringRef Name, FullSourceLoc Location, SourceManager &SM) { 2078268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett if (Candidate.Matches(Name, Location)) { 2088268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett EXPECT_TRUE(!Found); 2098268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett Found = true; 2108268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } else if (!Found && Candidate.PartiallyMatches(Name, Location)) { 2118268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett llvm::raw_string_ostream Stream(PartialMatches); 2128268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett Stream << ", partial match: \"" << Name << "\" at "; 2138268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett Location.print(Stream, SM); 2148268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 2158268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 2168268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 2178268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett void ExpectFound() const { 2188268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett EXPECT_TRUE(Found) 2198268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett << "Expected \"" << Candidate.ExpectedName 2208268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett << "\" at " << Candidate.LineNumber 2218268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett << ":" << Candidate.ColumnNumber << PartialMatches; 2228268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett } 2238268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 2248268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett MatchCandidate Candidate; 2258268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett std::string PartialMatches; 2268268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett bool Found; 2278268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett }; 2288268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett 2298268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett std::vector<MatchCandidate> DisallowedMatches; 2308268fe7c4bdfa341975a687a8a5e236c2c5b88a4James Dennett std::vector<ExpectedMatch> ExpectedMatches; 231bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith}; 232bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} 233bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 234bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#endif /* LLVM_CLANG_TEST_VISITOR_H */ 235