mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-29 22:02:42 +01:00
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:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user