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