Skip to content

Commit 3679da4

Browse files
nwolversonkritzcreek
authored andcommitted
Make explicit import suggestions more consistent (purescript#3142)
* Make explicit import suggestions more consistent * Make ImplicitQualifiedImport suggestions consistent
1 parent 38f631c commit 3679da4

1 file changed

Lines changed: 23 additions & 13 deletions

File tree

src/Language/PureScript/Linter/Imports.hs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
186197
lintImportDecl
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

Comments
 (0)