@@ -49,6 +49,7 @@ export const desugarExpr = (expr: S.SExpr): C.CExpr => {
4949 desugarExpr ( expr . value ) ,
5050 desugarExpr ( expr . body ) ,
5151 expr . span ,
52+ expr . nameSpan ,
5253 ) ;
5354
5455 case "SLetRec" :
@@ -57,6 +58,7 @@ export const desugarExpr = (expr: S.SExpr): C.CExpr => {
5758 expr . bindings . map ( ( b ) => ( {
5859 name : { id : - 1 , original : b . name } ,
5960 value : desugarExpr ( b . value ) ,
61+ nameSpan : b . nameSpan ,
6062 } ) ) ,
6163 desugarExpr ( expr . body ) ,
6264 expr . span ,
@@ -120,7 +122,13 @@ export const desugarExpr = (expr: S.SExpr): C.CExpr => {
120122 if ( expr . field [ 0 ] && expr . field [ 0 ] === expr . field [ 0 ] . toUpperCase ( ) ) {
121123 return C . ccon ( qualifiedName , expr . span ) ;
122124 }
123- return C . cvar ( { id : - 1 , original : qualifiedName } , expr . span ) ;
125+ // Pass module span (from the constructor) and member span (from the field)
126+ return C . cvar (
127+ { id : - 1 , original : qualifiedName } ,
128+ expr . span ,
129+ expr . record . span ,
130+ expr . fieldSpan ,
131+ ) ;
124132 }
125133 // D⟦ SField e f ⟧ = CField (D⟦e⟧) f
126134 return C . cfield ( desugarExpr ( expr . record ) , expr . field , expr . span ) ;
@@ -200,15 +208,21 @@ export const desugarExpr = (expr: S.SExpr): C.CExpr => {
200208// Helper Functions
201209// =============================================================================
202210
203- const desugarAbs = ( params : readonly string [ ] , body : S . SExpr , span ?: S . Span ) : C . CExpr => {
211+ const desugarAbs = ( params : readonly S . SParam [ ] , body : S . SExpr , span ?: S . Span ) : C . CExpr => {
204212 if ( params . length === 0 ) {
205213 return desugarExpr ( body ) ;
206214 }
207215
208216 // Build nested lambdas from right to left
209217 let result = desugarExpr ( body ) ;
210218 for ( let i = params . length - 1 ; i >= 0 ; i -- ) {
211- result = C . cabs ( { id : - 1 , original : params [ i ] ! } , result , i === 0 ? span : undefined ) ;
219+ const param = params [ i ] ! ;
220+ result = C . cabs (
221+ { id : - 1 , original : param . name } ,
222+ result ,
223+ i === 0 ? span : undefined ,
224+ param . span ,
225+ ) ;
212226 }
213227 return result ;
214228} ;
@@ -535,6 +549,7 @@ const desugarDecl = (decl: S.SDecl): C.CDecl | C.CDecl[] | null => {
535549 decl . constructors . map ( ( c ) => ( {
536550 name : c . name ,
537551 fields : c . fields . map ( desugarType ) ,
552+ span : c . span ,
538553 } ) ) ,
539554 decl . span ,
540555 ) ;
@@ -728,6 +743,7 @@ const desugarExprInModuleWithImports = (
728743 shadowedImportedNames ,
729744 ) ,
730745 expr . span ,
746+ expr . nameSpan ,
731747 ) ;
732748 }
733749
@@ -745,6 +761,7 @@ const desugarExprInModuleWithImports = (
745761 expr . bindings . map ( ( b ) => ( {
746762 name : { id : - 1 , original : b . name } ,
747763 value : recurseWithShadow ( b . value ) ,
764+ nameSpan : b . nameSpan ,
748765 } ) ) ,
749766 recurseWithShadow ( expr . body ) ,
750767 expr . span ,
@@ -839,7 +856,13 @@ const desugarExprInModuleWithImports = (
839856 if ( expr . field [ 0 ] && expr . field [ 0 ] === expr . field [ 0 ] . toUpperCase ( ) ) {
840857 return C . ccon ( qualifiedName , expr . span ) ;
841858 }
842- return C . cvar ( { id : - 1 , original : qualifiedName } , expr . span ) ;
859+ // Pass module span (from the constructor) and member span (from the field)
860+ return C . cvar (
861+ { id : - 1 , original : qualifiedName } ,
862+ expr . span ,
863+ expr . record . span ,
864+ expr . fieldSpan ,
865+ ) ;
843866 }
844867 return C . cfield ( recurse ( expr . record ) , expr . field , expr . span ) ;
845868
@@ -913,7 +936,7 @@ const desugarExprInModuleWithImports = (
913936} ;
914937
915938const desugarAbsInModuleWithImports = (
916- params : readonly string [ ] ,
939+ params : readonly S . SParam [ ] ,
917940 body : S . SExpr ,
918941 moduleName : string ,
919942 moduleNames : Set < string > ,
@@ -928,8 +951,8 @@ const desugarAbsInModuleWithImports = (
928951 const shadowedModuleNames = new Set ( moduleNames ) ;
929952 const shadowedImportedNames = new Map ( importedNames ) ;
930953 for ( const param of params ) {
931- shadowedModuleNames . delete ( param ) ;
932- shadowedImportedNames . delete ( param ) ;
954+ shadowedModuleNames . delete ( param . name ) ;
955+ shadowedImportedNames . delete ( param . name ) ;
933956 }
934957
935958 let result = desugarExprInModuleWithImports (
@@ -939,7 +962,13 @@ const desugarAbsInModuleWithImports = (
939962 shadowedImportedNames ,
940963 ) ;
941964 for ( let i = params . length - 1 ; i >= 0 ; i -- ) {
942- result = C . cabs ( { id : - 1 , original : params [ i ] ! } , result , i === 0 ? span : undefined ) ;
965+ const param = params [ i ] ! ;
966+ result = C . cabs (
967+ { id : - 1 , original : param . name } ,
968+ result ,
969+ i === 0 ? span : undefined ,
970+ param . span ,
971+ ) ;
943972 }
944973 return result ;
945974} ;
@@ -1133,6 +1162,7 @@ const desugarDeclInModuleWithImports = (
11331162 decl . constructors . map ( ( c ) => ( {
11341163 name : `${ moduleName } .${ c . name } ` ,
11351164 fields : c . fields . map ( desugarType ) ,
1165+ span : c . span ,
11361166 } ) ) ,
11371167 decl . span ,
11381168 ) ;
0 commit comments