Restructure Diagnostic objects to allow late formatting (#1131)

Co-authored-by: Richard Smith <richard@metafoo.co.uk>
This commit is contained in:
Jon Meow
2022-04-04 10:59:09 -07:00
committed by GitHub
co-authored by Richard Smith
parent 014c3847b3
commit aaca540a05
22 changed files with 661 additions and 765 deletions
+22 -21
View File
@@ -1120,36 +1120,37 @@ TEST_F(ParseTreeTest, StructErrors) {
};
Testcase testcases[] = {
{"var x: {i32} = {};",
DiagnosticMessage("Expected `.field: type` or `.field = value`.")},
IsDiagnosticMessage("Expected `.field: type` or `.field = value`.")},
{"var x: {a} = {};",
DiagnosticMessage("Expected `.field: type` or `.field = value`.")},
IsDiagnosticMessage("Expected `.field: type` or `.field = value`.")},
{"var x: {a:} = {};",
DiagnosticMessage("Expected `.field: type` or `.field = value`.")},
IsDiagnosticMessage("Expected `.field: type` or `.field = value`.")},
{"var x: {a=} = {};",
DiagnosticMessage("Expected `.field: type` or `.field = value`.")},
{"var x: {.} = {};", DiagnosticMessage("Expected identifier after `.`.")},
IsDiagnosticMessage("Expected `.field: type` or `.field = value`.")},
{"var x: {.} = {};",
IsDiagnosticMessage("Expected identifier after `.`.")},
{"var x: {.\"hello\" = 0, .y = 4} = {};",
DiagnosticMessage("Expected identifier after `.`.")},
IsDiagnosticMessage("Expected identifier after `.`.")},
{"var x: {.\"hello\": i32, .y: i32} = {};",
DiagnosticMessage("Expected identifier after `.`.")},
IsDiagnosticMessage("Expected identifier after `.`.")},
{"var x: {.a} = {};",
DiagnosticMessage("Expected `.field: type` or `.field = value`.")},
{"var x: {.a:} = {};", DiagnosticMessage("Expected expression.")},
{"var x: {.a=} = {};", DiagnosticMessage("Expected expression.")},
IsDiagnosticMessage("Expected `.field: type` or `.field = value`.")},
{"var x: {.a:} = {};", IsDiagnosticMessage("Expected expression.")},
{"var x: {.a=} = {};", IsDiagnosticMessage("Expected expression.")},
{"var x: {.a: i32, .b = 0} = {};",
DiagnosticMessage("Expected `.field: type`.")},
IsDiagnosticMessage("Expected `.field: type`.")},
{"var x: {.a = 0, b: i32} = {};",
DiagnosticMessage("Expected `.field = value`.")},
IsDiagnosticMessage("Expected `.field = value`.")},
{"var x: {,} = {};",
DiagnosticMessage("Expected `.field: type` or `.field = value`.")},
IsDiagnosticMessage("Expected `.field: type` or `.field = value`.")},
{"var x: {.a: i32,,} = {};",
DiagnosticMessage("Expected `.field: type`.")},
IsDiagnosticMessage("Expected `.field: type`.")},
{"var x: {.a = 0,,} = {};",
DiagnosticMessage("Expected `.field = value`.")},
IsDiagnosticMessage("Expected `.field = value`.")},
{"var x: {.a: i32 banana} = {.a = 0};",
DiagnosticMessage("Expected `,` or `}`.")},
IsDiagnosticMessage("Expected `,` or `}`.")},
{"var x: {.a: i32} = {.a = 0 banana};",
DiagnosticMessage("Expected `,` or `}`.")},
IsDiagnosticMessage("Expected `,` or `}`.")},
};
for (const Testcase& testcase : testcases) {
@@ -1268,10 +1269,10 @@ TEST_F(ParseTreeTest, RecursionLimit) {
// Recursion might be exceeded multiple times due to quirks in parse tree
// handling; we only need to be sure it's hit at least once for test
// correctness.
EXPECT_CALL(
consumer,
HandleDiagnostic(DiagnosticMessage(llvm::formatv(
"Exceeded recursion limit ({0})", ParseTree::StackDepthLimit))))
EXPECT_CALL(consumer, HandleDiagnostic(IsDiagnosticMessage(
llvm::formatv("Exceeded recursion limit ({0})",
ParseTree::StackDepthLimit)
.str())))
.Times(AtLeast(1));
ParseTree tree = ParseTree::Parse(tokens, consumer);
EXPECT_TRUE(tree.has_errors());