@@ -284,7 +284,7 @@ export const desugarExpr = (state: DesugarState, expr: S.SExpr): C.CExpr => {
284284
285285 case "SDo" :
286286 // D⟦ SDo stmts ⟧ = D_do⟦stmts⟧
287- return desugarDo ( state , expr . stmts , expr . span ) ;
287+ return desugarDo ( state , expr . moduleName , expr . stmts , expr . span ) ;
288288
289289 case "SAnnot" :
290290 // D⟦ SAnnot e t ⟧ = D⟦e⟧
@@ -366,13 +366,21 @@ const desugarCase = (state: DesugarState, c: S.SCase): C.CCase => ({
366366// Do-Notation Desugaring (Section 6.2)
367367// =============================================================================
368368
369- const desugarDo = ( state : DesugarState , stmts : readonly S . SDoStmt [ ] , span : S . Span ) : C . CExpr => {
369+ const desugarDo = (
370+ state : DesugarState ,
371+ moduleName : string ,
372+ stmts : readonly S . SDoStmt [ ] ,
373+ span : S . Span ,
374+ ) : C . CExpr => {
370375 if ( stmts . length === 0 ) {
371376 // Empty do block - should have been caught by parser
372377 // Synthetic node
373378 return C . clit ( freshNodeId ( state ) , { kind : "int" , value : 0 } , span ) ;
374379 }
375380
381+ // Use Module.flatMap from the specified module
382+ const flatMapName = `${ moduleName } .flatMap` ;
383+
376384 const lastStmt = stmts [ stmts . length - 1 ] ! ;
377385
378386 // D_do⟦ [DoExpr e] ⟧ = D⟦e⟧
@@ -400,7 +408,7 @@ const desugarDo = (state: DesugarState, stmts: readonly S.SDoStmt[], span: S.Spa
400408 freshNodeId ( state ) ,
401409 C . capp (
402410 freshNodeId ( state ) ,
403- C . cvar ( freshNodeId ( state ) , unresolvedName ( state , "flatMap" , stmtSpan ) , stmtSpan ) ,
411+ C . cvar ( freshNodeId ( state ) , unresolvedName ( state , flatMapName , stmtSpan ) , stmtSpan ) ,
404412 C . cabs (
405413 freshNodeId ( state ) ,
406414 unresolvedName ( state , stmt . pattern . name . text , stmt . pattern . name . span ) ,
@@ -422,7 +430,7 @@ const desugarDo = (state: DesugarState, stmts: readonly S.SDoStmt[], span: S.Spa
422430 freshNodeId ( state ) ,
423431 C . capp (
424432 freshNodeId ( state ) ,
425- C . cvar ( freshNodeId ( state ) , unresolvedName ( state , "flatMap" , stmtSpan ) , stmtSpan ) ,
433+ C . cvar ( freshNodeId ( state ) , unresolvedName ( state , flatMapName , stmtSpan ) , stmtSpan ) ,
426434 C . cabs (
427435 freshNodeId ( state ) ,
428436 unresolvedName ( state , tmp , stmtSpan ) ,
@@ -474,7 +482,7 @@ const desugarDo = (state: DesugarState, stmts: readonly S.SDoStmt[], span: S.Spa
474482 freshNodeId ( state ) ,
475483 C . capp (
476484 freshNodeId ( state ) ,
477- C . cvar ( freshNodeId ( state ) , unresolvedName ( state , "flatMap" , stmtSpan ) , stmtSpan ) ,
485+ C . cvar ( freshNodeId ( state ) , unresolvedName ( state , flatMapName , stmtSpan ) , stmtSpan ) ,
478486 C . cabs ( freshNodeId ( state ) , unresolvedName ( state , tmp , stmtSpan ) , result , stmtSpan ) ,
479487 stmtSpan ,
480488 ) ,
@@ -1229,6 +1237,7 @@ const desugarExprInModuleWithImports = (
12291237 case "SDo" :
12301238 return desugarDoInModuleWithImports (
12311239 state ,
1240+ expr . moduleName ,
12321241 expr . stmts ,
12331242 moduleName ,
12341243 moduleNames ,
@@ -1328,6 +1337,7 @@ const desugarListInModuleWithImports = (
13281337
13291338const desugarDoInModuleWithImports = (
13301339 state : DesugarState ,
1340+ doModuleName : string ,
13311341 stmts : readonly S . SDoStmt [ ] ,
13321342 moduleName : string ,
13331343 moduleNames : Set < string > ,
@@ -1342,6 +1352,9 @@ const desugarDoInModuleWithImports = (
13421352 return C . clit ( freshNodeId ( state ) , { kind : "int" , value : 0 } , span ) ;
13431353 }
13441354
1355+ // Use Module.flatMap from the specified module (from do[Module] syntax)
1356+ const flatMapName = `${ doModuleName } .flatMap` ;
1357+
13451358 const lastStmt = stmts [ stmts . length - 1 ] ! ;
13461359
13471360 if ( stmts . length === 1 && lastStmt . kind === "DoExpr" ) {
@@ -1365,7 +1378,7 @@ const desugarDoInModuleWithImports = (
13651378 freshNodeId ( state ) ,
13661379 C . capp (
13671380 freshNodeId ( state ) ,
1368- C . cvar ( freshNodeId ( state ) , unresolvedName ( state , "flatMap" , stmtSpan ) , stmtSpan ) ,
1381+ C . cvar ( freshNodeId ( state ) , unresolvedName ( state , flatMapName , stmtSpan ) , stmtSpan ) ,
13691382 C . cabs (
13701383 freshNodeId ( state ) ,
13711384 unresolvedName ( state , stmt . pattern . name . text , stmt . pattern . name . span ) ,
@@ -1383,7 +1396,7 @@ const desugarDoInModuleWithImports = (
13831396 freshNodeId ( state ) ,
13841397 C . capp (
13851398 freshNodeId ( state ) ,
1386- C . cvar ( freshNodeId ( state ) , unresolvedName ( state , "flatMap" , stmtSpan ) , stmtSpan ) ,
1399+ C . cvar ( freshNodeId ( state ) , unresolvedName ( state , flatMapName , stmtSpan ) , stmtSpan ) ,
13871400 C . cabs (
13881401 freshNodeId ( state ) ,
13891402 unresolvedName ( state , tmp , stmtSpan ) ,
@@ -1456,7 +1469,7 @@ const desugarDoInModuleWithImports = (
14561469 freshNodeId ( state ) ,
14571470 C . capp (
14581471 freshNodeId ( state ) ,
1459- C . cvar ( freshNodeId ( state ) , unresolvedName ( state , "flatMap" , stmtSpan ) , stmtSpan ) ,
1472+ C . cvar ( freshNodeId ( state ) , unresolvedName ( state , flatMapName , stmtSpan ) , stmtSpan ) ,
14601473 C . cabs ( freshNodeId ( state ) , unresolvedName ( state , tmp , stmtSpan ) , result , stmtSpan ) ,
14611474 stmtSpan ,
14621475 ) ,
0 commit comments