Put check stage handle functions in execution order (#3573)

No changes other than moving code and adding section comments.
This commit is contained in:
josh11b
2024-01-09 02:46:10 +00:00
committed by GitHub
parent a196b9840f
commit 0b9e73ab07
8 changed files with 223 additions and 211 deletions
+75 -63
View File
@@ -7,69 +7,8 @@
namespace Carbon::Check {
auto HandleBreakStatement(Context& /*context*/,
Parse::BreakStatementId /*parse_node*/) -> bool {
return true;
}
auto HandleBreakStatementStart(Context& context,
Parse::BreakStatementStartId parse_node)
-> bool {
auto& stack = context.break_continue_stack();
if (stack.empty()) {
CARBON_DIAGNOSTIC(BreakOutsideLoop, Error,
"`break` can only be used in a loop.");
context.emitter().Emit(parse_node, BreakOutsideLoop);
} else {
context.AddInst(SemIR::Branch{parse_node, stack.back().break_target});
}
context.inst_block_stack().Pop();
context.inst_block_stack().PushUnreachable();
return true;
}
auto HandleContinueStatement(Context& /*context*/,
Parse::ContinueStatementId /*parse_node*/)
-> bool {
return true;
}
auto HandleContinueStatementStart(Context& context,
Parse::ContinueStatementStartId parse_node)
-> bool {
auto& stack = context.break_continue_stack();
if (stack.empty()) {
CARBON_DIAGNOSTIC(ContinueOutsideLoop, Error,
"`continue` can only be used in a loop.");
context.emitter().Emit(parse_node, ContinueOutsideLoop);
} else {
context.AddInst(SemIR::Branch{parse_node, stack.back().continue_target});
}
context.inst_block_stack().Pop();
context.inst_block_stack().PushUnreachable();
return true;
}
auto HandleForHeader(Context& context, Parse::ForHeaderId parse_node) -> bool {
return context.TODO(parse_node, "HandleForHeader");
}
auto HandleForHeaderStart(Context& context, Parse::ForHeaderStartId parse_node)
-> bool {
return context.TODO(parse_node, "HandleForHeaderStart");
}
auto HandleForIn(Context& context, Parse::ForInId parse_node) -> bool {
context.decl_state_stack().Pop(DeclState::Var);
return context.TODO(parse_node, "HandleForIn");
}
auto HandleForStatement(Context& context, Parse::ForStatementId parse_node)
-> bool {
return context.TODO(parse_node, "HandleForStatement");
}
// `while`
// -------
auto HandleWhileConditionStart(Context& context,
Parse::WhileConditionStartId parse_node)
@@ -129,4 +68,77 @@ auto HandleWhileStatement(Context& context, Parse::WhileStatementId parse_node)
return true;
}
// `for`
// -----
auto HandleForHeaderStart(Context& context, Parse::ForHeaderStartId parse_node)
-> bool {
return context.TODO(parse_node, "HandleForHeaderStart");
}
auto HandleForIn(Context& context, Parse::ForInId parse_node) -> bool {
context.decl_state_stack().Pop(DeclState::Var);
return context.TODO(parse_node, "HandleForIn");
}
auto HandleForHeader(Context& context, Parse::ForHeaderId parse_node) -> bool {
return context.TODO(parse_node, "HandleForHeader");
}
auto HandleForStatement(Context& context, Parse::ForStatementId parse_node)
-> bool {
return context.TODO(parse_node, "HandleForStatement");
}
// `break`
// -------
auto HandleBreakStatementStart(Context& context,
Parse::BreakStatementStartId parse_node)
-> bool {
auto& stack = context.break_continue_stack();
if (stack.empty()) {
CARBON_DIAGNOSTIC(BreakOutsideLoop, Error,
"`break` can only be used in a loop.");
context.emitter().Emit(parse_node, BreakOutsideLoop);
} else {
context.AddInst(SemIR::Branch{parse_node, stack.back().break_target});
}
context.inst_block_stack().Pop();
context.inst_block_stack().PushUnreachable();
return true;
}
auto HandleBreakStatement(Context& /*context*/,
Parse::BreakStatementId /*parse_node*/) -> bool {
return true;
}
// `continue`
// ----------
auto HandleContinueStatementStart(Context& context,
Parse::ContinueStatementStartId parse_node)
-> bool {
auto& stack = context.break_continue_stack();
if (stack.empty()) {
CARBON_DIAGNOSTIC(ContinueOutsideLoop, Error,
"`continue` can only be used in a loop.");
context.emitter().Emit(parse_node, ContinueOutsideLoop);
} else {
context.AddInst(SemIR::Branch{parse_node, stack.back().continue_target});
}
context.inst_block_stack().Pop();
context.inst_block_stack().PushUnreachable();
return true;
}
auto HandleContinueStatement(Context& /*context*/,
Parse::ContinueStatementId /*parse_node*/)
-> bool {
return true;
}
} // namespace Carbon::Check