git.iko.soy/rowtype-yoga/purslint
on main help sign in
Commit something
commit68a78e45fbf7636d7f2c60f3942e8bccef93886c authorMark <mark.eibes@gmail.com> dateWed 28 Jan 2026, 20:50 (8 months ago) parentf6afde2
83 files changed+294−4
lib/purelint/src/Purelint/Fix.purs+19−4 lib/purelint/src/Purelint/ImportFix.purs+20 lib/purelint/src/Purelint/Rules/AlternativeLaw.purs+3 lib/purelint/src/Purelint/Rules/BooleanSimplify.purs+2 lib/purelint/src/Purelint/Rules/CollapseLambdas.purs+2 lib/purelint/src/Purelint/Rules/ConcatMap.purs+2 lib/purelint/src/Purelint/Rules/EtaReduce.purs+2 lib/purelint/src/Purelint/Rules/EtaReduceDecl.purs+2 lib/purelint/src/Purelint/Rules/EvaluateBool.purs+2 lib/purelint/src/Purelint/Rules/EvaluateConst.purs+2 lib/purelint/src/Purelint/Rules/EvaluateEither.purs+3 lib/purelint/src/Purelint/Rules/EvaluateFst.purs+3 lib/purelint/src/Purelint/Rules/FlattenCase.purs+2 lib/purelint/src/Purelint/Rules/FunctorLaw.purs+2 lib/purelint/src/Purelint/Rules/LetToDo.purs+4 lib/purelint/src/Purelint/Rules/LetToWhere.purs+2 lib/purelint/src/Purelint/Rules/MapFusion.purs+3 lib/purelint/src/Purelint/Rules/MapIdentity.purs+4 lib/purelint/src/Purelint/Rules/MonadLaw.purs+3 lib/purelint/src/Purelint/Rules/MonoidIdentity.purs+3 lib/purelint/src/Purelint/Rules/NotEqual.purs+2 lib/purelint/src/Purelint/Rules/NothingBind.purs+3 lib/purelint/src/Purelint/Rules/RedundantBind.purs+3 lib/purelint/src/Purelint/Rules/RedundantFlip.purs+2 lib/purelint/src/Purelint/Rules/RedundantGuard.purs+2 lib/purelint/src/Purelint/Rules/RedundantId.purs+6 lib/purelint/src/Purelint/Rules/RedundantIf.purs+3 lib/purelint/src/Purelint/Rules/RedundantNegate.purs+2 lib/purelint/src/Purelint/Rules/RedundantNot.purs+2 lib/purelint/src/Purelint/Rules/RedundantParens.purs+4 lib/purelint/src/Purelint/Rules/RedundantReverse.purs+2 lib/purelint/src/Purelint/Rules/UnlessNot.purs+3 lib/purelint/src/Purelint/Rules/UseAll.purs+2 lib/purelint/src/Purelint/Rules/UseAnd.purs+3 lib/purelint/src/Purelint/Rules/UseAny.purs+2 lib/purelint/src/Purelint/Rules/UseApplicative.purs+2 lib/purelint/src/Purelint/Rules/UseApplyFlipped.purs+2 lib/purelint/src/Purelint/Rules/UseBimap.purs+9 lib/purelint/src/Purelint/Rules/UseBindFlip.purs+2 lib/purelint/src/Purelint/Rules/UseBreak.purs+3 lib/purelint/src/Purelint/Rules/UseCaseOf.purs+2 lib/purelint/src/Purelint/Rules/UseComparing.purs+2 lib/purelint/src/Purelint/Rules/UseConst.purs+2 lib/purelint/src/Purelint/Rules/UseDollar.purs+2 lib/purelint/src/Purelint/Rules/UseEitherMap.purs+3 lib/purelint/src/Purelint/Rules/UseElemIndex.purs+3 lib/purelint/src/Purelint/Rules/UseFindMap.purs+8 lib/purelint/src/Purelint/Rules/UseFold.purs+2 lib/purelint/src/Purelint/Rules/UseFoldBool.purs+2 lib/purelint/src/Purelint/Rules/UseFoldMap.purs+2 lib/purelint/src/Purelint/Rules/UseFoldMapId.purs+3 lib/purelint/src/Purelint/Rules/UseFor.purs+3 lib/purelint/src/Purelint/Rules/UseFromJust.purs+4 lib/purelint/src/Purelint/Rules/UseFromMaybe.purs+2 lib/purelint/src/Purelint/Rules/UseFstSnd.purs+3 lib/purelint/src/Purelint/Rules/UseGuard.purs+3 lib/purelint/src/Purelint/Rules/UseGuardMaybe.purs+2 lib/purelint/src/Purelint/Rules/UseHead.purs+2 lib/purelint/src/Purelint/Rules/UseIsJust.purs+2 lib/purelint/src/Purelint/Rules/UseIsNothing.purs+2 lib/purelint/src/Purelint/Rules/UseJoin.purs+3 lib/purelint/src/Purelint/Rules/UseLastReverse.purs+2 lib/purelint/src/Purelint/Rules/UseMapMaybe.purs+8 lib/purelint/src/Purelint/Rules/UseMinMax.purs+2 lib/purelint/src/Purelint/Rules/UseMinimumSort.purs+2 lib/purelint/src/Purelint/Rules/UseNotElem.purs+2 lib/purelint/src/Purelint/Rules/UseNull.purs+2 lib/purelint/src/Purelint/Rules/UseOn.purs+2 lib/purelint/src/Purelint/Rules/UseOr.purs+3 lib/purelint/src/Purelint/Rules/UsePatternGuards.purs+2 lib/purelint/src/Purelint/Rules/UseReplicate.purs+8 lib/purelint/src/Purelint/Rules/UseSequence.purs+8 lib/purelint/src/Purelint/Rules/UseSpan.purs+3 lib/purelint/src/Purelint/Rules/UseTraverse.purs+12 lib/purelint/src/Purelint/Rules/UseTraverseSequence.purs+8 lib/purelint/src/Purelint/Rules/UseUncurry.purs+2 lib/purelint/src/Purelint/Rules/UseUnless.purs+2 lib/purelint/src/Purelint/Rules/UseUnwrap.purs+3 lib/purelint/src/Purelint/Rules/UseVoid.purs+2 lib/purelint/src/Purelint/Rules/UseWhen.purs+2 lib/purelint/src/Purelint/Rules/UseZip.purs+4 lib/purelint/src/Purelint/Rules/WhenNot.purs+3 lib/purelint/src/Purelint/Types.purs+11
lib/purelint/src/Purelint/Fix.purs+19−4
@@ -11,6 +11,7 @@ import Data.String as String
1111import Data.String.CodeUnits as StringCU
1212import PureScript.CST.Types (SourceRange)
1313import Purelint.Types (LintResult(..), LintWarning(..), ReplacementText(..), Suggestion(..))
14+import Purelint.ImportFix (processImports)
1415
1516-- | Extract text at a source range from source code
1617extractRange :: String -> SourceRange -> String
@@ -70,7 +71,10 @@ applyFix :: String -> LintWarning -> Maybe String
7071applyFix source (LintWarning w) = do
7172 Suggestion s <- w.suggestion
7273 let replacement = s.replacement # un ReplacementText
73− Just $ replaceRange source w.range replacement
74+ let { source: updatedSource, replacement: updatedReplacement, linesAdded } =
75+ processImports source replacement s.requiredImports
76+ let shiftedRange = shiftRange linesAdded w.range
77+ Just $ replaceRange updatedSource shiftedRange updatedReplacement
7478
7579-- | Apply all fixes to source code (in reverse order to preserve ranges)
7680-- | Skips overlapping fixes to avoid corruption
@@ -98,8 +102,11 @@ applyAllFixes source (LintResult result) =
98102 Nothing -> acc
99103 Just (Suggestion s) ->
100104 let replacement = s.replacement # un ReplacementText
101− in { source: replaceRange acc.source w.range replacement
102− , appliedRanges: Array.cons w.range acc.appliedRanges
105+ importResult = processImports acc.source replacement s.requiredImports
106+ shiftedRange = shiftRange importResult.linesAdded w.range
107+ updatedSource = replaceRange importResult.source shiftedRange importResult.replacement
108+ in { source: updatedSource
109+ , appliedRanges: Array.cons shiftedRange acc.appliedRanges
103110 }
104111
105112 -- Check if two ranges overlap
@@ -108,4 +115,12 @@ applyAllFixes source (LintResult result) =
108115 not (aEndsBeforeB || bEndsBeforeA)
109116 where
110117 aEndsBeforeB = a.end.line < b.start.line || (a.end.line == b.start.line && a.end.column <= b.start.column)
111− bEndsBeforeA = b.end.line < a.start.line || (b.end.line == a.start.line && b.end.column <= a.start.column)
118+ bEndsBeforeA = b.end.line < a.start.line || (b.end.line == a.start.line && b.end.column <= b.start.column)
119+
120+shiftRange :: Int -> SourceRange -> SourceRange
121+shiftRange lineDelta range =
122+ if lineDelta == 0 then range
123+ else
124+ { start: range.start { line = range.start.line + lineDelta }
125+ , end: range.end { line = range.end.line + lineDelta }
126+ }
lib/purelint/src/Purelint/ImportFix.pursnew file+20
@@ -0,0 +1,20 @@
1+module Purelint.ImportFix where
2+
3+import Prelude
4+
5+import Data.Maybe (Maybe)
6+import PureScript.CST.Types (SourceToken)
7+
8+-- [TODO]: This got lost, I'm not sure what it should do
9+processImports :: String -> String -> Array
10+ { codeText :: Maybe String
11+ , importItem :: Maybe String
12+ , moduleName :: String
13+ , qualifier :: Maybe String
14+ }
15+ -> { linesAdded :: Int
16+ , replacement :: String
17+ , source :: String
18+ }
19+processImports source replacement imports = do
20+ { linesAdded: 0, replacement: "", source: source }
lib/purelint/src/Purelint/Rules/AlternativeLaw.purs+3
@@ -46,6 +46,7 @@ alternativeLawRule = mkRule (RuleId "AlternativeLaw") run
4646 , suggestion: Just $ Suggestion
4747 { replacement: ReplacementText (printExpr rhs)
4848 , description: SuggestionDescription "empty is the identity for <|> (left identity)"
49+ , requiredImports: []
4950 }
5051 }
5152 ]
@@ -59,6 +60,7 @@ alternativeLawRule = mkRule (RuleId "AlternativeLaw") run
5960 , suggestion: Just $ Suggestion
6061 { replacement: ReplacementText (printExpr lhs)
6162 , description: SuggestionDescription "empty is the identity for <|> (right identity)"
63+ , requiredImports: []
6264 }
6365 }
6466 ]
@@ -72,3 +74,4 @@ alternativeLawRule = mkRule (RuleId "AlternativeLaw") run
7274 hasValue imports "Nothing"
7375 isEmpty _ (ExprArray (Wrapped { value: Nothing })) = true -- []
7476 isEmpty _ _ = false
77+
lib/purelint/src/Purelint/Rules/BooleanSimplify.purs+2
@@ -73,6 +73,7 @@ booleanSimplifyRule = run # mkRule (RuleId "BooleanSimplify")
7373 , suggestion: Just $ Suggestion
7474 { replacement: ReplacementText replacement
7575 , description: SuggestionDescription $ from <> " can be simplified to " <> to
76+ , requiredImports: []
7677 }
7778 }
7879
@@ -82,3 +83,4 @@ booleanSimplifyRule = run # mkRule (RuleId "BooleanSimplify")
8283 isBoolLit :: Boolean -> Expr Void -> Boolean
8384 isBoolLit expected (ExprBoolean _ val) = val == expected
8485 isBoolLit _ _ = false
86+
lib/purelint/src/Purelint/Rules/CollapseLambdas.purs+2
@@ -43,6 +43,7 @@ collapseLambdasRule = run # mkRule (RuleId "CollapseLambdas")
4343 , suggestion: Just $ Suggestion
4444 { replacement: ReplacementText replacement
4545 , description: SuggestionDescription "\\x -> \\y -> body can be simplified to \\x y -> body"
46+ , requiredImports: []
4647 }
4748 }
4849 ]
@@ -52,3 +53,4 @@ collapseLambdasRule = run # mkRule (RuleId "CollapseLambdas")
5253 getBinderName :: Binder Void -> Maybe String
5354 getBinderName (BinderVar (Name { name: Ident n })) = Just n
5455 getBinderName _ = Nothing
56+
lib/purelint/src/Purelint/Rules/ConcatMap.purs+2
@@ -58,6 +58,7 @@ concatMapRule = mkRule (RuleId "ConcatMap") run
5858 , suggestion: Just $ Suggestion
5959 { replacement: ReplacementText replacement
6060 , description: SuggestionDescription msg
61+ , requiredImports: []
6162 }
6263 }
6364 ]
@@ -77,3 +78,4 @@ concatMapRule = mkRule (RuleId "ConcatMap") run
7778
7879 getIdentName :: QualifiedName Ident -> String
7980 getIdentName (QualifiedName { name: Ident name }) = name
81+
lib/purelint/src/Purelint/Rules/EtaReduce.purs+2
@@ -63,6 +63,7 @@ etaReduceRule = mkRule (RuleId "EtaReduce") run
6363 , suggestion: Just $ Suggestion
6464 { replacement: ReplacementText fnText
6565 , description: SuggestionDescription $ "\\x -> f x can be simplified to f"
66+ , requiredImports: []
6667 }
6768 }
6869 ]
@@ -89,3 +90,4 @@ etaReduceRule = mkRule (RuleId "EtaReduce") run
8990 checkArg = case _, _ of
9091 name, (AppTerm e) -> e # mentionsParam name
9192 _, _ -> false
93+
lib/purelint/src/Purelint/Rules/EtaReduceDecl.purs+2
@@ -59,6 +59,7 @@ etaReduceDeclRule = mkRule (RuleId "EtaReduceDecl") run
5959 , suggestion: Just $ Suggestion
6060 { replacement: ReplacementText ("= " <> newRhs)
6161 , description: SuggestionDescription "Remove redundant parameter"
62+ , requiredImports: []
6263 }
6364 }
6465 ]
@@ -87,3 +88,4 @@ etaReduceDeclRule = mkRule (RuleId "EtaReduceDecl") run
8788 checkArg :: String -> AppSpine Expr Void -> Boolean
8889 checkArg name (AppTerm e) = mentionsParam name e
8990 checkArg _ _ = false
91+
lib/purelint/src/Purelint/Rules/EvaluateBool.purs+2
@@ -83,6 +83,8 @@ evaluateBoolRule = run # mkRule (RuleId "EvaluateBool")
8383 , suggestion: Just $ Suggestion
8484 { replacement: ReplacementText replacement
8585 , description: SuggestionDescription $ "Simplifies to " <> desc
86+ , requiredImports: []
8687 }
8788 }
8889 ]
90+
lib/purelint/src/Purelint/Rules/EvaluateConst.purs+2
@@ -40,6 +40,7 @@ evaluateConstRule = mkRule (RuleId "EvaluateConst") run
4040 , suggestion: Just $ Suggestion
4141 { replacement: ReplacementText x
4242 , description: SuggestionDescription "Evaluate const"
43+ , requiredImports: []
4344 }
4445 }
4546 ]
@@ -50,3 +51,4 @@ evaluateConstRule = mkRule (RuleId "EvaluateConst") run
5051 isConst imports (ExprIdent (QualifiedName { name: Ident name })) =
5152 name == "const" && hasValue imports "const"
5253 isConst _ _ = false
54+
lib/purelint/src/Purelint/Rules/EvaluateEither.purs+3
@@ -50,6 +50,7 @@ evaluateEitherRule = mkRule (RuleId "EvaluateEither") run
5050 , suggestion: Just $ Suggestion
5151 { replacement: ReplacementText replacement
5252 , description: SuggestionDescription "Apply f directly to x"
53+ , requiredImports: []
5354 }
5455 }
5556 ]
@@ -67,6 +68,7 @@ evaluateEitherRule = mkRule (RuleId "EvaluateEither") run
6768 , suggestion: Just $ Suggestion
6869 { replacement: ReplacementText replacement
6970 , description: SuggestionDescription "Apply g directly to y"
71+ , requiredImports: []
7072 }
7173 }
7274 ]
@@ -117,3 +119,4 @@ evaluateEitherRule = mkRule (RuleId "EvaluateEither") run
117119 ExprRecord _ -> printExpr e
118120 ExprParens _ -> printExpr e
119121 _ -> "(" <> printExpr e <> ")"
122+
lib/purelint/src/Purelint/Rules/EvaluateFst.purs+3
@@ -43,6 +43,7 @@ evaluateFstRule = mkRule (RuleId "EvaluateFst") run
4343 , suggestion: Just $ Suggestion
4444 { replacement: ReplacementText x
4545 , description: SuggestionDescription "Extract first element directly"
46+ , requiredImports: []
4647 }
4748 }
4849 ]
@@ -63,6 +64,7 @@ evaluateFstRule = mkRule (RuleId "EvaluateFst") run
6364 , suggestion: Just $ Suggestion
6465 { replacement: ReplacementText y
6566 , description: SuggestionDescription "Extract second element directly"
67+ , requiredImports: []
6668 }
6769 }
6870 ]
@@ -94,3 +96,4 @@ evaluateFstRule = mkRule (RuleId "EvaluateFst") run
9496 _ -> Nothing
9597 _ -> Nothing
9698 getTupleElements _ = Nothing
99+
lib/purelint/src/Purelint/Rules/FlattenCase.purs+2
@@ -56,6 +56,7 @@ flattenCaseRule = mkRule (RuleId "FlattenCase") run
5656 , suggestion: Just $ Suggestion
5757 { replacement: ReplacementText replacement
5858 , description: SuggestionDescription $ "Use case with " <> show depth <> " scrutinees instead of nested cases"
59+ , requiredImports: []
5960 }
6061 }
6162 ]
@@ -141,3 +142,4 @@ flattenCaseRule = mkRule (RuleId "FlattenCase") run
141142 formatArm :: { patterns :: Array String, body :: String } -> String
142143 formatArm { patterns, body } =
143144 String.joinWith ", " patterns <> " -> " <> body
145+
lib/purelint/src/Purelint/Rules/FunctorLaw.purs+2
@@ -74,6 +74,7 @@ functorLawRule = mkRule (RuleId "FunctorLaw") run
7474 , suggestion: Just $ Suggestion
7575 { replacement: ReplacementText replacement
7676 , description: SuggestionDescription $ style <> " f (" <> style <> " g x) can be fused to " <> style <> " (f <<< g) x"
77+ , requiredImports: []
7778 }
7879 }
7980 ]
@@ -90,3 +91,4 @@ functorLawRule = mkRule (RuleId "FunctorLaw") run
9091 isMapOp :: ImportInfo -> QualifiedName Operator -> Boolean
9192 isMapOp imports (QualifiedName { name: Operator op }) =
9293 op == "<$>" && hasOp imports "<$>"
94+
lib/purelint/src/Purelint/Rules/LetToDo.purs+4
@@ -68,6 +68,7 @@ letToDoRule = mkRule (RuleId "LetToDo") run
6868 , suggestion: Just $ Suggestion
6969 { replacement: ReplacementText replacement
7070 , description: SuggestionDescription "Convert to do notation"
71+ , requiredImports: []
7172 }
7273 }
7374 ]
@@ -111,6 +112,7 @@ letToDoRule = mkRule (RuleId "LetToDo") run
111112 , suggestion: Just $ Suggestion
112113 { replacement: ReplacementText replacement
113114 , description: SuggestionDescription "Convert to do notation"
115+ , requiredImports: []
114116 }
115117 }
116118 ]
@@ -154,3 +156,5 @@ letToDoRule = mkRule (RuleId "LetToDo") run
154156 Comment str -> str
155157 Space n -> power " " n
156158 Line v _ -> absurd v
159+
160+
lib/purelint/src/Purelint/Rules/LetToWhere.purs+2
@@ -77,6 +77,7 @@ letToWhereRule = mkRule (RuleId "LetToWhere") run
7777 , suggestion: Just $ Suggestion
7878 { replacement: ReplacementText replacement
7979 , description: SuggestionDescription "Convert to where clause"
80+ , requiredImports: []
8081 }
8182 }
8283 ]
@@ -118,3 +119,4 @@ letToWhereRule = mkRule (RuleId "LetToWhere") run
118119 Comment str -> str
119120 Space n -> power " " n
120121 Line v _ -> absurd v
122+
lib/purelint/src/Purelint/Rules/MapFusion.purs+3
@@ -84,6 +84,7 @@ mapFusionRule = mkRule (RuleId "MapFusion") run
8484 , suggestion: Just $ Suggestion
8585 { replacement: ReplacementText replacement
8686 , description: SuggestionDescription "x <#> g <#> f can be replaced with x <#> (g >>> f)"
87+ , requiredImports: []
8788 }
8889 }
8990 ]
@@ -120,6 +121,7 @@ mapFusionRule = mkRule (RuleId "MapFusion") run
120121 , suggestion: Just $ Suggestion
121122 { replacement: ReplacementText replacement
122123 , description: SuggestionDescription "Nested maps can be fused with composition"
124+ , requiredImports: []
123125 }
124126 }
125127 ]
@@ -139,3 +141,4 @@ mapFusionRule = mkRule (RuleId "MapFusion") run
139141 isFlippedMapOp :: ImportInfo -> QualifiedName Operator -> Boolean
140142 isFlippedMapOp imports (QualifiedName { name: Operator op }) =
141143 (op == "<#>" || op == "<##>") && hasOp imports "<#>"
144+
lib/purelint/src/Purelint/Rules/MapIdentity.purs+4
@@ -41,6 +41,7 @@ mapIdentityRule = run # mkRule (RuleId "MapIdentity")
4141 , suggestion: Just $ Suggestion
4242 { replacement: ReplacementText (printExpr xExpr)
4343 , description: SuggestionDescription "map identity x can be simplified to x"
44+ , requiredImports: []
4445 }
4546 }
4647 ]
@@ -57,6 +58,7 @@ mapIdentityRule = run # mkRule (RuleId "MapIdentity")
5758 , suggestion: Just $ Suggestion
5859 { replacement: ReplacementText (printExpr xExpr)
5960 , description: SuggestionDescription "identity <$> x can be simplified to x"
61+ , requiredImports: []
6062 }
6163 }
6264 ]
@@ -73,6 +75,7 @@ mapIdentityRule = run # mkRule (RuleId "MapIdentity")
7375 , suggestion: Just $ Suggestion
7476 { replacement: ReplacementText (printExpr lhs)
7577 , description: SuggestionDescription "x <#> identity can be simplified to x"
78+ , requiredImports: []
7679 }
7780 }
7881 ]
@@ -94,3 +97,4 @@ mapIdentityRule = run # mkRule (RuleId "MapIdentity")
9497 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
9598 (name == "identity" && hasValue imports "identity") || (name == "id" && hasValue imports "id")
9699 isIdentity _ _ = false
100+
lib/purelint/src/Purelint/Rules/MonadLaw.purs+3
@@ -52,6 +52,7 @@ monadLawRule = mkRule (RuleId "MonadLaw") run
5252 , suggestion: Just $ Suggestion
5353 { replacement: ReplacementText replacement
5454 , description: SuggestionDescription "Apply f directly to a (left identity)"
55+ , requiredImports: []
5556 }
5657 }
5758 ]
@@ -66,6 +67,7 @@ monadLawRule = mkRule (RuleId "MonadLaw") run
6667 , suggestion: Just $ Suggestion
6768 { replacement: ReplacementText (printExpr m)
6869 , description: SuggestionDescription "pure =<< m is just m (right identity)"
70+ , requiredImports: []
6971 }
7072 }
7173 ]
@@ -95,3 +97,4 @@ monadLawRule = mkRule (RuleId "MonadLaw") run
9597 ExprRecord _ -> printExpr e
9698 ExprParens _ -> printExpr e
9799 _ -> "(" <> printExpr e <> ")"
100+
lib/purelint/src/Purelint/Rules/MonoidIdentity.purs+3
@@ -42,6 +42,7 @@ monoidIdentityRule = mkRule (RuleId "MonoidIdentity") run
4242 , suggestion: Just $ Suggestion
4343 { replacement: ReplacementText rhsText
4444 , description: SuggestionDescription "mempty <> x can be simplified to x (Monoid left identity)"
45+ , requiredImports: []
4546 }
4647 }
4748 ]
@@ -56,6 +57,7 @@ monoidIdentityRule = mkRule (RuleId "MonoidIdentity") run
5657 , suggestion: Just $ Suggestion
5758 { replacement: ReplacementText lhsText
5859 , description: SuggestionDescription "x <> mempty can be simplified to x (Monoid right identity)"
60+ , requiredImports: []
5961 }
6062 }
6163 ]
@@ -67,3 +69,4 @@ monoidIdentityRule = mkRule (RuleId "MonoidIdentity") run
6769 isMempty imports (ExprIdent (QualifiedName { name: Ident name })) =
6870 name == "mempty" && hasValue imports "mempty"
6971 isMempty _ _ = false
72+
lib/purelint/src/Purelint/Rules/NotEqual.purs+2
@@ -64,6 +64,7 @@ notEqualRule = mkRule (RuleId "NotEqual") run
6464 , suggestion: Just $ Suggestion
6565 { replacement: ReplacementText replacement
6666 , description: SuggestionDescription msg
67+ , requiredImports: []
6768 }
6869 }
6970 ]
@@ -80,3 +81,4 @@ notEqualRule = mkRule (RuleId "NotEqual") run
8081
8182 isNot :: ImportInfo -> QualifiedName Ident -> Boolean
8283 isNot imports (QualifiedName { name: Ident name }) = name == "not" && hasValue imports "not"
84+
lib/purelint/src/Purelint/Rules/NothingBind.purs+3
@@ -40,6 +40,7 @@ nothingBindRule = mkRule (RuleId "NothingBind") run
4040 , suggestion: Just $ Suggestion
4141 { replacement: ReplacementText "Nothing"
4242 , description: SuggestionDescription "Simplify Nothing >>= f to Nothing"
43+ , requiredImports: []
4344 }
4445 }
4546 ]
@@ -54,6 +55,7 @@ nothingBindRule = mkRule (RuleId "NothingBind") run
5455 , suggestion: Just $ Suggestion
5556 { replacement: ReplacementText "Nothing"
5657 , description: SuggestionDescription "Simplify f =<< Nothing to Nothing"
58+ , requiredImports: []
5759 }
5860 }
5961 ]
@@ -69,3 +71,4 @@ nothingBindRule = mkRule (RuleId "NothingBind") run
6971 isNothing (ExprIdent (QualifiedName { name: Ident "Nothing" })) = true
7072 isNothing (ExprConstructor (QualifiedName { name: Proper "Nothing" })) = true
7173 isNothing _ = false
74+
lib/purelint/src/Purelint/Rules/RedundantBind.purs+3
@@ -50,6 +50,7 @@ redundantBindRule = mkRule (RuleId "RedundantBind") run
5050 , suggestion: Just $ Suggestion
5151 { replacement: ReplacementText lhsText
5252 , description: SuggestionDescription "x >>= pure can be simplified to x"
53+ , requiredImports: []
5354 }
5455 }
5556 ]
@@ -66,6 +67,7 @@ redundantBindRule = mkRule (RuleId "RedundantBind") run
6667 , suggestion: Just $ Suggestion
6768 { replacement: ReplacementText replacement
6869 , description: SuggestionDescription "Apply f directly to x"
70+ , requiredImports: []
6971 }
7072 }
7173 ]
@@ -83,3 +85,4 @@ redundantBindRule = mkRule (RuleId "RedundantBind") run
8385 [AppTerm arg] -> Just arg
8486 _ -> Nothing
8587 getPureArg _ _ = Nothing
88+
lib/purelint/src/Purelint/Rules/RedundantFlip.purs+2
@@ -41,6 +41,7 @@ redundantFlipRule = mkRule (RuleId "RedundantFlip") run
4141 , suggestion: Just $ Suggestion
4242 { replacement: ReplacementText fText
4343 , description: SuggestionDescription "flip (flip f) can be simplified to f"
44+ , requiredImports: []
4445 }
4546 }
4647 ]
@@ -60,3 +61,4 @@ redundantFlipRule = mkRule (RuleId "RedundantFlip") run
6061 _ -> Nothing
6162 getFlipArg imports (ExprParens (Wrapped { value })) = getFlipArg imports value
6263 getFlipArg _ _ = Nothing
64+
lib/purelint/src/Purelint/Rules/RedundantGuard.purs+2
@@ -38,6 +38,7 @@ redundantGuardRule = mkRule (RuleId "RedundantGuard") run
3838 , suggestion: Just $ Suggestion
3939 { replacement: ReplacementText "pure unit"
4040 , description: SuggestionDescription "guard true can be replaced with pure unit"
41+ , requiredImports: []
4142 }
4243 }
4344 ]
@@ -69,3 +70,4 @@ redundantGuardRule = mkRule (RuleId "RedundantGuard") run
6970 isFalse :: Expr Void -> Boolean
7071 isFalse (ExprBoolean _ b) = not b
7172 isFalse _ = false
73+
lib/purelint/src/Purelint/Rules/RedundantId.purs+6
@@ -43,6 +43,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
4343 , suggestion: Just $ Suggestion
4444 { replacement: ReplacementText x
4545 , description: SuggestionDescription "Remove redundant identity application"
46+ , requiredImports: []
4647 }
4748 }
4849 ]
@@ -63,6 +64,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
6364 , suggestion: Just $ Suggestion
6465 { replacement: ReplacementText x
6566 , description: SuggestionDescription "Remove redundant identity composition"
67+ , requiredImports: []
6668 }
6769 }
6870 ]
@@ -77,6 +79,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
7779 , suggestion: Just $ Suggestion
7880 { replacement: ReplacementText x
7981 , description: SuggestionDescription "Remove redundant identity composition"
82+ , requiredImports: []
8083 }
8184 }
8285 ]
@@ -93,6 +96,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
9396 , suggestion: Just $ Suggestion
9497 { replacement: ReplacementText x
9598 , description: SuggestionDescription "Remove redundant identity composition"
99+ , requiredImports: []
96100 }
97101 }
98102 ]
@@ -107,6 +111,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
107111 , suggestion: Just $ Suggestion
108112 { replacement: ReplacementText x
109113 , description: SuggestionDescription "Remove redundant identity composition"
114+ , requiredImports: []
110115 }
111116 }
112117 ]
@@ -122,3 +127,4 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
122127 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
123128 (name == "identity" || name == "id") && hasValue imports "identity"
124129 isIdentity _ _ = false
130+
lib/purelint/src/Purelint/Rules/RedundantIf.purs+3
@@ -41,6 +41,7 @@ redundantIfRule = mkRule (RuleId "RedundantIf") run
4141 , suggestion: Just $ Suggestion
4242 { replacement: ReplacementText (printExpr condExpr)
4343 , description: SuggestionDescription "if a then true else false can be simplified to a"
44+ , requiredImports: []
4445 }
4546 }
4647 ]
@@ -54,6 +55,7 @@ redundantIfRule = mkRule (RuleId "RedundantIf") run
5455 , suggestion: Just $ Suggestion
5556 { replacement: ReplacementText ("not " <> printExpr condExpr)
5657 , description: SuggestionDescription "if a then false else true can be simplified to not a"
58+ , requiredImports: []
5759 }
5860 }
5961 ]
@@ -63,3 +65,4 @@ redundantIfRule = mkRule (RuleId "RedundantIf") run
6365 isBoolLit :: Boolean -> Expr Void -> Boolean
6466 isBoolLit expected (ExprBoolean _ val) = val == expected
6567 isBoolLit _ _ = false
68+
lib/purelint/src/Purelint/Rules/RedundantNegate.purs+2
@@ -45,6 +45,7 @@ redundantNegateRule = mkRule (RuleId "RedundantNegate") run
4545 , suggestion: Just $ Suggestion
4646 { replacement: ReplacementText x
4747 , description: SuggestionDescription "Remove redundant double negation"
48+ , requiredImports: []
4849 }
4950 }
5051 ]
@@ -61,3 +62,4 @@ redundantNegateRule = mkRule (RuleId "RedundantNegate") run
6162 isNegate imports (ExprIdent (QualifiedName { name: Ident name })) =
6263 name == "negate" && hasValue imports "negate"
6364 isNegate _ _ = false
65+
lib/purelint/src/Purelint/Rules/RedundantNot.purs+2
@@ -41,6 +41,7 @@ redundantNotRule = mkRule (RuleId "RedundantNot") run
4141 , suggestion: Just $ Suggestion
4242 { replacement: ReplacementText xText
4343 , description: SuggestionDescription "not (not x) can be simplified to x"
44+ , requiredImports: []
4445 }
4546 }
4647 ]
@@ -60,3 +61,4 @@ redundantNotRule = mkRule (RuleId "RedundantNot") run
6061 _ -> Nothing
6162 getNotArg imports (ExprParens (Wrapped { value })) = getNotArg imports value
6263 getNotArg _ _ = Nothing
64+
lib/purelint/src/Purelint/Rules/RedundantParens.purs+4
@@ -256,6 +256,7 @@ redundantParensRule = mkRule (RuleId "RedundantParens") run
256256 , suggestion: Just $ Suggestion
257257 { replacement: ReplacementText (printExpr inner)
258258 , description: SuggestionDescription "Remove unnecessary parentheses"
259+ , requiredImports: []
259260 }
260261 }
261262
@@ -321,6 +322,7 @@ redundantParensRule = mkRule (RuleId "RedundantParens") run
321322 , suggestion: Just $ Suggestion
322323 { replacement: ReplacementText (printBinder inner)
323324 , description: SuggestionDescription "Remove unnecessary parentheses"
325+ , requiredImports: []
324326 }
325327 }
326328
@@ -415,5 +417,7 @@ redundantParensRule = mkRule (RuleId "RedundantParens") run
415417 , suggestion: Just $ Suggestion
416418 { replacement: ReplacementText (printType inner)
417419 , description: SuggestionDescription "Remove unnecessary parentheses"
420+ , requiredImports: []
418421 }
419422 }
423+
lib/purelint/src/Purelint/Rules/RedundantReverse.purs+2
@@ -42,6 +42,7 @@ redundantReverseRule = mkRule (RuleId "RedundantReverse") run
4242 , suggestion: Just $ Suggestion
4343 { replacement: ReplacementText x
4444 , description: SuggestionDescription "Remove redundant double reverse"
45+ , requiredImports: []
4546 }
4647 }
4748 ]
@@ -56,3 +57,4 @@ redundantReverseRule = mkRule (RuleId "RedundantReverse") run
5657 isReverse imports (ExprIdent (QualifiedName { name: Ident name })) =
5758 name == "reverse" && hasValue imports "reverse"
5859 isReverse _ _ = false
60+
lib/purelint/src/Purelint/Rules/UnlessNot.purs+3
@@ -44,6 +44,7 @@ unlessNotRule = mkRule (RuleId "UnlessNot") run
4444 , suggestion: Just $ Suggestion
4545 { replacement: ReplacementText ("when " <> xText <> " " <> action)
4646 , description: SuggestionDescription "Use when instead of unless (not ...)"
47+ , requiredImports: []
4748 }
4849 }
4950 ]
@@ -61,6 +62,7 @@ unlessNotRule = mkRule (RuleId "UnlessNot") run
6162 , suggestion: Just $ Suggestion
6263 { replacement: ReplacementText ("when " <> xText)
6364 , description: SuggestionDescription "Use when instead of unless (not ...)"
65+ , requiredImports: []
6466 }
6567 }
6668 ]
@@ -91,3 +93,4 @@ unlessNotRule = mkRule (RuleId "UnlessNot") run
9193 [AppTerm arg] -> Just arg
9294 _ -> Nothing
9395 _ -> Nothing
96+
lib/purelint/src/Purelint/Rules/UseAll.purs+2
@@ -45,6 +45,7 @@ useAllRule = mkRule (RuleId "UseAll") run
4545 , suggestion: Just $ Suggestion
4646 { replacement: ReplacementText ("all " <> fText <> " " <> xText)
4747 , description: SuggestionDescription "and (map f x) can be simplified to all f x"
48+ , requiredImports: []
4849 }
4950 }
5051 ]
@@ -66,3 +67,4 @@ useAllRule = mkRule (RuleId "UseAll") run
6667 isMapLike imports (ExprIdent (QualifiedName { name: Ident name })) =
6768 name == "map" && hasValue imports "map"
6869 isMapLike _ _ = false
70+
lib/purelint/src/Purelint/Rules/UseAnd.purs+3
@@ -39,6 +39,7 @@ useAndRule = mkRule (RuleId "UseAnd") run
3939 , suggestion: Just $ Suggestion
4040 { replacement: ReplacementText "and"
4141 , description: SuggestionDescription "Use and instead of all identity"
42+ , requiredImports: []
4243 }
4344 }
4445 ]
@@ -55,6 +56,7 @@ useAndRule = mkRule (RuleId "UseAnd") run
5556 , suggestion: Just $ Suggestion
5657 { replacement: ReplacementText ("and " <> x)
5758 , description: SuggestionDescription "Use and instead of all identity"
59+ , requiredImports: []
5860 }
5961 }
6062 ]
@@ -75,3 +77,4 @@ useAndRule = mkRule (RuleId "UseAnd") run
7577 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
7678 (name == "identity" || name == "id") && hasValue imports "identity"
7779 isIdentity _ _ = false
80+
lib/purelint/src/Purelint/Rules/UseAny.purs+2
@@ -41,6 +41,7 @@ useAnyRule = mkRule (RuleId "UseAny") run
4141 , suggestion: Just $ Suggestion
4242 { replacement: ReplacementText ("any " <> fText <> " " <> xText)
4343 , description: SuggestionDescription "or (map f x) can be simplified to any f x"
44+ , requiredImports: []
4445 }
4546 }
4647 ]
@@ -59,3 +60,4 @@ useAnyRule = mkRule (RuleId "UseAny") run
5960 isMapLike = case _, _ of
6061 imports, (ExprIdent (QualifiedName { name: Ident name })) -> name == "map" && hasValue imports "map"
6162 _, _ -> false
63+
lib/purelint/src/Purelint/Rules/UseApplicative.purs+2
@@ -43,6 +43,7 @@ useApplicativeRule = run # mkRule (RuleId "UseApplicative")
4343 , suggestion: Just $ Suggestion
4444 { replacement: ReplacementText (f <> " <$> " <> x)
4545 , description: SuggestionDescription "Use <$> instead of pure f <*> x"
46+ , requiredImports: []
4647 }
4748 }
4849 ]
@@ -56,3 +57,4 @@ useApplicativeRule = run # mkRule (RuleId "UseApplicative")
5657 isPure imports (ExprIdent (QualifiedName { name: Ident name })) =
5758 name == "pure" && hasValue imports "pure"
5859 isPure _ _ = false
60+
lib/purelint/src/Purelint/Rules/UseApplyFlipped.purs+2
@@ -45,6 +45,7 @@ useApplyFlippedRule = mkRule (RuleId "UseApplyFlipped") run
4545 , suggestion: Just $ Suggestion
4646 { replacement: ReplacementText replacement
4747 , description: SuggestionDescription ("Rewrite as: " <> replacement)
48+ , requiredImports: []
4849 }
4950 }
5051 ]
@@ -53,3 +54,4 @@ useApplyFlippedRule = mkRule (RuleId "UseApplyFlipped") run
5354 unwrapParens :: Expr Void -> Expr Void
5455 unwrapParens (ExprParens (Wrapped { value })) = unwrapParens value
5556 unwrapParens e = e
57+
lib/purelint/src/Purelint/Rules/UseBimap.purs+9
@@ -48,6 +48,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
4848 , suggestion: Just $ Suggestion
4949 { replacement: ReplacementText ("second " <> g)
5050 , description: SuggestionDescription "Use second instead of bimap id"
51+ , requiredImports: []
5152 }
5253 }
5354 ]
@@ -63,6 +64,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
6364 , suggestion: Just $ Suggestion
6465 { replacement: ReplacementText ("first " <> f)
6566 , description: SuggestionDescription "Use first instead of bimap f id"
67+ , requiredImports: []
6668 }
6769 }
6870 ]
@@ -75,6 +77,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
7577 , suggestion: Just $ Suggestion
7678 { replacement: ReplacementText "identity"
7779 , description: SuggestionDescription "bimap id id is just identity"
80+ , requiredImports: []
7881 }
7982 }
8083 ]
@@ -97,6 +100,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
97100 , suggestion: Just $ Suggestion
98101 { replacement: ReplacementText ("second " <> g <> " " <> x)
99102 , description: SuggestionDescription "Use second instead of bimap id"
103+ , requiredImports: []
100104 }
101105 }
102106 ]
@@ -112,6 +116,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
112116 , suggestion: Just $ Suggestion
113117 { replacement: ReplacementText ("first " <> f <> " " <> x)
114118 , description: SuggestionDescription "Use first instead of bimap f id"
119+ , requiredImports: []
115120 }
116121 }
117122 ]
@@ -124,6 +129,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
124129 , suggestion: Just $ Suggestion
125130 { replacement: ReplacementText x
126131 , description: SuggestionDescription "bimap id id x is just x"
132+ , requiredImports: []
127133 }
128134 }
129135 ]
@@ -149,6 +155,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
149155 , suggestion: Just $ Suggestion
150156 { replacement: ReplacementText ("bimap " <> f <> " " <> g <> " " <> x)
151157 , description: SuggestionDescription "Use bimap instead of first and second"
158+ , requiredImports: []
152159 }
153160 }
154161 ]
@@ -172,6 +179,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
172179 , suggestion: Just $ Suggestion
173180 { replacement: ReplacementText ("bimap " <> f <> " " <> g <> " " <> x)
174181 , description: SuggestionDescription "Use bimap instead of first and second"
182+ , requiredImports: []
175183 }
176184 }
177185 ]
@@ -201,3 +209,4 @@ useBimapRule = mkRule (RuleId "UseBimap") run
201209 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
202210 (name == "identity" && hasValue imports "identity") || (name == "id" && hasValue imports "identity")
203211 isIdentity _ _ = false
212+
lib/purelint/src/Purelint/Rules/UseBindFlip.purs+2
@@ -52,6 +52,7 @@ useBindFlipRule = mkRule (RuleId "UseBindFlip") run
5252 , suggestion: Just $ Suggestion
5353 { replacement: ReplacementText (x <> " >>= " <> f)
5454 , description: SuggestionDescription "Use >>= instead of join composed with map"
55+ , requiredImports: []
5556 }
5657 }
5758 ]
@@ -66,3 +67,4 @@ useBindFlipRule = mkRule (RuleId "UseBindFlip") run
6667 isMap = case _, _ of
6768 imports, ExprIdent (QualifiedName { name: Ident name }) -> name == "map" && hasValue imports "map"
6869 _, _ -> false
70+
lib/purelint/src/Purelint/Rules/UseBreak.purs+3
@@ -45,6 +45,7 @@ useBreakRule = mkRule (RuleId "UseBreak") run
4545 , suggestion: Just $ Suggestion
4646 { replacement: ReplacementText ("break " <> pText <> " " <> x)
4747 , description: SuggestionDescription "Use break instead of span with negated predicate"
48+ , requiredImports: []
4849 }
4950 }
5051 ]
@@ -63,6 +64,7 @@ useBreakRule = mkRule (RuleId "UseBreak") run
6364 , suggestion: Just $ Suggestion
6465 { replacement: ReplacementText ("break " <> pText)
6566 , description: SuggestionDescription "Use break instead of span with negated predicate"
67+ , requiredImports: []
6668 }
6769 }
6870 ]
@@ -94,3 +96,4 @@ useBreakRule = mkRule (RuleId "UseBreak") run
9496 [ AppTerm p ] -> Just p
9597 _ -> Nothing
9698 _ -> Nothing
99+
lib/purelint/src/Purelint/Rules/UseCaseOf.purs+2
@@ -156,6 +156,7 @@ useCaseOfRule = mkRule (RuleId "UseCaseOf") run
156156 , suggestion: Just $ Suggestion
157157 { replacement: ReplacementText replacement
158158 , description: SuggestionDescription "Convert to case _ of"
159+ , requiredImports: []
159160 }
160161 }
161162 ]
@@ -235,3 +236,4 @@ useCaseOfRule = mkRule (RuleId "UseCaseOf") run
235236 Comment str -> str
236237 Space n -> power " " n
237238 Line v _ -> absurd v
239+
lib/purelint/src/Purelint/Rules/UseComparing.purs+2
@@ -55,6 +55,7 @@ useComparingRule = mkRule (RuleId "UseComparing") run
5555 , suggestion: Just $ Suggestion
5656 { replacement: ReplacementText ("comparing " <> f1)
5757 , description: SuggestionDescription "Use comparing instead of lambda with compare"
58+ , requiredImports: []
5859 }
5960 }
6061 ]
@@ -74,3 +75,4 @@ useComparingRule = mkRule (RuleId "UseComparing") run
7475 _ -> Nothing
7576 _, _ -> Nothing
7677 extractFunctionCall _ = Nothing
78+
lib/purelint/src/Purelint/Rules/UseConst.purs+2
@@ -78,6 +78,7 @@ useConstRule = mkRule (RuleId "UseConst") run
7878 , suggestion: Just $ Suggestion
7979 { replacement: ReplacementText replacement
8080 , description: SuggestionDescription "\\_ -> y can be simplified to const y"
81+ , requiredImports: []
8182 }
8283 }
8384 ]
@@ -89,3 +90,4 @@ useConstRule = mkRule (RuleId "UseConst") run
8990 getIndent s =
9091 let loop i = if String.take 1 (String.drop i s) == " " then loop (i + 1) else i
9192 in loop 0
93+
lib/purelint/src/Purelint/Rules/UseDollar.purs+2
@@ -86,6 +86,7 @@ useDollarRule = mkRule (RuleId "UseDollar") run
8686 , suggestion: Just $ Suggestion
8787 { replacement: ReplacementText replacement
8888 , description: SuggestionDescription "Replace parentheses with $"
89+ , requiredImports: []
8990 }
9091 }
9192
@@ -93,3 +94,4 @@ useDollarRule = mkRule (RuleId "UseDollar") run
9394 printAppSpine = case _ of
9495 AppTerm e -> printExpr e
9596 AppType _ t -> "@" <> printType t
97+
lib/purelint/src/Purelint/Rules/UseEitherMap.purs+3
@@ -45,6 +45,7 @@ useEitherMapRule = mkRule (RuleId "UseEitherMap") run
4545 , suggestion: Just $ Suggestion
4646 { replacement: ReplacementText ("map " <> fText)
4747 , description: SuggestionDescription "Use map instead of either Left (Right <<< f)"
48+ , requiredImports: []
4849 }
4950 }
5051 ]
@@ -67,6 +68,7 @@ useEitherMapRule = mkRule (RuleId "UseEitherMap") run
6768 , suggestion: Just $ Suggestion
6869 { replacement: ReplacementText ("map " <> fText <> " " <> x)
6970 , description: SuggestionDescription "Use map instead of either Left (Right <<< f)"
71+ , requiredImports: []
7072 }
7173 }
7274 ]
@@ -112,3 +114,4 @@ useEitherMapRule = mkRule (RuleId "UseEitherMap") run
112114 | isRight imports rhs -> Just lhs
113115 _ -> Nothing
114116 _ -> Nothing
117+
lib/purelint/src/Purelint/Rules/UseElemIndex.purs+3
@@ -44,6 +44,7 @@ useElemIndexRule = mkRule (RuleId "UseElemIndex") run
4444 , suggestion: Just $ Suggestion
4545 { replacement: ReplacementText ("elemIndex " <> aText)
4646 , description: SuggestionDescription "Use elemIndex instead of findIndex (== a)"
47+ , requiredImports: []
4748 }
4849 }
4950 ]
@@ -63,6 +64,7 @@ useElemIndexRule = mkRule (RuleId "UseElemIndex") run
6364 , suggestion: Just $ Suggestion
6465 { replacement: ReplacementText ("elemIndex " <> aText <> " " <> x)
6566 , description: SuggestionDescription "Use elemIndex instead of findIndex (== a)"
67+ , requiredImports: []
6668 }
6769 }
6870 ]
@@ -126,3 +128,4 @@ useElemIndexRule = mkRule (RuleId "UseElemIndex") run
126128 getBinderName (BinderVar (Name { name: Ident name })) = Just name
127129 getBinderName (BinderParens (Wrapped { value: inner })) = getBinderName inner
128130 getBinderName _ = Nothing
131+
lib/purelint/src/Purelint/Rules/UseFindMap.purs+8
@@ -56,6 +56,13 @@ useFindMapRule = mkRule (RuleId "UseFindMap") run
5656 , suggestion: Just $ Suggestion
5757 { replacement: ReplacementText ("findMap " <> f <> " " <> x)
5858 , description: SuggestionDescription "Use findMap instead of head composed with mapMaybe"
59+ , requiredImports:
60+ [ { moduleName: "Data.Array"
61+ , importItem: Just "findMap"
62+ , codeText: Just "findMap"
63+ , qualifier: Nothing
64+ }
65+ ]
5966 }
6067 }
6168 ]
@@ -71,3 +78,4 @@ useFindMapRule = mkRule (RuleId "UseFindMap") run
7178 isMapMaybe imports (ExprIdent (QualifiedName { name: Ident name })) =
7279 name == "mapMaybe" && hasValue imports "mapMaybe"
7380 isMapMaybe _ _ = false
81+
lib/purelint/src/Purelint/Rules/UseFold.purs+2
@@ -36,6 +36,7 @@ useFoldRule = mkRule (RuleId "UseFold") run
3636 , suggestion: Just $ Suggestion
3737 { replacement: ReplacementText "fold"
3838 , description: SuggestionDescription "Use fold instead of foldMap identity"
39+ , requiredImports: []
3940 }
4041 }
4142 ]
@@ -51,3 +52,4 @@ useFoldRule = mkRule (RuleId "UseFold") run
5152 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
5253 name == "identity" && hasValue imports "identity"
5354 isIdentity _ _ = false
55+
lib/purelint/src/Purelint/Rules/UseFoldBool.purs+2
@@ -84,5 +84,7 @@ useFoldBoolRule = mkRule (RuleId "UseFoldBool") run
8484 , suggestion: Just $ Suggestion
8585 { replacement: ReplacementText replacement
8686 , description: SuggestionDescription $ "Replace with " <> replacement
87+ , requiredImports: []
8788 }
8889 }
90+
lib/purelint/src/Purelint/Rules/UseFoldMap.purs+2
@@ -109,6 +109,7 @@ useFoldMapRule = mkRule (RuleId "UseFoldMap") run
109109 , suggestion: Just $ Suggestion
110110 { replacement: ReplacementText suggestion
111111 , description: SuggestionDescription "Use foldMap instead of case with Nothing -> mempty"
112+ , requiredImports: []
112113 }
113114 }
114115 ]
@@ -163,3 +164,4 @@ useFoldMapRule = mkRule (RuleId "UseFoldMap") run
163164 getIndent s =
164165 let loop i = if String.take 1 (String.drop i s) == " " then loop (i + 1) else i
165166 in loop 0
167+
lib/purelint/src/Purelint/Rules/UseFoldMapId.purs+3
@@ -39,6 +39,7 @@ useFoldMapIdRule = mkRule (RuleId "UseFoldMapId") run
3939 , suggestion: Just $ Suggestion
4040 { replacement: ReplacementText "fold"
4141 , description: SuggestionDescription "Use fold instead of foldMap identity"
42+ , requiredImports: []
4243 }
4344 }
4445 ]
@@ -55,6 +56,7 @@ useFoldMapIdRule = mkRule (RuleId "UseFoldMapId") run
5556 , suggestion: Just $ Suggestion
5657 { replacement: ReplacementText ("fold " <> x)
5758 , description: SuggestionDescription "Use fold instead of foldMap identity"
59+ , requiredImports: []
5860 }
5961 }
6062 ]
@@ -75,3 +77,4 @@ useFoldMapIdRule = mkRule (RuleId "UseFoldMapId") run
7577 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
7678 (name == "identity" || name == "id") && hasValue imports "identity"
7779 isIdentity _ _ = false
80+
lib/purelint/src/Purelint/Rules/UseFor.purs+3
@@ -51,6 +51,7 @@ useForRule = mkRule (RuleId "UseFor") run
5151 , suggestion: Just $ Suggestion
5252 { replacement: ReplacementText "for"
5353 , description: SuggestionDescription "Use for instead of flip traverse"
54+ , requiredImports: []
5455 }
5556 }
5657 ]
@@ -63,6 +64,7 @@ useForRule = mkRule (RuleId "UseFor") run
6364 , suggestion: Just $ Suggestion
6465 { replacement: ReplacementText "for_"
6566 , description: SuggestionDescription "Use for_ instead of flip traverse_"
67+ , requiredImports: []
6668 }
6769 }
6870 ]
@@ -72,3 +74,4 @@ useForRule = mkRule (RuleId "UseFor") run
7274 isFlip imports (ExprIdent (QualifiedName { name: Ident name })) =
7375 name == "flip" && hasValue imports "flip"
7476 isFlip _ _ = false
77+
lib/purelint/src/Purelint/Rules/UseFromJust.purs+4
@@ -43,6 +43,7 @@ useFromJustRule = mkRule (RuleId "UseFromJust") run
4343 , suggestion: Just $ Suggestion
4444 { replacement: ReplacementText xText
4545 , description: SuggestionDescription "Simplify fromMaybe with Just"
46+ , requiredImports: []
4647 }
4748 }
4849 ]
@@ -59,6 +60,7 @@ useFromJustRule = mkRule (RuleId "UseFromJust") run
5960 , suggestion: Just $ Suggestion
6061 { replacement: ReplacementText d
6162 , description: SuggestionDescription "Simplify fromMaybe with Nothing"
63+ , requiredImports: []
6264 }
6365 }
6466 ]
@@ -73,6 +75,7 @@ useFromJustRule = mkRule (RuleId "UseFromJust") run
7375 , suggestion: Just $ Suggestion
7476 { replacement: ReplacementText d
7577 , description: SuggestionDescription "Simplify fromMaybe with Nothing"
78+ , requiredImports: []
7679 }
7780 }
7881 ]
@@ -102,3 +105,4 @@ useFromJustRule = mkRule (RuleId "UseFromJust") run
102105 _ -> Nothing
103106 _ -> Nothing
104107 getJustArg _ = Nothing
108+
lib/purelint/src/Purelint/Rules/UseFromMaybe.purs+2
@@ -39,6 +39,7 @@ useFromMaybeRule = mkRule (RuleId "UseFromMaybe") run
3939 , suggestion: Just $ Suggestion
4040 { replacement: ReplacementText ("fromMaybe " <> defaultText)
4141 , description: SuggestionDescription "Use fromMaybe instead of maybe x id"
42+ , requiredImports: []
4243 }
4344 }
4445 ]
@@ -54,3 +55,4 @@ useFromMaybeRule = mkRule (RuleId "UseFromMaybe") run
5455 isId imports (ExprIdent (QualifiedName { name: Ident name })) =
5556 name == "identity" && hasValue imports "identity"
5657 isId _ _ = false
58+
lib/purelint/src/Purelint/Rules/UseFstSnd.purs+3
@@ -40,6 +40,7 @@ useFstSndRule = mkRule (RuleId "UseFstSnd") run
4040 , suggestion: Just $ Suggestion
4141 { replacement: ReplacementText "fst"
4242 , description: SuggestionDescription "Use fst instead of lambda extracting first element"
43+ , requiredImports: []
4344 }
4445 }
4546 ]
@@ -52,6 +53,7 @@ useFstSndRule = mkRule (RuleId "UseFstSnd") run
5253 , suggestion: Just $ Suggestion
5354 { replacement: ReplacementText "snd"
5455 , description: SuggestionDescription "Use snd instead of lambda extracting second element"
56+ , requiredImports: []
5557 }
5658 }
5759 ]
@@ -77,3 +79,4 @@ useFstSndRule = mkRule (RuleId "UseFstSnd") run
7779 getBinderName (BinderWildcard _) = Nothing -- wildcards can't be referenced in body
7880 getBinderName (BinderParens (Wrapped { value: inner })) = getBinderName inner
7981 getBinderName _ = Nothing
82+
lib/purelint/src/Purelint/Rules/UseGuard.purs+3
@@ -54,6 +54,7 @@ useGuardRule = mkRule (RuleId "UseGuard") run
5454 , suggestion: Just $ Suggestion
5555 { replacement: ReplacementText replacement
5656 , description: SuggestionDescription "if cond then pure unit else x can be replaced with unless cond x"
57+ , requiredImports: []
5758 }
5859 }
5960 ]
@@ -71,6 +72,7 @@ useGuardRule = mkRule (RuleId "UseGuard") run
7172 , suggestion: Just $ Suggestion
7273 { replacement: ReplacementText replacement
7374 , description: SuggestionDescription "if cond then x else pure unit can be replaced with when cond x"
75+ , requiredImports: []
7476 }
7577 }
7678 ]
@@ -97,3 +99,4 @@ useGuardRule = mkRule (RuleId "UseGuard") run
9799 isUnit :: Expr Void -> Boolean
98100 isUnit (ExprIdent (QualifiedName { name: Ident name })) = name == "unit"
99101 isUnit _ = false
102+
lib/purelint/src/Purelint/Rules/UseGuardMaybe.purs+2
@@ -42,6 +42,7 @@ useGuardMaybeRule = mkRule (RuleId "UseGuardMaybe") run
4242 , suggestion: Just $ Suggestion
4343 { replacement: ReplacementText ("guard " <> c <> " $> " <> x)
4444 , description: SuggestionDescription "Use guard c $> x instead of if-then-else with Maybe"
45+ , requiredImports: []
4546 }
4647 }
4748 ]
@@ -75,3 +76,4 @@ useGuardMaybeRule = mkRule (RuleId "UseGuardMaybe") run
7576 isNothing imports (ExprConstructor (QualifiedName { name: _ })) =
7677 hasValue imports "Nothing"
7778 isNothing _ _ = false
79+
lib/purelint/src/Purelint/Rules/UseHead.purs+2
@@ -39,6 +39,7 @@ useHeadRule = mkRule (RuleId "UseHead") run
3939 , suggestion: Just $ Suggestion
4040 { replacement: ReplacementText "head"
4141 , description: SuggestionDescription "Use head instead of !! 0"
42+ , requiredImports: []
4243 }
4344 }
4445 ]
@@ -54,3 +55,4 @@ useHeadRule = mkRule (RuleId "UseHead") run
5455 isZeroLiteral (ExprInt _ (SmallInt 0)) = true
5556 isZeroLiteral (ExprInt _ (BigInt s)) = s == "0"
5657 isZeroLiteral _ = false
58+
lib/purelint/src/Purelint/Rules/UseIsJust.purs+2
@@ -37,6 +37,7 @@ useIsJustRule = mkRule (RuleId "UseIsJust") run
3737 , suggestion: Just $ Suggestion
3838 { replacement: ReplacementText "isJust"
3939 , description: SuggestionDescription "Use isJust instead of maybe false (const true)"
40+ , requiredImports: []
4041 }
4142 }
4243 ]
@@ -66,3 +67,4 @@ useIsJustRule = mkRule (RuleId "UseIsJust") run
6667 isTrue :: Expr Void -> Boolean
6768 isTrue (ExprBoolean _ b) = b
6869 isTrue _ = false
70+
lib/purelint/src/Purelint/Rules/UseIsNothing.purs+2
@@ -37,6 +37,7 @@ useIsNothingRule = mkRule (RuleId "UseIsNothing") run
3737 , suggestion: Just $ Suggestion
3838 { replacement: ReplacementText "isNothing"
3939 , description: SuggestionDescription "Use isNothing instead of maybe true (const false)"
40+ , requiredImports: []
4041 }
4142 }
4243 ]
@@ -66,3 +67,4 @@ useIsNothingRule = mkRule (RuleId "UseIsNothing") run
6667 isFalse :: Expr Void -> Boolean
6768 isFalse (ExprBoolean _ b) = not b
6869 isFalse _ = false
70+
lib/purelint/src/Purelint/Rules/UseJoin.purs+3
@@ -40,6 +40,7 @@ useJoinRule = mkRule (RuleId "UseJoin") run
4040 , suggestion: Just $ Suggestion
4141 { replacement: ReplacementText ("join " <> xText)
4242 , description: SuggestionDescription "x >>= identity can be simplified to join x"
43+ , requiredImports: []
4344 }
4445 }
4546 ]
@@ -58,6 +59,7 @@ useJoinRule = mkRule (RuleId "UseJoin") run
5859 , suggestion: Just $ Suggestion
5960 { replacement: ReplacementText ("join " <> xText)
6061 , description: SuggestionDescription "identity =<< x can be simplified to join x"
62+ , requiredImports: []
6163 }
6264 }
6365 ]
@@ -76,3 +78,4 @@ useJoinRule = mkRule (RuleId "UseJoin") run
7678 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
7779 (name == "identity" && hasValue imports "identity") || (name == "id" && hasValue imports "id")
7880 isIdentity _ _ = false
81+
lib/purelint/src/Purelint/Rules/UseLastReverse.purs+2
@@ -50,6 +50,7 @@ useLastReverseRule = mkRule (RuleId "UseLastReverse") run
5050 , suggestion: Just $ Suggestion
5151 { replacement: ReplacementText (newFn <> " " <> x)
5252 , description: SuggestionDescription $ "Use " <> newFn <> " instead"
53+ , requiredImports: []
5354 }
5455 }
5556 ]
@@ -76,3 +77,4 @@ useLastReverseRule = mkRule (RuleId "UseLastReverse") run
7677 isReverse imports (ExprIdent (QualifiedName { name: Ident name })) =
7778 name == "reverse" && hasValue imports "reverse"
7879 isReverse _ _ = false
80+
lib/purelint/src/Purelint/Rules/UseMapMaybe.purs+8
@@ -56,6 +56,13 @@ useMapMaybeRule = mkRule (RuleId "UseMapMaybe") run
5656 , suggestion: Just $ Suggestion
5757 { replacement: ReplacementText ("mapMaybe " <> f <> " " <> x)
5858 , description: SuggestionDescription "Use mapMaybe instead of catMaybes composed with map"
59+ , requiredImports:
60+ [ { moduleName: "Data.Array"
61+ , importItem: Just "mapMaybe"
62+ , codeText: Just "mapMaybe"
63+ , qualifier: Nothing
64+ }
65+ ]
5966 }
6067 }
6168 ]
@@ -71,3 +78,4 @@ useMapMaybeRule = mkRule (RuleId "UseMapMaybe") run
7178 isMap imports (ExprIdent (QualifiedName { name: Ident name })) =
7279 name == "map" && hasValue imports "map"
7380 isMap _ _ = false
81+
lib/purelint/src/Purelint/Rules/UseMinMax.purs+2
@@ -64,6 +64,7 @@ useMinMaxRule = mkRule (RuleId "UseMinMax") run
6464 , suggestion: Just $ Suggestion
6565 { replacement: ReplacementText (fn <> " " <> a <> " " <> b)
6666 , description: SuggestionDescription ("Use " <> fn <> " instead of if/else with comparison")
67+ , requiredImports: []
6768 }
6869 }
6970
@@ -76,3 +77,4 @@ useMinMaxRule = mkRule (RuleId "UseMinMax") run
7677 _ -> Nothing
7778 getComparison imports (ExprParens (Wrapped { value })) = getComparison imports value
7879 getComparison _ _ = Nothing
80+
lib/purelint/src/Purelint/Rules/UseMinimumSort.purs+2
@@ -50,6 +50,7 @@ useMinimumSortRule = mkRule (RuleId "UseMinimumSort") run
5050 , suggestion: Just $ Suggestion
5151 { replacement: ReplacementText (newFn <> " " <> x)
5252 , description: SuggestionDescription $ "Use " <> newFn <> " instead of sorting"
53+ , requiredImports: []
5354 }
5455 }
5556 ]
@@ -76,3 +77,4 @@ useMinimumSortRule = mkRule (RuleId "UseMinimumSort") run
7677 isSort imports (ExprIdent (QualifiedName { name: Ident name })) =
7778 name == "sort" && hasValue imports "sort"
7879 isSort _ _ = false
80+
lib/purelint/src/Purelint/Rules/UseNotElem.purs+2
@@ -42,6 +42,7 @@ useNotElemRule = mkRule (RuleId "UseNotElem") run
4242 , suggestion: Just $ Suggestion
4343 { replacement: ReplacementText ("notElem " <> xText <> " " <> yText)
4444 , description: SuggestionDescription "Use notElem instead of not (elem ...)"
45+ , requiredImports: []
4546 }
4647 }
4748 ]
@@ -64,3 +65,4 @@ useNotElemRule = mkRule (RuleId "UseNotElem") run
6465 _ -> Nothing
6566 getElemArgs imports (ExprParens (Wrapped { value })) = getElemArgs imports value
6667 getElemArgs _ _ = Nothing
68+
lib/purelint/src/Purelint/Rules/UseNull.purs+2
@@ -57,6 +57,7 @@ useNullRule = mkRule (RuleId "UseNull") run
5757 , suggestion: Just $ Suggestion
5858 { replacement: ReplacementText ("null " <> xText)
5959 , description: SuggestionDescription $ from <> " can be simplified to null x"
60+ , requiredImports: []
6061 }
6162 }
6263
@@ -77,3 +78,4 @@ useNullRule = mkRule (RuleId "UseNull") run
7778 _ -> Nothing
7879 _ -> Nothing
7980 getLengthArg _ _ = Nothing
81+
lib/purelint/src/Purelint/Rules/UseOn.purs+2
@@ -54,6 +54,7 @@ useOnRule = mkRule (RuleId "UseOn") run
5454 , suggestion: Just $ Suggestion
5555 { replacement: ReplacementText ("on " <> f <> " " <> g1)
5656 , description: SuggestionDescription "Use on instead of lambda applying g to both arguments"
57+ , requiredImports: []
5758 }
5859 }
5960 ]
@@ -70,3 +71,4 @@ useOnRule = mkRule (RuleId "UseOn") run
7071 _ -> Nothing
7172 _, _ -> Nothing
7273 extractFunctionCall _ = Nothing
74+
lib/purelint/src/Purelint/Rules/UseOr.purs+3
@@ -40,6 +40,7 @@ useOrRule = mkRule (RuleId "UseOr") run
4040 , suggestion: Just $ Suggestion
4141 { replacement: ReplacementText "or"
4242 , description: SuggestionDescription "Use or instead of any identity"
43+ , requiredImports: []
4344 }
4445 }
4546 ]
@@ -56,6 +57,7 @@ useOrRule = mkRule (RuleId "UseOr") run
5657 , suggestion: Just $ Suggestion
5758 { replacement: ReplacementText ("or " <> x)
5859 , description: SuggestionDescription "Use or instead of any identity"
60+ , requiredImports: []
5961 }
6062 }
6163 ]
@@ -76,3 +78,4 @@ useOrRule = mkRule (RuleId "UseOr") run
7678 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
7779 (name == "identity" || name == "id") && hasValue imports "identity"
7880 isIdentity _ _ = false
81+
lib/purelint/src/Purelint/Rules/UsePatternGuards.purs+2
@@ -72,6 +72,7 @@ usePatternGuardsRule = mkRule (RuleId "UsePatternGuards") run
7272 , suggestion: Just $ Suggestion
7373 { replacement: ReplacementText replacement
7474 , description: SuggestionDescription $ "Use pattern guards instead of " <> show result.depth <> " nested case expressions"
75+ , requiredImports: []
7576 }
7677 }
7778 ]
@@ -227,3 +228,4 @@ usePatternGuardsRule = mkRule (RuleId "UsePatternGuards") run
227228 _ -> Nothing
228229 _ -> Nothing
229230 getMatchPatternAndBody _ = Nothing
231+
lib/purelint/src/Purelint/Rules/UseReplicate.purs+8
@@ -44,6 +44,13 @@ useReplicateRule = mkRule (RuleId "UseReplicate") run
4444 , suggestion: Just $ Suggestion
4545 { replacement: ReplacementText ("replicate " <> n <> " " <> xText)
4646 , description: SuggestionDescription "Use replicate instead of take n (repeat x)"
47+ , requiredImports:
48+ [ { moduleName: "Data.Array"
49+ , importItem: Just "replicate"
50+ , codeText: Just "replicate"
51+ , qualifier: Nothing
52+ }
53+ ]
4754 }
4855 }
4956 ]
@@ -74,3 +81,4 @@ useReplicateRule = mkRule (RuleId "UseReplicate") run
7481 [AppTerm arg] -> Just arg
7582 _ -> Nothing
7683 _ -> Nothing
84+
lib/purelint/src/Purelint/Rules/UseSequence.purs+8
@@ -37,6 +37,13 @@ useSequenceRule = mkRule (RuleId "UseSequence") run
3737 , suggestion: Just $ Suggestion
3838 { replacement: ReplacementText "sequence"
3939 , description: SuggestionDescription "Use sequence instead of traverse identity"
40+ , requiredImports:
41+ [ { moduleName: "Data.Traversable"
42+ , importItem: Just "sequence"
43+ , codeText: Just "sequence"
44+ , qualifier: Nothing
45+ }
46+ ]
4047 }
4148 }
4249 ]
@@ -52,3 +59,4 @@ useSequenceRule = mkRule (RuleId "UseSequence") run
5259 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
5360 name == "identity" && hasValue imports "identity"
5461 isIdentity _ _ = false
62+
lib/purelint/src/Purelint/Rules/UseSpan.purs+3
@@ -44,6 +44,7 @@ useSpanRule = mkRule (RuleId "UseSpan") run
4444 , suggestion: Just $ Suggestion
4545 { replacement: ReplacementText ("span " <> pText <> " " <> x)
4646 , description: SuggestionDescription "Use span instead of break with negated predicate"
47+ , requiredImports: []
4748 }
4849 }
4950 ]
@@ -61,6 +62,7 @@ useSpanRule = mkRule (RuleId "UseSpan") run
6162 , suggestion: Just $ Suggestion
6263 { replacement: ReplacementText ("span " <> pText)
6364 , description: SuggestionDescription "Use span instead of break with negated predicate"
65+ , requiredImports: []
6466 }
6567 }
6668 ]
@@ -91,3 +93,4 @@ useSpanRule = mkRule (RuleId "UseSpan") run
9193 [AppTerm p] -> Just p
9294 _ -> Nothing
9395 _ -> Nothing
96+
lib/purelint/src/Purelint/Rules/UseTraverse.purs+12
@@ -69,6 +69,8 @@ useTraverseRule = mkRule (RuleId "UseTraverse") run
6969 replacement = if seqName == "sequenceA" || seqName == "sequenceA_" then "traverse" else "mapM"
7070 replacementSuffix = if seqName == "sequenceA_" || seqName == "sequence_" then "_" else ""
7171 concreteReplacement = replacement <> replacementSuffix <> " " <> fText <> " " <> xText
72+ moduleName = if replacement == "mapM" then "Control.Monad" else "Data.Traversable"
73+ importItem = replacement <> replacementSuffix
7274 in
7375 [ LintWarning
7476 { ruleId: RuleId "UseTraverse"
@@ -78,6 +80,15 @@ useTraverseRule = mkRule (RuleId "UseTraverse") run
7880 , suggestion: Just $ Suggestion
7981 { replacement: ReplacementText concreteReplacement
8082 , description: SuggestionDescription $ seqName <> " (map f x) can be replaced with " <> replacement <> replacementSuffix <> " f x"
83+ , requiredImports:
84+ if replacement == "mapM" then []
85+ else
86+ [ { moduleName
87+ , importItem: Just importItem
88+ , codeText: Just importItem
89+ , qualifier: Nothing
90+ }
91+ ]
8192 }
8293 }
8394 ]
@@ -124,3 +135,4 @@ useTraverseRule = mkRule (RuleId "UseTraverse") run
124135
125136 getIdentName :: QualifiedName Ident -> String
126137 getIdentName (QualifiedName { name: Ident name }) = name
138+
lib/purelint/src/Purelint/Rules/UseTraverseSequence.purs+8
@@ -42,6 +42,13 @@ useTraverseSequenceRule = mkRule (RuleId "UseTraverseSequence") run
4242 , suggestion: Just $ Suggestion
4343 { replacement: ReplacementText ("traverse " <> fText <> " " <> xText)
4444 , description: SuggestionDescription "Use traverse instead of sequence (map ...)"
45+ , requiredImports:
46+ [ { moduleName: "Data.Traversable"
47+ , importItem: Just "traverse"
48+ , codeText: Just "traverse"
49+ , qualifier: Nothing
50+ }
51+ ]
4552 }
4653 }
4754 ]
@@ -64,3 +71,4 @@ useTraverseSequenceRule = mkRule (RuleId "UseTraverseSequence") run
6471 _ -> Nothing
6572 getMapArgs imports (ExprParens (Wrapped { value })) = getMapArgs imports value
6673 getMapArgs _ _ = Nothing
74+
lib/purelint/src/Purelint/Rules/UseUncurry.purs+2
@@ -47,6 +47,7 @@ useUncurryRule = mkRule (RuleId "UseUncurry") run
4747 , suggestion: Just $ Suggestion
4848 { replacement: ReplacementText ("uncurry " <> f <> " " <> p1Text)
4949 , description: SuggestionDescription "Use uncurry instead of fst/snd"
50+ , requiredImports: []
5051 }
5152 }
5253 ]
@@ -88,3 +89,4 @@ useUncurryRule = mkRule (RuleId "UseUncurry") run
8889 [AppTerm arg] -> Just arg
8990 _ -> Nothing
9091 _ -> Nothing
92+
lib/purelint/src/Purelint/Rules/UseUnless.purs+2
@@ -38,6 +38,7 @@ useUnlessRule = mkRule (RuleId "UseUnless") run
3838 , suggestion: Just $ Suggestion
3939 { replacement: ReplacementText ("unless " <> condText <> " " <> actionText)
4040 , description: SuggestionDescription "Use unless instead of if/else with pure unit"
41+ , requiredImports: []
4142 }
4243 }
4344 ]
@@ -53,3 +54,4 @@ useUnlessRule = mkRule (RuleId "UseUnless") run
5354 isPure imports (ExprIdent (QualifiedName { name: Ident name })) =
5455 (name == "pure" && hasValue imports "pure") || (name == "return" && hasValue imports "return")
5556 isPure _ _ = false
57+
lib/purelint/src/Purelint/Rules/UseUnwrap.purs+3
@@ -40,6 +40,7 @@ useUnwrapRule = mkRule (RuleId "UseUnwrap") run
4040 , suggestion: Just $ Suggestion
4141 { replacement: ReplacementText replacement
4242 , description: SuggestionDescription "Use un with typed hole to find the right accessor"
43+ , requiredImports: []
4344 }
4445 }
4546 ]
@@ -54,6 +55,7 @@ useUnwrapRule = mkRule (RuleId "UseUnwrap") run
5455 , suggestion: Just $ Suggestion
5556 { replacement: ReplacementText "un ?Constructor"
5657 , description: SuggestionDescription "Use un with typed hole to find the right accessor"
58+ , requiredImports: []
5759 }
5860 }
5961 ]
@@ -65,3 +67,4 @@ useUnwrapRule = mkRule (RuleId "UseUnwrap") run
6567
6668 isUnwrapIdent :: QualifiedName Ident -> Boolean
6769 isUnwrapIdent (QualifiedName { name: Ident name }) = name == "unwrap"
70+
lib/purelint/src/Purelint/Rules/UseVoid.purs+2
@@ -41,6 +41,7 @@ useVoidRule = mkRule (RuleId "UseVoid") run
4141 , suggestion: Just $ Suggestion
4242 { replacement: ReplacementText ("void " <> aText)
4343 , description: SuggestionDescription "a *> pure unit can be simplified to void a"
44+ , requiredImports: []
4445 }
4546 }
4647 ]
@@ -64,3 +65,4 @@ useVoidRule = mkRule (RuleId "UseVoid") run
6465 isUnit :: Expr Void -> Boolean
6566 isUnit (ExprIdent (QualifiedName { name: Ident name })) = name == "unit"
6667 isUnit _ = false
68+
lib/purelint/src/Purelint/Rules/UseWhen.purs+2
@@ -38,6 +38,7 @@ useWhenRule = mkRule (RuleId "UseWhen") run
3838 , suggestion: Just $ Suggestion
3939 { replacement: ReplacementText ("when " <> condText <> " " <> actionText)
4040 , description: SuggestionDescription "Use when instead of if/else with pure unit"
41+ , requiredImports: []
4142 }
4243 }
4344 ]
@@ -53,3 +54,4 @@ useWhenRule = mkRule (RuleId "UseWhen") run
5354 isPure imports (ExprIdent (QualifiedName { name: Ident name })) =
5455 (name == "pure" && hasValue imports "pure") || (name == "return" && hasValue imports "return")
5556 isPure _ _ = false
57+
lib/purelint/src/Purelint/Rules/UseZip.purs+4
@@ -39,6 +39,7 @@ useZipRule = mkRule (RuleId "UseZip") run
3939 , suggestion: Just $ Suggestion
4040 { replacement: ReplacementText "zip"
4141 , description: SuggestionDescription "Use zip instead of zipWith Tuple"
42+ , requiredImports: []
4243 }
4344 }
4445 ]
@@ -55,6 +56,7 @@ useZipRule = mkRule (RuleId "UseZip") run
5556 , suggestion: Just $ Suggestion
5657 { replacement: ReplacementText ("zip " <> x)
5758 , description: SuggestionDescription "Use zip instead of zipWith Tuple"
59+ , requiredImports: []
5860 }
5961 }
6062 ]
@@ -73,6 +75,7 @@ useZipRule = mkRule (RuleId "UseZip") run
7375 , suggestion: Just $ Suggestion
7476 { replacement: ReplacementText ("zip " <> x <> " " <> y)
7577 , description: SuggestionDescription "Use zip instead of zipWith Tuple"
78+ , requiredImports: []
7679 }
7780 }
7881 ]
@@ -93,3 +96,4 @@ useZipRule = mkRule (RuleId "UseZip") run
9396 isTupleCtor (ExprConstructor (QualifiedName { name: Proper "Tuple" })) = true
9497 isTupleCtor (ExprIdent (QualifiedName { name: Ident "Tuple" })) = true
9598 isTupleCtor _ = false
99+
lib/purelint/src/Purelint/Rules/WhenNot.purs+3
@@ -44,6 +44,7 @@ whenNotRule = mkRule (RuleId "WhenNot") run
4444 , suggestion: Just $ Suggestion
4545 { replacement: ReplacementText ("unless " <> xText <> " " <> action)
4646 , description: SuggestionDescription "Use unless instead of when (not ...)"
47+ , requiredImports: []
4748 }
4849 }
4950 ]
@@ -61,6 +62,7 @@ whenNotRule = mkRule (RuleId "WhenNot") run
6162 , suggestion: Just $ Suggestion
6263 { replacement: ReplacementText ("unless " <> xText)
6364 , description: SuggestionDescription "Use unless instead of when (not ...)"
65+ , requiredImports: []
6466 }
6567 }
6668 ]
@@ -91,3 +93,4 @@ whenNotRule = mkRule (RuleId "WhenNot") run
9193 [AppTerm arg] -> Just arg
9294 _ -> Nothing
9395 _ -> Nothing
96+
lib/purelint/src/Purelint/Types.purs+11
@@ -31,10 +31,19 @@ instance Show Severity where
3131 show Warning = "warning"
3232 show Error = "error"
3333
34+-- | Information about imports required for a suggestion
35+type RequiredImport =
36+ { moduleName :: String
37+ , importItem :: Maybe String
38+ , codeText :: Maybe String
39+ , qualifier :: Maybe String
40+ }
41+
3442-- | A suggested replacement for the original code
3543newtype Suggestion = Suggestion
3644 { replacement :: ReplacementText
3745 , description :: SuggestionDescription
46+ , requiredImports :: Array RequiredImport
3847 }
3948
4049derive instance Newtype Suggestion _
@@ -93,3 +102,5 @@ newtype SourceCode = SourceCode String
93102derive instance Newtype SourceCode _
94103derive newtype instance Eq SourceCode
95104derive newtype instance Show SourceCode
105+
106+