From 2c4079c090aa05dc542169bbc0c3e4b31c6920e9 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 3 Oct 2018 08:21:54 +0000 Subject: [PATCH] [clang-query] Add comment token handling Summary: It is possible to pass a file of commands to clang-query using the command line option -f or --preload. Make it possible to write comments in such files. Reviewers: aaron.ballman Reviewed By: aaron.ballman Subscribers: mgorny, cfe-commits Differential Revision: https://reviews.llvm.org/D52752 llvm-svn: 343666 --- clang-tools-extra/clang-query/QueryParser.cpp | 8 ++++++++ clang-tools-extra/unittests/clang-query/QueryParserTest.cpp | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/clang-tools-extra/clang-query/QueryParser.cpp b/clang-tools-extra/clang-query/QueryParser.cpp index ddedd1e..55504f7 100644 --- a/clang-tools-extra/clang-query/QueryParser.cpp +++ b/clang-tools-extra/clang-query/QueryParser.cpp @@ -37,6 +37,11 @@ StringRef QueryParser::lexWord() { ++Begin; } + if (*Begin == '#') { + End = Begin; + return StringRef(); + } + const char *WordBegin = Begin; while (true) { @@ -127,6 +132,7 @@ namespace { enum ParsedQueryKind { PQK_Invalid, + PQK_Comment, PQK_NoOp, PQK_Help, PQK_Let, @@ -161,6 +167,7 @@ QueryRef QueryParser::doParse() { StringRef CommandStr; ParsedQueryKind QKind = LexOrCompleteWord(this, CommandStr) .Case("", PQK_NoOp) + .Case("#", PQK_Comment, /*IsCompletion=*/false) .Case("help", PQK_Help) .Case("l", PQK_Let, /*IsCompletion=*/false) .Case("let", PQK_Let) @@ -173,6 +180,7 @@ QueryRef QueryParser::doParse() { .Default(PQK_Invalid); switch (QKind) { + case PQK_Comment: case PQK_NoOp: return new NoOpQuery; diff --git a/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp b/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp index 729862b..62844c8 100644 --- a/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp +++ b/clang-tools-extra/unittests/clang-query/QueryParserTest.cpp @@ -146,6 +146,17 @@ TEST_F(QueryParserTest, LetUnlet) { cast(Q)->ErrStr); } +TEST_F(QueryParserTest, Comment) { + QueryRef Q = parse("# let foo decl()"); + ASSERT_TRUE(isa(Q)); + + Q = parse("let foo decl() # creates a decl() matcher called foo"); + ASSERT_TRUE(isa(Q)); + + Q = parse("set bind-root false # reduce noise"); + ASSERT_TRUE(isa>(Q)); +} + TEST_F(QueryParserTest, Complete) { std::vector Comps = QueryParser::complete("", 0, QS); -- 2.7.4