[PATCH] D33623: Make the parser close parens for you on EOF

2017-05-27 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles created this revision.
Herald added a subscriber: klimek.

Makes the parser for clang-query auto close all open parens on EOF


https://reviews.llvm.org/D33623

Files:
  lib/ASTMatchers/Dynamic/Parser.cpp
  unittests/ASTMatchers/Dynamic/ParserTest.cpp


Index: unittests/ASTMatchers/Dynamic/ParserTest.cpp
===
--- unittests/ASTMatchers/Dynamic/ParserTest.cpp
+++ unittests/ASTMatchers/Dynamic/ParserTest.cpp
@@ -239,7 +239,6 @@
   ParseWithError("stmt(someValue)"));
   EXPECT_EQ(
   "1:1: Matcher not found: Foo\n"
-  "1:4: Error parsing matcher. Found end-of-code while looking for ')'.",
   ParseWithError("Foo("));
   EXPECT_EQ("1:1: End of code found while looking for token.",
 ParseWithError(""));
Index: lib/ASTMatchers/Dynamic/Parser.cpp
===
--- lib/ASTMatchers/Dynamic/Parser.cpp
+++ lib/ASTMatchers/Dynamic/Parser.cpp
@@ -377,8 +377,8 @@
   }
 
   if (EndToken.Kind == TokenInfo::TK_Eof) {
-Error->addError(OpenToken.Range, Error->ET_ParserNoCloseParen);
-return false;
+// Just assume they want to finish the expression immediately and did not
+// have enough trailing right parens.
   }
 
   std::string BindID;


Index: unittests/ASTMatchers/Dynamic/ParserTest.cpp
===
--- unittests/ASTMatchers/Dynamic/ParserTest.cpp
+++ unittests/ASTMatchers/Dynamic/ParserTest.cpp
@@ -239,7 +239,6 @@
   ParseWithError("stmt(someValue)"));
   EXPECT_EQ(
   "1:1: Matcher not found: Foo\n"
-  "1:4: Error parsing matcher. Found end-of-code while looking for ')'.",
   ParseWithError("Foo("));
   EXPECT_EQ("1:1: End of code found while looking for token.",
 ParseWithError(""));
Index: lib/ASTMatchers/Dynamic/Parser.cpp
===
--- lib/ASTMatchers/Dynamic/Parser.cpp
+++ lib/ASTMatchers/Dynamic/Parser.cpp
@@ -377,8 +377,8 @@
   }
 
   if (EndToken.Kind == TokenInfo::TK_Eof) {
-Error->addError(OpenToken.Range, Error->ET_ParserNoCloseParen);
-return false;
+// Just assume they want to finish the expression immediately and did not
+// have enough trailing right parens.
   }
 
   std::string BindID;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33679: Make clang-query close parens for you

2017-05-30 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles created this revision.

Make clang-query close parens for you


https://reviews.llvm.org/D33679

Files:
  clang-query/QueryParser.cpp


Index: clang-query/QueryParser.cpp
===
--- clang-query/QueryParser.cpp
+++ clang-query/QueryParser.cpp
@@ -15,6 +15,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
 #include 
+#include 
 
 using namespace llvm;
 using namespace clang::ast_matchers::dynamic;
@@ -210,13 +211,27 @@
 if (CompletionPos)
   return completeMatcherExpression();
 
