@@ -82,7 +82,7 @@ lintImports (Module _ _ mn mdecls (Just mexports)) env usedImps = do
8282 let names = ordNub $ M. findWithDefault [] mni usedImps'
8383 usedRefs = findUsedRefs ss env mni (Just mnq) names
8484 unless (null usedRefs) .
85- tell . errorMessage' ss $ ImplicitQualifiedImport mni mnq usedRefs
85+ tell . errorMessage' ss $ ImplicitQualifiedImport mni mnq $ map (simplifyTypeRef $ const True ) usedRefs
8686
8787 for_ imports $ \ (mnq, imps) -> do
8888
@@ -183,6 +183,17 @@ lintImports (Module _ _ mn mdecls (Just mexports)) env usedImps = do
183183 _ -> internalError " unqualified name in extractByQual"
184184 go _ = Nothing
185185
186+
187+ -- Replace explicit type refs with data constructor lists from listing the
188+ -- used constructors explicity `T(X, Y, [...])` to `T(..)` for suggestion
189+ -- message.
190+ -- Done everywhere when suggesting a completely new explicit imports list, otherwise
191+ -- maintain the existing form.
192+ simplifyTypeRef :: (ProperName 'TypeName -> Bool ) -> DeclarationRef -> DeclarationRef
193+ simplifyTypeRef shouldOpen (TypeRef ss name (Just dctors))
194+ | not (null dctors) && shouldOpen name = TypeRef ss name Nothing
195+ simplifyTypeRef _ other = other
196+
186197lintImportDecl
187198 :: forall m
188199 . MonadWriter MultipleErrors m
@@ -214,15 +225,7 @@ lintImportDecl env mni qualifierName names ss declType allowImplicit =
214225 checkImplicit warning =
215226 if null allRefs
216227 then unused
217- else warn (warning mni (map simplifyTypeRef allRefs))
218- where
219- -- Replace explicit type refs with data constructor lists from listing the
220- -- used constructors explicity `T(X, Y, [...])` to `T(..)` for suggestion
221- -- message.
222- simplifyTypeRef :: DeclarationRef -> DeclarationRef
223- simplifyTypeRef (TypeRef ss' name (Just dctors))
224- | not (null dctors) = TypeRef ss' name Nothing
225- simplifyTypeRef other = other
228+ else warn (warning mni (map (simplifyTypeRef $ const True ) allRefs))
226229
227230 checkExplicit
228231 :: [DeclarationRef ]
@@ -236,21 +239,28 @@ lintImportDecl env mni qualifierName names ss declType allowImplicit =
236239 didWarn <- case (length diff, length idents) of
237240 (0 , _) -> return False
238241 (n, m) | n == m -> unused
239- _ -> warn (UnusedExplicitImport mni diff qualifierName allRefs)
242+ _ -> warn (UnusedExplicitImport mni diff qualifierName $ map simplifyTypeRef' allRefs)
240243
241244 didWarn' <- forM (mapMaybe getTypeRef declrefs) $ \ (tn, c) -> do
242245 let allCtors = dctorsForType mni tn
243246 -- If we've not already warned a type is unused, check its data constructors
244247 unless' (TyName tn `notElem` usedNames) $
245248 case (c, dctors `intersect` allCtors) of
246- (_, [] ) | c /= Just [] -> warn (UnusedDctorImport mni tn qualifierName allRefs)
249+ (_, [] ) | c /= Just [] -> warn (UnusedDctorImport mni tn qualifierName $ map simplifyTypeRef' allRefs)
247250 (Just ctors, dctors') ->
248251 let ddiff = ctors \\ dctors'
249- in unless' (null ddiff) . warn $ UnusedDctorExplicitImport mni tn ddiff qualifierName allRefs
252+ in unless' (null ddiff) . warn $ UnusedDctorExplicitImport mni tn ddiff qualifierName $ map simplifyTypeRef' allRefs
250253 _ -> return False
251254
252255 return (didWarn || or didWarn')
253256
257+ where
258+ simplifyTypeRef' :: DeclarationRef -> DeclarationRef
259+ simplifyTypeRef' = simplifyTypeRef (\ name -> any (isMatch name) declrefs)
260+ where
261+ isMatch name (TypeRef _ name' Nothing ) = name == name'
262+ isMatch _ _ = False
263+
254264 unused :: m Bool
255265 unused = warn (UnusedImport mni)
256266
0 commit comments