|
|
@@ -2,9 +2,7 @@
|
|
|
// Exceptions. See /LICENSE for license information.
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
|
|
-#include "toolchain/semantics/semantics_ir_factory.h"
|
|
|
-
|
|
|
-#include <stack>
|
|
|
+#include "toolchain/semantics/semantics_parse_tree_handler.h"
|
|
|
|
|
|
#include "toolchain/lexer/token_kind.h"
|
|
|
#include "toolchain/lexer/tokenized_buffer.h"
|
|
|
@@ -13,18 +11,11 @@
|
|
|
|
|
|
namespace Carbon {
|
|
|
|
|
|
-auto SemanticsIRFactory::Build(const TokenizedBuffer& tokens,
|
|
|
- const ParseTree& parse_tree) -> SemanticsIR {
|
|
|
- SemanticsIRFactory builder(tokens, parse_tree);
|
|
|
- builder.Build();
|
|
|
- return builder.semantics_;
|
|
|
-}
|
|
|
-
|
|
|
-void SemanticsIRFactory::Build() {
|
|
|
- auto range = parse_tree().postorder();
|
|
|
+auto SemanticsParseTreeHandler::Build() -> void {
|
|
|
+ auto range = parse_tree_->postorder();
|
|
|
for (auto it = range.begin();; ++it) {
|
|
|
auto parse_node = *it;
|
|
|
- switch (auto parse_kind = parse_tree().node_kind(parse_node)) {
|
|
|
+ switch (auto parse_kind = parse_tree_->node_kind(parse_node)) {
|
|
|
case ParseNodeKind::DeclaredName(): {
|
|
|
HandleDeclaredName(parse_node);
|
|
|
break;
|
|
|
@@ -41,7 +32,7 @@ void SemanticsIRFactory::Build() {
|
|
|
++it;
|
|
|
CARBON_CHECK(it == range.end())
|
|
|
<< "FileEnd should always be last, found "
|
|
|
- << parse_tree().node_kind(*it);
|
|
|
+ << parse_tree_->node_kind(*it);
|
|
|
return;
|
|
|
}
|
|
|
case ParseNodeKind::InfixOperator(): {
|
|
|
@@ -76,43 +67,43 @@ void SemanticsIRFactory::Build() {
|
|
|
llvm_unreachable("Should always end at FileEnd");
|
|
|
}
|
|
|
|
|
|
-auto SemanticsIRFactory::HandleDeclaredName(ParseTree::Node parse_node)
|
|
|
+auto SemanticsParseTreeHandler::HandleDeclaredName(ParseTree::Node parse_node)
|
|
|
-> void {
|
|
|
- auto text = parse_tree().GetNodeText(parse_node);
|
|
|
- auto identifier_id = semantics_.AddIdentifier(text);
|
|
|
+ auto text = parse_tree_->GetNodeText(parse_node);
|
|
|
+ auto identifier_id = semantics_->AddIdentifier(text);
|
|
|
Push(parse_node, SemanticsNode::MakeIdentifier(identifier_id));
|
|
|
}
|
|
|
|
|
|
-auto SemanticsIRFactory::HandleFunctionDefinition(ParseTree::Node parse_node)
|
|
|
- -> void {
|
|
|
+auto SemanticsParseTreeHandler::HandleFunctionDefinition(
|
|
|
+ ParseTree::Node parse_node) -> void {
|
|
|
// Merges code block children up under the FunctionDefinitionStart.
|
|
|
- while (parse_tree().node_kind(node_stack_.back().parse_node) !=
|
|
|
+ while (parse_tree_->node_kind(node_stack_.back().parse_node) !=
|
|
|
ParseNodeKind::FunctionDefinitionStart()) {
|
|
|
node_stack_.pop_back();
|
|
|
}
|
|
|
Pop(ParseNodeKind::FunctionDefinitionStart());
|
|
|
- semantics_.AddNode(SemanticsNode::MakeFunctionDefinitionEnd());
|
|
|
+ semantics_->AddNode(SemanticsNode::MakeFunctionDefinitionEnd());
|
|
|
Push(parse_node);
|
|
|
}
|
|
|
|
|
|
-auto SemanticsIRFactory::HandleFunctionDefinitionStart(
|
|
|
+auto SemanticsParseTreeHandler::HandleFunctionDefinitionStart(
|
|
|
ParseTree::Node parse_node) -> void {
|
|
|
Pop(ParseNodeKind::ParameterList());
|
|
|
auto name_node_id = PopWithResult(ParseNodeKind::DeclaredName());
|
|
|
Pop(ParseNodeKind::FunctionIntroducer());
|
|
|
auto decl_id =
|
|
|
- semantics_.AddNode(SemanticsNode::MakeFunctionDeclaration(name_node_id));
|
|
|
- semantics_.AddNode(SemanticsNode::MakeFunctionDefinitionStart(decl_id));
|
|
|
+ semantics_->AddNode(SemanticsNode::MakeFunctionDeclaration(name_node_id));
|
|
|
+ semantics_->AddNode(SemanticsNode::MakeFunctionDefinitionStart(decl_id));
|
|
|
Push(parse_node);
|
|
|
}
|
|
|
|
|
|
-auto SemanticsIRFactory::HandleInfixOperator(ParseTree::Node parse_node)
|
|
|
+auto SemanticsParseTreeHandler::HandleInfixOperator(ParseTree::Node parse_node)
|
|
|
-> void {
|
|
|
auto rhs_id = PopWithResult();
|
|
|
auto lhs_id = PopWithResult();
|
|
|
|
|
|
// Figure out the operator for the token.
|
|
|
- auto token = parse_tree().node_token(parse_node);
|
|
|
+ auto token = parse_tree_->node_token(parse_node);
|
|
|
switch (auto token_kind = tokens_->GetKind(token)) {
|
|
|
case TokenKind::Plus():
|
|
|
Push(parse_node, SemanticsNode::MakeBinaryOperatorAdd(lhs_id, rhs_id));
|
|
|
@@ -122,11 +113,13 @@ auto SemanticsIRFactory::HandleInfixOperator(ParseTree::Node parse_node)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-auto SemanticsIRFactory::HandleLiteral(ParseTree::Node parse_node) -> void {
|
|
|
- auto token = parse_tree().node_token(parse_node);
|
|
|
+auto SemanticsParseTreeHandler::HandleLiteral(ParseTree::Node parse_node)
|
|
|
+ -> void {
|
|
|
+ auto token = parse_tree_->node_token(parse_node);
|
|
|
switch (auto token_kind = tokens_->GetKind(token)) {
|
|
|
case TokenKind::IntegerLiteral(): {
|
|
|
- auto id = semantics_.AddIntegerLiteral(tokens_->GetIntegerLiteral(token));
|
|
|
+ auto id =
|
|
|
+ semantics_->AddIntegerLiteral(tokens_->GetIntegerLiteral(token));
|
|
|
Push(parse_node, SemanticsNode::MakeIntegerLiteral(id));
|
|
|
break;
|
|
|
}
|
|
|
@@ -135,7 +128,7 @@ auto SemanticsIRFactory::HandleLiteral(ParseTree::Node parse_node) -> void {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-auto SemanticsIRFactory::HandleParameterList(ParseTree::Node parse_node)
|
|
|
+auto SemanticsParseTreeHandler::HandleParameterList(ParseTree::Node parse_node)
|
|
|
-> void {
|
|
|
// TODO: This should transform into a usable parameter list. For now
|
|
|
// it's unused and only stored so that node counts match.
|
|
|
@@ -145,13 +138,13 @@ auto SemanticsIRFactory::HandleParameterList(ParseTree::Node parse_node)
|
|
|
Push(parse_node);
|
|
|
}
|
|
|
|
|
|
-auto SemanticsIRFactory::HandleReturnStatement(ParseTree::Node parse_node)
|
|
|
- -> void {
|
|
|
+auto SemanticsParseTreeHandler::HandleReturnStatement(
|
|
|
+ ParseTree::Node parse_node) -> void {
|
|
|
Pop(ParseNodeKind::StatementEnd());
|
|
|
|
|
|
// TODO: Restructure ReturnStatement so that we can do this without
|
|
|
// looking at the subtree size.
|
|
|
- if (parse_tree().node_subtree_size(parse_node) == 2) {
|
|
|
+ if (parse_tree_->node_subtree_size(parse_node) == 2) {
|
|
|
Push(parse_node, SemanticsNode::MakeReturn());
|
|
|
} else {
|
|
|
auto arg = PopWithResult();
|