Start adding var decls to semantics. (#2447)

This is just the declaration, without initialization. Partly breaking it out because I'm changing the placeholder builtin types.

Might also need to separate out storage of the var from the name bind.
This commit is contained in:
Jon Ross-Perkins
2022-12-07 15:10:42 -08:00
committed by GitHub
parent 04f0288cd2
commit 30960d11a9
7 changed files with 130 additions and 17 deletions
@@ -98,14 +98,23 @@ auto SemanticsParseTreeHandler::Build() -> void {
HandleParameterList(parse_node);
break;
}
case ParseNodeKind::PatternBinding(): {
HandlePatternBinding(parse_node);
break;
}
case ParseNodeKind::ReturnStatement(): {
HandleReturnStatement(parse_node);
break;
}
case ParseNodeKind::VariableDeclaration(): {
HandleVariableDeclaration(parse_node);
break;
}
case ParseNodeKind::DeclaredName():
case ParseNodeKind::FunctionIntroducer():
case ParseNodeKind::ParameterListStart():
case ParseNodeKind::ReturnStatementStart(): {
case ParseNodeKind::ReturnStatementStart():
case ParseNodeKind::VariableIntroducer(): {
// The token has no action, but we still track it for the stack.
Push(parse_node);
break;
@@ -144,6 +153,16 @@ auto SemanticsParseTreeHandler::Push(ParseTree::Node parse_node,
node_stack_.push_back({parse_node, node_id});
}
auto SemanticsParseTreeHandler::Push(ParseTree::Node parse_node,
SemanticsNodeId node_id) -> void {
CARBON_VLOG() << "Push " << node_stack_.size() << ": "
<< parse_tree_->node_kind(parse_node) << " -> " << node_id
<< "\n";
CARBON_CHECK(node_stack_.size() < (1 << 20))
<< "Excessive stack size: likely infinite loop";
node_stack_.push_back({parse_node, node_id});
}
auto SemanticsParseTreeHandler::Pop(ParseNodeKind pop_parse_kind) -> void {
auto back = node_stack_.pop_back_val();
auto parse_kind = parse_tree_->node_kind(back.parse_node);
@@ -262,6 +281,13 @@ auto SemanticsParseTreeHandler::HandleLiteral(ParseTree::Node parse_node)
Push(parse_node, SemanticsNode::MakeRealLiteral(parse_node));
break;
}
case TokenKind::IntegerTypeLiteral(): {
auto text = tokens_->GetTokenText(token);
CARBON_CHECK(text == "i32") << "Currently only i32 is allowed";
Push(parse_node, SemanticsNodeId::MakeBuiltinReference(
SemanticsBuiltinKind::IntegerType()));
break;
}
default:
CARBON_FATAL() << "Unhandled kind: " << token_kind.Name();
}
@@ -277,6 +303,20 @@ auto SemanticsParseTreeHandler::HandleParameterList(ParseTree::Node parse_node)
Push(parse_node);
}
auto SemanticsParseTreeHandler::HandlePatternBinding(ParseTree::Node parse_node)
-> void {
// TODO: Create storage for the type, use that for the bind instead of the
// type itself.
auto type_id = PopWithResult();
auto name_node = node_stack_.back().parse_node;
auto name = AddIdentifier(name_node);
node_stack_.pop_back();
Push(parse_node,
AddNode(SemanticsNode::MakeBindName(name_node, name, type_id)));
}
auto SemanticsParseTreeHandler::HandleReturnStatement(
ParseTree::Node parse_node) -> void {
if (parse_tree_->node_kind(node_stack_.back().parse_node) ==
@@ -292,4 +332,13 @@ auto SemanticsParseTreeHandler::HandleReturnStatement(
}
}
auto SemanticsParseTreeHandler::HandleVariableDeclaration(
ParseTree::Node parse_node) -> void {
// TODO: Initializers would assign to the PatternBinding, but this code
// doesn't handle it right now.
PopWithResult();
Pop(ParseNodeKind::VariableIntroducer());
Push(parse_node);
}
} // namespace Carbon