semantics_parse_tree_handler.cpp 25 KB

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