@@ -7316,7 +7316,6 @@ struct Typechecker {
73167316 safety_mode: SafetyMode
73177317 ) throws -> [CheckedStatement] {
73187318 match lhs {
7319- // Simple variable assignment
73207319 Var => {
73217320 let assign_stmt = ParsedStatement::Expression(
73227321 expr: ParsedExpression::BinaryOp(
@@ -7330,11 +7329,50 @@ struct Typechecker {
73307329 let checked_assign = .typecheck_statement(assign_stmt, scope_id, safety_mode)
73317330 return [checked_assign]
73327331 }
7333-
7334- // Nested tuple assignment - handle recursively
73357332 JaktTuple(values) => {
7336- // Create a temporary variable for the nested tuple RHS
7337- let nested_tmp_name = format("__jakt_nested_tuple_tmp{}", .temp_var_count)
7333+ // Optimization: If all elements are simple variables, we can
7334+ // avoid introducing an intermediate temporary and directly index
7335+ // into the parent tuple expression (chaining IndexedTuple expressions).
7336+ mut no_nesting = true
7337+ for v in values {
7338+ match v {
7339+ Var => {},
7340+ else => {
7341+ no_nesting = false
7342+ break
7343+ }
7344+ }
7345+ }
7346+
7347+ if no_nesting {
7348+ mut direct_assignments: [CheckedStatement] = []
7349+ for i in 0..values.size() {
7350+ let nested_lhs = values[i]
7351+ let nested_rhs = ParsedExpression::IndexedTuple(
7352+ expr: rhs,
7353+ index: i,
7354+ is_optional: false,
7355+ span: nested_lhs.span()
7356+ )
7357+
7358+ // Build assignment: nested_lhs = rhs.get<i>()
7359+ let assign_stmt = ParsedStatement::Expression(
7360+ expr: ParsedExpression::BinaryOp(
7361+ lhs: nested_lhs,
7362+ op: BinaryOperator::Assign,
7363+ rhs: nested_rhs,
7364+ span: nested_lhs.span()
7365+ )
7366+ span: nested_lhs.span()
7367+ )
7368+ let checked_assign = .typecheck_statement(assign_stmt, scope_id, safety_mode)
7369+ direct_assignments.push(checked_assign)
7370+ }
7371+ return direct_assignments
7372+ }
7373+
7374+ // else: introduce an intermediate temporary for the nested tuple RHS
7375+ let nested_tmp_name = format("__jakt_tuple_assign_tmp{}", .temp_var_count)
73387376 .temp_var_count++
73397377
73407378 let nested_tmp_decl = ParsedVarDecl(
@@ -7372,8 +7410,6 @@ struct Typechecker {
73727410
73737411 return nested_assignments
73747412 }
7375-
7376- // Other expressions - not allowed in tuple destructuring
73777413 else => {
73787414 .error("Left-hand side of tuple assignment must be variables or nested tuples", lhs.span())
73797415 return []
0 commit comments