semantics_parse_tree_handler.cpp 22 KB

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