parse_tree_test.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "parser/parse_tree.h"
  5. #include <forward_list>
  6. #include "diagnostics/diagnostic_emitter.h"
  7. #include "gmock/gmock.h"
  8. #include "gtest/gtest.h"
  9. #include "lexer/tokenized_buffer.h"
  10. #include "lexer/tokenized_buffer_test_helpers.h"
  11. #include "llvm/ADT/Sequence.h"
  12. #include "llvm/Support/SourceMgr.h"
  13. #include "llvm/Support/YAMLParser.h"
  14. #include "parser/parse_node_kind.h"
  15. #include "parser/parse_test_helpers.h"
  16. namespace Carbon {
  17. namespace {
  18. using Carbon::Testing::IsKeyValueScalars;
  19. using Carbon::Testing::MatchParseTreeNodes;
  20. using ::testing::Eq;
  21. using ::testing::Ne;
  22. using ::testing::NotNull;
  23. using ::testing::StrEq;
  24. struct ParseTreeTest : ::testing::Test {
  25. std::forward_list<SourceBuffer> source_storage;
  26. std::forward_list<TokenizedBuffer> token_storage;
  27. DiagnosticEmitter emitter = NullDiagnosticEmitter();
  28. auto GetSourceBuffer(llvm::Twine t) -> SourceBuffer& {
  29. source_storage.push_front(SourceBuffer::CreateFromText(t.str()));
  30. return source_storage.front();
  31. }
  32. auto GetTokenizedBuffer(llvm::Twine t) -> TokenizedBuffer& {
  33. token_storage.push_front(TokenizedBuffer::Lex(GetSourceBuffer(t), emitter));
  34. return token_storage.front();
  35. }
  36. };
  37. TEST_F(ParseTreeTest, Empty) {
  38. TokenizedBuffer tokens = GetTokenizedBuffer("");
  39. ParseTree tree = ParseTree::Parse(tokens, emitter);
  40. EXPECT_FALSE(tree.HasErrors());
  41. EXPECT_THAT(tree.Postorder().begin(), Eq(tree.Postorder().end()));
  42. }
  43. TEST_F(ParseTreeTest, EmptyDeclaration) {
  44. TokenizedBuffer tokens = GetTokenizedBuffer(";");
  45. ParseTree tree = ParseTree::Parse(tokens, emitter);
  46. EXPECT_FALSE(tree.HasErrors());
  47. auto it = tree.Postorder().begin();
  48. auto end = tree.Postorder().end();
  49. ASSERT_THAT(it, Ne(end));
  50. ParseTree::Node n = *it++;
  51. EXPECT_THAT(it, Eq(end));
  52. // Directly test the main API so that we get easier to understand errors in
  53. // simple cases than what the custom matcher will produce.
  54. EXPECT_FALSE(tree.HasErrorInNode(n));
  55. EXPECT_THAT(tree.GetNodeKind(n), Eq(ParseNodeKind::EmptyDeclaration()));
  56. auto t = tree.GetNodeToken(n);
  57. ASSERT_THAT(tokens.Tokens().begin(), Ne(tokens.Tokens().end()));
  58. EXPECT_THAT(t, Eq(*tokens.Tokens().begin()));
  59. EXPECT_THAT(tokens.GetTokenText(t), Eq(";"));
  60. EXPECT_THAT(tree.Postorder(n).begin(), Eq(tree.Postorder().begin()));
  61. EXPECT_THAT(tree.Postorder(n).end(), Eq(tree.Postorder().end()));
  62. EXPECT_THAT(tree.Children(n).begin(), Eq(tree.Children(n).end()));
  63. }
  64. TEST_F(ParseTreeTest, BasicFunctionDeclaration) {
  65. TokenizedBuffer tokens = GetTokenizedBuffer("fn F();");
  66. ParseTree tree = ParseTree::Parse(tokens, emitter);
  67. EXPECT_FALSE(tree.HasErrors());
  68. EXPECT_THAT(
  69. tree, MatchParseTreeNodes(
  70. {{.kind = ParseNodeKind::FunctionDeclaration(),
  71. .text = "fn",
  72. .children = {
  73. {ParseNodeKind::Identifier(), "F"},
  74. {.kind = ParseNodeKind::ParameterList(),
  75. .text = "(",
  76. .children = {{ParseNodeKind::ParameterListEnd(), ")"}}},
  77. {ParseNodeKind::DeclarationEnd(), ";"}}}}));
  78. }
  79. TEST_F(ParseTreeTest, NoDeclarationIntroducerOrSemi) {
  80. TokenizedBuffer tokens = GetTokenizedBuffer("foo bar baz");
  81. ParseTree tree = ParseTree::Parse(tokens, emitter);
  82. EXPECT_TRUE(tree.HasErrors());
  83. EXPECT_THAT(tree.Postorder().begin(), Eq(tree.Postorder().end()));
  84. }
  85. TEST_F(ParseTreeTest, NoDeclarationIntroducerWithSemi) {
  86. TokenizedBuffer tokens = GetTokenizedBuffer("foo;");
  87. ParseTree tree = ParseTree::Parse(tokens, emitter);
  88. EXPECT_TRUE(tree.HasErrors());
  89. EXPECT_THAT(tree,
  90. MatchParseTreeNodes({{.kind = ParseNodeKind::EmptyDeclaration(),
  91. .text = ";",
  92. .has_error = true}}));
  93. }
  94. TEST_F(ParseTreeTest, JustFunctionIntroducerAndSemi) {
  95. TokenizedBuffer tokens = GetTokenizedBuffer("fn;");
  96. ParseTree tree = ParseTree::Parse(tokens, emitter);
  97. EXPECT_TRUE(tree.HasErrors());
  98. EXPECT_THAT(tree, MatchParseTreeNodes(
  99. {{.kind = ParseNodeKind::FunctionDeclaration(),
  100. .has_error = true,
  101. .children = {{ParseNodeKind::DeclarationEnd()}}}}));
  102. }
  103. TEST_F(ParseTreeTest, RepeatedFunctionIntroducerAndSemi) {
  104. TokenizedBuffer tokens = GetTokenizedBuffer("fn fn;");
  105. ParseTree tree = ParseTree::Parse(tokens, emitter);
  106. EXPECT_TRUE(tree.HasErrors());
  107. EXPECT_THAT(tree, MatchParseTreeNodes(
  108. {{.kind = ParseNodeKind::FunctionDeclaration(),
  109. .has_error = true,
  110. .children = {{ParseNodeKind::DeclarationEnd()}}}}));
  111. }
  112. TEST_F(ParseTreeTest, FunctionDeclarationWithNoSignatureOrSemi) {
  113. TokenizedBuffer tokens = GetTokenizedBuffer("fn foo");
  114. ParseTree tree = ParseTree::Parse(tokens, emitter);
  115. EXPECT_TRUE(tree.HasErrors());
  116. EXPECT_THAT(tree,
  117. MatchParseTreeNodes(
  118. {{.kind = ParseNodeKind::FunctionDeclaration(),
  119. .has_error = true,
  120. .children = {{ParseNodeKind::Identifier(), "foo"}}}}));
  121. }
  122. TEST_F(ParseTreeTest,
  123. FunctionDeclarationWithIdentifierInsteadOfSignatureAndSemi) {
  124. TokenizedBuffer tokens = GetTokenizedBuffer("fn foo bar;");
  125. ParseTree tree = ParseTree::Parse(tokens, emitter);
  126. EXPECT_TRUE(tree.HasErrors());
  127. EXPECT_THAT(tree, MatchParseTreeNodes(
  128. {{.kind = ParseNodeKind::FunctionDeclaration(),
  129. .has_error = true,
  130. .children = {{ParseNodeKind::Identifier(), "foo"},
  131. {ParseNodeKind::DeclarationEnd()}}}}));
  132. }
  133. TEST_F(ParseTreeTest, FunctionDeclarationWithSingleIdentifierParameterList) {
  134. TokenizedBuffer tokens = GetTokenizedBuffer("fn foo(bar);");
  135. ParseTree tree = ParseTree::Parse(tokens, emitter);
  136. // Note: this might become valid depending on the parameter syntax, this test
  137. // shouldn't be taken as a sign it should remain invalid.
  138. EXPECT_TRUE(tree.HasErrors());
  139. EXPECT_THAT(
  140. tree,
  141. MatchParseTreeNodes(
  142. {{.kind = ParseNodeKind::FunctionDeclaration(),
  143. .has_error = true,
  144. .children = {{ParseNodeKind::Identifier(), "foo"},
  145. {.kind = ParseNodeKind::ParameterList(),
  146. .has_error = true,
  147. .children = {{ParseNodeKind::ParameterListEnd()}}},
  148. {ParseNodeKind::DeclarationEnd()}}}}));
  149. }
  150. TEST_F(ParseTreeTest, FunctionDeclarationWithoutName) {
  151. TokenizedBuffer tokens = GetTokenizedBuffer("fn ();");
  152. ParseTree tree = ParseTree::Parse(tokens, emitter);
  153. EXPECT_TRUE(tree.HasErrors());
  154. EXPECT_THAT(tree, MatchParseTreeNodes(
  155. {{.kind = ParseNodeKind::FunctionDeclaration(),
  156. .has_error = true,
  157. .children = {{ParseNodeKind::DeclarationEnd()}}}}));
  158. }
  159. TEST_F(ParseTreeTest,
  160. FunctionDeclarationWithoutNameAndManyTokensToSkipInGroupedSymbols) {
  161. TokenizedBuffer tokens = GetTokenizedBuffer(
  162. "fn (a tokens c d e f g h i j k l m n o p q r s t u v w x y z);");
  163. ParseTree tree = ParseTree::Parse(tokens, emitter);
  164. EXPECT_TRUE(tree.HasErrors());
  165. EXPECT_THAT(tree, MatchParseTreeNodes(
  166. {{.kind = ParseNodeKind::FunctionDeclaration(),
  167. .has_error = true,
  168. .children = {{ParseNodeKind::DeclarationEnd()}}}}));
  169. }
  170. TEST_F(ParseTreeTest, FunctionDeclarationSkipToNewlineWithoutSemi) {
  171. TokenizedBuffer tokens = GetTokenizedBuffer(
  172. "fn ()\n"
  173. "fn F();");
  174. ParseTree tree = ParseTree::Parse(tokens, emitter);
  175. EXPECT_TRUE(tree.HasErrors());
  176. EXPECT_THAT(
  177. tree,
  178. MatchParseTreeNodes(
  179. {{.kind = ParseNodeKind::FunctionDeclaration(), .has_error = true},
  180. {.kind = ParseNodeKind::FunctionDeclaration(),
  181. .children = {{ParseNodeKind::Identifier(), "F"},
  182. {.kind = ParseNodeKind::ParameterList(),
  183. .children = {{ParseNodeKind::ParameterListEnd()}}},
  184. {ParseNodeKind::DeclarationEnd()}}}}));
  185. }
  186. TEST_F(ParseTreeTest, FunctionDeclarationSkipIndentedNewlineWithSemi) {
  187. TokenizedBuffer tokens = GetTokenizedBuffer(
  188. "fn (x,\n"
  189. " y,\n"
  190. " z);\n"
  191. "fn F();");
  192. ParseTree tree = ParseTree::Parse(tokens, emitter);
  193. EXPECT_TRUE(tree.HasErrors());
  194. EXPECT_THAT(
  195. tree,
  196. MatchParseTreeNodes(
  197. {{.kind = ParseNodeKind::FunctionDeclaration(),
  198. .has_error = true,
  199. .children = {{ParseNodeKind::DeclarationEnd()}}},
  200. {.kind = ParseNodeKind::FunctionDeclaration(),
  201. .children = {{ParseNodeKind::Identifier(), "F"},
  202. {.kind = ParseNodeKind::ParameterList(),
  203. .children = {{ParseNodeKind::ParameterListEnd()}}},
  204. {ParseNodeKind::DeclarationEnd()}}}}));
  205. }
  206. TEST_F(ParseTreeTest, FunctionDeclarationSkipIndentedNewlineWithoutSemi) {
  207. TokenizedBuffer tokens = GetTokenizedBuffer(
  208. "fn (x,\n"
  209. " y,\n"
  210. " z)\n"
  211. "fn F();");
  212. ParseTree tree = ParseTree::Parse(tokens, emitter);
  213. EXPECT_TRUE(tree.HasErrors());
  214. EXPECT_THAT(
  215. tree,
  216. MatchParseTreeNodes(
  217. {{.kind = ParseNodeKind::FunctionDeclaration(), .has_error = true},
  218. {.kind = ParseNodeKind::FunctionDeclaration(),
  219. .children = {{ParseNodeKind::Identifier(), "F"},
  220. {.kind = ParseNodeKind::ParameterList(),
  221. .children = {{ParseNodeKind::ParameterListEnd()}}},
  222. {ParseNodeKind::DeclarationEnd()}}}}));
  223. }
  224. TEST_F(ParseTreeTest, FunctionDeclarationSkipIndentedNewlineUntilOutdent) {
  225. TokenizedBuffer tokens = GetTokenizedBuffer(
  226. " fn (x,\n"
  227. " y,\n"
  228. " z)\n"
  229. "fn F();");
  230. ParseTree tree = ParseTree::Parse(tokens, emitter);
  231. EXPECT_TRUE(tree.HasErrors());
  232. EXPECT_THAT(
  233. tree,
  234. MatchParseTreeNodes(
  235. {{.kind = ParseNodeKind::FunctionDeclaration(), .has_error = true},
  236. {.kind = ParseNodeKind::FunctionDeclaration(),
  237. .children = {{ParseNodeKind::Identifier(), "F"},
  238. {.kind = ParseNodeKind::ParameterList(),
  239. .children = {{ParseNodeKind::ParameterListEnd()}}},
  240. {ParseNodeKind::DeclarationEnd()}}}}));
  241. }
  242. TEST_F(ParseTreeTest, FunctionDeclarationSkipWithoutSemiToCurly) {
  243. // FIXME: We don't have a grammar construct that uses curlies yet so this just
  244. // won't parse at all. Once it does, we should ensure that the close brace
  245. // gets properly parsed for the struct (or whatever other curly-braced syntax
  246. // we have grouping function declarations) despite the invalid function
  247. // declaration missing a semicolon.
  248. TokenizedBuffer tokens = GetTokenizedBuffer(
  249. "struct X { fn () }\n"
  250. "fn F();");
  251. ParseTree tree = ParseTree::Parse(tokens, emitter);
  252. EXPECT_TRUE(tree.HasErrors());
  253. }
  254. TEST_F(ParseTreeTest, BasicFunctionDefinition) {
  255. TokenizedBuffer tokens = GetTokenizedBuffer(
  256. "fn F() {\n"
  257. "}");
  258. ParseTree tree = ParseTree::Parse(tokens, emitter);
  259. EXPECT_FALSE(tree.HasErrors());
  260. EXPECT_THAT(
  261. tree, MatchParseTreeNodes(
  262. {{.kind = ParseNodeKind::FunctionDeclaration(),
  263. .children = {
  264. {ParseNodeKind::Identifier(), "F"},
  265. {.kind = ParseNodeKind::ParameterList(),
  266. .children = {{ParseNodeKind::ParameterListEnd()}}},
  267. {.kind = ParseNodeKind::CodeBlock(),
  268. .text = "{",
  269. .children = {{ParseNodeKind::CodeBlockEnd(), "}"}}}}}}));
  270. }
  271. TEST_F(ParseTreeTest, FunctionDefinitionWithNestedBlocks) {
  272. TokenizedBuffer tokens = GetTokenizedBuffer(
  273. "fn F() {\n"
  274. " {\n"
  275. " {{}}\n"
  276. " }\n"
  277. "}");
  278. ParseTree tree = ParseTree::Parse(tokens, emitter);
  279. EXPECT_FALSE(tree.HasErrors());
  280. EXPECT_THAT(
  281. tree,
  282. MatchParseTreeNodes(
  283. {{.kind = ParseNodeKind::FunctionDeclaration(),
  284. .children = {
  285. {ParseNodeKind::Identifier(), "F"},
  286. {.kind = ParseNodeKind::ParameterList(),
  287. .children = {{ParseNodeKind::ParameterListEnd()}}},
  288. {.kind = ParseNodeKind::CodeBlock(),
  289. .children = {
  290. {.kind = ParseNodeKind::CodeBlock(),
  291. .children = {{.kind = ParseNodeKind::CodeBlock(),
  292. .children =
  293. {{.kind = ParseNodeKind::CodeBlock(),
  294. .children = {{ParseNodeKind::
  295. CodeBlockEnd()}}},
  296. {ParseNodeKind::CodeBlockEnd()}}},
  297. {ParseNodeKind::CodeBlockEnd()}}},
  298. {ParseNodeKind::CodeBlockEnd()}}}}}}));
  299. }
  300. TEST_F(ParseTreeTest, FunctionDefinitionWithIdenifierInStatements) {
  301. TokenizedBuffer tokens = GetTokenizedBuffer(
  302. "fn F() {\n"
  303. " bar\n"
  304. "}");
  305. ParseTree tree = ParseTree::Parse(tokens, emitter);
  306. // Note: this might become valid depending on the expression syntax. This test
  307. // shouldn't be taken as a sign it should remain invalid.
  308. EXPECT_TRUE(tree.HasErrors());
  309. EXPECT_THAT(
  310. tree,
  311. MatchParseTreeNodes(
  312. {{.kind = ParseNodeKind::FunctionDeclaration(),
  313. .children = {{ParseNodeKind::Identifier(), "F"},
  314. {.kind = ParseNodeKind::ParameterList(),
  315. .children = {{ParseNodeKind::ParameterListEnd()}}},
  316. {.kind = ParseNodeKind::CodeBlock(),
  317. .has_error = true,
  318. .children = {{ParseNodeKind::CodeBlockEnd()}}}}}}));
  319. }
  320. TEST_F(ParseTreeTest, FunctionDefinitionWithIdenifierInNestedBlock) {
  321. TokenizedBuffer tokens = GetTokenizedBuffer(
  322. "fn F() {\n"
  323. " {bar}\n"
  324. "}");
  325. ParseTree tree = ParseTree::Parse(tokens, emitter);
  326. // Note: this might become valid depending on the expression syntax. This test
  327. // shouldn't be taken as a sign it should remain invalid.
  328. EXPECT_TRUE(tree.HasErrors());
  329. EXPECT_THAT(
  330. tree,
  331. MatchParseTreeNodes(
  332. {{.kind = ParseNodeKind::FunctionDeclaration(),
  333. .children = {
  334. {ParseNodeKind::Identifier(), "F"},
  335. {.kind = ParseNodeKind::ParameterList(),
  336. .children = {{ParseNodeKind::ParameterListEnd()}}},
  337. {.kind = ParseNodeKind::CodeBlock(),
  338. .children = {{.kind = ParseNodeKind::CodeBlock(),
  339. .has_error = true,
  340. .children = {{ParseNodeKind::CodeBlockEnd()}}},
  341. {ParseNodeKind::CodeBlockEnd()}}}}}}));
  342. }
  343. auto GetAndDropLine(llvm::StringRef& s) -> std::string {
  344. auto newline_offset = s.find_first_of('\n');
  345. llvm::StringRef line = s.slice(0, newline_offset);
  346. if (newline_offset != llvm::StringRef::npos) {
  347. s = s.substr(newline_offset + 1);
  348. } else {
  349. s = "";
  350. }
  351. return line.str();
  352. }
  353. TEST_F(ParseTreeTest, Printing) {
  354. TokenizedBuffer tokens = GetTokenizedBuffer("fn F();");
  355. ParseTree tree = ParseTree::Parse(tokens, emitter);
  356. EXPECT_FALSE(tree.HasErrors());
  357. std::string print_storage;
  358. llvm::raw_string_ostream print_stream(print_storage);
  359. tree.Print(print_stream);
  360. llvm::StringRef print = print_stream.str();
  361. EXPECT_THAT(GetAndDropLine(print), StrEq("["));
  362. EXPECT_THAT(GetAndDropLine(print),
  363. StrEq("{node_index: 4, kind: 'FunctionDeclaration', text: 'fn', "
  364. "subtree_size: 5, children: ["));
  365. EXPECT_THAT(GetAndDropLine(print),
  366. StrEq(" {node_index: 0, kind: 'Identifier', text: 'F'},"));
  367. EXPECT_THAT(GetAndDropLine(print),
  368. StrEq(" {node_index: 2, kind: 'ParameterList', text: '(', "
  369. "subtree_size: 2, children: ["));
  370. EXPECT_THAT(GetAndDropLine(print),
  371. StrEq(" {node_index: 1, kind: 'ParameterListEnd', "
  372. "text: ')'}]},"));
  373. EXPECT_THAT(GetAndDropLine(print),
  374. StrEq(" {node_index: 3, kind: 'DeclarationEnd', text: ';'}]},"));
  375. EXPECT_THAT(GetAndDropLine(print), StrEq("]"));
  376. EXPECT_TRUE(print.empty()) << print;
  377. }
  378. TEST_F(ParseTreeTest, PrintingAsYAML) {
  379. TokenizedBuffer tokens = GetTokenizedBuffer("fn F();");
  380. ParseTree tree = ParseTree::Parse(tokens, emitter);
  381. EXPECT_FALSE(tree.HasErrors());
  382. std::string print_output;
  383. llvm::raw_string_ostream print_stream(print_output);
  384. tree.Print(print_stream);
  385. print_stream.flush();
  386. // Parse the output into a YAML stream. This will print errors to stderr.
  387. llvm::SourceMgr source_manager;
  388. llvm::yaml::Stream yaml_stream(print_output, source_manager);
  389. auto di = yaml_stream.begin();
  390. auto* root_node = llvm::dyn_cast<llvm::yaml::SequenceNode>(di->getRoot());
  391. ASSERT_THAT(root_node, NotNull());
  392. // The root node is just an array of top-level parse nodes.
  393. auto ni = root_node->begin();
  394. auto ne = root_node->end();
  395. auto* node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*ni);
  396. ASSERT_THAT(node, NotNull());
  397. auto nkvi = node->begin();
  398. auto nkve = node->end();
  399. EXPECT_THAT(&*nkvi, IsKeyValueScalars("node_index", "4"));
  400. ++nkvi;
  401. EXPECT_THAT(&*nkvi, IsKeyValueScalars("kind", "FunctionDeclaration"));
  402. ++nkvi;
  403. EXPECT_THAT(&*nkvi, IsKeyValueScalars("text", "fn"));
  404. ++nkvi;
  405. EXPECT_THAT(&*nkvi, IsKeyValueScalars("subtree_size", "5"));
  406. ++nkvi;
  407. auto* children_node = llvm::dyn_cast<llvm::yaml::KeyValueNode>(&*nkvi);
  408. ASSERT_THAT(children_node, NotNull());
  409. auto* children_key_node =
  410. llvm::dyn_cast<llvm::yaml::ScalarNode>(children_node->getKey());
  411. ASSERT_THAT(children_key_node, NotNull());
  412. EXPECT_THAT(children_key_node->getRawValue(), StrEq("children"));
  413. auto* children_value_node =
  414. llvm::dyn_cast<llvm::yaml::SequenceNode>(children_node->getValue());
  415. ASSERT_THAT(children_value_node, NotNull());
  416. auto ci = children_value_node->begin();
  417. auto ce = children_value_node->end();
  418. ASSERT_THAT(ci, Ne(ce));
  419. node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*ci);
  420. ASSERT_THAT(node, NotNull());
  421. auto ckvi = node->begin();
  422. EXPECT_THAT(&*ckvi, IsKeyValueScalars("node_index", "0"));
  423. ++ckvi;
  424. EXPECT_THAT(&*ckvi, IsKeyValueScalars("kind", "Identifier"));
  425. ++ckvi;
  426. EXPECT_THAT(&*ckvi, IsKeyValueScalars("text", "F"));
  427. ++ckvi;
  428. EXPECT_THAT(ckvi, Eq(node->end()));
  429. ++ci;
  430. ASSERT_THAT(ci, Ne(ce));
  431. node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*ci);
  432. ASSERT_THAT(node, NotNull());
  433. ckvi = node->begin();
  434. auto ckve = node->end();
  435. EXPECT_THAT(&*ckvi, IsKeyValueScalars("node_index", "2"));
  436. ++ckvi;
  437. EXPECT_THAT(&*ckvi, IsKeyValueScalars("kind", "ParameterList"));
  438. ++ckvi;
  439. EXPECT_THAT(&*ckvi, IsKeyValueScalars("text", "("));
  440. ++ckvi;
  441. EXPECT_THAT(&*ckvi, IsKeyValueScalars("subtree_size", "2"));
  442. ++ckvi;
  443. children_node = llvm::dyn_cast<llvm::yaml::KeyValueNode>(&*ckvi);
  444. ASSERT_THAT(children_node, NotNull());
  445. children_key_node =
  446. llvm::dyn_cast<llvm::yaml::ScalarNode>(children_node->getKey());
  447. ASSERT_THAT(children_key_node, NotNull());
  448. EXPECT_THAT(children_key_node->getRawValue(), StrEq("children"));
  449. children_value_node =
  450. llvm::dyn_cast<llvm::yaml::SequenceNode>(children_node->getValue());
  451. ASSERT_THAT(children_value_node, NotNull());
  452. auto c2_i = children_value_node->begin();
  453. auto c2_e = children_value_node->end();
  454. ASSERT_THAT(c2_i, Ne(c2_e));
  455. node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*c2_i);
  456. ASSERT_THAT(node, NotNull());
  457. auto c2_kvi = node->begin();
  458. EXPECT_THAT(&*c2_kvi, IsKeyValueScalars("node_index", "1"));
  459. ++c2_kvi;
  460. EXPECT_THAT(&*c2_kvi, IsKeyValueScalars("kind", "ParameterListEnd"));
  461. ++c2_kvi;
  462. EXPECT_THAT(&*c2_kvi, IsKeyValueScalars("text", ")"));
  463. ++c2_kvi;
  464. EXPECT_THAT(c2_kvi, Eq(node->end()));
  465. ++c2_i;
  466. EXPECT_THAT(c2_i, Eq(c2_e));
  467. ++ckvi;
  468. EXPECT_THAT(ckvi, Eq(ckve));
  469. ++ci;
  470. ASSERT_THAT(ci, Ne(ce));
  471. node = llvm::dyn_cast<llvm::yaml::MappingNode>(&*ci);
  472. ASSERT_THAT(node, NotNull());
  473. ckvi = node->begin();
  474. EXPECT_THAT(&*ckvi, IsKeyValueScalars("node_index", "3"));
  475. ++ckvi;
  476. EXPECT_THAT(&*ckvi, IsKeyValueScalars("kind", "DeclarationEnd"));
  477. ++ckvi;
  478. EXPECT_THAT(&*ckvi, IsKeyValueScalars("text", ";"));
  479. ++ckvi;
  480. EXPECT_THAT(ckvi, Eq(node->end()));
  481. ++ci;
  482. EXPECT_THAT(ci, Eq(ce));
  483. ++nkvi;
  484. EXPECT_THAT(nkvi, Eq(nkve));
  485. ++ni;
  486. EXPECT_THAT(ni, Eq(ne));
  487. ++di;
  488. EXPECT_THAT(di, Eq(yaml_stream.end()));
  489. }
  490. } // namespace
  491. } // namespace Carbon