@@ -7311,7 +7311,6 @@ struct Typechecker {
73117311 safety_mode: SafetyMode
73127312 ) throws -> [CheckedStatement] {
73137313 match lhs {
7314- // Simple variable assignment
73157314 Var => {
73167315 let assign_stmt = ParsedStatement::Expression(
73177316 expr: ParsedExpression::BinaryOp(
@@ -7325,11 +7324,50 @@ struct Typechecker {
73257324 let checked_assign = .typecheck_statement(assign_stmt, scope_id, safety_mode)
73267325 return [checked_assign]
73277326 }
7328-
7329- // Nested tuple assignment - handle recursively
73307327 JaktTuple(values) => {
7331- // Create a temporary variable for the nested tuple RHS
7332- let nested_tmp_name = format("__jakt_nested_tuple_tmp{}", .temp_var_count)
7328+ // Optimization: If all elements are simple variables, we can
7329+ // avoid introducing an intermediate temporary and directly index
7330+ // into the parent tuple expression (chaining IndexedTuple expressions).
7331+ mut no_nesting = true
7332+ for v in values {
7333+ match v {
7334+ Var => {},
7335+ else => {
7336+ no_nesting = false
7337+ break
7338+ }
7339+ }
7340+ }
7341+
7342+ if no_nesting {
7343+ mut direct_assignments: [CheckedStatement] = []
7344+ for i in 0..values.size() {
7345+ let nested_lhs = values[i]
7346+ let nested_rhs = ParsedExpression::IndexedTuple(
7347+ expr: rhs,
7348+ index: i,
7349+ is_optional: false,
7350+ span: nested_lhs.span()
7351+ )
7352+
7353+ // Build assignment: nested_lhs = rhs.get<i>()
7354+ let assign_stmt = ParsedStatement::Expression(
7355+ expr: ParsedExpression::BinaryOp(
7356+ lhs: nested_lhs,
7357+ op: BinaryOperator::Assign,
7358+ rhs: nested_rhs,
7359+ span: nested_lhs.span()
7360+ )
7361+ span: nested_lhs.span()
7362+ )
7363+ let checked_assign = .typecheck_statement(assign_stmt, scope_id, safety_mode)
7364+ direct_assignments.push(checked_assign)
7365+ }
7366+ return direct_assignments
7367+ }
7368+
7369+ // else: introduce an intermediate temporary for the nested tuple RHS
7370+ let nested_tmp_name = format("__jakt_tuple_assign_tmp{}", .temp_var_count)
73337371 .temp_var_count++
73347372
73357373 let nested_tmp_decl = ParsedVarDecl(
@@ -7367,8 +7405,6 @@ struct Typechecker {
73677405
73687406 return nested_assignments
73697407 }
7370-
7371- // Other expressions - not allowed in tuple destructuring
73727408 else => {
73737409 .error("Left-hand side of tuple assignment must be variables or nested tuples", lhs.span())
73747410 return []
0 commit comments