@@ -9,8 +9,9 @@ import Control.Monad
9import Control.Monad.Writer.Class (MonadWriter(..))
9import Control.Monad.Writer.Class (MonadWriter(..))
10import Control.Monad.Error.Class (MonadError(..))
10import Control.Monad.Error.Class (MonadError(..))
12+import Data.Function (on)
12import Data.Foldable (traverse_)
13import Data.Foldable (traverse_)
13−import Data.List (intersect)
14+import Data.List (intersect, groupBy, sortBy)
14import Data.Maybe (fromMaybe, mapMaybe)
15import Data.Maybe (fromMaybe, mapMaybe)
15import qualified Data.Map as M
16import qualified Data.Map as M
@@ -224,7 +225,7 @@ filterModule
224 -> [DeclarationRef]
225 -> [DeclarationRef]
225 -> m Exports
226 -> m Exports
226filterModule mn exps refs = do
227filterModule mn exps refs = do
227− types <- foldM filterTypes M.empty refs
228+ types <- foldM filterTypes M.empty (combineTypeRefs refs)
228 typeOps <- foldM (filterExport TyOpName getTypeOpRef exportedTypeOps) M.empty refs
229 typeOps <- foldM (filterExport TyOpName getTypeOpRef exportedTypeOps) M.empty refs
229 classes <- foldM (filterExport TyClassName getTypeClassRef exportedTypeClasses) M.empty refs
230 classes <- foldM (filterExport TyClassName getTypeClassRef exportedTypeClasses) M.empty refs
230 values <- foldM (filterExport IdentName getValueRef exportedValues) M.empty refs
231 values <- foldM (filterExport IdentName getValueRef exportedValues) M.empty refs
@@ -239,6 +240,18 @@ filterModule mn exps refs = do
243+ -- Takes the list of exported refs, filters out any non-TypeRefs, then
244+ -- combines any duplicate type exports to ensure that all constructors
245+ -- listed for the type are covered. Without this, only the data constructor
246+ -- listing for the last ref would be used.
247+ combineTypeRefs :: [DeclarationRef] -> [DeclarationRef]
249+ = fmap (uncurry TypeRef)
250+ . map (foldr1 $ \(tc, dcs1) (_, dcs2) -> (tc, liftM2 (++) dcs1 dcs2))
251+ . groupBy ((==) `on` fst)
252+ . sortBy (compare `on` fst)
253+ . mapMaybe getTypeRef
242 filterTypes
255 filterTypes
243 :: M.Map (ProperName 'TypeName) ([ProperName 'ConstructorName], ModuleName)
256 :: M.Map (ProperName 'TypeName) ([ProperName 'ConstructorName], ModuleName)
244 -> DeclarationRef
257 -> DeclarationRef