1bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith//===- unittest/Tooling/CommentHandlerTest.cpp -----------------------===// 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//===----------------------------------------------------------------------===// 9bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 10bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#include "TestVisitor.h" 11bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith#include "clang/Lex/Preprocessor.h" 12bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 13bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithnamespace clang { 14bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 15bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithstruct Comment { 16bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Comment(const std::string &Message, unsigned Line, unsigned Col) 17bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith : Message(Message), Line(Line), Col(Col) { } 18bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 19bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith std::string Message; 20bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith unsigned Line, Col; 21bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith}; 22bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 23bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithclass CommentVerifier; 24bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithtypedef std::vector<Comment> CommentList; 25bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 26bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithclass CommentHandlerVisitor : public TestVisitor<CommentHandlerVisitor>, 27bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith public CommentHandler { 28bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith typedef TestVisitor<CommentHandlerVisitor> base; 29bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 30bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithpublic: 31ef8225444452a1486bd721f3285301fe84643b00Stephen Hines CommentHandlerVisitor() : base(), PP(nullptr), Verified(false) {} 32bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 33bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith ~CommentHandlerVisitor() { 34bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Verified) << "CommentVerifier not accessed"; 35bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 36bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 37bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith virtual bool HandleComment(Preprocessor &PP, SourceRange Loc) { 38bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith assert(&PP == this->PP && "Preprocessor changed!"); 39bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 40bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith SourceLocation Start = Loc.getBegin(); 41bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith SourceManager &SM = PP.getSourceManager(); 42bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith std::string C(SM.getCharacterData(Start), 43bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith SM.getCharacterData(Loc.getEnd())); 44bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 45bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith bool Invalid; 46bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith unsigned CLine = SM.getSpellingLineNumber(Start, &Invalid); 47bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(!Invalid) << "Invalid line number on comment " << C; 48bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 49bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith unsigned CCol = SM.getSpellingColumnNumber(Start, &Invalid); 50bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(!Invalid) << "Invalid column number on comment " << C; 51bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 52bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Comments.push_back(Comment(C, CLine, CCol)); 53bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith return false; 54bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 55bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 56bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentVerifier GetVerifier(); 57bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 58bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithprotected: 59bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith virtual ASTFrontendAction* CreateTestAction() { 60bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith return new CommentHandlerAction(this); 61bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 62bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 63bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithprivate: 64bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Preprocessor *PP; 65bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentList Comments; 66bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith bool Verified; 67bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 68bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith class CommentHandlerAction : public base::TestAction { 69bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith public: 70bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerAction(CommentHandlerVisitor *Visitor) 71bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith : TestAction(Visitor) { } 72bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 73bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith virtual bool BeginSourceFileAction(CompilerInstance &CI, 74bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith StringRef FileName) { 75bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerVisitor *V = 76bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith static_cast<CommentHandlerVisitor*>(this->Visitor); 77bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith V->PP = &CI.getPreprocessor(); 78bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith V->PP->addCommentHandler(V); 79bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith return true; 80bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 81bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 82bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith virtual void EndSourceFileAction() { 83bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerVisitor *V = 84bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith static_cast<CommentHandlerVisitor*>(this->Visitor); 85bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith V->PP->removeCommentHandler(V); 86bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 87bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith }; 88bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith}; 89bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 90bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithclass CommentVerifier { 91bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentList::const_iterator Current; 92bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentList::const_iterator End; 93bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Preprocessor *PP; 94bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 95bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smithpublic: 96bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentVerifier(const CommentList &Comments, Preprocessor *PP) 97bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith : Current(Comments.begin()), End(Comments.end()), PP(PP) 98bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith { } 99bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 100bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith ~CommentVerifier() { 101bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith if (Current != End) { 102bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Current == End) << "Unexpected comment \"" 103bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith << Current->Message << "\" at line " << Current->Line << ", column " 104bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith << Current->Col; 105bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 106bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 107bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 108bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith void Match(const char *Message, unsigned Line, unsigned Col) { 109bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Current != End) << "Comment " << Message << " not found"; 110bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith if (Current == End) return; 111bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 112bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith const Comment &C = *Current; 113bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(C.Message == Message && C.Line == Line && C.Col == Col) 114bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith << "Expected comment \"" << Message 115bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith << "\" at line " << Line << ", column " << Col 116bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith << "\nActual comment \"" << C.Message 117bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith << "\" at line " << C.Line << ", column " << C.Col; 118bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 119bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith ++Current; 120bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith } 121bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith}; 122bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 123bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard SmithCommentVerifier CommentHandlerVisitor::GetVerifier() { 124bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verified = true; 125bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith return CommentVerifier(Comments, PP); 126bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} 127bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 128bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 129bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard SmithTEST(CommentHandlerTest, BasicTest1) { 130bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerVisitor Visitor; 131bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Visitor.runOver("class X {}; int main() { return 0; }")); 132bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentVerifier Verifier = Visitor.GetVerifier(); 133bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} 134bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 135bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard SmithTEST(CommentHandlerTest, BasicTest2) { 136bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerVisitor Visitor; 137bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Visitor.runOver( 138bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "class X {}; int main() { /* comment */ return 0; }")); 139bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentVerifier Verifier = Visitor.GetVerifier(); 140bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("/* comment */", 1, 26); 141bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} 142bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 143bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard SmithTEST(CommentHandlerTest, BasicTest3) { 144bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerVisitor Visitor; 145bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Visitor.runOver( 146bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "class X {}; // comment 1\n" 147bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "int main() {\n" 148bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith " // comment 2\n" 149bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith " return 0;\n" 150bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "}")); 151bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentVerifier Verifier = Visitor.GetVerifier(); 152bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// comment 1", 1, 13); 153bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// comment 2", 3, 3); 154bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} 155bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 156bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard SmithTEST(CommentHandlerTest, IfBlock1) { 157bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerVisitor Visitor; 158bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Visitor.runOver( 159bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#if 0\n" 160bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "// ignored comment\n" 161bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#endif\n" 162bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "// visible comment\n")); 163bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentVerifier Verifier = Visitor.GetVerifier(); 164bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible comment", 4, 1); 165bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} 166bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 167bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard SmithTEST(CommentHandlerTest, IfBlock2) { 168bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerVisitor Visitor; 169bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Visitor.runOver( 170bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#define TEST // visible_1\n" 171bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#ifndef TEST // visible_2\n" 172bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith " // ignored_3\n" 173bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "# ifdef UNDEFINED // ignored_4\n" 174bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "# endif // ignored_5\n" 175bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#elif defined(TEST) // visible_6\n" 176bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "# if 1 // visible_7\n" 177bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith " // visible_8\n" 178bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "# else // visible_9\n" 179bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith " // ignored_10\n" 180bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "# ifndef TEST // ignored_11\n" 181bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "# endif // ignored_12\n" 182bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "# endif // visible_13\n" 183bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#endif // visible_14\n")); 184bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 185bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentVerifier Verifier = Visitor.GetVerifier(); 186bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_1", 1, 21); 187bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_2", 2, 21); 188bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_6", 6, 21); 189bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_7", 7, 21); 190bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_8", 8, 21); 191bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_9", 9, 21); 192bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_13", 13, 21); 193bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_14", 14, 21); 194bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} 195bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 196bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard SmithTEST(CommentHandlerTest, IfBlock3) { 197bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith const char *Source = 198bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "/* commented out ...\n" 199bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#if 0\n" 200bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "// enclosed\n" 201bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#endif */"; 202bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 203bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerVisitor Visitor; 204bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Visitor.runOver(Source)); 205bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentVerifier Verifier = Visitor.GetVerifier(); 206bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match(Source, 1, 1); 207bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} 208bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 209bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard SmithTEST(CommentHandlerTest, PPDirectives) { 210bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentHandlerVisitor Visitor; 211bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith EXPECT_TRUE(Visitor.runOver( 212bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#warning Y // ignored_1\n" // #warning takes whole line as message 213bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#undef MACRO // visible_2\n" 214bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith "#line 1 // visible_3\n")); 215bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 216bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith CommentVerifier Verifier = Visitor.GetVerifier(); 217bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_2", 2, 14); 218bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith Verifier.Match("// visible_3", 3, 14); 219bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} 220bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith 221bc9e5582467e70ec38b9fc5d3605152e86e2a5f8Richard Smith} // end namespace clang 222