Skip to content

Commit 96ccf1e

Browse files
authored
Take advantage of multi-span errors (purescript#3273)
* Take advantage of multi-span errors This fixes `CycleInModule ` not having many positions, and adds all positions for `DuplicateModule` using the usual form rather than special handling * Work around Data.Graph not using NELs
1 parent 80c671e commit 96ccf1e

4 files changed

Lines changed: 17 additions & 13 deletions

File tree

src/Language/PureScript/AST/Declarations.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ data SimpleErrorMessage
9393
| ScopeShadowing Name (Maybe ModuleName) [ModuleName]
9494
| DeclConflict Name Name
9595
| ExportConflict (Qualified Name) (Qualified Name)
96-
| DuplicateModule ModuleName [SourceSpan]
96+
| DuplicateModule ModuleName
9797
| DuplicateTypeClass (ProperName 'ClassName) SourceSpan
9898
| DuplicateInstance Ident SourceSpan
9999
| DuplicateTypeArgument Text

src/Language/PureScript/Errors.hs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,10 @@ errorMessage err = MultipleErrors [ErrorMessage [] err]
197197
errorMessage' :: SourceSpan -> SimpleErrorMessage -> MultipleErrors
198198
errorMessage' ss err = MultipleErrors [ErrorMessage [positionedError ss] err]
199199

200+
-- | Create an error set from a single simple error message and source annotations
201+
errorMessage'' :: NEL.NonEmpty SourceSpan -> SimpleErrorMessage -> MultipleErrors
202+
errorMessage'' sss err = MultipleErrors [ErrorMessage [PositionedError sss] err]
203+
200204
-- | Create an error set from a single error message
201205
singleError :: ErrorMessage -> MultipleErrors
202206
singleError = MultipleErrors . pure
@@ -537,10 +541,8 @@ prettyPrintSingleError (PPEOptions codeColor full level showDocs relPath) e = fl
537541
line $ "Declaration for " <> printName (Qualified Nothing new) <> " conflicts with an existing " <> nameType existing <> " of the same name."
538542
renderSimpleErrorMessage (ExportConflict new existing) =
539543
line $ "Export for " <> printName new <> " conflicts with " <> runName existing
540-
renderSimpleErrorMessage (DuplicateModule mn ss) =
541-
paras [ line ("Module " <> markCode (runModuleName mn) <> " has been defined multiple times:")
542-
, indent . paras $ map (line . displaySourceSpan relPath) ss
543-
]
544+
renderSimpleErrorMessage (DuplicateModule mn) =
545+
line $ "Module " <> markCode (runModuleName mn) <> " has been defined multiple times"
544546
renderSimpleErrorMessage (DuplicateTypeClass pn ss) =
545547
paras [ line ("Type class " <> markCode (runProperName pn) <> " has been defined multiple times:")
546548
, indent $ line $ displaySourceSpan relPath ss

src/Language/PureScript/Make.hs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ import Data.Aeson (encode, decode)
3838
import Data.Either (partitionEithers)
3939
import Data.Function (on)
4040
import Data.Foldable (for_)
41-
import Data.List (foldl', sortBy, groupBy)
41+
import Data.List (foldl', sortBy)
42+
import qualified Data.List.NonEmpty as NEL
4243
import Data.Maybe (fromMaybe, catMaybes)
4344
import Data.Monoid ((<>))
4445
import Data.Time.Clock
@@ -191,13 +192,13 @@ make ma@MakeActions{..} ms = do
191192
checkModuleNamesAreUnique =
192193
for_ (findDuplicates getModuleName ms) $ \mss ->
193194
throwError . flip foldMap mss $ \ms' ->
194-
let mn = getModuleName (head ms')
195-
in errorMessage $ DuplicateModule mn (map getModuleSourceSpan ms')
195+
let mn = getModuleName (NEL.head ms')
196+
in errorMessage'' (fmap getModuleSourceSpan ms') $ DuplicateModule mn
196197

197198
-- Find all groups of duplicate values in a list based on a projection.
198-
findDuplicates :: Ord b => (a -> b) -> [a] -> Maybe [[a]]
199+
findDuplicates :: Ord b => (a -> b) -> [a] -> Maybe [NEL.NonEmpty a]
199200
findDuplicates f xs =
200-
case filter ((> 1) . length) . groupBy ((==) `on` f) . sortBy (compare `on` f) $ xs of
201+
case filter ((> 1) . length) . NEL.groupBy ((==) `on` f) . sortBy (compare `on` f) $ xs of
201202
[] -> Nothing
202203
xss -> Just xss
203204

src/Language/PureScript/ModuleDependencies.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ module Language.PureScript.ModuleDependencies
77
import Protolude hiding (head)
88

99
import Data.Graph
10-
import Data.List (head)
10+
import Data.List.NonEmpty (NonEmpty((:|)))
1111
import qualified Data.Set as S
1212
import Language.PureScript.AST
1313
import qualified Language.PureScript.Constants as C
@@ -59,8 +59,9 @@ usedModules _ = Nothing
5959
-- | Convert a strongly connected component of the module graph to a module
6060
toModule :: MonadError MultipleErrors m => SCC Module -> m Module
6161
toModule (AcyclicSCC m) = return m
62+
toModule (CyclicSCC []) = internalError "toModule: empty CyclicSCC"
6263
toModule (CyclicSCC [m]) = return m
63-
toModule (CyclicSCC ms) =
64+
toModule (CyclicSCC (m : ms)) =
6465
throwError
65-
. errorMessage' (getModuleSourceSpan (head ms))
66+
. errorMessage'' (fmap getModuleSourceSpan (m :| ms))
6667
$ CycleInModules (map getModuleName ms)

0 commit comments

Comments
 (0)