Track the ParseTree::Node with SemanticsNode. (#2407)

Longer term, I think this is going to be important as part of associating errors with code after the particular node has been processed, even though it isn't used here.
This commit is contained in:
Jon Ross-Perkins
2022-11-17 08:58:13 -08:00
committed by GitHub
parent 242b191317
commit 37dd968709
2 changed files with 57 additions and 35 deletions
@@ -200,14 +200,16 @@ auto SemanticsParseTreeHandler::HandleFunctionDefinition(
auto SemanticsParseTreeHandler::HandleFunctionDefinitionStart(
ParseTree::Node parse_node) -> void {
Pop(ParseNodeKind::ParameterList());
auto name = AddIdentifier(node_stack_.back().parse_node);
auto name_node = node_stack_.back().parse_node;
auto name = AddIdentifier(name_node);
node_stack_.pop_back();
auto fn_node = node_stack_.back().parse_node;
Pop(ParseNodeKind::FunctionIntroducer());
auto decl_id = AddNode(SemanticsNode::MakeFunctionDeclaration());
AddNode(SemanticsNode::MakeBindName(name, decl_id));
auto decl_id = AddNode(SemanticsNode::MakeFunctionDeclaration(fn_node));
AddNode(SemanticsNode::MakeBindName(name_node, name, decl_id));
auto block_id = semantics_->AddNodeBlock();
AddNode(SemanticsNode::MakeFunctionDefinition(decl_id, block_id));
AddNode(SemanticsNode::MakeFunctionDefinition(parse_node, decl_id, block_id));
node_block_stack_.push_back(block_id);
Push(parse_node);
}
@@ -221,7 +223,8 @@ auto SemanticsParseTreeHandler::HandleInfixOperator(ParseTree::Node 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));
Push(parse_node,
SemanticsNode::MakeBinaryOperatorAdd(parse_node, lhs_id, rhs_id));
break;
default:
CARBON_FATAL() << "Unrecognized token kind: " << token_kind.Name();
@@ -235,7 +238,7 @@ auto SemanticsParseTreeHandler::HandleLiteral(ParseTree::Node parse_node)
case TokenKind::IntegerLiteral(): {
auto id =
semantics_->AddIntegerLiteral(tokens_->GetIntegerLiteral(token));
Push(parse_node, SemanticsNode::MakeIntegerLiteral(id));
Push(parse_node, SemanticsNode::MakeIntegerLiteral(parse_node, id));
break;
}
default:
@@ -258,11 +261,11 @@ auto SemanticsParseTreeHandler::HandleReturnStatement(
if (parse_tree_->node_kind(node_stack_.back().parse_node) ==
ParseNodeKind::ReturnStatementStart()) {
Pop(ParseNodeKind::ReturnStatementStart());
Push(parse_node, SemanticsNode::MakeReturn());
Push(parse_node, SemanticsNode::MakeReturn(parse_node));
} else {
auto arg = PopWithResult();
Pop(ParseNodeKind::ReturnStatementStart());
Push(parse_node, SemanticsNode::MakeReturnExpression(arg));
Push(parse_node, SemanticsNode::MakeReturnExpression(parse_node, arg));
}
}