semantics_parse_tree_handler.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  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 "toolchain/semantics/semantics_parse_tree_handler.h"
  5. #include "common/vlog.h"
  6. #include "llvm/Support/PrettyStackTrace.h"
  7. #include "toolchain/lexer/token_kind.h"
  8. #include "toolchain/lexer/tokenized_buffer.h"
  9. #include "toolchain/parser/parse_node_kind.h"
  10. #include "toolchain/semantics/semantics_builtin_kind.h"
  11. #include "toolchain/semantics/semantics_node.h"
  12. namespace Carbon {
  13. class SemanticsParseTreeHandler::PrettyStackTraceNodeStack
  14. : public llvm::PrettyStackTraceEntry {
  15. public:
  16. explicit PrettyStackTraceNodeStack(const SemanticsParseTreeHandler* handler)
  17. : handler_(handler) {}
  18. ~PrettyStackTraceNodeStack() override = default;
  19. auto print(llvm::raw_ostream& output) const -> void override {
  20. handler_->node_stack_.PrintForStackDump(output);
  21. }
  22. private:
  23. const SemanticsParseTreeHandler* handler_;
  24. };
  25. class SemanticsParseTreeHandler::PrettyStackTraceNodeBlockStack
  26. : public llvm::PrettyStackTraceEntry {
  27. public:
  28. explicit PrettyStackTraceNodeBlockStack(
  29. const SemanticsParseTreeHandler* handler)
  30. : handler_(handler) {}
  31. ~PrettyStackTraceNodeBlockStack() override = default;
  32. auto print(llvm::raw_ostream& output) const -> void override {
  33. output << "node_block_stack_:\n";
  34. for (int i = 0; i < static_cast<int>(handler_->node_block_stack_.size());
  35. ++i) {
  36. const auto& entry = handler_->node_block_stack_[i];
  37. output << "\t" << i << ".\t" << entry << "\n";
  38. }
  39. }
  40. private:
  41. const SemanticsParseTreeHandler* handler_;
  42. };
  43. auto SemanticsParseTreeHandler::Build() -> void {
  44. PrettyStackTraceNodeStack pretty_node_stack(this);
  45. PrettyStackTraceNodeBlockStack pretty_node_block_stack(this);
  46. // Add a block for the ParseTree.
  47. node_block_stack_.push_back(semantics_->AddNodeBlock());
  48. PushScope();
  49. for (auto parse_node : parse_tree_->postorder()) {
  50. switch (auto parse_kind = parse_tree_->node_kind(parse_node)) {
  51. #define CARBON_PARSE_NODE_KIND(Name) \
  52. case ParseNodeKind::Name: { \
  53. Handle##Name(parse_node); \
  54. break; \
  55. }
  56. #include "toolchain/parser/parse_node_kind.def"
  57. }
  58. }
  59. node_block_stack_.pop_back();
  60. CARBON_CHECK(node_block_stack_.empty()) << node_block_stack_.size();
  61. PopScope();
  62. CARBON_CHECK(name_lookup_.empty()) << name_lookup_.size();
  63. CARBON_CHECK(scope_stack_.empty()) << scope_stack_.size();
  64. }
  65. auto SemanticsParseTreeHandler::AddNode(SemanticsNode node) -> SemanticsNodeId {
  66. CARBON_VLOG() << "AddNode " << current_block_id() << ": " << node << "\n";
  67. return semantics_->AddNode(current_block_id(), node);
  68. }
  69. auto SemanticsParseTreeHandler::AddNodeAndPush(ParseTree::Node parse_node,
  70. SemanticsNode node) -> void {
  71. auto node_id = AddNode(node);
  72. node_stack_.Push(parse_node, node_id);
  73. }
  74. auto SemanticsParseTreeHandler::BindName(ParseTree::Node name_node,
  75. SemanticsNodeId type_id,
  76. SemanticsNodeId target_id)
  77. -> SemanticsStringId {
  78. CARBON_CHECK(parse_tree_->node_kind(name_node) == ParseNodeKind::DeclaredName)
  79. << parse_tree_->node_kind(name_node);
  80. auto name_str = parse_tree_->GetNodeText(name_node);
  81. auto name_id = semantics_->AddString(name_str);
  82. AddNode(SemanticsNode::MakeBindName(name_node, type_id, name_id, target_id));
  83. auto [it, inserted] = current_scope().names.insert(name_id);
  84. if (inserted) {
  85. name_lookup_[name_id].push_back(target_id);
  86. } else {
  87. CARBON_DIAGNOSTIC(NameRedefined, Error, "Redefining {0} in the same scope.",
  88. llvm::StringRef);
  89. CARBON_DIAGNOSTIC(PreviousDefinition, Note, "Previous definition is here.");
  90. auto prev_def_id = name_lookup_[name_id].back();
  91. auto prev_def = semantics_->GetNode(prev_def_id);
  92. emitter_->Build(name_node, NameRedefined, name_str)
  93. .Note(prev_def.parse_node(), PreviousDefinition)
  94. .Emit();
  95. }
  96. return name_id;
  97. }
  98. auto SemanticsParseTreeHandler::PushScope() -> void {
  99. scope_stack_.push_back({});
  100. }
  101. auto SemanticsParseTreeHandler::PopScope() -> void {
  102. auto scope = scope_stack_.pop_back_val();
  103. for (const auto& str_id : scope.names) {
  104. auto it = name_lookup_.find(str_id);
  105. if (it->second.size() == 1) {
  106. // Erase names that no longer resolve.
  107. name_lookup_.erase(it);
  108. } else {
  109. it->second.pop_back();
  110. }
  111. }
  112. }
  113. auto SemanticsParseTreeHandler::TryTypeConversion(ParseTree::Node parse_node,
  114. SemanticsNodeId lhs_id,
  115. SemanticsNodeId rhs_id,
  116. bool /*can_convert_lhs*/)
  117. -> SemanticsNodeId {
  118. auto lhs_type = semantics_->GetType(lhs_id);
  119. auto rhs_type = semantics_->GetType(rhs_id);
  120. // TODO: This should attempt a type conversion, but there's not enough
  121. // implemented to do that right now.
  122. if (lhs_type != rhs_type) {
  123. auto invalid_type = SemanticsNodeId::MakeBuiltinReference(
  124. SemanticsBuiltinKind::InvalidType);
  125. if (lhs_type != invalid_type && rhs_type != invalid_type) {
  126. // TODO: This is a poor diagnostic, and should be expanded.
  127. CARBON_DIAGNOSTIC(TypeMismatch, Error,
  128. "Type mismatch: lhs is {0}, rhs is {1}",
  129. SemanticsNodeId, SemanticsNodeId);
  130. emitter_->Emit(parse_node, TypeMismatch, lhs_type, rhs_type);
  131. }
  132. return invalid_type;
  133. }
  134. return lhs_type;
  135. }
  136. auto SemanticsParseTreeHandler::HandleAddress(ParseTree::Node /*parse_node*/)
  137. -> void {
  138. CARBON_FATAL() << "TODO";
  139. }
  140. auto SemanticsParseTreeHandler::HandleBreakStatement(
  141. ParseTree::Node /*parse_node*/) -> void {
  142. CARBON_FATAL() << "TODO";
  143. }
  144. auto SemanticsParseTreeHandler::HandleBreakStatementStart(
  145. ParseTree::Node /*parse_node*/) -> void {
  146. CARBON_FATAL() << "TODO";
  147. }
  148. auto SemanticsParseTreeHandler::HandleCallExpression(
  149. ParseTree::Node /*parse_node*/) -> void {
  150. CARBON_FATAL() << "TODO";
  151. }
  152. auto SemanticsParseTreeHandler::HandleCallExpressionComma(
  153. ParseTree::Node /*parse_node*/) -> void {
  154. CARBON_FATAL() << "TODO";
  155. }
  156. auto SemanticsParseTreeHandler::HandleCallExpressionStart(
  157. ParseTree::Node /*parse_node*/) -> void {
  158. CARBON_FATAL() << "TODO";
  159. }
  160. auto SemanticsParseTreeHandler::HandleCodeBlock(ParseTree::Node /*parse_node*/)
  161. -> void {
  162. CARBON_FATAL() << "TODO";
  163. }
  164. auto SemanticsParseTreeHandler::HandleCodeBlockStart(
  165. ParseTree::Node /*parse_node*/) -> void {
  166. CARBON_FATAL() << "TODO";
  167. }
  168. auto SemanticsParseTreeHandler::HandleContinueStatement(
  169. ParseTree::Node /*parse_node*/) -> void {
  170. CARBON_FATAL() << "TODO";
  171. }
  172. auto SemanticsParseTreeHandler::HandleContinueStatementStart(
  173. ParseTree::Node /*parse_node*/) -> void {
  174. CARBON_FATAL() << "TODO";
  175. }
  176. auto SemanticsParseTreeHandler::HandleDeclaredName(ParseTree::Node parse_node)
  177. -> void {
  178. // The parent is responsible for binding the name.
  179. node_stack_.Push(parse_node);
  180. }
  181. auto SemanticsParseTreeHandler::HandleDeducedParameterList(
  182. ParseTree::Node /*parse_node*/) -> void {
  183. CARBON_FATAL() << "TODO";
  184. }
  185. auto SemanticsParseTreeHandler::HandleDeducedParameterListStart(
  186. ParseTree::Node /*parse_node*/) -> void {
  187. CARBON_FATAL() << "TODO";
  188. }
  189. auto SemanticsParseTreeHandler::HandleDesignatedName(
  190. ParseTree::Node /*parse_node*/) -> void {
  191. CARBON_FATAL() << "TODO";
  192. }
  193. auto SemanticsParseTreeHandler::HandleDesignatorExpression(
  194. ParseTree::Node /*parse_node*/) -> void {
  195. CARBON_FATAL() << "TODO";
  196. }
  197. auto SemanticsParseTreeHandler::HandleEmptyDeclaration(
  198. ParseTree::Node parse_node) -> void {
  199. // Empty declarations have no actions associated, but we still balance the
  200. // tree.
  201. node_stack_.Push(parse_node);
  202. }
  203. auto SemanticsParseTreeHandler::HandleExpressionStatement(
  204. ParseTree::Node parse_node) -> void {
  205. // Pop the expression without investigating its contents.
  206. // TODO: This will probably eventually need to do some "do not discard"
  207. // analysis.
  208. node_stack_.PopAndIgnore();
  209. node_stack_.Push(parse_node);
  210. }
  211. auto SemanticsParseTreeHandler::HandleFileEnd(ParseTree::Node /*parse_node*/)
  212. -> void {
  213. // Do nothing, no need to balance this node.
  214. }
  215. auto SemanticsParseTreeHandler::HandleForHeader(ParseTree::Node /*parse_node*/)
  216. -> void {
  217. CARBON_FATAL() << "TODO";
  218. }
  219. auto SemanticsParseTreeHandler::HandleForHeaderStart(
  220. ParseTree::Node /*parse_node*/) -> void {
  221. CARBON_FATAL() << "TODO";
  222. }
  223. auto SemanticsParseTreeHandler::HandleForIn(ParseTree::Node /*parse_node*/)
  224. -> void {
  225. CARBON_FATAL() << "TODO";
  226. }
  227. auto SemanticsParseTreeHandler::HandleForStatement(
  228. ParseTree::Node /*parse_node*/) -> void {
  229. CARBON_FATAL() << "TODO";
  230. }
  231. auto SemanticsParseTreeHandler::HandleFunctionDeclaration(
  232. ParseTree::Node /*parse_node*/) -> void {
  233. CARBON_FATAL() << "TODO";
  234. }
  235. auto SemanticsParseTreeHandler::HandleFunctionDefinition(
  236. ParseTree::Node parse_node) -> void {
  237. // Merges code block children up under the FunctionDefinitionStart.
  238. while (parse_tree_->node_kind(node_stack_.PeekParseNode()) !=
  239. ParseNodeKind::FunctionDefinitionStart) {
  240. node_stack_.PopAndIgnore();
  241. }
  242. node_stack_.PopAndIgnore();
  243. PopScope();
  244. node_block_stack_.pop_back();
  245. node_stack_.Push(parse_node);
  246. }
  247. auto SemanticsParseTreeHandler::HandleFunctionDefinitionStart(
  248. ParseTree::Node parse_node) -> void {
  249. node_stack_.PopAndDiscardSoloParseNode(ParseNodeKind::ParameterList);
  250. auto name_node = node_stack_.PopForSoloParseNode(ParseNodeKind::DeclaredName);
  251. auto fn_node =
  252. node_stack_.PopForSoloParseNode(ParseNodeKind::FunctionIntroducer);
  253. auto decl_id = AddNode(SemanticsNode::MakeFunctionDeclaration(fn_node));
  254. // TODO: Propagate the type of the function.
  255. BindName(name_node, SemanticsNodeId::MakeInvalid(), decl_id);
  256. auto block_id = semantics_->AddNodeBlock();
  257. AddNode(SemanticsNode::MakeFunctionDefinition(parse_node, decl_id, block_id));
  258. node_block_stack_.push_back(block_id);
  259. PushScope();
  260. node_stack_.Push(parse_node);
  261. }
  262. auto SemanticsParseTreeHandler::HandleFunctionIntroducer(
  263. ParseTree::Node parse_node) -> void {
  264. // No action, just a bracketing node.
  265. node_stack_.Push(parse_node);
  266. }
  267. auto SemanticsParseTreeHandler::HandleIfCondition(
  268. ParseTree::Node /*parse_node*/) -> void {
  269. CARBON_FATAL() << "TODO";
  270. }
  271. auto SemanticsParseTreeHandler::HandleIfConditionStart(
  272. ParseTree::Node /*parse_node*/) -> void {
  273. CARBON_FATAL() << "TODO";
  274. }
  275. auto SemanticsParseTreeHandler::HandleIfStatement(
  276. ParseTree::Node /*parse_node*/) -> void {
  277. CARBON_FATAL() << "TODO";
  278. }
  279. auto SemanticsParseTreeHandler::HandleIfStatementElse(
  280. ParseTree::Node /*parse_node*/) -> void {
  281. CARBON_FATAL() << "TODO";
  282. }
  283. auto SemanticsParseTreeHandler::HandleInfixOperator(ParseTree::Node parse_node)
  284. -> void {
  285. auto rhs_id = node_stack_.PopForNodeId();
  286. auto lhs_id = node_stack_.PopForNodeId();
  287. SemanticsNodeId result_type =
  288. TryTypeConversion(parse_node, lhs_id, rhs_id, /*can_convert_lhs=*/true);
  289. // Figure out the operator for the token.
  290. auto token = parse_tree_->node_token(parse_node);
  291. switch (auto token_kind = tokens_->GetKind(token)) {
  292. case TokenKind::Plus:
  293. AddNodeAndPush(parse_node, SemanticsNode::MakeBinaryOperatorAdd(
  294. parse_node, result_type, lhs_id, rhs_id));
  295. break;
  296. default:
  297. CARBON_FATAL() << "Unrecognized token kind: " << token_kind;
  298. }
  299. }
  300. auto SemanticsParseTreeHandler::HandleInterfaceBody(
  301. ParseTree::Node /*parse_node*/) -> void {
  302. CARBON_FATAL() << "TODO";
  303. }
  304. auto SemanticsParseTreeHandler::HandleInterfaceBodyStart(
  305. ParseTree::Node /*parse_node*/) -> void {
  306. CARBON_FATAL() << "TODO";
  307. }
  308. auto SemanticsParseTreeHandler::HandleInterfaceDefinition(
  309. ParseTree::Node /*parse_node*/) -> void {
  310. CARBON_FATAL() << "TODO";
  311. }
  312. auto SemanticsParseTreeHandler::HandleLiteral(ParseTree::Node parse_node)
  313. -> void {
  314. auto token = parse_tree_->node_token(parse_node);
  315. switch (auto token_kind = tokens_->GetKind(token)) {
  316. case TokenKind::IntegerLiteral: {
  317. auto id =
  318. semantics_->AddIntegerLiteral(tokens_->GetIntegerLiteral(token));
  319. AddNodeAndPush(parse_node,
  320. SemanticsNode::MakeIntegerLiteral(parse_node, id));
  321. break;
  322. }
  323. case TokenKind::RealLiteral: {
  324. // TODO: Add storage of the Real literal.
  325. AddNodeAndPush(parse_node, SemanticsNode::MakeRealLiteral(parse_node));
  326. break;
  327. }
  328. case TokenKind::IntegerTypeLiteral: {
  329. auto text = tokens_->GetTokenText(token);
  330. CARBON_CHECK(text == "i32") << "Currently only i32 is allowed";
  331. node_stack_.Push(parse_node, SemanticsNodeId::MakeBuiltinReference(
  332. SemanticsBuiltinKind::IntegerType));
  333. break;
  334. }
  335. default:
  336. CARBON_FATAL() << "Unhandled kind: " << token_kind;
  337. }
  338. }
  339. auto SemanticsParseTreeHandler::HandleNameReference(ParseTree::Node parse_node)
  340. -> void {
  341. auto name_str = parse_tree_->GetNodeText(parse_node);
  342. auto name_not_found = [&] {
  343. CARBON_DIAGNOSTIC(NameNotFound, Error, "Name {0} not found",
  344. llvm::StringRef);
  345. emitter_->Emit(parse_node, NameNotFound, name_str);
  346. node_stack_.Push(parse_node, SemanticsNodeId::MakeBuiltinReference(
  347. SemanticsBuiltinKind::InvalidType));
  348. };
  349. auto name_id = semantics_->GetString(name_str);
  350. if (!name_id) {
  351. name_not_found();
  352. return;
  353. }
  354. auto it = name_lookup_.find(*name_id);
  355. if (it == name_lookup_.end()) {
  356. name_not_found();
  357. return;
  358. }
  359. CARBON_CHECK(!it->second.empty()) << "Should have been erased: " << name_str;
  360. // TODO: Check for ambiguous lookups.
  361. node_stack_.Push(parse_node, it->second.back());
  362. }
  363. auto SemanticsParseTreeHandler::HandlePackageApi(ParseTree::Node /*parse_node*/)
  364. -> void {
  365. CARBON_FATAL() << "TODO";
  366. }
  367. auto SemanticsParseTreeHandler::HandlePackageDirective(
  368. ParseTree::Node /*parse_node*/) -> void {
  369. CARBON_FATAL() << "TODO";
  370. }
  371. auto SemanticsParseTreeHandler::HandlePackageImpl(
  372. ParseTree::Node /*parse_node*/) -> void {
  373. CARBON_FATAL() << "TODO";
  374. }
  375. auto SemanticsParseTreeHandler::HandlePackageIntroducer(
  376. ParseTree::Node /*parse_node*/) -> void {
  377. CARBON_FATAL() << "TODO";
  378. }
  379. auto SemanticsParseTreeHandler::HandlePackageLibrary(
  380. ParseTree::Node /*parse_node*/) -> void {
  381. CARBON_FATAL() << "TODO";
  382. }
  383. auto SemanticsParseTreeHandler::HandleParameterList(ParseTree::Node parse_node)
  384. -> void {
  385. // TODO: This should transform into a usable parameter list. For now
  386. // it's unused and only stored so that node counts match.
  387. node_stack_.PopAndDiscardSoloParseNode(ParseNodeKind::ParameterListStart);
  388. node_stack_.Push(parse_node);
  389. }
  390. auto SemanticsParseTreeHandler::HandleParameterListComma(
  391. ParseTree::Node /*parse_node*/) -> void {
  392. CARBON_FATAL() << "TODO";
  393. }
  394. auto SemanticsParseTreeHandler::HandleParameterListStart(
  395. ParseTree::Node parse_node) -> void {
  396. // TODO: See HandleParameterList.
  397. node_stack_.Push(parse_node);
  398. }
  399. auto SemanticsParseTreeHandler::HandleParenExpression(
  400. ParseTree::Node /*parse_node*/) -> void {
  401. CARBON_FATAL() << "TODO";
  402. }
  403. auto SemanticsParseTreeHandler::HandleParenExpressionOrTupleLiteralStart(
  404. ParseTree::Node /*parse_node*/) -> void {
  405. CARBON_FATAL() << "TODO";
  406. }
  407. auto SemanticsParseTreeHandler::HandlePatternBinding(ParseTree::Node parse_node)
  408. -> void {
  409. auto type = node_stack_.PopForNodeId();
  410. // Get the name.
  411. auto name_node = node_stack_.PopForSoloParseNode();
  412. // Allocate storage, linked to the name for error locations.
  413. auto storage_id = AddNode(SemanticsNode::MakeVarStorage(name_node, type));
  414. // Bind the name to storage.
  415. auto name_id = BindName(name_node, type, storage_id);
  416. // If this node's result is used, it'll be for either the name or the storage
  417. // address. The storage address can be found through the name, so we push the
  418. // name.
  419. node_stack_.Push(parse_node, name_id);
  420. }
  421. auto SemanticsParseTreeHandler::HandlePostfixOperator(
  422. ParseTree::Node /*parse_node*/) -> void {
  423. CARBON_FATAL() << "TODO";
  424. }
  425. auto SemanticsParseTreeHandler::HandlePrefixOperator(
  426. ParseTree::Node /*parse_node*/) -> void {
  427. CARBON_FATAL() << "TODO";
  428. }
  429. auto SemanticsParseTreeHandler::HandleReturnStatement(
  430. ParseTree::Node parse_node) -> void {
  431. if (parse_tree_->node_kind(node_stack_.PeekParseNode()) ==
  432. ParseNodeKind::ReturnStatementStart) {
  433. node_stack_.PopAndDiscardSoloParseNode(ParseNodeKind::ReturnStatementStart);
  434. AddNodeAndPush(parse_node, SemanticsNode::MakeReturn(parse_node));
  435. } else {
  436. auto arg = node_stack_.PopForNodeId();
  437. auto arg_type = semantics_->GetType(arg);
  438. node_stack_.PopAndDiscardSoloParseNode(ParseNodeKind::ReturnStatementStart);
  439. AddNodeAndPush(parse_node, SemanticsNode::MakeReturnExpression(
  440. parse_node, arg_type, arg));
  441. }
  442. }
  443. auto SemanticsParseTreeHandler::HandleReturnStatementStart(
  444. ParseTree::Node parse_node) -> void {
  445. // No action, just a bracketing node.
  446. node_stack_.Push(parse_node);
  447. }
  448. auto SemanticsParseTreeHandler::HandleReturnType(ParseTree::Node /*parse_node*/)
  449. -> void {
  450. CARBON_FATAL() << "TODO";
  451. }
  452. auto SemanticsParseTreeHandler::HandleSelfDeducedParameter(
  453. ParseTree::Node /*parse_node*/) -> void {
  454. CARBON_FATAL() << "TODO";
  455. }
  456. auto SemanticsParseTreeHandler::HandleSelfType(ParseTree::Node /*parse_node*/)
  457. -> void {
  458. CARBON_FATAL() << "TODO";
  459. }
  460. auto SemanticsParseTreeHandler::HandleStructComma(
  461. ParseTree::Node /*parse_node*/) -> void {
  462. CARBON_FATAL() << "TODO";
  463. }
  464. auto SemanticsParseTreeHandler::HandleStructFieldDesignator(
  465. ParseTree::Node /*parse_node*/) -> void {
  466. CARBON_FATAL() << "TODO";
  467. }
  468. auto SemanticsParseTreeHandler::HandleStructFieldType(
  469. ParseTree::Node /*parse_node*/) -> void {
  470. CARBON_FATAL() << "TODO";
  471. }
  472. auto SemanticsParseTreeHandler::HandleStructFieldUnknown(
  473. ParseTree::Node /*parse_node*/) -> void {
  474. CARBON_FATAL() << "TODO";
  475. }
  476. auto SemanticsParseTreeHandler::HandleStructFieldValue(
  477. ParseTree::Node /*parse_node*/) -> void {
  478. CARBON_FATAL() << "TODO";
  479. }
  480. auto SemanticsParseTreeHandler::HandleStructLiteral(
  481. ParseTree::Node /*parse_node*/) -> void {
  482. CARBON_FATAL() << "TODO";
  483. }
  484. auto SemanticsParseTreeHandler::HandleStructLiteralOrStructTypeLiteralStart(
  485. ParseTree::Node /*parse_node*/) -> void {
  486. CARBON_FATAL() << "TODO";
  487. }
  488. auto SemanticsParseTreeHandler::HandleStructTypeLiteral(
  489. ParseTree::Node /*parse_node*/) -> void {
  490. CARBON_FATAL() << "TODO";
  491. }
  492. auto SemanticsParseTreeHandler::HandleTupleLiteral(
  493. ParseTree::Node /*parse_node*/) -> void {
  494. CARBON_FATAL() << "TODO";
  495. }
  496. auto SemanticsParseTreeHandler::HandleTupleLiteralComma(
  497. ParseTree::Node /*parse_node*/) -> void {
  498. CARBON_FATAL() << "TODO";
  499. }
  500. auto SemanticsParseTreeHandler::HandleVariableDeclaration(
  501. ParseTree::Node parse_node) -> void {
  502. auto last_child = node_stack_.PopForParseNodeAndNodeId();
  503. if (parse_tree_->node_kind(last_child.first) !=
  504. ParseNodeKind::PatternBinding) {
  505. auto storage_id =
  506. node_stack_.PopForNodeId(ParseNodeKind::VariableInitializer);
  507. auto binding = node_stack_.PopForParseNodeAndNameId();
  508. CARBON_CHECK(parse_tree_->node_kind(binding.first) ==
  509. ParseNodeKind::PatternBinding);
  510. CARBON_CHECK(binding.second.is_valid());
  511. // Restore the name now that the initializer is complete.
  512. AddNameToLookup(binding.second, storage_id);
  513. auto storage_type =
  514. TryTypeConversion(parse_node, storage_id, last_child.second,
  515. /*can_convert_lhs=*/false);
  516. AddNode(SemanticsNode::MakeAssign(parse_node, storage_type, storage_id,
  517. last_child.second));
  518. }
  519. node_stack_.PopAndDiscardSoloParseNode(ParseNodeKind::VariableIntroducer);
  520. node_stack_.Push(parse_node);
  521. }
  522. auto SemanticsParseTreeHandler::HandleVariableIntroducer(
  523. ParseTree::Node parse_node) -> void {
  524. // No action, just a bracketing node.
  525. node_stack_.Push(parse_node);
  526. }
  527. auto SemanticsParseTreeHandler::HandleVariableInitializer(
  528. ParseTree::Node parse_node) -> void {
  529. // Temporarily remove name lookup entries added by the `var`. These will be
  530. // restored by `VariableDeclaration`.
  531. // Save the storage ID.
  532. auto it = name_lookup_.find(node_stack_.PeekForNameId());
  533. CARBON_CHECK(it != name_lookup_.end());
  534. CARBON_CHECK(!it->second.empty());
  535. auto storage_id = it->second.back();
  536. // Pop the name from lookup.
  537. if (it->second.size() == 1) {
  538. // Erase names that no longer resolve.
  539. name_lookup_.erase(it);
  540. } else {
  541. it->second.pop_back();
  542. }
  543. node_stack_.Push(parse_node, storage_id);
  544. }
  545. auto SemanticsParseTreeHandler::HandleWhileCondition(
  546. ParseTree::Node /*parse_node*/) -> void {
  547. CARBON_FATAL() << "TODO";
  548. }
  549. auto SemanticsParseTreeHandler::HandleWhileConditionStart(
  550. ParseTree::Node /*parse_node*/) -> void {
  551. CARBON_FATAL() << "TODO";
  552. }
  553. auto SemanticsParseTreeHandler::HandleWhileStatement(
  554. ParseTree::Node /*parse_node*/) -> void {
  555. CARBON_FATAL() << "TODO";
  556. }
  557. } // namespace Carbon