| 5274 | } |
| 5275 | |
| 5276 | ErrorOr<void> Jakt::codegen::CodeGenerator::codegen_match(NonnullRefPtr<typename Jakt::types::CheckedExpression> const expr,JaktInternal::DynamicArray<Jakt::types::CheckedMatchCase> const match_cases,Jakt::ids::TypeId const type_id,bool const all_variants_constant,bool const forward_error_with_try,ByteStringBuilder& output) { |
| 5277 | { |
| 5278 | if (!Jakt::codegen::has_cpp_value(type_id)){ |
| 5279 | TRY((this->codegen_void_match(expr,match_cases,type_id,output))); return {}; |
| 5280 | } |
| 5281 | if (!Jakt::codegen::has_control_flow<Jakt::types::CheckedMatchCase>(match_cases,true)){ |
| 5282 | TRY((this->codegen_value_match(expr,match_cases,type_id,forward_error_with_try,output))); return {}; |
| 5283 | } |
| 5284 | ByteStringBuilder builder = ByteStringBuilder::create(); |
| 5285 | Jakt::codegen::ControlFlowState const last_control_flow = this->control_flow_state; |
| 5286 | this->control_flow_state = this->control_flow_state.enter_match(); |
| 5287 | ByteString const cpp_match_result_type = TRY((this->codegen_type(type_id))); |
| 5288 | NonnullRefPtr<typename Jakt::types::Type> const expr_type = this->program->get_type(expr->type()); |
| 5289 | JaktInternal::Optional<Jakt::codegen::YieldMethod> const old_yield_method = this->yield_method; |
| 5290 | this->yield_method = Jakt::codegen::YieldMethod::ReturnExplicitValue(__jakt_format(StringView::from_string_literal("JaktInternal::ExplicitValue<{}>"sv),cpp_match_result_type)); |
| 5291 | ScopeGuard __jakt_var_125([&] { |
| 5292 | this->yield_method = old_yield_method; |
| 5293 | }); |
| 5294 | builder.append(StringView::from_string_literal("([&]() -> JaktInternal::ExplicitValueOrControlFlow<"sv)); |
| 5295 | builder.append(cpp_match_result_type); |
| 5296 | builder.append(StringView::from_string_literal(", "sv)); |
| 5297 | builder.append(TRY((this->codegen_function_return_type(this->current_function.value())))); |
| 5298 | builder.append(StringView::from_string_literal(">{\n"sv)); |
| 5299 | TRY((this->codegen_inner_match(expr,match_cases,type_id,builder))); |
| 5300 | builder.append(StringView::from_string_literal("}()\n)"sv)); |
| 5301 | this->control_flow_state = last_control_flow; |
| 5302 | output.append(TRY((this->control_flow_state.apply_control_flow_macro(builder.to_string(),this->current_function.value()->return_type_id,this->current_function.value()->can_throw)))); |
| 5303 | } |
| 5304 | return {}; |
| 5305 | } |
| 5306 | |
| 5307 | ErrorOr<void> Jakt::codegen::CodeGenerator::codegen_value_match(NonnullRefPtr<typename Jakt::types::CheckedExpression> const expr,JaktInternal::DynamicArray<Jakt::types::CheckedMatchCase> const match_cases,Jakt::ids::TypeId const type_id,bool const forward_error_with_try,ByteStringBuilder& output) { |
| 5308 | { |
no test coverage detected