@@ -476,13 +476,13 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
476476 let target := name.val
477477 let valueExpr ← translateExpr ctx value
478478 let targetExpr := mkStmtExprMd (StmtExpr.Identifier target)
479- let assignStmt := mkStmtExprMd (StmtExpr.Assign [targetExpr] valueExpr)
479+ let assignStmt := mkStmtExprMdWithLoc (StmtExpr.Assign [targetExpr] valueExpr) md
480480 return (ctx, assignStmt)
481481 | .Attribute _ obj attr _ =>
482482 -- Field assignment: obj.field = expr or self.field = expr
483483 let valueExpr ← translateExpr ctx value
484484 let targetExpr ← translateExpr ctx targets.val[0 ]! -- This will handle self.field via translateExpr
485- let assignStmt := mkStmtExprMd (StmtExpr.Assign [targetExpr] valueExpr)
485+ let assignStmt := mkStmtExprMdWithLoc (StmtExpr.Assign [targetExpr] valueExpr) md
486486 return (ctx, assignStmt)
487487 | _ => throw (.unsupportedConstruct "Only simple variable or field assignment supported" (toString (repr s)))
488488
@@ -501,7 +501,7 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
501501 let fieldAccess := mkStmtExprMd (StmtExpr.FieldSelect
502502 (mkStmtExprMd (StmtExpr.Identifier "self" ))
503503 attr.val)
504- let assignStmt := mkStmtExprMd (StmtExpr.Assign [fieldAccess] valueExpr)
504+ let assignStmt := mkStmtExprMdWithLoc (StmtExpr.Assign [fieldAccess] valueExpr) md
505505 return (ctx, assignStmt)
506506 else
507507 throw (.unsupportedConstruct "Only self.field assignments supported in methods" (toString (repr s)))
@@ -535,7 +535,7 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
535535 let translatedArgs ← args.val.toList.mapM (translateExpr ctx)
536536
537537 let newExpr := mkStmtExprMd (StmtExpr.New funcName)
538- let declStmt := mkStmtExprMd (StmtExpr.LocalVariable varName varType (some newExpr))
538+ let declStmt := mkStmtExprMdWithLoc (StmtExpr.LocalVariable varName varType (some newExpr)) md
539539
540540 let initCall := mkStmtExprMd (StmtExpr.InstanceCall
541541 (mkStmtExprMd (StmtExpr.Identifier varName))
@@ -547,16 +547,18 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
547547 else
548548 -- Regular call, not a constructor
549549 let initVal ← translateCall ctx f args.val.toList
550- let declStmt := mkStmtExprMd (StmtExpr.LocalVariable varName varType (some initVal))
550+ let initVal := { initVal with md := md }
551+ let declStmt := mkStmtExprMdWithLoc (StmtExpr.LocalVariable varName varType (some initVal)) md
551552 return (newCtx, declStmt)
552553 | some initExpr => do
553554 -- Regular annotated assignment with initializer
554555 let initVal ← translateExpr newCtx initExpr
555- let declStmt := mkStmtExprMd (StmtExpr.LocalVariable varName varType (some initVal))
556+ let initVal := { initVal with md := md }
557+ let declStmt := mkStmtExprMdWithLoc (StmtExpr.LocalVariable varName varType (some initVal)) md
556558 return (newCtx, declStmt)
557559 | none =>
558560 -- Declaration without initializer
559- let declStmt := mkStmtExprMd (StmtExpr.LocalVariable varName varType none)
561+ let declStmt := mkStmtExprMdWithLoc (StmtExpr.LocalVariable varName varType none) md
560562 return (newCtx, declStmt)
561563
562564 -- If statement
@@ -583,13 +585,13 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
583585 else do
584586 let (_, elseStmts) ← translateStmtList bodyCtx orelse.val.toList
585587 .ok (some (mkStmtExprMd (StmtExpr.Block elseStmts none)))
586- let ifStmt := mkStmtExprMd (StmtExpr.IfThenElse finalCondExpr bodyBlock elseBlock)
588+ let ifStmt := mkStmtExprMdWithLoc (StmtExpr.IfThenElse finalCondExpr bodyBlock elseBlock) md
587589
588590 -- Wrap in block if we hoisted condition
589591 let result := if condStmts.isEmpty then
590592 ifStmt
591593 else
592- mkStmtExprMd (StmtExpr.Block (condStmts ++ [ifStmt]) none)
594+ mkStmtExprMdWithLoc (StmtExpr.Block (condStmts ++ [ifStmt]) none) md
593595
594596 return (bodyCtx, result)
595597
@@ -610,13 +612,13 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
610612
611613 let (loopCtx, bodyStmts) ← translateStmtList condCtx body.val.toList
612614 let bodyBlock := mkStmtExprMd (StmtExpr.Block bodyStmts none)
613- let whileStmt := mkStmtExprMd (StmtExpr.While finalCondExpr [] none bodyBlock)
615+ let whileStmt := mkStmtExprMdWithLoc (StmtExpr.While finalCondExpr [] none bodyBlock) md
614616
615617 -- Wrap in block if we hoisted condition
616618 let result := if condStmts.isEmpty then
617619 whileStmt
618620 else
619- mkStmtExprMd (StmtExpr.Block (condStmts ++ [whileStmt]) none)
621+ mkStmtExprMdWithLoc (StmtExpr.Block (condStmts ++ [whileStmt]) none) md
620622
621623 return (loopCtx, result)
622624
@@ -627,7 +629,7 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
627629 let e ← translateExpr ctx expr
628630 .ok (some e)
629631 | none => .ok none
630- let retStmt := mkStmtExprMd (StmtExpr.Return retVal)
632+ let retStmt := mkStmtExprMdWithLoc (StmtExpr.Return retVal) md
631633 return (ctx, retStmt)
632634
633635 -- Assert statement
@@ -650,13 +652,14 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
650652 let result := if condStmts.isEmpty then
651653 assertStmt
652654 else
653- mkStmtExprMd (StmtExpr.Block (condStmts ++ [assertStmt]) none)
655+ mkStmtExprMdWithLoc (StmtExpr.Block (condStmts ++ [assertStmt]) none) md
654656
655657 return (condCtx, result)
656658
657659 -- Expression statement (e.g., function call)
658660 | .Expr _ value => do
659661 let expr ← translateExpr ctx value
662+ let expr := { expr with md := md }
660663 return (ctx, expr)
661664
662665 | .Import _ _ | .ImportFrom _ _ _ _ => return (ctx, mkStmtExprMd .Hole)
@@ -690,7 +693,7 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
690693 let handlerBlock := mkStmtExprMd (StmtExpr.Block handlerStmts (some handlerLabel))
691694
692695 -- Wrap in try block
693- let tryBlock := mkStmtExprMd (StmtExpr.Block (bodyStmtsWithChecks ++ [handlerBlock]) (some tryLabel))
696+ let tryBlock := mkStmtExprMdWithLoc (StmtExpr.Block (bodyStmtsWithChecks ++ [handlerBlock]) (some tryLabel)) md
694697 return (bodyCtx, tryBlock)
695698
696699 | .Raise _ _ _ => return (ctx, mkStmtExprMd .Hole)
@@ -717,7 +720,7 @@ partial def translateStmt (ctx : TranslationContext) (s : Python.stmt SourceRang
717720 -- Create: { target = havoc; body_statements }
718721 -- This abstracts: execute body once with arbitrary target value
719722 let targetDecl := mkStmtExprMd (StmtExpr.LocalVariable targetName targetType (some (mkStmtExprMd .Hole)))
720- let loopBlock := mkStmtExprMd (StmtExpr.Block ([targetDecl] ++ bodyStmts) none)
723+ let loopBlock := mkStmtExprMdWithLoc (StmtExpr.Block ([targetDecl] ++ bodyStmts) none) md
721724
722725 return (finalCtx, loopBlock)
723726
0 commit comments