-Diagnostics Diag;
-Optional Matcher = Parser::parseMatcherExpression(
-StringRef(Begin, End - Begin), nullptr, &QS.NamedValues, &Diag);
-if (!Matcher) {
-  return makeInvalidQueryFromDiagnostics(Diag);
+Diagnostics FirstDiag;
+std::string Query = StringRef(Begin, End - Begin).str();
+while (true) {
+  Diagnostics Diag;
+  Diagnostics* CurrentDiag = FirstDiag.errors().empty() ? &FirstDiag : 
&Diag;
+  Optional Matcher = Parser::parseMatcherExpression(
+  Query, nullptr, &QS.NamedValues, CurrentDiag);
+  if (Matcher) {
+return new MatchQuery(*Matcher);
+  }
+  for (const auto& Error : CurrentDiag->errors()) {
+for (const auto &Message : Error.Messages) {
+  if (Message.Type == Diagnostics::ET_ParserNoCloseParen) {
+Query += ")";
+  } else {
+// Report the first error before we mucked with the query.
+return makeInvalidQueryFromDiagnostics(FirstDiag);
+  }
+}
+  }
 }
-return new MatchQuery(*Matcher);
   }
 
   case PQK_Set: {


Index: clang-query/QueryParser.cpp
===
--- clang-query/QueryParser.cpp
+++ clang-query/QueryParser.cpp
@@ -15,6 +15,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
 #include 
+#include 
 
 using namespace llvm;
 using namespace clang::ast_matchers::dynamic;
@@ -210,13 +211,27 @@
 if (CompletionPos)
   return completeMatcherExpression();
 
-Diagnostics Diag;
-Optional Matcher = Parser::parseMatcherExpression(
-StringRef(Begin, End - Begin), nullptr, &QS.NamedValues, &Diag);
-if (!Matcher) {
-  return makeInvalidQueryFromDiagnostics(Diag);
+Diagnostics FirstDiag;
+std::string Query = StringRef(Begin, End - Begin).str();
+while (true) {
+  Diagnostics Diag;
+  Diagnostics* CurrentDiag = FirstDiag.errors().empty() ? &FirstDiag : &Diag;
+  Optional Matcher = Parser::parseMatcherExpression(
+  Query, nullptr, &QS.NamedValues, CurrentDiag);
+  if (Matcher) {
+return new MatchQuery(*Matcher);
+  }
+  for (const auto& Error : CurrentDiag->errors()) {
+for (const auto &Message : Error.Messages) {
+  if (Message.Type == Diagnostics::ET_ParserNoCloseParen) {
+Query += ")";
+  } else {
+// Report the first error before we mucked with the query.
+return makeInvalidQueryFromDiagnostics(FirstDiag);
+  }
+}
+  }
 }
-return new MatchQuery(*Matcher);
   }
 
   case PQK_Set: {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33623: Make the parser close parens for you on EOF

2017-05-30 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles abandoned this revision.
fowles added a comment.

Switching to https://reviews.llvm.org/D33679 for sbenza's suggestion


https://reviews.llvm.org/D33623



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33679: Make clang-query close parens for you

2017-05-30 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles updated this revision to Diff 100715.
fowles added a comment.

Add a test


https://reviews.llvm.org/D33679

Files:
  clang-query/QueryParser.cpp


Index: clang-query/QueryParser.cpp
===
--- clang-query/QueryParser.cpp
+++ clang-query/QueryParser.cpp
@@ -15,6 +15,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
 #include 
+#include 
 
 using namespace llvm;
 using namespace clang::ast_matchers::dynamic;
@@ -210,13 +211,27 @@
 if (CompletionPos)
   return completeMatcherExpression();
 
-Diagnostics Diag;
-Optional Matcher = Parser::parseMatcherExpression(
-StringRef(Begin, End - Begin), nullptr, &QS.NamedValues, &Diag);
-if (!Matcher) {
-  return makeInvalidQueryFromDiagnostics(Diag);
+Diagnostics FirstDiag;
+std::string Query = StringRef(Begin, End - Begin).str();
+while (true) {
+  Diagnostics Diag;
+  Diagnostics* CurrentDiag = FirstDiag.errors().empty() ? &FirstDiag : 
&Diag;
+  Optional Matcher = Parser::parseMatcherExpression(
+  Query, nullptr, &QS.NamedValues, CurrentDiag);
+  if (Matcher) {
+return new MatchQuery(*Matcher);
+  }
+  for (const auto& Error : CurrentDiag->errors()) {
+for (const auto &Message : Error.Messages) {
+  if (Message.Type == Diagnostics::ET_ParserNoCloseParen) {
+Query += ")";
+  } else {
+// Report the first error before we mucked with the query.
+return makeInvalidQueryFromDiagnostics(FirstDiag);
+  }
+}
+  }
 }
-return new MatchQuery(*Matcher);
   }
 
   case PQK_Set: {


Index: clang-query/QueryParser.cpp
===
--- clang-query/QueryParser.cpp
+++ clang-query/QueryParser.cpp
@@ -15,6 +15,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
 #include 
+#include 
 
 using namespace llvm;
 using namespace clang::ast_matchers::dynamic;
@@ -210,13 +211,27 @@
 if (CompletionPos)
   return completeMatcherExpression();
 
-Diagnostics Diag;
-Optional Matcher = Parser::parseMatcherExpression(
-StringRef(Begin, End - Begin), nullptr, &QS.NamedValues, &Diag);
-if (!Matcher) {
-  return makeInvalidQueryFromDiagnostics(Diag);
+Diagnostics FirstDiag;
+std::string Query = StringRef(Begin, End - Begin).str();
+while (true) {
+  Diagnostics Diag;
+  Diagnostics* CurrentDiag = FirstDiag.errors().empty() ? &FirstDiag : &Diag;
+  Optional Matcher = Parser::parseMatcherExpression(
+  Query, nullptr, &QS.NamedValues, CurrentDiag);
+  if (Matcher) {
+return new MatchQuery(*Matcher);
+  }
+  for (const auto& Error : CurrentDiag->errors()) {
+for (const auto &Message : Error.Messages) {
+  if (Message.Type == Diagnostics::ET_ParserNoCloseParen) {
+Query += ")";
+  } else {
+// Report the first error before we mucked with the query.
+return makeInvalidQueryFromDiagnostics(FirstDiag);
+  }
+}
+  }
 }
-return new MatchQuery(*Matcher);
   }
 
   case PQK_Set: {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D33679: Make clang-query close parens for you

2017-05-30 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles updated this revision to Diff 100716.
fowles added a comment.

Add tests for real


https://reviews.llvm.org/D33679

Files:
  clang-query/QueryParser.cpp
  test/clang-query/missing-parens.c


Index: test/clang-query/missing-parens.c
===
--- /dev/null
+++ test/clang-query/missing-parens.c
@@ -0,0 +1,4 @@
+// RUN: clang-query -c "match functionDecl(" %s -- | FileCheck %s
+
+// CHECK: function-decl.c:4:1: note: "root" binds here
+void foo(void) {}
Index: clang-query/QueryParser.cpp
===
--- clang-query/QueryParser.cpp
+++ clang-query/QueryParser.cpp
@@ -15,6 +15,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
 #include 
+#include 
 
 using namespace llvm;
 using namespace clang::ast_matchers::dynamic;
@@ -210,13 +211,27 @@
 if (CompletionPos)
   return completeMatcherExpression();
 
-Diagnostics Diag;
-Optional Matcher = Parser::parseMatcherExpression(
-StringRef(Begin, End - Begin), nullptr, &QS.NamedValues, &Diag);
-if (!Matcher) {
-  return makeInvalidQueryFromDiagnostics(Diag);
+Diagnostics FirstDiag;
+std::string Query = StringRef(Begin, End - Begin).str();
+while (true) {
+  Diagnostics Diag;
+  Diagnostics* CurrentDiag = FirstDiag.errors().empty() ? &FirstDiag : 
&Diag;
+  Optional Matcher = Parser::parseMatcherExpression(
+  Query, nullptr, &QS.NamedValues, CurrentDiag);
+  if (Matcher) {
+return new MatchQuery(*Matcher);
+  }
+  for (const auto& Error : CurrentDiag->errors()) {
+for (const auto &Message : Error.Messages) {
+  if (Message.Type == Diagnostics::ET_ParserNoCloseParen) {
+Query += ")";
+  } else {
+// Report the first error before we mucked with the query.
+return makeInvalidQueryFromDiagnostics(FirstDiag);
+  }
+}
+  }
 }
-return new MatchQuery(*Matcher);
   }
 
   case PQK_Set: {


Index: test/clang-query/missing-parens.c
===
--- /dev/null
+++ test/clang-query/missing-parens.c
@@ -0,0 +1,4 @@
+// RUN: clang-query -c "match functionDecl(" %s -- | FileCheck %s
+
+// CHECK: function-decl.c:4:1: note: "root" binds here
+void foo(void) {}
Index: clang-query/QueryParser.cpp
===
--- clang-query/QueryParser.cpp
+++ clang-query/QueryParser.cpp
@@ -15,6 +15,7 @@
 #include "llvm/ADT/StringRef.h"
 #include "llvm/ADT/StringSwitch.h"
 #include 
+#include 
 
 using namespace llvm;
 using namespace clang::ast_matchers::dynamic;
@@ -210,13 +211,27 @@
 if (CompletionPos)
   return completeMatcherExpression();
 
-Diagnostics Diag;
-Optional Matcher = Parser::parseMatcherExpression(
-StringRef(Begin, End - Begin), nullptr, &QS.NamedValues, &Diag);
-if (!Matcher) {
-  return makeInvalidQueryFromDiagnostics(Diag);
+Diagnostics FirstDiag;
+std::string Query = StringRef(Begin, End - Begin).str();
+while (true) {
+  Diagnostics Diag;
+  Diagnostics* CurrentDiag = FirstDiag.errors().empty() ? &FirstDiag : &Diag;
+  Optional Matcher = Parser::parseMatcherExpression(
+  Query, nullptr, &QS.NamedValues, CurrentDiag);
+  if (Matcher) {
+return new MatchQuery(*Matcher);
+  }
+  for (const auto& Error : CurrentDiag->errors()) {
+for (const auto &Message : Error.Messages) {
+  if (Message.Type == Diagnostics::ET_ParserNoCloseParen) {
+Query += ")";
+  } else {
+// Report the first error before we mucked with the query.
+return makeInvalidQueryFromDiagnostics(FirstDiag);
+  }
+}
+  }
 }
-return new MatchQuery(*Matcher);
   }
 
   case PQK_Set: {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D55534: [AST] Store "UsesADL" information in CallExpr.

2018-12-10 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles added inline comments.



Comment at: include/clang/AST/ExprCXX.h:218
+ SourceLocation RP, unsigned MinNumArgs = 0,
+ bool UsesADL = false)
   : CallExpr(C, CUDAKernelCallExprClass, fn, Config, args, t, VK, RP,

Can CUDAKernelCalls ever use ADL?



Comment at: include/clang/AST/ExprCXX.h:499
+  : CallExpr(C, UserDefinedLiteralClass, Fn, Args, T, VK, LitEndLoc,
+ /*MinNumArgs=*/0, /*UsesADL=*/false),
 UDSuffixLoc(SuffixLoc) {}

Same question, I assume user defined literals can only be called as string 
suffixes and thus never get ADL



Comment at: include/clang/ASTMatchers/ASTMatchers.h:1275
+/// NS::y(x); // Doesn't match
+/// y(42);
+///   }

y(42);  // Doesn't match



Comment at: include/clang/Sema/Overload.h:775
+/// True if the candidate was found using ADL.
+bool IsADLCandidate;
+

maybe bit pack these?  I think overload sets for operator<< actually get pretty 
big



Comment at: lib/Sema/SemaOverload.cpp:8946
+   ExplicitTemplateArgs, Args, CandidateSet,
+   /*SuppressUserConversions=*/false,
+   PartialOverloading, 
/*IsADLCandidate=*/true);

should this fix be in a separate change?



Comment at: lib/Sema/SemaOverload.cpp:12024
 return SemaRef.BuildResolvedCallExpr(Fn, FDecl, LParenLoc, Args, RParenLoc,
- ExecConfig);
+ ExecConfig, /*IsExecConfig*/ false,
+ (*Best)->IsADLCandidate);

/*IsExecConfig=*/



Comment at: lib/Sema/SemaOverload.cpp:12077
 return SemaRef.BuildResolvedCallExpr(Fn, FDecl, LParenLoc, Args, RParenLoc,
- ExecConfig);
+ ExecConfig, /*IsExecConfig*/ false,
+ (*Best)->IsADLCandidate);

here too



Comment at: lib/Serialization/ASTReaderStmt.cpp:735
   unsigned NumArgs = Record.readInt();
+  bool UsesADL = Record.readInt();
   assert((NumArgs == E->getNumArgs()) && "Wrong NumArgs!");

readInt into a bool?



Comment at: unittests/ASTMatchers/ASTMatchersNodeTest.cpp:204
+  StatementMatcher ADLMatch = callExpr(usesADL());
+  auto NS_Str = R"DELIM(
+  namespace NS {

if you use cc or cpp as your delimiter, I think clang-format will recurse 
correctly


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D55534/new/

https://reviews.llvm.org/D55534



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D78323: [clang] Fix invalid comparator in tablegen

2020-04-19 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles added a comment.

LGTM


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D78323/new/

https://reviews.llvm.org/D78323



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112491: Add `LambdaCapture`-related matchers.

2021-11-01 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles added a comment.

This is great!




Comment at: clang/docs/LibASTMatchersReference.html:8368
+lambdaExpr(hasAnyCapture(lambdaCapture(capturesVar(hasName("x",
+capturesVar(hasName("x")) matches `int x` and `x = 1`.
 

I think this should be "matches `x` and `x = 1`


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112491/new/

https://reviews.llvm.org/D112491

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112491: Add `LambdaCapture`-related matchers.

2021-11-03 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles added a comment.

Do we also want a `forEachCapture` matcher?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112491/new/

https://reviews.llvm.org/D112491

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D112491: Add `LambdaCapture`-related matchers.

2021-11-04 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles added a comment.

In D112491#3108631 , @aaron.ballman 
wrote:

> That might be good follow-on work (I wouldn't insist on it for this patch 
> though).

Completely agreed, just something that occurred to me as the next thing I will 
need when building on this.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112491/new/

https://reviews.llvm.org/D112491

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D113575: Add `isInitCapture` and `forEachLambdaCapture` matchers.

2021-11-10 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles added inline comments.



Comment at: clang/include/clang/ASTMatchers/ASTMatchers.h:4224
+/// float z;
+/// auto f = [=]() { return x + y + z; };
+///   }

it would be nice to be able to do something like

```
int main() {
  int x, y;
  float z;
  auto f = [=, z]() { return x+ y + z; };
}
```

`lambdaExpr(forEachLambdaCapture(isImplicit())` matches `x` and `y` but not `z`


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113575/new/

https://reviews.llvm.org/D113575

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D113575: Add `isInitCapture` and `forEachLambdaCapture` matchers.

2021-11-11 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles added a comment.

That is awesome!  Thanks for much for the examples.  Everything here LGTM.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113575/new/

https://reviews.llvm.org/D113575

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D141547: Fix format for `case` in .proto files

2023-01-11 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles created this revision.
fowles added a reviewer: krasimir.
Herald added a project: All.
fowles requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Fix format for `case` in .proto files


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D141547

Files:
  clang/lib/Format/UnwrappedLineParser.cpp
  clang/test/Format/case.proto


Index: clang/test/Format/case.proto
===
--- /dev/null
+++ clang/test/Format/case.proto
@@ -0,0 +1,15 @@
+// RUN: grep -Ev "// *[A-Z-]+:" %s \
+// RUN:   | clang-format -assume-filename=case.proto -style=Google \
+// RUN:   | FileCheck -strict-whitespace %s
+
+syntax = "proto2";
+
+package foo.bar;
+
+message Baz {
+  optional int64 fred = 1;
+// CHECK: {{^\ {2}required}}
+required string case = 2;
+// CHECK: {{^\ {2}repeated}}
+repeated int32 fizz = 1;
+}
Index: clang/lib/Format/UnwrappedLineParser.cpp
===
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -590,8 +590,9 @@
   [[fallthrough]];
 }
 case tok::kw_case:
-  if (Style.isVerilog() ||
+  if (Style.isProto() || Style.isVerilog() ||
   (Style.isJavaScript() && Line->MustBeDeclaration)) {
+// Proto: there are no switch/case statements
 // Verilog: Case labels don't have this word. We handle case
 // labels including default in TokenAnnotator.
 // JavaScript: A 'case: string' style field declaration.
@@ -1620,7 +1621,11 @@
 // e.g. "default void f() {}" in a Java interface.
 break;
   case tok::kw_case:
-// In Verilog switch is called case.
+// Proto: there are no switch/case statements.
+if (Style.isProto()) {
+  nextToken();
+  return;
+}
 if (Style.isVerilog()) {
   parseBlock();
   addUnwrappedLine();
@@ -2100,6 +2105,11 @@
   parseNew();
   break;
 case tok::kw_case:
+  // Proto: there are no switch/case statements.
+  if (Style.isProto()) {
+nextToken();
+return;
+  }
   // In Verilog switch is called case.
   if (Style.isVerilog()) {
 parseBlock();


Index: clang/test/Format/case.proto
===
--- /dev/null
+++ clang/test/Format/case.proto
@@ -0,0 +1,15 @@
+// RUN: grep -Ev "// *[A-Z-]+:" %s \
+// RUN:   | clang-format -assume-filename=case.proto -style=Google \
+// RUN:   | FileCheck -strict-whitespace %s
+
+syntax = "proto2";
+
+package foo.bar;
+
+message Baz {
+  optional int64 fred = 1;
+// CHECK: {{^\ {2}required}}
+required string case = 2;
+// CHECK: {{^\ {2}repeated}}
+repeated int32 fizz = 1;
+}
Index: clang/lib/Format/UnwrappedLineParser.cpp
===
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -590,8 +590,9 @@
   [[fallthrough]];
 }
 case tok::kw_case:
-  if (Style.isVerilog() ||
+  if (Style.isProto() || Style.isVerilog() ||
   (Style.isJavaScript() && Line->MustBeDeclaration)) {
+// Proto: there are no switch/case statements
 // Verilog: Case labels don't have this word. We handle case
 // labels including default in TokenAnnotator.
 // JavaScript: A 'case: string' style field declaration.
@@ -1620,7 +1621,11 @@
 // e.g. "default void f() {}" in a Java interface.
 break;
   case tok::kw_case:
-// In Verilog switch is called case.
+// Proto: there are no switch/case statements.
+if (Style.isProto()) {
+  nextToken();
+  return;
+}
 if (Style.isVerilog()) {
   parseBlock();
   addUnwrappedLine();
@@ -2100,6 +2105,11 @@
   parseNew();
   break;
 case tok::kw_case:
+  // Proto: there are no switch/case statements.
+  if (Style.isProto()) {
+nextToken();
+return;
+  }
   // In Verilog switch is called case.
   if (Style.isVerilog()) {
 parseBlock();
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D141547: Fix format for `case` in .proto files

2023-01-13 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles updated this revision to Diff 488979.
fowles added a comment.

Move from lit test to unit test


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D141547/new/

https://reviews.llvm.org/D141547

Files:
  clang/lib/Format/UnwrappedLineParser.cpp
  clang/unittests/Format/FormatTestProto.cpp


Index: clang/unittests/Format/FormatTestProto.cpp
===
--- clang/unittests/Format/FormatTestProto.cpp
+++ clang/unittests/Format/FormatTestProto.cpp
@@ -113,6 +113,13 @@
"}");
 }
 
+TEST_F(FormatTestProto, CaseAsFieldName) {
+  verifyFormat("message SomeMessage {\n"
+   "  required string case = 1;\n"
+   "  repeated int32 fizz = 2;\n"
+   "}");
+}
+
 TEST_F(FormatTestProto, UnderstandsReturns) {
   verifyFormat("rpc Search(SearchRequest) returns (SearchResponse);");
 }
Index: clang/lib/Format/UnwrappedLineParser.cpp
===
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -590,8 +590,9 @@
   [[fallthrough]];
 }
 case tok::kw_case:
-  if (Style.isVerilog() ||
+  if (Style.isProto() || Style.isVerilog() ||
   (Style.isJavaScript() && Line->MustBeDeclaration)) {
+// Proto: there are no switch/case statements
 // Verilog: Case labels don't have this word. We handle case
 // labels including default in TokenAnnotator.
 // JavaScript: A 'case: string' style field declaration.
@@ -1620,7 +1621,11 @@
 // e.g. "default void f() {}" in a Java interface.
 break;
   case tok::kw_case:
-// In Verilog switch is called case.
+// Proto: there are no switch/case statements.
+if (Style.isProto()) {
+  nextToken();
+  return;
+}
 if (Style.isVerilog()) {
   parseBlock();
   addUnwrappedLine();
@@ -2100,6 +2105,11 @@
   parseNew();
   break;
 case tok::kw_case:
+  // Proto: there are no switch/case statements.
+  if (Style.isProto()) {
+nextToken();
+return;
+  }
   // In Verilog switch is called case.
   if (Style.isVerilog()) {
 parseBlock();


Index: clang/unittests/Format/FormatTestProto.cpp
===
--- clang/unittests/Format/FormatTestProto.cpp
+++ clang/unittests/Format/FormatTestProto.cpp
@@ -113,6 +113,13 @@
"}");
 }
 
+TEST_F(FormatTestProto, CaseAsFieldName) {
+  verifyFormat("message SomeMessage {\n"
+   "  required string case = 1;\n"
+   "  repeated int32 fizz = 2;\n"
+   "}");
+}
+
 TEST_F(FormatTestProto, UnderstandsReturns) {
   verifyFormat("rpc Search(SearchRequest) returns (SearchResponse);");
 }
Index: clang/lib/Format/UnwrappedLineParser.cpp
===
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -590,8 +590,9 @@
   [[fallthrough]];
 }
 case tok::kw_case:
-  if (Style.isVerilog() ||
+  if (Style.isProto() || Style.isVerilog() ||
   (Style.isJavaScript() && Line->MustBeDeclaration)) {
+// Proto: there are no switch/case statements
 // Verilog: Case labels don't have this word. We handle case
 // labels including default in TokenAnnotator.
 // JavaScript: A 'case: string' style field declaration.
@@ -1620,7 +1621,11 @@
 // e.g. "default void f() {}" in a Java interface.
 break;
   case tok::kw_case:
-// In Verilog switch is called case.
+// Proto: there are no switch/case statements.
+if (Style.isProto()) {
+  nextToken();
+  return;
+}
 if (Style.isVerilog()) {
   parseBlock();
   addUnwrappedLine();
@@ -2100,6 +2105,11 @@
   parseNew();
   break;
 case tok::kw_case:
+  // Proto: there are no switch/case statements.
+  if (Style.isProto()) {
+nextToken();
+return;
+  }
   // In Verilog switch is called case.
   if (Style.isVerilog()) {
 parseBlock();
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D28260: Add an argumentsAre matcher

2017-01-03 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles created this revision.
fowles added a reviewer: klimek.
fowles added a subscriber: cfe-commits.

Add an argumentsAre matcher


https://reviews.llvm.org/D28260

Files:
  include/clang/ASTMatchers/ASTMatchers.h
  unittests/ASTMatchers/ASTMatchersTraversalTest.cpp


Index: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===
--- unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -375,6 +375,14 @@
   EXPECT_TRUE(notMatches("void x(int) { int y; x(y); }", WrongIndex));
 }
 
+TEST(Matcher, ArgumentsAre) {
+  StatementMatcher Call = callExpr(argumentsAre(declRefExpr(), declRefExpr()));
+
+  EXPECT_TRUE(notMatches("void f(int x) { f(x); }", Call));
+  EXPECT_TRUE(matches("void f(int x, int y) { f(x, y); }", Call));
+  EXPECT_TRUE(notMatches("void f(int x, int y, int z) { f(x, y, z); }", Call));
+}
+
 TEST(Matcher, AnyArgument) {
   StatementMatcher CallArgumentY = callExpr(
 hasAnyArgument(
Index: include/clang/ASTMatchers/ASTMatchers.h
===
--- include/clang/ASTMatchers/ASTMatchers.h
+++ include/clang/ASTMatchers/ASTMatchers.h
@@ -3055,6 +3055,34 @@
   *Node.getArg(N)->IgnoreParenImpCasts(), Finder, Builder));
 }
 
+namespace internal {
+inline auto argumentsAreImpl(int n) -> decltype(argumentCountIs(n)) {
+  return argumentCountIs(n);
+}
+
+template 
+auto argumentsAreImpl(int n, First &&first, Rest &&... rest)
+-> decltype(allOf(hasArgument(n, std::forward(first)),
+  argumentsAreImpl(n + 1, std::forward(rest)...))) {
+  return allOf(hasArgument(n, std::forward(first)),
+   argumentsAreImpl(n + 1, std::forward(rest)...));
+}
+} // end namespace internal
+
+/// \brief Matches all the arguments of a call expression or a constructor
+/// call expression.
+///
+/// Example matches the call to f2, but not f1 or f3.
+/// (matcher = callExpr(argumentsAre(declRefExpr(), declRefExpr(
+/// \code
+///   void x(int a, int b, int c) { f1(a); f2(a, b); f3(a, b, c); }
+/// \endcode
+template 
+auto argumentsAre(T &&... t)
+-> decltype(internal::argumentsAreImpl(0, std::forward(t)...)) {
+  return internal::argumentsAreImpl(0, std::forward(t)...);
+}
+
 /// \brief Matches declaration statements that contain a specific number of
 /// declarations.
 ///


Index: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
===
--- unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
+++ unittests/ASTMatchers/ASTMatchersTraversalTest.cpp
@@ -375,6 +375,14 @@
   EXPECT_TRUE(notMatches("void x(int) { int y; x(y); }", WrongIndex));
 }
 
+TEST(Matcher, ArgumentsAre) {
+  StatementMatcher Call = callExpr(argumentsAre(declRefExpr(), declRefExpr()));
+
+  EXPECT_TRUE(notMatches("void f(int x) { f(x); }", Call));
+  EXPECT_TRUE(matches("void f(int x, int y) { f(x, y); }", Call));
+  EXPECT_TRUE(notMatches("void f(int x, int y, int z) { f(x, y, z); }", Call));
+}
+
 TEST(Matcher, AnyArgument) {
   StatementMatcher CallArgumentY = callExpr(
 hasAnyArgument(
Index: include/clang/ASTMatchers/ASTMatchers.h
===
--- include/clang/ASTMatchers/ASTMatchers.h
+++ include/clang/ASTMatchers/ASTMatchers.h
@@ -3055,6 +3055,34 @@
   *Node.getArg(N)->IgnoreParenImpCasts(), Finder, Builder));
 }
 
+namespace internal {
+inline auto argumentsAreImpl(int n) -> decltype(argumentCountIs(n)) {
+  return argumentCountIs(n);
+}
+
+template 
+auto argumentsAreImpl(int n, First &&first, Rest &&... rest)
+-> decltype(allOf(hasArgument(n, std::forward(first)),
+  argumentsAreImpl(n + 1, std::forward(rest)...))) {
+  return allOf(hasArgument(n, std::forward(first)),
+   argumentsAreImpl(n + 1, std::forward(rest)...));
+}
+} // end namespace internal
+
+/// \brief Matches all the arguments of a call expression or a constructor
+/// call expression.
+///
+/// Example matches the call to f2, but not f1 or f3.
+/// (matcher = callExpr(argumentsAre(declRefExpr(), declRefExpr(
+/// \code
+///   void x(int a, int b, int c) { f1(a); f2(a, b); f3(a, b, c); }
+/// \endcode
+template 
+auto argumentsAre(T &&... t)
+-> decltype(internal::argumentsAreImpl(0, std::forward(t)...)) {
+  return internal::argumentsAreImpl(0, std::forward(t)...);
+}
+
 /// \brief Matches declaration statements that contain a specific number of
 /// declarations.
 ///
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D28260: Add an argumentsAre matcher

2017-01-10 Thread Matt Kulukundis via Phabricator via cfe-commits
fowles added a subscriber: jdennett.
fowles added a comment.

@jdennett wanted this matcher for something he is working on and I had some 
free cycles to write it up.  Unfortunately, I am about to leave on an extended 
vacation, so I will not be able to follow up with this patch for 2 months at 
the earliest.

I suspect the best solution is for someone to take over this patch and work 
with James to clarify any corner cases.


https://reviews.llvm.org/D28260



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits