git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Avoid overlaps during type renaming in errors
630fb19Phil Freeman
src/Language/PureScript/Errors.hs+12−9
@@ -340,14 +340,17 @@ addHint hint = onErrorMessages $ \(ErrorMessage hints se) -> ErrorMessage (hint
340
340
341-- | A map from rigid type variable name/unknown variable pairs to new variables.
341-- | A map from rigid type variable name/unknown variable pairs to new variables.
342data TypeMap = TypeMap
342data TypeMap = TypeMap
343− { umSkolemMap :: M.Map Int (String, Int, Maybe SourceSpan)
343+ { umSkolemMap :: M.Map Int (String, Int, Maybe SourceSpan)
344− , umNextSkolem :: Int
344+ -- ^ a map from skolems to their new names, including source and naming info
345− , umUnknownMap :: M.Map Int Int
345+ , umUnknownMap :: M.Map Int Int
346− , umNextUnknown :: Int
346+ -- ^ a map from unification variables to their new names
347+ , umNextIndex :: Int
348+ -- ^ unknowns and skolems share a source of names during renaming, to
349+ -- avoid overlaps in error messages. This is the next label for either case.
347 } deriving Show
350 } deriving Show
348
351
349defaultUnknownMap :: TypeMap
352defaultUnknownMap :: TypeMap
350−defaultUnknownMap = TypeMap M.empty 0 M.empty 0
353+defaultUnknownMap = TypeMap M.empty M.empty 0
351
354
352-- | How critical the issue is
355-- | How critical the issue is
353data Level = Error | Warning deriving Show
356data Level = Error | Warning deriving Show
@@ -366,16 +369,16 @@ replaceUnknowns = everywhereOnTypesM replaceTypes
366 m <- get
369 m <- get
367 case M.lookup u (umUnknownMap m) of
370 case M.lookup u (umUnknownMap m) of
368 Nothing -> do
371 Nothing -> do
369− let u' = umNextUnknown m
372+ let u' = umNextIndex m
370− put $ m { umUnknownMap = M.insert u u' (umUnknownMap m), umNextUnknown = u' + 1 }
373+ put $ m { umUnknownMap = M.insert u u' (umUnknownMap m), umNextIndex = u' + 1 }
371 return (TUnknown u')
374 return (TUnknown u')
372 Just u' -> return (TUnknown u')
375 Just u' -> return (TUnknown u')
373 replaceTypes (Skolem name s sko ss) = do
376 replaceTypes (Skolem name s sko ss) = do
374 m <- get
377 m <- get
375 case M.lookup s (umSkolemMap m) of
378 case M.lookup s (umSkolemMap m) of
376 Nothing -> do
379 Nothing -> do
377− let s' = umNextSkolem m
380+ let s' = umNextIndex m
378− put $ m { umSkolemMap = M.insert s (name, s', ss) (umSkolemMap m), umNextSkolem = s' + 1 }
381+ put $ m { umSkolemMap = M.insert s (name, s', ss) (umSkolemMap m), umNextIndex = s' + 1 }
379 return (Skolem name s' sko ss)
382 return (Skolem name s' sko ss)
380 Just (_, s', _) -> return (Skolem name s' sko ss)
383 Just (_, s', _) -> return (Skolem name s' sko ss)
381 replaceTypes other = return other
384 replaceTypes other = return other