Skip to content

Commit d60d0f5

Browse files
garybkritzcreek
authored andcommitted
Ensure ExportConflict has source span (purescript#3217)
1 parent 65df12a commit d60d0f5

2 files changed

Lines changed: 56 additions & 48 deletions

File tree

src/Language/PureScript/Sugar/Names/Env.hs

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -214,13 +214,14 @@ data ExportMode = Internal | ReExport
214214
--
215215
exportType
216216
:: MonadError MultipleErrors m
217-
=> ExportMode
217+
=> SourceSpan
218+
-> ExportMode
218219
-> Exports
219220
-> ProperName 'TypeName
220221
-> [ProperName 'ConstructorName]
221222
-> ModuleName
222223
-> m Exports
223-
exportType exportMode exps name dctors mn = do
224+
exportType ss exportMode exps name dctors mn = do
224225
let exTypes = exportedTypes exps
225226
exClasses = exportedTypeClasses exps
226227
dctorNameCounts :: [(ProperName 'ConstructorName, Int)]
@@ -242,11 +243,11 @@ exportType exportMode exps name dctors mn = do
242243
ReExport -> do
243244
forM_ (name `M.lookup` exTypes) $ \(_, mn') ->
244245
when (mn /= mn') $
245-
throwExportConflict mn mn' (TyName name)
246+
throwExportConflict ss mn mn' (TyName name)
246247
forM_ dctors $ \dctor ->
247248
forM_ ((elem dctor . fst) `find` exTypes) $ \(_, mn') ->
248249
when (mn /= mn') $
249-
throwExportConflict mn mn' (DctorName dctor)
250+
throwExportConflict ss mn mn' (DctorName dctor)
250251
return $ exps { exportedTypes = M.alter updateOrInsert name exTypes }
251252
where
252253
updateOrInsert Nothing = Just (dctors, mn)
@@ -258,45 +259,48 @@ exportType exportMode exps name dctors mn = do
258259
--
259260
exportTypeOp
260261
:: MonadError MultipleErrors m
261-
=> Exports
262+
=> SourceSpan
263+
-> Exports
262264
-> OpName 'TypeOpName
263265
-> ModuleName
264266
-> m Exports
265-
exportTypeOp exps op mn = do
266-
typeOps <- addExport TyOpName op mn (exportedTypeOps exps)
267+
exportTypeOp ss exps op mn = do
268+
typeOps <- addExport ss TyOpName op mn (exportedTypeOps exps)
267269
return $ exps { exportedTypeOps = typeOps }
268270

269271
-- |
270272
-- Safely adds a class to some exports, returning an error if a conflict occurs.
271273
--
272274
exportTypeClass
273275
:: MonadError MultipleErrors m
274-
=> ExportMode
276+
=> SourceSpan
277+
-> ExportMode
275278
-> Exports
276279
-> ProperName 'ClassName
277280
-> ModuleName
278281
-> m Exports
279-
exportTypeClass exportMode exps name mn = do
282+
exportTypeClass ss exportMode exps name mn = do
280283
let exTypes = exportedTypes exps
281284
when (exportMode == Internal) $ do
282285
when (coerceProperName name `M.member` exTypes) $
283286
throwDeclConflict (TyClassName name) (TyName (coerceProperName name))
284287
when ((elem (coerceProperName name) . fst) `any` exTypes) $
285288
throwDeclConflict (TyClassName name) (DctorName (coerceProperName name))
286-
classes <- addExport TyClassName name mn (exportedTypeClasses exps)
289+
classes <- addExport ss TyClassName name mn (exportedTypeClasses exps)
287290
return $ exps { exportedTypeClasses = classes }
288291

289292
-- |
290293
-- Safely adds a value to some exports, returning an error if a conflict occurs.
291294
--
292295
exportValue
293296
:: MonadError MultipleErrors m
294-
=> Exports
297+
=> SourceSpan
298+
-> Exports
295299
-> Ident
296300
-> ModuleName
297301
-> m Exports
298-
exportValue exps name mn = do
299-
values <- addExport IdentName name mn (exportedValues exps)
302+
exportValue ss exps name mn = do
303+
values <- addExport ss IdentName name mn (exportedValues exps)
300304
return $ exps { exportedValues = values }
301305

302306
-- |
@@ -305,25 +309,27 @@ exportValue exps name mn = do
305309
--
306310
exportValueOp
307311
:: MonadError MultipleErrors m
308-
=> Exports
312+
=> SourceSpan
313+
-> Exports
309314
-> OpName 'ValueOpName
310315
-> ModuleName
311316
-> m Exports
312-
exportValueOp exps op mn = do
313-
valueOps <- addExport ValOpName op mn (exportedValueOps exps)
317+
exportValueOp ss exps op mn = do
318+
valueOps <- addExport ss ValOpName op mn (exportedValueOps exps)
314319
return $ exps { exportedValueOps = valueOps }
315320

316321
-- |
317322
-- Safely adds a kind to some exports, returning an error if a conflict occurs.
318323
--
319324
exportKind
320325
:: MonadError MultipleErrors m
321-
=> Exports
326+
=> SourceSpan
327+
-> Exports
322328
-> ProperName 'KindName
323329
-> ModuleName
324330
-> m Exports
325-
exportKind exps name mn = do
326-
kinds <- addExport KiName name mn (exportedKinds exps)
331+
exportKind ss exps name mn = do
332+
kinds <- addExport ss KiName name mn (exportedKinds exps)
327333
return $ exps { exportedKinds = kinds }
328334

329335
-- |
@@ -332,16 +338,17 @@ exportKind exps name mn = do
332338
--
333339
addExport
334340
:: (MonadError MultipleErrors m, Ord a)
335-
=> (a -> Name)
341+
=> SourceSpan
342+
-> (a -> Name)
336343
-> a
337344
-> ModuleName
338345
-> M.Map a ModuleName
339346
-> m (M.Map a ModuleName)
340-
addExport toName name mn exports =
347+
addExport ss toName name mn exports =
341348
case M.lookup name exports of
342349
Just mn'
343350
| mn == mn' -> return exports
344-
| otherwise -> throwExportConflict mn mn' (toName name)
351+
| otherwise -> throwExportConflict ss mn mn' (toName name)
345352
Nothing ->
346353
return $ M.insert name mn exports
347354

@@ -361,12 +368,13 @@ throwDeclConflict new existing =
361368
--
362369
throwExportConflict
363370
:: MonadError MultipleErrors m
364-
=> ModuleName
371+
=> SourceSpan
372+
-> ModuleName
365373
-> ModuleName
366374
-> Name
367375
-> m a
368-
throwExportConflict new existing name =
369-
throwError . errorMessage $
376+
throwExportConflict ss new existing name =
377+
throwError . errorMessage' ss $
370378
ExportConflict (Qualified (Just new) name) (Qualified (Just existing) name)
371379

372380
-- |

src/Language/PureScript/Sugar/Names/Exports.hs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,27 @@ findExportable (Module _ _ mn ds _) =
3434

3535
updateExports :: Exports -> Declaration -> m Exports
3636
updateExports exps (TypeClassDeclaration (ss, _) tcn _ _ _ ds') = do
37-
exps' <- rethrowWithPosition ss $ exportTypeClass Internal exps tcn mn
37+
exps' <- rethrowWithPosition ss $ exportTypeClass ss Internal exps tcn mn
3838
foldM go exps' ds'
3939
where
40-
go exps'' (TypeDeclaration (TypeDeclarationData (ss', _) name _)) = rethrowWithPosition ss' $ exportValue exps'' name mn
40+
go exps'' (TypeDeclaration (TypeDeclarationData (ss', _) name _)) = exportValue ss' exps'' name mn
4141
go _ _ = internalError "Invalid declaration in TypeClassDeclaration"
42-
updateExports exps (DataDeclaration _ _ tn _ dcs) =
43-
exportType Internal exps tn (map fst dcs) mn
44-
updateExports exps (TypeSynonymDeclaration _ tn _ _) =
45-
exportType Internal exps tn [] mn
46-
updateExports exps (ExternDataDeclaration _ tn _) =
47-
exportType Internal exps tn [] mn
42+
updateExports exps (DataDeclaration (ss, _) _ tn _ dcs) =
43+
exportType ss Internal exps tn (map fst dcs) mn
44+
updateExports exps (TypeSynonymDeclaration (ss, _) tn _ _) =
45+
exportType ss Internal exps tn [] mn
46+
updateExports exps (ExternDataDeclaration (ss, _) tn _) =
47+
exportType ss Internal exps tn [] mn
4848
updateExports exps (ValueDeclaration vd) =
49-
exportValue exps (valdeclIdent vd) mn
50-
updateExports exps (ValueFixityDeclaration _ _ _ op) =
51-
exportValueOp exps op mn
52-
updateExports exps (TypeFixityDeclaration _ _ _ op) =
53-
exportTypeOp exps op mn
54-
updateExports exps (ExternDeclaration _ name _) =
55-
exportValue exps name mn
56-
updateExports exps (ExternKindDeclaration _ pn) =
57-
exportKind exps pn mn
49+
exportValue (fst (valdeclSourceAnn vd)) exps (valdeclIdent vd) mn
50+
updateExports exps (ValueFixityDeclaration (ss, _) _ _ op) =
51+
exportValueOp ss exps op mn
52+
updateExports exps (TypeFixityDeclaration (ss, _) _ _ op) =
53+
exportTypeOp ss exps op mn
54+
updateExports exps (ExternDeclaration (ss, _) name _) =
55+
exportValue ss exps name mn
56+
updateExports exps (ExternKindDeclaration (ss, _) pn) =
57+
exportKind ss exps pn mn
5858
updateExports exps _ = return exps
5959

6060
-- |
@@ -110,12 +110,12 @@ resolveExports env ss mn imps exps refs =
110110
reValues <- extract isPseudo name IdentName (importedValues imps)
111111
reValueOps <- extract isPseudo name ValOpName (importedValueOps imps)
112112
reKinds <- extract isPseudo name KiName (importedKinds imps)
113-
foldM (\exps' ((tctor, dctors), mn') -> exportType ReExport exps' tctor dctors mn') result (resolveTypeExports reTypes reDctors)
114-
>>= flip (foldM (uncurry . exportTypeOp)) (map resolveTypeOp reTypeOps)
115-
>>= flip (foldM (uncurry . exportTypeClass ReExport)) (map resolveClass reClasses)
116-
>>= flip (foldM (uncurry . exportValue)) (map resolveValue reValues)
117-
>>= flip (foldM (uncurry . exportValueOp)) (map resolveValueOp reValueOps)
118-
>>= flip (foldM (uncurry . exportKind)) (map resolveKind reKinds)
113+
foldM (\exps' ((tctor, dctors), mn') -> exportType ss' ReExport exps' tctor dctors mn') result (resolveTypeExports reTypes reDctors)
114+
>>= flip (foldM (uncurry . exportTypeOp ss')) (map resolveTypeOp reTypeOps)
115+
>>= flip (foldM (uncurry . exportTypeClass ss' ReExport)) (map resolveClass reClasses)
116+
>>= flip (foldM (uncurry . exportValue ss')) (map resolveValue reValues)
117+
>>= flip (foldM (uncurry . exportValueOp ss')) (map resolveValueOp reValueOps)
118+
>>= flip (foldM (uncurry . exportKind ss')) (map resolveKind reKinds)
119119
elaborateModuleExports result _ = return result
120120

121121
-- Extracts a list of values for a module based on a lookup table. If the

0 commit comments

Comments
 (0)