git.iko.soy/rowtype-yoga/purslint
on main help sign in
Commit something
68a78e4Mark
lib/purelint/src/Purelint/Fix.purs+19−4
@@ -11,6 +11,7 @@ import Data.String as String
11import Data.String.CodeUnits as StringCU
11import Data.String.CodeUnits as StringCU
12import PureScript.CST.Types (SourceRange)
12import PureScript.CST.Types (SourceRange)
13import Purelint.Types (LintResult(..), LintWarning(..), ReplacementText(..), Suggestion(..))
13import Purelint.Types (LintResult(..), LintWarning(..), ReplacementText(..), Suggestion(..))
14+import Purelint.ImportFix (processImports)
14
15
15-- | Extract text at a source range from source code
16-- | Extract text at a source range from source code
16extractRange :: String -> SourceRange -> String
17extractRange :: String -> SourceRange -> String
@@ -70,7 +71,10 @@ applyFix :: String -> LintWarning -> Maybe String
70applyFix source (LintWarning w) = do
71applyFix source (LintWarning w) = do
71 Suggestion s <- w.suggestion
72 Suggestion s <- w.suggestion
72 let replacement = s.replacement # un ReplacementText
73 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
74
78
75-- | Apply all fixes to source code (in reverse order to preserve ranges)
79-- | Apply all fixes to source code (in reverse order to preserve ranges)
76-- | Skips overlapping fixes to avoid corruption
80-- | Skips overlapping fixes to avoid corruption
@@ -98,8 +102,11 @@ applyAllFixes source (LintResult result) =
98 Nothing -> acc
102 Nothing -> acc
99 Just (Suggestion s) ->
103 Just (Suggestion s) ->
100 let replacement = s.replacement # un ReplacementText
104 let replacement = s.replacement # un ReplacementText
101− in { source: replaceRange acc.source w.range replacement
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
102− , appliedRanges: Array.cons w.range acc.appliedRanges
109+ , appliedRanges: Array.cons shiftedRange acc.appliedRanges
103 }
110 }
104
111
105 -- Check if two ranges overlap
112 -- Check if two ranges overlap
@@ -108,4 +115,12 @@ applyAllFixes source (LintResult result) =
108 not (aEndsBeforeB || bEndsBeforeA)
115 not (aEndsBeforeB || bEndsBeforeA)
109 where
116 where
110 aEndsBeforeB = a.end.line < b.start.line || (a.end.line == b.start.line && a.end.column <= b.start.column)
117 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
46 , suggestion: Just $ Suggestion
46 , suggestion: Just $ Suggestion
47 { replacement: ReplacementText (printExpr rhs)
47 { replacement: ReplacementText (printExpr rhs)
48 , description: SuggestionDescription "empty is the identity for <|> (left identity)"
48 , description: SuggestionDescription "empty is the identity for <|> (left identity)"
49+ , requiredImports: []
49 }
50 }
50 }
51 }
51 ]
52 ]
@@ -59,6 +60,7 @@ alternativeLawRule = mkRule (RuleId "AlternativeLaw") run
59 , suggestion: Just $ Suggestion
60 , suggestion: Just $ Suggestion
60 { replacement: ReplacementText (printExpr lhs)
61 { replacement: ReplacementText (printExpr lhs)
61 , description: SuggestionDescription "empty is the identity for <|> (right identity)"
62 , description: SuggestionDescription "empty is the identity for <|> (right identity)"
63+ , requiredImports: []
62 }
64 }
63 }
65 }
64 ]
66 ]
@@ -72,3 +74,4 @@ alternativeLawRule = mkRule (RuleId "AlternativeLaw") run
72 hasValue imports "Nothing"
74 hasValue imports "Nothing"
73 isEmpty _ (ExprArray (Wrapped { value: Nothing })) = true -- []
75 isEmpty _ (ExprArray (Wrapped { value: Nothing })) = true -- []
74 isEmpty _ _ = false
76 isEmpty _ _ = false
77+
lib/purelint/src/Purelint/Rules/BooleanSimplify.purs+2
@@ -73,6 +73,7 @@ booleanSimplifyRule = run # mkRule (RuleId "BooleanSimplify")
73 , suggestion: Just $ Suggestion
73 , suggestion: Just $ Suggestion
74 { replacement: ReplacementText replacement
74 { replacement: ReplacementText replacement
75 , description: SuggestionDescription $ from <> " can be simplified to " <> to
75 , description: SuggestionDescription $ from <> " can be simplified to " <> to
76+ , requiredImports: []
76 }
77 }
77 }
78 }
78
79
@@ -82,3 +83,4 @@ booleanSimplifyRule = run # mkRule (RuleId "BooleanSimplify")
82 isBoolLit :: Boolean -> Expr Void -> Boolean
83 isBoolLit :: Boolean -> Expr Void -> Boolean
83 isBoolLit expected (ExprBoolean _ val) = val == expected
84 isBoolLit expected (ExprBoolean _ val) = val == expected
84 isBoolLit _ _ = false
85 isBoolLit _ _ = false
86+
lib/purelint/src/Purelint/Rules/CollapseLambdas.purs+2
@@ -43,6 +43,7 @@ collapseLambdasRule = run # mkRule (RuleId "CollapseLambdas")
43 , suggestion: Just $ Suggestion
43 , suggestion: Just $ Suggestion
44 { replacement: ReplacementText replacement
44 { replacement: ReplacementText replacement
45 , description: SuggestionDescription "\\x -> \\y -> body can be simplified to \\x y -> body"
45 , description: SuggestionDescription "\\x -> \\y -> body can be simplified to \\x y -> body"
46+ , requiredImports: []
46 }
47 }
47 }
48 }
48 ]
49 ]
@@ -52,3 +53,4 @@ collapseLambdasRule = run # mkRule (RuleId "CollapseLambdas")
52 getBinderName :: Binder Void -> Maybe String
53 getBinderName :: Binder Void -> Maybe String
53 getBinderName (BinderVar (Name { name: Ident n })) = Just n
54 getBinderName (BinderVar (Name { name: Ident n })) = Just n
54 getBinderName _ = Nothing
55 getBinderName _ = Nothing
56+
lib/purelint/src/Purelint/Rules/ConcatMap.purs+2
@@ -58,6 +58,7 @@ concatMapRule = mkRule (RuleId "ConcatMap") run
58 , suggestion: Just $ Suggestion
58 , suggestion: Just $ Suggestion
59 { replacement: ReplacementText replacement
59 { replacement: ReplacementText replacement
60 , description: SuggestionDescription msg
60 , description: SuggestionDescription msg
61+ , requiredImports: []
61 }
62 }
62 }
63 }
63 ]
64 ]
@@ -77,3 +78,4 @@ concatMapRule = mkRule (RuleId "ConcatMap") run
77
78
78 getIdentName :: QualifiedName Ident -> String
79 getIdentName :: QualifiedName Ident -> String
79 getIdentName (QualifiedName { name: Ident name }) = name
80 getIdentName (QualifiedName { name: Ident name }) = name
81+
lib/purelint/src/Purelint/Rules/EtaReduce.purs+2
@@ -63,6 +63,7 @@ etaReduceRule = mkRule (RuleId "EtaReduce") run
63 , suggestion: Just $ Suggestion
63 , suggestion: Just $ Suggestion
64 { replacement: ReplacementText fnText
64 { replacement: ReplacementText fnText
65 , description: SuggestionDescription $ "\\x -> f x can be simplified to f"
65 , description: SuggestionDescription $ "\\x -> f x can be simplified to f"
66+ , requiredImports: []
66 }
67 }
67 }
68 }
68 ]
69 ]
@@ -89,3 +90,4 @@ etaReduceRule = mkRule (RuleId "EtaReduce") run
89 checkArg = case _, _ of
90 checkArg = case _, _ of
90 name, (AppTerm e) -> e # mentionsParam name
91 name, (AppTerm e) -> e # mentionsParam name
91 _, _ -> false
92 _, _ -> false
93+
lib/purelint/src/Purelint/Rules/EtaReduceDecl.purs+2
@@ -59,6 +59,7 @@ etaReduceDeclRule = mkRule (RuleId "EtaReduceDecl") run
59 , suggestion: Just $ Suggestion
59 , suggestion: Just $ Suggestion
60 { replacement: ReplacementText ("= " <> newRhs)
60 { replacement: ReplacementText ("= " <> newRhs)
61 , description: SuggestionDescription "Remove redundant parameter"
61 , description: SuggestionDescription "Remove redundant parameter"
62+ , requiredImports: []
62 }
63 }
63 }
64 }
64 ]
65 ]
@@ -87,3 +88,4 @@ etaReduceDeclRule = mkRule (RuleId "EtaReduceDecl") run
87 checkArg :: String -> AppSpine Expr Void -> Boolean
88 checkArg :: String -> AppSpine Expr Void -> Boolean
88 checkArg name (AppTerm e) = mentionsParam name e
89 checkArg name (AppTerm e) = mentionsParam name e
89 checkArg _ _ = false
90 checkArg _ _ = false
91+
lib/purelint/src/Purelint/Rules/EvaluateBool.purs+2
@@ -83,6 +83,8 @@ evaluateBoolRule = run # mkRule (RuleId "EvaluateBool")
83 , suggestion: Just $ Suggestion
83 , suggestion: Just $ Suggestion
84 { replacement: ReplacementText replacement
84 { replacement: ReplacementText replacement
85 , description: SuggestionDescription $ "Simplifies to " <> desc
85 , description: SuggestionDescription $ "Simplifies to " <> desc
86+ , requiredImports: []
86 }
87 }
87 }
88 }
88 ]
89 ]
90+
lib/purelint/src/Purelint/Rules/EvaluateConst.purs+2
@@ -40,6 +40,7 @@ evaluateConstRule = mkRule (RuleId "EvaluateConst") run
40 , suggestion: Just $ Suggestion
40 , suggestion: Just $ Suggestion
41 { replacement: ReplacementText x
41 { replacement: ReplacementText x
42 , description: SuggestionDescription "Evaluate const"
42 , description: SuggestionDescription "Evaluate const"
43+ , requiredImports: []
43 }
44 }
44 }
45 }
45 ]
46 ]
@@ -50,3 +51,4 @@ evaluateConstRule = mkRule (RuleId "EvaluateConst") run
50 isConst imports (ExprIdent (QualifiedName { name: Ident name })) =
51 isConst imports (ExprIdent (QualifiedName { name: Ident name })) =
51 name == "const" && hasValue imports "const"
52 name == "const" && hasValue imports "const"
52 isConst _ _ = false
53 isConst _ _ = false
54+
lib/purelint/src/Purelint/Rules/EvaluateEither.purs+3
@@ -50,6 +50,7 @@ evaluateEitherRule = mkRule (RuleId "EvaluateEither") run
50 , suggestion: Just $ Suggestion
50 , suggestion: Just $ Suggestion
51 { replacement: ReplacementText replacement
51 { replacement: ReplacementText replacement
52 , description: SuggestionDescription "Apply f directly to x"
52 , description: SuggestionDescription "Apply f directly to x"
53+ , requiredImports: []
53 }
54 }
54 }
55 }
55 ]
56 ]
@@ -67,6 +68,7 @@ evaluateEitherRule = mkRule (RuleId "EvaluateEither") run
67 , suggestion: Just $ Suggestion
68 , suggestion: Just $ Suggestion
68 { replacement: ReplacementText replacement
69 { replacement: ReplacementText replacement
69 , description: SuggestionDescription "Apply g directly to y"
70 , description: SuggestionDescription "Apply g directly to y"
71+ , requiredImports: []
70 }
72 }
71 }
73 }
72 ]
74 ]
@@ -117,3 +119,4 @@ evaluateEitherRule = mkRule (RuleId "EvaluateEither") run
117 ExprRecord _ -> printExpr e
119 ExprRecord _ -> printExpr e
118 ExprParens _ -> printExpr e
120 ExprParens _ -> printExpr e
119 _ -> "(" <> printExpr e <> ")"
121 _ -> "(" <> printExpr e <> ")"
122+
lib/purelint/src/Purelint/Rules/EvaluateFst.purs+3
@@ -43,6 +43,7 @@ evaluateFstRule = mkRule (RuleId "EvaluateFst") run
43 , suggestion: Just $ Suggestion
43 , suggestion: Just $ Suggestion
44 { replacement: ReplacementText x
44 { replacement: ReplacementText x
45 , description: SuggestionDescription "Extract first element directly"
45 , description: SuggestionDescription "Extract first element directly"
46+ , requiredImports: []
46 }
47 }
47 }
48 }
48 ]
49 ]
@@ -63,6 +64,7 @@ evaluateFstRule = mkRule (RuleId "EvaluateFst") run
63 , suggestion: Just $ Suggestion
64 , suggestion: Just $ Suggestion
64 { replacement: ReplacementText y
65 { replacement: ReplacementText y
65 , description: SuggestionDescription "Extract second element directly"
66 , description: SuggestionDescription "Extract second element directly"
67+ , requiredImports: []
66 }
68 }
67 }
69 }
68 ]
70 ]
@@ -94,3 +96,4 @@ evaluateFstRule = mkRule (RuleId "EvaluateFst") run
94 _ -> Nothing
96 _ -> Nothing
95 _ -> Nothing
97 _ -> Nothing
96 getTupleElements _ = Nothing
98 getTupleElements _ = Nothing
99+
lib/purelint/src/Purelint/Rules/FlattenCase.purs+2
@@ -56,6 +56,7 @@ flattenCaseRule = mkRule (RuleId "FlattenCase") run
56 , suggestion: Just $ Suggestion
56 , suggestion: Just $ Suggestion
57 { replacement: ReplacementText replacement
57 { replacement: ReplacementText replacement
58 , description: SuggestionDescription $ "Use case with " <> show depth <> " scrutinees instead of nested cases"
58 , description: SuggestionDescription $ "Use case with " <> show depth <> " scrutinees instead of nested cases"
59+ , requiredImports: []
59 }
60 }
60 }
61 }
61 ]
62 ]
@@ -141,3 +142,4 @@ flattenCaseRule = mkRule (RuleId "FlattenCase") run
141 formatArm :: { patterns :: Array String, body :: String } -> String
142 formatArm :: { patterns :: Array String, body :: String } -> String
142 formatArm { patterns, body } =
143 formatArm { patterns, body } =
143 String.joinWith ", " patterns <> " -> " <> body
144 String.joinWith ", " patterns <> " -> " <> body
145+
lib/purelint/src/Purelint/Rules/FunctorLaw.purs+2
@@ -74,6 +74,7 @@ functorLawRule = mkRule (RuleId "FunctorLaw") run
74 , suggestion: Just $ Suggestion
74 , suggestion: Just $ Suggestion
75 { replacement: ReplacementText replacement
75 { replacement: ReplacementText replacement
76 , description: SuggestionDescription $ style <> " f (" <> style <> " g x) can be fused to " <> style <> " (f <<< g) x"
76 , description: SuggestionDescription $ style <> " f (" <> style <> " g x) can be fused to " <> style <> " (f <<< g) x"
77+ , requiredImports: []
77 }
78 }
78 }
79 }
79 ]
80 ]
@@ -90,3 +91,4 @@ functorLawRule = mkRule (RuleId "FunctorLaw") run
90 isMapOp :: ImportInfo -> QualifiedName Operator -> Boolean
91 isMapOp :: ImportInfo -> QualifiedName Operator -> Boolean
91 isMapOp imports (QualifiedName { name: Operator op }) =
92 isMapOp imports (QualifiedName { name: Operator op }) =
92 op == "<$>" && hasOp imports "<$>"
93 op == "<$>" && hasOp imports "<$>"
94+
lib/purelint/src/Purelint/Rules/LetToDo.purs+4
@@ -68,6 +68,7 @@ letToDoRule = mkRule (RuleId "LetToDo") run
68 , suggestion: Just $ Suggestion
68 , suggestion: Just $ Suggestion
69 { replacement: ReplacementText replacement
69 { replacement: ReplacementText replacement
70 , description: SuggestionDescription "Convert to do notation"
70 , description: SuggestionDescription "Convert to do notation"
71+ , requiredImports: []
71 }
72 }
72 }
73 }
73 ]
74 ]
@@ -111,6 +112,7 @@ letToDoRule = mkRule (RuleId "LetToDo") run
111 , suggestion: Just $ Suggestion
112 , suggestion: Just $ Suggestion
112 { replacement: ReplacementText replacement
113 { replacement: ReplacementText replacement
113 , description: SuggestionDescription "Convert to do notation"
114 , description: SuggestionDescription "Convert to do notation"
115+ , requiredImports: []
114 }
116 }
115 }
117 }
116 ]
118 ]
@@ -154,3 +156,5 @@ letToDoRule = mkRule (RuleId "LetToDo") run
154 Comment str -> str
156 Comment str -> str
155 Space n -> power " " n
157 Space n -> power " " n
156 Line v _ -> absurd v
158 Line v _ -> absurd v
159+
160+
lib/purelint/src/Purelint/Rules/LetToWhere.purs+2
@@ -77,6 +77,7 @@ letToWhereRule = mkRule (RuleId "LetToWhere") run
77 , suggestion: Just $ Suggestion
77 , suggestion: Just $ Suggestion
78 { replacement: ReplacementText replacement
78 { replacement: ReplacementText replacement
79 , description: SuggestionDescription "Convert to where clause"
79 , description: SuggestionDescription "Convert to where clause"
80+ , requiredImports: []
80 }
81 }
81 }
82 }
82 ]
83 ]
@@ -118,3 +119,4 @@ letToWhereRule = mkRule (RuleId "LetToWhere") run
118 Comment str -> str
119 Comment str -> str
119 Space n -> power " " n
120 Space n -> power " " n
120 Line v _ -> absurd v
121 Line v _ -> absurd v
122+
lib/purelint/src/Purelint/Rules/MapFusion.purs+3
@@ -84,6 +84,7 @@ mapFusionRule = mkRule (RuleId "MapFusion") run
84 , suggestion: Just $ Suggestion
84 , suggestion: Just $ Suggestion
85 { replacement: ReplacementText replacement
85 { replacement: ReplacementText replacement
86 , description: SuggestionDescription "x <#> g <#> f can be replaced with x <#> (g >>> f)"
86 , description: SuggestionDescription "x <#> g <#> f can be replaced with x <#> (g >>> f)"
87+ , requiredImports: []
87 }
88 }
88 }
89 }
89 ]
90 ]
@@ -120,6 +121,7 @@ mapFusionRule = mkRule (RuleId "MapFusion") run
120 , suggestion: Just $ Suggestion
121 , suggestion: Just $ Suggestion
121 { replacement: ReplacementText replacement
122 { replacement: ReplacementText replacement
122 , description: SuggestionDescription "Nested maps can be fused with composition"
123 , description: SuggestionDescription "Nested maps can be fused with composition"
124+ , requiredImports: []
123 }
125 }
124 }
126 }
125 ]
127 ]
@@ -139,3 +141,4 @@ mapFusionRule = mkRule (RuleId "MapFusion") run
139 isFlippedMapOp :: ImportInfo -> QualifiedName Operator -> Boolean
141 isFlippedMapOp :: ImportInfo -> QualifiedName Operator -> Boolean
140 isFlippedMapOp imports (QualifiedName { name: Operator op }) =
142 isFlippedMapOp imports (QualifiedName { name: Operator op }) =
141 (op == "<#>" || op == "<##>") && hasOp imports "<#>"
143 (op == "<#>" || op == "<##>") && hasOp imports "<#>"
144+
lib/purelint/src/Purelint/Rules/MapIdentity.purs+4
@@ -41,6 +41,7 @@ mapIdentityRule = run # mkRule (RuleId "MapIdentity")
41 , suggestion: Just $ Suggestion
41 , suggestion: Just $ Suggestion
42 { replacement: ReplacementText (printExpr xExpr)
42 { replacement: ReplacementText (printExpr xExpr)
43 , description: SuggestionDescription "map identity x can be simplified to x"
43 , description: SuggestionDescription "map identity x can be simplified to x"
44+ , requiredImports: []
44 }
45 }
45 }
46 }
46 ]
47 ]
@@ -57,6 +58,7 @@ mapIdentityRule = run # mkRule (RuleId "MapIdentity")
57 , suggestion: Just $ Suggestion
58 , suggestion: Just $ Suggestion
58 { replacement: ReplacementText (printExpr xExpr)
59 { replacement: ReplacementText (printExpr xExpr)
59 , description: SuggestionDescription "identity <$> x can be simplified to x"
60 , description: SuggestionDescription "identity <$> x can be simplified to x"
61+ , requiredImports: []
60 }
62 }
61 }
63 }
62 ]
64 ]
@@ -73,6 +75,7 @@ mapIdentityRule = run # mkRule (RuleId "MapIdentity")
73 , suggestion: Just $ Suggestion
75 , suggestion: Just $ Suggestion
74 { replacement: ReplacementText (printExpr lhs)
76 { replacement: ReplacementText (printExpr lhs)
75 , description: SuggestionDescription "x <#> identity can be simplified to x"
77 , description: SuggestionDescription "x <#> identity can be simplified to x"
78+ , requiredImports: []
76 }
79 }
77 }
80 }
78 ]
81 ]
@@ -94,3 +97,4 @@ mapIdentityRule = run # mkRule (RuleId "MapIdentity")
94 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
97 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
95 (name == "identity" && hasValue imports "identity") || (name == "id" && hasValue imports "id")
98 (name == "identity" && hasValue imports "identity") || (name == "id" && hasValue imports "id")
96 isIdentity _ _ = false
99 isIdentity _ _ = false
100+
lib/purelint/src/Purelint/Rules/MonadLaw.purs+3
@@ -52,6 +52,7 @@ monadLawRule = mkRule (RuleId "MonadLaw") run
52 , suggestion: Just $ Suggestion
52 , suggestion: Just $ Suggestion
53 { replacement: ReplacementText replacement
53 { replacement: ReplacementText replacement
54 , description: SuggestionDescription "Apply f directly to a (left identity)"
54 , description: SuggestionDescription "Apply f directly to a (left identity)"
55+ , requiredImports: []
55 }
56 }
56 }
57 }
57 ]
58 ]
@@ -66,6 +67,7 @@ monadLawRule = mkRule (RuleId "MonadLaw") run
66 , suggestion: Just $ Suggestion
67 , suggestion: Just $ Suggestion
67 { replacement: ReplacementText (printExpr m)
68 { replacement: ReplacementText (printExpr m)
68 , description: SuggestionDescription "pure =<< m is just m (right identity)"
69 , description: SuggestionDescription "pure =<< m is just m (right identity)"
70+ , requiredImports: []
69 }
71 }
70 }
72 }
71 ]
73 ]
@@ -95,3 +97,4 @@ monadLawRule = mkRule (RuleId "MonadLaw") run
95 ExprRecord _ -> printExpr e
97 ExprRecord _ -> printExpr e
96 ExprParens _ -> printExpr e
98 ExprParens _ -> printExpr e
97 _ -> "(" <> printExpr e <> ")"
99 _ -> "(" <> printExpr e <> ")"
100+
lib/purelint/src/Purelint/Rules/MonoidIdentity.purs+3
@@ -42,6 +42,7 @@ monoidIdentityRule = mkRule (RuleId "MonoidIdentity") run
42 , suggestion: Just $ Suggestion
42 , suggestion: Just $ Suggestion
43 { replacement: ReplacementText rhsText
43 { replacement: ReplacementText rhsText
44 , description: SuggestionDescription "mempty <> x can be simplified to x (Monoid left identity)"
44 , description: SuggestionDescription "mempty <> x can be simplified to x (Monoid left identity)"
45+ , requiredImports: []
45 }
46 }
46 }
47 }
47 ]
48 ]
@@ -56,6 +57,7 @@ monoidIdentityRule = mkRule (RuleId "MonoidIdentity") run
56 , suggestion: Just $ Suggestion
57 , suggestion: Just $ Suggestion
57 { replacement: ReplacementText lhsText
58 { replacement: ReplacementText lhsText
58 , description: SuggestionDescription "x <> mempty can be simplified to x (Monoid right identity)"
59 , description: SuggestionDescription "x <> mempty can be simplified to x (Monoid right identity)"
60+ , requiredImports: []
59 }
61 }
60 }
62 }
61 ]
63 ]
@@ -67,3 +69,4 @@ monoidIdentityRule = mkRule (RuleId "MonoidIdentity") run
67 isMempty imports (ExprIdent (QualifiedName { name: Ident name })) =
69 isMempty imports (ExprIdent (QualifiedName { name: Ident name })) =
68 name == "mempty" && hasValue imports "mempty"
70 name == "mempty" && hasValue imports "mempty"
69 isMempty _ _ = false
71 isMempty _ _ = false
72+
lib/purelint/src/Purelint/Rules/NotEqual.purs+2
@@ -64,6 +64,7 @@ notEqualRule = mkRule (RuleId "NotEqual") run
64 , suggestion: Just $ Suggestion
64 , suggestion: Just $ Suggestion
65 { replacement: ReplacementText replacement
65 { replacement: ReplacementText replacement
66 , description: SuggestionDescription msg
66 , description: SuggestionDescription msg
67+ , requiredImports: []
67 }
68 }
68 }
69 }
69 ]
70 ]
@@ -80,3 +81,4 @@ notEqualRule = mkRule (RuleId "NotEqual") run
80
81
81 isNot :: ImportInfo -> QualifiedName Ident -> Boolean
82 isNot :: ImportInfo -> QualifiedName Ident -> Boolean
82 isNot imports (QualifiedName { name: Ident name }) = name == "not" && hasValue imports "not"
83 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
40 , suggestion: Just $ Suggestion
40 , suggestion: Just $ Suggestion
41 { replacement: ReplacementText "Nothing"
41 { replacement: ReplacementText "Nothing"
42 , description: SuggestionDescription "Simplify Nothing >>= f to Nothing"
42 , description: SuggestionDescription "Simplify Nothing >>= f to Nothing"
43+ , requiredImports: []
43 }
44 }
44 }
45 }
45 ]
46 ]
@@ -54,6 +55,7 @@ nothingBindRule = mkRule (RuleId "NothingBind") run
54 , suggestion: Just $ Suggestion
55 , suggestion: Just $ Suggestion
55 { replacement: ReplacementText "Nothing"
56 { replacement: ReplacementText "Nothing"
56 , description: SuggestionDescription "Simplify f =<< Nothing to Nothing"
57 , description: SuggestionDescription "Simplify f =<< Nothing to Nothing"
58+ , requiredImports: []
57 }
59 }
58 }
60 }
59 ]
61 ]
@@ -69,3 +71,4 @@ nothingBindRule = mkRule (RuleId "NothingBind") run
69 isNothing (ExprIdent (QualifiedName { name: Ident "Nothing" })) = true
71 isNothing (ExprIdent (QualifiedName { name: Ident "Nothing" })) = true
70 isNothing (ExprConstructor (QualifiedName { name: Proper "Nothing" })) = true
72 isNothing (ExprConstructor (QualifiedName { name: Proper "Nothing" })) = true
71 isNothing _ = false
73 isNothing _ = false
74+
lib/purelint/src/Purelint/Rules/RedundantBind.purs+3
@@ -50,6 +50,7 @@ redundantBindRule = mkRule (RuleId "RedundantBind") run
50 , suggestion: Just $ Suggestion
50 , suggestion: Just $ Suggestion
51 { replacement: ReplacementText lhsText
51 { replacement: ReplacementText lhsText
52 , description: SuggestionDescription "x >>= pure can be simplified to x"
52 , description: SuggestionDescription "x >>= pure can be simplified to x"
53+ , requiredImports: []
53 }
54 }
54 }
55 }
55 ]
56 ]
@@ -66,6 +67,7 @@ redundantBindRule = mkRule (RuleId "RedundantBind") run
66 , suggestion: Just $ Suggestion
67 , suggestion: Just $ Suggestion
67 { replacement: ReplacementText replacement
68 { replacement: ReplacementText replacement
68 , description: SuggestionDescription "Apply f directly to x"
69 , description: SuggestionDescription "Apply f directly to x"
70+ , requiredImports: []
69 }
71 }
70 }
72 }
71 ]
73 ]
@@ -83,3 +85,4 @@ redundantBindRule = mkRule (RuleId "RedundantBind") run
83 [AppTerm arg] -> Just arg
85 [AppTerm arg] -> Just arg
84 _ -> Nothing
86 _ -> Nothing
85 getPureArg _ _ = Nothing
87 getPureArg _ _ = Nothing
88+
lib/purelint/src/Purelint/Rules/RedundantFlip.purs+2
@@ -41,6 +41,7 @@ redundantFlipRule = mkRule (RuleId "RedundantFlip") run
41 , suggestion: Just $ Suggestion
41 , suggestion: Just $ Suggestion
42 { replacement: ReplacementText fText
42 { replacement: ReplacementText fText
43 , description: SuggestionDescription "flip (flip f) can be simplified to f"
43 , description: SuggestionDescription "flip (flip f) can be simplified to f"
44+ , requiredImports: []
44 }
45 }
45 }
46 }
46 ]
47 ]
@@ -60,3 +61,4 @@ redundantFlipRule = mkRule (RuleId "RedundantFlip") run
60 _ -> Nothing
61 _ -> Nothing
61 getFlipArg imports (ExprParens (Wrapped { value })) = getFlipArg imports value
62 getFlipArg imports (ExprParens (Wrapped { value })) = getFlipArg imports value
62 getFlipArg _ _ = Nothing
63 getFlipArg _ _ = Nothing
64+
lib/purelint/src/Purelint/Rules/RedundantGuard.purs+2
@@ -38,6 +38,7 @@ redundantGuardRule = mkRule (RuleId "RedundantGuard") run
38 , suggestion: Just $ Suggestion
38 , suggestion: Just $ Suggestion
39 { replacement: ReplacementText "pure unit"
39 { replacement: ReplacementText "pure unit"
40 , description: SuggestionDescription "guard true can be replaced with pure unit"
40 , description: SuggestionDescription "guard true can be replaced with pure unit"
41+ , requiredImports: []
41 }
42 }
42 }
43 }
43 ]
44 ]
@@ -69,3 +70,4 @@ redundantGuardRule = mkRule (RuleId "RedundantGuard") run
69 isFalse :: Expr Void -> Boolean
70 isFalse :: Expr Void -> Boolean
70 isFalse (ExprBoolean _ b) = not b
71 isFalse (ExprBoolean _ b) = not b
71 isFalse _ = false
72 isFalse _ = false
73+
lib/purelint/src/Purelint/Rules/RedundantId.purs+6
@@ -43,6 +43,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
43 , suggestion: Just $ Suggestion
43 , suggestion: Just $ Suggestion
44 { replacement: ReplacementText x
44 { replacement: ReplacementText x
45 , description: SuggestionDescription "Remove redundant identity application"
45 , description: SuggestionDescription "Remove redundant identity application"
46+ , requiredImports: []
46 }
47 }
47 }
48 }
48 ]
49 ]
@@ -63,6 +64,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
63 , suggestion: Just $ Suggestion
64 , suggestion: Just $ Suggestion
64 { replacement: ReplacementText x
65 { replacement: ReplacementText x
65 , description: SuggestionDescription "Remove redundant identity composition"
66 , description: SuggestionDescription "Remove redundant identity composition"
67+ , requiredImports: []
66 }
68 }
67 }
69 }
68 ]
70 ]
@@ -77,6 +79,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
77 , suggestion: Just $ Suggestion
79 , suggestion: Just $ Suggestion
78 { replacement: ReplacementText x
80 { replacement: ReplacementText x
79 , description: SuggestionDescription "Remove redundant identity composition"
81 , description: SuggestionDescription "Remove redundant identity composition"
82+ , requiredImports: []
80 }
83 }
81 }
84 }
82 ]
85 ]
@@ -93,6 +96,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
93 , suggestion: Just $ Suggestion
96 , suggestion: Just $ Suggestion
94 { replacement: ReplacementText x
97 { replacement: ReplacementText x
95 , description: SuggestionDescription "Remove redundant identity composition"
98 , description: SuggestionDescription "Remove redundant identity composition"
99+ , requiredImports: []
96 }
100 }
97 }
101 }
98 ]
102 ]
@@ -107,6 +111,7 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
107 , suggestion: Just $ Suggestion
111 , suggestion: Just $ Suggestion
108 { replacement: ReplacementText x
112 { replacement: ReplacementText x
109 , description: SuggestionDescription "Remove redundant identity composition"
113 , description: SuggestionDescription "Remove redundant identity composition"
114+ , requiredImports: []
110 }
115 }
111 }
116 }
112 ]
117 ]
@@ -122,3 +127,4 @@ redundantIdRule = mkRule (RuleId "RedundantId") run
122 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
127 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
123 (name == "identity" || name == "id") && hasValue imports "identity"
128 (name == "identity" || name == "id") && hasValue imports "identity"
124 isIdentity _ _ = false
129 isIdentity _ _ = false
130+
lib/purelint/src/Purelint/Rules/RedundantIf.purs+3
@@ -41,6 +41,7 @@ redundantIfRule = mkRule (RuleId "RedundantIf") run
41 , suggestion: Just $ Suggestion
41 , suggestion: Just $ Suggestion
42 { replacement: ReplacementText (printExpr condExpr)
42 { replacement: ReplacementText (printExpr condExpr)
43 , description: SuggestionDescription "if a then true else false can be simplified to a"
43 , description: SuggestionDescription "if a then true else false can be simplified to a"
44+ , requiredImports: []
44 }
45 }
45 }
46 }
46 ]
47 ]
@@ -54,6 +55,7 @@ redundantIfRule = mkRule (RuleId "RedundantIf") run
54 , suggestion: Just $ Suggestion
55 , suggestion: Just $ Suggestion
55 { replacement: ReplacementText ("not " <> printExpr condExpr)
56 { replacement: ReplacementText ("not " <> printExpr condExpr)
56 , description: SuggestionDescription "if a then false else true can be simplified to not a"
57 , description: SuggestionDescription "if a then false else true can be simplified to not a"
58+ , requiredImports: []
57 }
59 }
58 }
60 }
59 ]
61 ]
@@ -63,3 +65,4 @@ redundantIfRule = mkRule (RuleId "RedundantIf") run
63 isBoolLit :: Boolean -> Expr Void -> Boolean
65 isBoolLit :: Boolean -> Expr Void -> Boolean
64 isBoolLit expected (ExprBoolean _ val) = val == expected
66 isBoolLit expected (ExprBoolean _ val) = val == expected
65 isBoolLit _ _ = false
67 isBoolLit _ _ = false
68+
lib/purelint/src/Purelint/Rules/RedundantNegate.purs+2
@@ -45,6 +45,7 @@ redundantNegateRule = mkRule (RuleId "RedundantNegate") run
45 , suggestion: Just $ Suggestion
45 , suggestion: Just $ Suggestion
46 { replacement: ReplacementText x
46 { replacement: ReplacementText x
47 , description: SuggestionDescription "Remove redundant double negation"
47 , description: SuggestionDescription "Remove redundant double negation"
48+ , requiredImports: []
48 }
49 }
49 }
50 }
50 ]
51 ]
@@ -61,3 +62,4 @@ redundantNegateRule = mkRule (RuleId "RedundantNegate") run
61 isNegate imports (ExprIdent (QualifiedName { name: Ident name })) =
62 isNegate imports (ExprIdent (QualifiedName { name: Ident name })) =
62 name == "negate" && hasValue imports "negate"
63 name == "negate" && hasValue imports "negate"
63 isNegate _ _ = false
64 isNegate _ _ = false
65+
lib/purelint/src/Purelint/Rules/RedundantNot.purs+2
@@ -41,6 +41,7 @@ redundantNotRule = mkRule (RuleId "RedundantNot") run
41 , suggestion: Just $ Suggestion
41 , suggestion: Just $ Suggestion
42 { replacement: ReplacementText xText
42 { replacement: ReplacementText xText
43 , description: SuggestionDescription "not (not x) can be simplified to x"
43 , description: SuggestionDescription "not (not x) can be simplified to x"
44+ , requiredImports: []
44 }
45 }
45 }
46 }
46 ]
47 ]
@@ -60,3 +61,4 @@ redundantNotRule = mkRule (RuleId "RedundantNot") run
60 _ -> Nothing
61 _ -> Nothing
61 getNotArg imports (ExprParens (Wrapped { value })) = getNotArg imports value
62 getNotArg imports (ExprParens (Wrapped { value })) = getNotArg imports value
62 getNotArg _ _ = Nothing
63 getNotArg _ _ = Nothing
64+
lib/purelint/src/Purelint/Rules/RedundantParens.purs+4
@@ -256,6 +256,7 @@ redundantParensRule = mkRule (RuleId "RedundantParens") run
256 , suggestion: Just $ Suggestion
256 , suggestion: Just $ Suggestion
257 { replacement: ReplacementText (printExpr inner)
257 { replacement: ReplacementText (printExpr inner)
258 , description: SuggestionDescription "Remove unnecessary parentheses"
258 , description: SuggestionDescription "Remove unnecessary parentheses"
259+ , requiredImports: []
259 }
260 }
260 }
261 }
261
262
@@ -321,6 +322,7 @@ redundantParensRule = mkRule (RuleId "RedundantParens") run
321 , suggestion: Just $ Suggestion
322 , suggestion: Just $ Suggestion
322 { replacement: ReplacementText (printBinder inner)
323 { replacement: ReplacementText (printBinder inner)
323 , description: SuggestionDescription "Remove unnecessary parentheses"
324 , description: SuggestionDescription "Remove unnecessary parentheses"
325+ , requiredImports: []
324 }
326 }
325 }
327 }
326
328
@@ -415,5 +417,7 @@ redundantParensRule = mkRule (RuleId "RedundantParens") run
415 , suggestion: Just $ Suggestion
417 , suggestion: Just $ Suggestion
416 { replacement: ReplacementText (printType inner)
418 { replacement: ReplacementText (printType inner)
417 , description: SuggestionDescription "Remove unnecessary parentheses"
419 , description: SuggestionDescription "Remove unnecessary parentheses"
420+ , requiredImports: []
418 }
421 }
419 }
422 }
423+
lib/purelint/src/Purelint/Rules/RedundantReverse.purs+2
@@ -42,6 +42,7 @@ redundantReverseRule = mkRule (RuleId "RedundantReverse") run
42 , suggestion: Just $ Suggestion
42 , suggestion: Just $ Suggestion
43 { replacement: ReplacementText x
43 { replacement: ReplacementText x
44 , description: SuggestionDescription "Remove redundant double reverse"
44 , description: SuggestionDescription "Remove redundant double reverse"
45+ , requiredImports: []
45 }
46 }
46 }
47 }
47 ]
48 ]
@@ -56,3 +57,4 @@ redundantReverseRule = mkRule (RuleId "RedundantReverse") run
56 isReverse imports (ExprIdent (QualifiedName { name: Ident name })) =
57 isReverse imports (ExprIdent (QualifiedName { name: Ident name })) =
57 name == "reverse" && hasValue imports "reverse"
58 name == "reverse" && hasValue imports "reverse"
58 isReverse _ _ = false
59 isReverse _ _ = false
60+
lib/purelint/src/Purelint/Rules/UnlessNot.purs+3
@@ -44,6 +44,7 @@ unlessNotRule = mkRule (RuleId "UnlessNot") run
44 , suggestion: Just $ Suggestion
44 , suggestion: Just $ Suggestion
45 { replacement: ReplacementText ("when " <> xText <> " " <> action)
45 { replacement: ReplacementText ("when " <> xText <> " " <> action)
46 , description: SuggestionDescription "Use when instead of unless (not ...)"
46 , description: SuggestionDescription "Use when instead of unless (not ...)"
47+ , requiredImports: []
47 }
48 }
48 }
49 }
49 ]
50 ]
@@ -61,6 +62,7 @@ unlessNotRule = mkRule (RuleId "UnlessNot") run
61 , suggestion: Just $ Suggestion
62 , suggestion: Just $ Suggestion
62 { replacement: ReplacementText ("when " <> xText)
63 { replacement: ReplacementText ("when " <> xText)
63 , description: SuggestionDescription "Use when instead of unless (not ...)"
64 , description: SuggestionDescription "Use when instead of unless (not ...)"
65+ , requiredImports: []
64 }
66 }
65 }
67 }
66 ]
68 ]
@@ -91,3 +93,4 @@ unlessNotRule = mkRule (RuleId "UnlessNot") run
91 [AppTerm arg] -> Just arg
93 [AppTerm arg] -> Just arg
92 _ -> Nothing
94 _ -> Nothing
93 _ -> Nothing
95 _ -> Nothing
96+
lib/purelint/src/Purelint/Rules/UseAll.purs+2
@@ -45,6 +45,7 @@ useAllRule = mkRule (RuleId "UseAll") run
45 , suggestion: Just $ Suggestion
45 , suggestion: Just $ Suggestion
46 { replacement: ReplacementText ("all " <> fText <> " " <> xText)
46 { replacement: ReplacementText ("all " <> fText <> " " <> xText)
47 , description: SuggestionDescription "and (map f x) can be simplified to all f x"
47 , description: SuggestionDescription "and (map f x) can be simplified to all f x"
48+ , requiredImports: []
48 }
49 }
49 }
50 }
50 ]
51 ]
@@ -66,3 +67,4 @@ useAllRule = mkRule (RuleId "UseAll") run
66 isMapLike imports (ExprIdent (QualifiedName { name: Ident name })) =
67 isMapLike imports (ExprIdent (QualifiedName { name: Ident name })) =
67 name == "map" && hasValue imports "map"
68 name == "map" && hasValue imports "map"
68 isMapLike _ _ = false
69 isMapLike _ _ = false
70+
lib/purelint/src/Purelint/Rules/UseAnd.purs+3
@@ -39,6 +39,7 @@ useAndRule = mkRule (RuleId "UseAnd") run
39 , suggestion: Just $ Suggestion
39 , suggestion: Just $ Suggestion
40 { replacement: ReplacementText "and"
40 { replacement: ReplacementText "and"
41 , description: SuggestionDescription "Use and instead of all identity"
41 , description: SuggestionDescription "Use and instead of all identity"
42+ , requiredImports: []
42 }
43 }
43 }
44 }
44 ]
45 ]
@@ -55,6 +56,7 @@ useAndRule = mkRule (RuleId "UseAnd") run
55 , suggestion: Just $ Suggestion
56 , suggestion: Just $ Suggestion
56 { replacement: ReplacementText ("and " <> x)
57 { replacement: ReplacementText ("and " <> x)
57 , description: SuggestionDescription "Use and instead of all identity"
58 , description: SuggestionDescription "Use and instead of all identity"
59+ , requiredImports: []
58 }
60 }
59 }
61 }
60 ]
62 ]
@@ -75,3 +77,4 @@ useAndRule = mkRule (RuleId "UseAnd") run
75 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
77 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
76 (name == "identity" || name == "id") && hasValue imports "identity"
78 (name == "identity" || name == "id") && hasValue imports "identity"
77 isIdentity _ _ = false
79 isIdentity _ _ = false
80+
lib/purelint/src/Purelint/Rules/UseAny.purs+2
@@ -41,6 +41,7 @@ useAnyRule = mkRule (RuleId "UseAny") run
41 , suggestion: Just $ Suggestion
41 , suggestion: Just $ Suggestion
42 { replacement: ReplacementText ("any " <> fText <> " " <> xText)
42 { replacement: ReplacementText ("any " <> fText <> " " <> xText)
43 , description: SuggestionDescription "or (map f x) can be simplified to any f x"
43 , description: SuggestionDescription "or (map f x) can be simplified to any f x"
44+ , requiredImports: []
44 }
45 }
45 }
46 }
46 ]
47 ]
@@ -59,3 +60,4 @@ useAnyRule = mkRule (RuleId "UseAny") run
59 isMapLike = case _, _ of
60 isMapLike = case _, _ of
60 imports, (ExprIdent (QualifiedName { name: Ident name })) -> name == "map" && hasValue imports "map"
61 imports, (ExprIdent (QualifiedName { name: Ident name })) -> name == "map" && hasValue imports "map"
61 _, _ -> false
62 _, _ -> false
63+
lib/purelint/src/Purelint/Rules/UseApplicative.purs+2
@@ -43,6 +43,7 @@ useApplicativeRule = run # mkRule (RuleId "UseApplicative")
43 , suggestion: Just $ Suggestion
43 , suggestion: Just $ Suggestion
44 { replacement: ReplacementText (f <> " <$> " <> x)
44 { replacement: ReplacementText (f <> " <$> " <> x)
45 , description: SuggestionDescription "Use <$> instead of pure f <*> x"
45 , description: SuggestionDescription "Use <$> instead of pure f <*> x"
46+ , requiredImports: []
46 }
47 }
47 }
48 }
48 ]
49 ]
@@ -56,3 +57,4 @@ useApplicativeRule = run # mkRule (RuleId "UseApplicative")
56 isPure imports (ExprIdent (QualifiedName { name: Ident name })) =
57 isPure imports (ExprIdent (QualifiedName { name: Ident name })) =
57 name == "pure" && hasValue imports "pure"
58 name == "pure" && hasValue imports "pure"
58 isPure _ _ = false
59 isPure _ _ = false
60+
lib/purelint/src/Purelint/Rules/UseApplyFlipped.purs+2
@@ -45,6 +45,7 @@ useApplyFlippedRule = mkRule (RuleId "UseApplyFlipped") run
45 , suggestion: Just $ Suggestion
45 , suggestion: Just $ Suggestion
46 { replacement: ReplacementText replacement
46 { replacement: ReplacementText replacement
47 , description: SuggestionDescription ("Rewrite as: " <> replacement)
47 , description: SuggestionDescription ("Rewrite as: " <> replacement)
48+ , requiredImports: []
48 }
49 }
49 }
50 }
50 ]
51 ]
@@ -53,3 +54,4 @@ useApplyFlippedRule = mkRule (RuleId "UseApplyFlipped") run
53 unwrapParens :: Expr Void -> Expr Void
54 unwrapParens :: Expr Void -> Expr Void
54 unwrapParens (ExprParens (Wrapped { value })) = unwrapParens value
55 unwrapParens (ExprParens (Wrapped { value })) = unwrapParens value
55 unwrapParens e = e
56 unwrapParens e = e
57+
lib/purelint/src/Purelint/Rules/UseBimap.purs+9
@@ -48,6 +48,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
48 , suggestion: Just $ Suggestion
48 , suggestion: Just $ Suggestion
49 { replacement: ReplacementText ("second " <> g)
49 { replacement: ReplacementText ("second " <> g)
50 , description: SuggestionDescription "Use second instead of bimap id"
50 , description: SuggestionDescription "Use second instead of bimap id"
51+ , requiredImports: []
51 }
52 }
52 }
53 }
53 ]
54 ]
@@ -63,6 +64,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
63 , suggestion: Just $ Suggestion
64 , suggestion: Just $ Suggestion
64 { replacement: ReplacementText ("first " <> f)
65 { replacement: ReplacementText ("first " <> f)
65 , description: SuggestionDescription "Use first instead of bimap f id"
66 , description: SuggestionDescription "Use first instead of bimap f id"
67+ , requiredImports: []
66 }
68 }
67 }
69 }
68 ]
70 ]
@@ -75,6 +77,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
75 , suggestion: Just $ Suggestion
77 , suggestion: Just $ Suggestion
76 { replacement: ReplacementText "identity"
78 { replacement: ReplacementText "identity"
77 , description: SuggestionDescription "bimap id id is just identity"
79 , description: SuggestionDescription "bimap id id is just identity"
80+ , requiredImports: []
78 }
81 }
79 }
82 }
80 ]
83 ]
@@ -97,6 +100,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
97 , suggestion: Just $ Suggestion
100 , suggestion: Just $ Suggestion
98 { replacement: ReplacementText ("second " <> g <> " " <> x)
101 { replacement: ReplacementText ("second " <> g <> " " <> x)
99 , description: SuggestionDescription "Use second instead of bimap id"
102 , description: SuggestionDescription "Use second instead of bimap id"
103+ , requiredImports: []
100 }
104 }
101 }
105 }
102 ]
106 ]
@@ -112,6 +116,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
112 , suggestion: Just $ Suggestion
116 , suggestion: Just $ Suggestion
113 { replacement: ReplacementText ("first " <> f <> " " <> x)
117 { replacement: ReplacementText ("first " <> f <> " " <> x)
114 , description: SuggestionDescription "Use first instead of bimap f id"
118 , description: SuggestionDescription "Use first instead of bimap f id"
119+ , requiredImports: []
115 }
120 }
116 }
121 }
117 ]
122 ]
@@ -124,6 +129,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
124 , suggestion: Just $ Suggestion
129 , suggestion: Just $ Suggestion
125 { replacement: ReplacementText x
130 { replacement: ReplacementText x
126 , description: SuggestionDescription "bimap id id x is just x"
131 , description: SuggestionDescription "bimap id id x is just x"
132+ , requiredImports: []
127 }
133 }
128 }
134 }
129 ]
135 ]
@@ -149,6 +155,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
149 , suggestion: Just $ Suggestion
155 , suggestion: Just $ Suggestion
150 { replacement: ReplacementText ("bimap " <> f <> " " <> g <> " " <> x)
156 { replacement: ReplacementText ("bimap " <> f <> " " <> g <> " " <> x)
151 , description: SuggestionDescription "Use bimap instead of first and second"
157 , description: SuggestionDescription "Use bimap instead of first and second"
158+ , requiredImports: []
152 }
159 }
153 }
160 }
154 ]
161 ]
@@ -172,6 +179,7 @@ useBimapRule = mkRule (RuleId "UseBimap") run
172 , suggestion: Just $ Suggestion
179 , suggestion: Just $ Suggestion
173 { replacement: ReplacementText ("bimap " <> f <> " " <> g <> " " <> x)
180 { replacement: ReplacementText ("bimap " <> f <> " " <> g <> " " <> x)
174 , description: SuggestionDescription "Use bimap instead of first and second"
181 , description: SuggestionDescription "Use bimap instead of first and second"
182+ , requiredImports: []
175 }
183 }
176 }
184 }
177 ]
185 ]
@@ -201,3 +209,4 @@ useBimapRule = mkRule (RuleId "UseBimap") run
201 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
209 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
202 (name == "identity" && hasValue imports "identity") || (name == "id" && hasValue imports "identity")
210 (name == "identity" && hasValue imports "identity") || (name == "id" && hasValue imports "identity")
203 isIdentity _ _ = false
211 isIdentity _ _ = false
212+
lib/purelint/src/Purelint/Rules/UseBindFlip.purs+2
@@ -52,6 +52,7 @@ useBindFlipRule = mkRule (RuleId "UseBindFlip") run
52 , suggestion: Just $ Suggestion
52 , suggestion: Just $ Suggestion
53 { replacement: ReplacementText (x <> " >>= " <> f)
53 { replacement: ReplacementText (x <> " >>= " <> f)
54 , description: SuggestionDescription "Use >>= instead of join composed with map"
54 , description: SuggestionDescription "Use >>= instead of join composed with map"
55+ , requiredImports: []
55 }
56 }
56 }
57 }
57 ]
58 ]
@@ -66,3 +67,4 @@ useBindFlipRule = mkRule (RuleId "UseBindFlip") run
66 isMap = case _, _ of
67 isMap = case _, _ of
67 imports, ExprIdent (QualifiedName { name: Ident name }) -> name == "map" && hasValue imports "map"
68 imports, ExprIdent (QualifiedName { name: Ident name }) -> name == "map" && hasValue imports "map"
68 _, _ -> false
69 _, _ -> false
70+
lib/purelint/src/Purelint/Rules/UseBreak.purs+3
@@ -45,6 +45,7 @@ useBreakRule = mkRule (RuleId "UseBreak") run
45 , suggestion: Just $ Suggestion
45 , suggestion: Just $ Suggestion
46 { replacement: ReplacementText ("break " <> pText <> " " <> x)
46 { replacement: ReplacementText ("break " <> pText <> " " <> x)
47 , description: SuggestionDescription "Use break instead of span with negated predicate"
47 , description: SuggestionDescription "Use break instead of span with negated predicate"
48+ , requiredImports: []
48 }
49 }
49 }
50 }
50 ]
51 ]
@@ -63,6 +64,7 @@ useBreakRule = mkRule (RuleId "UseBreak") run
63 , suggestion: Just $ Suggestion
64 , suggestion: Just $ Suggestion
64 { replacement: ReplacementText ("break " <> pText)
65 { replacement: ReplacementText ("break " <> pText)
65 , description: SuggestionDescription "Use break instead of span with negated predicate"
66 , description: SuggestionDescription "Use break instead of span with negated predicate"
67+ , requiredImports: []
66 }
68 }
67 }
69 }
68 ]
70 ]
@@ -94,3 +96,4 @@ useBreakRule = mkRule (RuleId "UseBreak") run
94 [ AppTerm p ] -> Just p
96 [ AppTerm p ] -> Just p
95 _ -> Nothing
97 _ -> Nothing
96 _ -> Nothing
98 _ -> Nothing
99+
lib/purelint/src/Purelint/Rules/UseCaseOf.purs+2
@@ -156,6 +156,7 @@ useCaseOfRule = mkRule (RuleId "UseCaseOf") run
156 , suggestion: Just $ Suggestion
156 , suggestion: Just $ Suggestion
157 { replacement: ReplacementText replacement
157 { replacement: ReplacementText replacement
158 , description: SuggestionDescription "Convert to case _ of"
158 , description: SuggestionDescription "Convert to case _ of"
159+ , requiredImports: []
159 }
160 }
160 }
161 }
161 ]
162 ]
@@ -235,3 +236,4 @@ useCaseOfRule = mkRule (RuleId "UseCaseOf") run
235 Comment str -> str
236 Comment str -> str
236 Space n -> power " " n
237 Space n -> power " " n
237 Line v _ -> absurd v
238 Line v _ -> absurd v
239+
lib/purelint/src/Purelint/Rules/UseComparing.purs+2
@@ -55,6 +55,7 @@ useComparingRule = mkRule (RuleId "UseComparing") run
55 , suggestion: Just $ Suggestion
55 , suggestion: Just $ Suggestion
56 { replacement: ReplacementText ("comparing " <> f1)
56 { replacement: ReplacementText ("comparing " <> f1)
57 , description: SuggestionDescription "Use comparing instead of lambda with compare"
57 , description: SuggestionDescription "Use comparing instead of lambda with compare"
58+ , requiredImports: []
58 }
59 }
59 }
60 }
60 ]
61 ]
@@ -74,3 +75,4 @@ useComparingRule = mkRule (RuleId "UseComparing") run
74 _ -> Nothing
75 _ -> Nothing
75 _, _ -> Nothing
76 _, _ -> Nothing
76 extractFunctionCall _ = Nothing
77 extractFunctionCall _ = Nothing
78+
lib/purelint/src/Purelint/Rules/UseConst.purs+2
@@ -78,6 +78,7 @@ useConstRule = mkRule (RuleId "UseConst") run
78 , suggestion: Just $ Suggestion
78 , suggestion: Just $ Suggestion
79 { replacement: ReplacementText replacement
79 { replacement: ReplacementText replacement
80 , description: SuggestionDescription "\\_ -> y can be simplified to const y"
80 , description: SuggestionDescription "\\_ -> y can be simplified to const y"
81+ , requiredImports: []
81 }
82 }
82 }
83 }
83 ]
84 ]
@@ -89,3 +90,4 @@ useConstRule = mkRule (RuleId "UseConst") run
89 getIndent s =
90 getIndent s =
90 let loop i = if String.take 1 (String.drop i s) == " " then loop (i + 1) else i
91 let loop i = if String.take 1 (String.drop i s) == " " then loop (i + 1) else i
91 in loop 0
92 in loop 0
93+
lib/purelint/src/Purelint/Rules/UseDollar.purs+2
@@ -86,6 +86,7 @@ useDollarRule = mkRule (RuleId "UseDollar") run
86 , suggestion: Just $ Suggestion
86 , suggestion: Just $ Suggestion
87 { replacement: ReplacementText replacement
87 { replacement: ReplacementText replacement
88 , description: SuggestionDescription "Replace parentheses with $"
88 , description: SuggestionDescription "Replace parentheses with $"
89+ , requiredImports: []
89 }
90 }
90 }
91 }
91
92
@@ -93,3 +94,4 @@ useDollarRule = mkRule (RuleId "UseDollar") run
93 printAppSpine = case _ of
94 printAppSpine = case _ of
94 AppTerm e -> printExpr e
95 AppTerm e -> printExpr e
95 AppType _ t -> "@" <> printType t
96 AppType _ t -> "@" <> printType t
97+
lib/purelint/src/Purelint/Rules/UseEitherMap.purs+3
@@ -45,6 +45,7 @@ useEitherMapRule = mkRule (RuleId "UseEitherMap") run
45 , suggestion: Just $ Suggestion
45 , suggestion: Just $ Suggestion
46 { replacement: ReplacementText ("map " <> fText)
46 { replacement: ReplacementText ("map " <> fText)
47 , description: SuggestionDescription "Use map instead of either Left (Right <<< f)"
47 , description: SuggestionDescription "Use map instead of either Left (Right <<< f)"
48+ , requiredImports: []
48 }
49 }
49 }
50 }
50 ]
51 ]
@@ -67,6 +68,7 @@ useEitherMapRule = mkRule (RuleId "UseEitherMap") run
67 , suggestion: Just $ Suggestion
68 , suggestion: Just $ Suggestion
68 { replacement: ReplacementText ("map " <> fText <> " " <> x)
69 { replacement: ReplacementText ("map " <> fText <> " " <> x)
69 , description: SuggestionDescription "Use map instead of either Left (Right <<< f)"
70 , description: SuggestionDescription "Use map instead of either Left (Right <<< f)"
71+ , requiredImports: []
70 }
72 }
71 }
73 }
72 ]
74 ]
@@ -112,3 +114,4 @@ useEitherMapRule = mkRule (RuleId "UseEitherMap") run
112 | isRight imports rhs -> Just lhs
114 | isRight imports rhs -> Just lhs
113 _ -> Nothing
115 _ -> Nothing
114 _ -> Nothing
116 _ -> Nothing
117+
lib/purelint/src/Purelint/Rules/UseElemIndex.purs+3
@@ -44,6 +44,7 @@ useElemIndexRule = mkRule (RuleId "UseElemIndex") run
44 , suggestion: Just $ Suggestion
44 , suggestion: Just $ Suggestion
45 { replacement: ReplacementText ("elemIndex " <> aText)
45 { replacement: ReplacementText ("elemIndex " <> aText)
46 , description: SuggestionDescription "Use elemIndex instead of findIndex (== a)"
46 , description: SuggestionDescription "Use elemIndex instead of findIndex (== a)"
47+ , requiredImports: []
47 }
48 }
48 }
49 }
49 ]
50 ]
@@ -63,6 +64,7 @@ useElemIndexRule = mkRule (RuleId "UseElemIndex") run
63 , suggestion: Just $ Suggestion
64 , suggestion: Just $ Suggestion
64 { replacement: ReplacementText ("elemIndex " <> aText <> " " <> x)
65 { replacement: ReplacementText ("elemIndex " <> aText <> " " <> x)
65 , description: SuggestionDescription "Use elemIndex instead of findIndex (== a)"
66 , description: SuggestionDescription "Use elemIndex instead of findIndex (== a)"
67+ , requiredImports: []
66 }
68 }
67 }
69 }
68 ]
70 ]
@@ -126,3 +128,4 @@ useElemIndexRule = mkRule (RuleId "UseElemIndex") run
126 getBinderName (BinderVar (Name { name: Ident name })) = Just name
128 getBinderName (BinderVar (Name { name: Ident name })) = Just name
127 getBinderName (BinderParens (Wrapped { value: inner })) = getBinderName inner
129 getBinderName (BinderParens (Wrapped { value: inner })) = getBinderName inner
128 getBinderName _ = Nothing
130 getBinderName _ = Nothing
131+
lib/purelint/src/Purelint/Rules/UseFindMap.purs+8
@@ -56,6 +56,13 @@ useFindMapRule = mkRule (RuleId "UseFindMap") run
56 , suggestion: Just $ Suggestion
56 , suggestion: Just $ Suggestion
57 { replacement: ReplacementText ("findMap " <> f <> " " <> x)
57 { replacement: ReplacementText ("findMap " <> f <> " " <> x)
58 , description: SuggestionDescription "Use findMap instead of head composed with mapMaybe"
58 , 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+ ]
59 }
66 }
60 }
67 }
61 ]
68 ]
@@ -71,3 +78,4 @@ useFindMapRule = mkRule (RuleId "UseFindMap") run
71 isMapMaybe imports (ExprIdent (QualifiedName { name: Ident name })) =
78 isMapMaybe imports (ExprIdent (QualifiedName { name: Ident name })) =
72 name == "mapMaybe" && hasValue imports "mapMaybe"
79 name == "mapMaybe" && hasValue imports "mapMaybe"
73 isMapMaybe _ _ = false
80 isMapMaybe _ _ = false
81+
lib/purelint/src/Purelint/Rules/UseFold.purs+2
@@ -36,6 +36,7 @@ useFoldRule = mkRule (RuleId "UseFold") run
36 , suggestion: Just $ Suggestion
36 , suggestion: Just $ Suggestion
37 { replacement: ReplacementText "fold"
37 { replacement: ReplacementText "fold"
38 , description: SuggestionDescription "Use fold instead of foldMap identity"
38 , description: SuggestionDescription "Use fold instead of foldMap identity"
39+ , requiredImports: []
39 }
40 }
40 }
41 }
41 ]
42 ]
@@ -51,3 +52,4 @@ useFoldRule = mkRule (RuleId "UseFold") run
51 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
52 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
52 name == "identity" && hasValue imports "identity"
53 name == "identity" && hasValue imports "identity"
53 isIdentity _ _ = false
54 isIdentity _ _ = false
55+
lib/purelint/src/Purelint/Rules/UseFoldBool.purs+2
@@ -84,5 +84,7 @@ useFoldBoolRule = mkRule (RuleId "UseFoldBool") run
84 , suggestion: Just $ Suggestion
84 , suggestion: Just $ Suggestion
85 { replacement: ReplacementText replacement
85 { replacement: ReplacementText replacement
86 , description: SuggestionDescription $ "Replace with " <> replacement
86 , description: SuggestionDescription $ "Replace with " <> replacement
87+ , requiredImports: []
87 }
88 }
88 }
89 }
90+
lib/purelint/src/Purelint/Rules/UseFoldMap.purs+2
@@ -109,6 +109,7 @@ useFoldMapRule = mkRule (RuleId "UseFoldMap") run
109 , suggestion: Just $ Suggestion
109 , suggestion: Just $ Suggestion
110 { replacement: ReplacementText suggestion
110 { replacement: ReplacementText suggestion
111 , description: SuggestionDescription "Use foldMap instead of case with Nothing -> mempty"
111 , description: SuggestionDescription "Use foldMap instead of case with Nothing -> mempty"
112+ , requiredImports: []
112 }
113 }
113 }
114 }
114 ]
115 ]
@@ -163,3 +164,4 @@ useFoldMapRule = mkRule (RuleId "UseFoldMap") run
163 getIndent s =
164 getIndent s =
164 let loop i = if String.take 1 (String.drop i s) == " " then loop (i + 1) else i
165 let loop i = if String.take 1 (String.drop i s) == " " then loop (i + 1) else i
165 in loop 0
166 in loop 0
167+
lib/purelint/src/Purelint/Rules/UseFoldMapId.purs+3
@@ -39,6 +39,7 @@ useFoldMapIdRule = mkRule (RuleId "UseFoldMapId") run
39 , suggestion: Just $ Suggestion
39 , suggestion: Just $ Suggestion
40 { replacement: ReplacementText "fold"
40 { replacement: ReplacementText "fold"
41 , description: SuggestionDescription "Use fold instead of foldMap identity"
41 , description: SuggestionDescription "Use fold instead of foldMap identity"
42+ , requiredImports: []
42 }
43 }
43 }
44 }
44 ]
45 ]
@@ -55,6 +56,7 @@ useFoldMapIdRule = mkRule (RuleId "UseFoldMapId") run
55 , suggestion: Just $ Suggestion
56 , suggestion: Just $ Suggestion
56 { replacement: ReplacementText ("fold " <> x)
57 { replacement: ReplacementText ("fold " <> x)
57 , description: SuggestionDescription "Use fold instead of foldMap identity"
58 , description: SuggestionDescription "Use fold instead of foldMap identity"
59+ , requiredImports: []
58 }
60 }
59 }
61 }
60 ]
62 ]
@@ -75,3 +77,4 @@ useFoldMapIdRule = mkRule (RuleId "UseFoldMapId") run
75 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
77 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
76 (name == "identity" || name == "id") && hasValue imports "identity"
78 (name == "identity" || name == "id") && hasValue imports "identity"
77 isIdentity _ _ = false
79 isIdentity _ _ = false
80+
lib/purelint/src/Purelint/Rules/UseFor.purs+3
@@ -51,6 +51,7 @@ useForRule = mkRule (RuleId "UseFor") run
51 , suggestion: Just $ Suggestion
51 , suggestion: Just $ Suggestion
52 { replacement: ReplacementText "for"
52 { replacement: ReplacementText "for"
53 , description: SuggestionDescription "Use for instead of flip traverse"
53 , description: SuggestionDescription "Use for instead of flip traverse"
54+ , requiredImports: []
54 }
55 }
55 }
56 }
56 ]
57 ]
@@ -63,6 +64,7 @@ useForRule = mkRule (RuleId "UseFor") run
63 , suggestion: Just $ Suggestion
64 , suggestion: Just $ Suggestion
64 { replacement: ReplacementText "for_"
65 { replacement: ReplacementText "for_"
65 , description: SuggestionDescription "Use for_ instead of flip traverse_"
66 , description: SuggestionDescription "Use for_ instead of flip traverse_"
67+ , requiredImports: []
66 }
68 }
67 }
69 }
68 ]
70 ]
@@ -72,3 +74,4 @@ useForRule = mkRule (RuleId "UseFor") run
72 isFlip imports (ExprIdent (QualifiedName { name: Ident name })) =
74 isFlip imports (ExprIdent (QualifiedName { name: Ident name })) =
73 name == "flip" && hasValue imports "flip"
75 name == "flip" && hasValue imports "flip"
74 isFlip _ _ = false
76 isFlip _ _ = false
77+
lib/purelint/src/Purelint/Rules/UseFromJust.purs+4
@@ -43,6 +43,7 @@ useFromJustRule = mkRule (RuleId "UseFromJust") run
43 , suggestion: Just $ Suggestion
43 , suggestion: Just $ Suggestion
44 { replacement: ReplacementText xText
44 { replacement: ReplacementText xText
45 , description: SuggestionDescription "Simplify fromMaybe with Just"
45 , description: SuggestionDescription "Simplify fromMaybe with Just"
46+ , requiredImports: []
46 }
47 }
47 }
48 }
48 ]
49 ]
@@ -59,6 +60,7 @@ useFromJustRule = mkRule (RuleId "UseFromJust") run
59 , suggestion: Just $ Suggestion
60 , suggestion: Just $ Suggestion
60 { replacement: ReplacementText d
61 { replacement: ReplacementText d
61 , description: SuggestionDescription "Simplify fromMaybe with Nothing"
62 , description: SuggestionDescription "Simplify fromMaybe with Nothing"
63+ , requiredImports: []
62 }
64 }
63 }
65 }
64 ]
66 ]
@@ -73,6 +75,7 @@ useFromJustRule = mkRule (RuleId "UseFromJust") run
73 , suggestion: Just $ Suggestion
75 , suggestion: Just $ Suggestion
74 { replacement: ReplacementText d
76 { replacement: ReplacementText d
75 , description: SuggestionDescription "Simplify fromMaybe with Nothing"
77 , description: SuggestionDescription "Simplify fromMaybe with Nothing"
78+ , requiredImports: []
76 }
79 }
77 }
80 }
78 ]
81 ]
@@ -102,3 +105,4 @@ useFromJustRule = mkRule (RuleId "UseFromJust") run
102 _ -> Nothing
105 _ -> Nothing
103 _ -> Nothing
106 _ -> Nothing
104 getJustArg _ = Nothing
107 getJustArg _ = Nothing
108+
lib/purelint/src/Purelint/Rules/UseFromMaybe.purs+2
@@ -39,6 +39,7 @@ useFromMaybeRule = mkRule (RuleId "UseFromMaybe") run
39 , suggestion: Just $ Suggestion
39 , suggestion: Just $ Suggestion
40 { replacement: ReplacementText ("fromMaybe " <> defaultText)
40 { replacement: ReplacementText ("fromMaybe " <> defaultText)
41 , description: SuggestionDescription "Use fromMaybe instead of maybe x id"
41 , description: SuggestionDescription "Use fromMaybe instead of maybe x id"
42+ , requiredImports: []
42 }
43 }
43 }
44 }
44 ]
45 ]
@@ -54,3 +55,4 @@ useFromMaybeRule = mkRule (RuleId "UseFromMaybe") run
54 isId imports (ExprIdent (QualifiedName { name: Ident name })) =
55 isId imports (ExprIdent (QualifiedName { name: Ident name })) =
55 name == "identity" && hasValue imports "identity"
56 name == "identity" && hasValue imports "identity"
56 isId _ _ = false
57 isId _ _ = false
58+
lib/purelint/src/Purelint/Rules/UseFstSnd.purs+3
@@ -40,6 +40,7 @@ useFstSndRule = mkRule (RuleId "UseFstSnd") run
40 , suggestion: Just $ Suggestion
40 , suggestion: Just $ Suggestion
41 { replacement: ReplacementText "fst"
41 { replacement: ReplacementText "fst"
42 , description: SuggestionDescription "Use fst instead of lambda extracting first element"
42 , description: SuggestionDescription "Use fst instead of lambda extracting first element"
43+ , requiredImports: []
43 }
44 }
44 }
45 }
45 ]
46 ]
@@ -52,6 +53,7 @@ useFstSndRule = mkRule (RuleId "UseFstSnd") run
52 , suggestion: Just $ Suggestion
53 , suggestion: Just $ Suggestion
53 { replacement: ReplacementText "snd"
54 { replacement: ReplacementText "snd"
54 , description: SuggestionDescription "Use snd instead of lambda extracting second element"
55 , description: SuggestionDescription "Use snd instead of lambda extracting second element"
56+ , requiredImports: []
55 }
57 }
56 }
58 }
57 ]
59 ]
@@ -77,3 +79,4 @@ useFstSndRule = mkRule (RuleId "UseFstSnd") run
77 getBinderName (BinderWildcard _) = Nothing -- wildcards can't be referenced in body
79 getBinderName (BinderWildcard _) = Nothing -- wildcards can't be referenced in body
78 getBinderName (BinderParens (Wrapped { value: inner })) = getBinderName inner
80 getBinderName (BinderParens (Wrapped { value: inner })) = getBinderName inner
79 getBinderName _ = Nothing
81 getBinderName _ = Nothing
82+
lib/purelint/src/Purelint/Rules/UseGuard.purs+3
@@ -54,6 +54,7 @@ useGuardRule = mkRule (RuleId "UseGuard") run
54 , suggestion: Just $ Suggestion
54 , suggestion: Just $ Suggestion
55 { replacement: ReplacementText replacement
55 { replacement: ReplacementText replacement
56 , description: SuggestionDescription "if cond then pure unit else x can be replaced with unless cond x"
56 , description: SuggestionDescription "if cond then pure unit else x can be replaced with unless cond x"
57+ , requiredImports: []
57 }
58 }
58 }
59 }
59 ]
60 ]
@@ -71,6 +72,7 @@ useGuardRule = mkRule (RuleId "UseGuard") run
71 , suggestion: Just $ Suggestion
72 , suggestion: Just $ Suggestion
72 { replacement: ReplacementText replacement
73 { replacement: ReplacementText replacement
73 , description: SuggestionDescription "if cond then x else pure unit can be replaced with when cond x"
74 , description: SuggestionDescription "if cond then x else pure unit can be replaced with when cond x"
75+ , requiredImports: []
74 }
76 }
75 }
77 }
76 ]
78 ]
@@ -97,3 +99,4 @@ useGuardRule = mkRule (RuleId "UseGuard") run
97 isUnit :: Expr Void -> Boolean
99 isUnit :: Expr Void -> Boolean
98 isUnit (ExprIdent (QualifiedName { name: Ident name })) = name == "unit"
100 isUnit (ExprIdent (QualifiedName { name: Ident name })) = name == "unit"
99 isUnit _ = false
101 isUnit _ = false
102+
lib/purelint/src/Purelint/Rules/UseGuardMaybe.purs+2
@@ -42,6 +42,7 @@ useGuardMaybeRule = mkRule (RuleId "UseGuardMaybe") run
42 , suggestion: Just $ Suggestion
42 , suggestion: Just $ Suggestion
43 { replacement: ReplacementText ("guard " <> c <> " $> " <> x)
43 { replacement: ReplacementText ("guard " <> c <> " $> " <> x)
44 , description: SuggestionDescription "Use guard c $> x instead of if-then-else with Maybe"
44 , description: SuggestionDescription "Use guard c $> x instead of if-then-else with Maybe"
45+ , requiredImports: []
45 }
46 }
46 }
47 }
47 ]
48 ]
@@ -75,3 +76,4 @@ useGuardMaybeRule = mkRule (RuleId "UseGuardMaybe") run
75 isNothing imports (ExprConstructor (QualifiedName { name: _ })) =
76 isNothing imports (ExprConstructor (QualifiedName { name: _ })) =
76 hasValue imports "Nothing"
77 hasValue imports "Nothing"
77 isNothing _ _ = false
78 isNothing _ _ = false
79+
lib/purelint/src/Purelint/Rules/UseHead.purs+2
@@ -39,6 +39,7 @@ useHeadRule = mkRule (RuleId "UseHead") run
39 , suggestion: Just $ Suggestion
39 , suggestion: Just $ Suggestion
40 { replacement: ReplacementText "head"
40 { replacement: ReplacementText "head"
41 , description: SuggestionDescription "Use head instead of !! 0"
41 , description: SuggestionDescription "Use head instead of !! 0"
42+ , requiredImports: []
42 }
43 }
43 }
44 }
44 ]
45 ]
@@ -54,3 +55,4 @@ useHeadRule = mkRule (RuleId "UseHead") run
54 isZeroLiteral (ExprInt _ (SmallInt 0)) = true
55 isZeroLiteral (ExprInt _ (SmallInt 0)) = true
55 isZeroLiteral (ExprInt _ (BigInt s)) = s == "0"
56 isZeroLiteral (ExprInt _ (BigInt s)) = s == "0"
56 isZeroLiteral _ = false
57 isZeroLiteral _ = false
58+
lib/purelint/src/Purelint/Rules/UseIsJust.purs+2
@@ -37,6 +37,7 @@ useIsJustRule = mkRule (RuleId "UseIsJust") run
37 , suggestion: Just $ Suggestion
37 , suggestion: Just $ Suggestion
38 { replacement: ReplacementText "isJust"
38 { replacement: ReplacementText "isJust"
39 , description: SuggestionDescription "Use isJust instead of maybe false (const true)"
39 , description: SuggestionDescription "Use isJust instead of maybe false (const true)"
40+ , requiredImports: []
40 }
41 }
41 }
42 }
42 ]
43 ]
@@ -66,3 +67,4 @@ useIsJustRule = mkRule (RuleId "UseIsJust") run
66 isTrue :: Expr Void -> Boolean
67 isTrue :: Expr Void -> Boolean
67 isTrue (ExprBoolean _ b) = b
68 isTrue (ExprBoolean _ b) = b
68 isTrue _ = false
69 isTrue _ = false
70+
lib/purelint/src/Purelint/Rules/UseIsNothing.purs+2
@@ -37,6 +37,7 @@ useIsNothingRule = mkRule (RuleId "UseIsNothing") run
37 , suggestion: Just $ Suggestion
37 , suggestion: Just $ Suggestion
38 { replacement: ReplacementText "isNothing"
38 { replacement: ReplacementText "isNothing"
39 , description: SuggestionDescription "Use isNothing instead of maybe true (const false)"
39 , description: SuggestionDescription "Use isNothing instead of maybe true (const false)"
40+ , requiredImports: []
40 }
41 }
41 }
42 }
42 ]
43 ]
@@ -66,3 +67,4 @@ useIsNothingRule = mkRule (RuleId "UseIsNothing") run
66 isFalse :: Expr Void -> Boolean
67 isFalse :: Expr Void -> Boolean
67 isFalse (ExprBoolean _ b) = not b
68 isFalse (ExprBoolean _ b) = not b
68 isFalse _ = false
69 isFalse _ = false
70+
lib/purelint/src/Purelint/Rules/UseJoin.purs+3
@@ -40,6 +40,7 @@ useJoinRule = mkRule (RuleId "UseJoin") run
40 , suggestion: Just $ Suggestion
40 , suggestion: Just $ Suggestion
41 { replacement: ReplacementText ("join " <> xText)
41 { replacement: ReplacementText ("join " <> xText)
42 , description: SuggestionDescription "x >>= identity can be simplified to join x"
42 , description: SuggestionDescription "x >>= identity can be simplified to join x"
43+ , requiredImports: []
43 }
44 }
44 }
45 }
45 ]
46 ]
@@ -58,6 +59,7 @@ useJoinRule = mkRule (RuleId "UseJoin") run
58 , suggestion: Just $ Suggestion
59 , suggestion: Just $ Suggestion
59 { replacement: ReplacementText ("join " <> xText)
60 { replacement: ReplacementText ("join " <> xText)
60 , description: SuggestionDescription "identity =<< x can be simplified to join x"
61 , description: SuggestionDescription "identity =<< x can be simplified to join x"
62+ , requiredImports: []
61 }
63 }
62 }
64 }
63 ]
65 ]
@@ -76,3 +78,4 @@ useJoinRule = mkRule (RuleId "UseJoin") run
76 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
78 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
77 (name == "identity" && hasValue imports "identity") || (name == "id" && hasValue imports "id")
79 (name == "identity" && hasValue imports "identity") || (name == "id" && hasValue imports "id")
78 isIdentity _ _ = false
80 isIdentity _ _ = false
81+
lib/purelint/src/Purelint/Rules/UseLastReverse.purs+2
@@ -50,6 +50,7 @@ useLastReverseRule = mkRule (RuleId "UseLastReverse") run
50 , suggestion: Just $ Suggestion
50 , suggestion: Just $ Suggestion
51 { replacement: ReplacementText (newFn <> " " <> x)
51 { replacement: ReplacementText (newFn <> " " <> x)
52 , description: SuggestionDescription $ "Use " <> newFn <> " instead"
52 , description: SuggestionDescription $ "Use " <> newFn <> " instead"
53+ , requiredImports: []
53 }
54 }
54 }
55 }
55 ]
56 ]
@@ -76,3 +77,4 @@ useLastReverseRule = mkRule (RuleId "UseLastReverse") run
76 isReverse imports (ExprIdent (QualifiedName { name: Ident name })) =
77 isReverse imports (ExprIdent (QualifiedName { name: Ident name })) =
77 name == "reverse" && hasValue imports "reverse"
78 name == "reverse" && hasValue imports "reverse"
78 isReverse _ _ = false
79 isReverse _ _ = false
80+
lib/purelint/src/Purelint/Rules/UseMapMaybe.purs+8
@@ -56,6 +56,13 @@ useMapMaybeRule = mkRule (RuleId "UseMapMaybe") run
56 , suggestion: Just $ Suggestion
56 , suggestion: Just $ Suggestion
57 { replacement: ReplacementText ("mapMaybe " <> f <> " " <> x)
57 { replacement: ReplacementText ("mapMaybe " <> f <> " " <> x)
58 , description: SuggestionDescription "Use mapMaybe instead of catMaybes composed with map"
58 , 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+ ]
59 }
66 }
60 }
67 }
61 ]
68 ]
@@ -71,3 +78,4 @@ useMapMaybeRule = mkRule (RuleId "UseMapMaybe") run
71 isMap imports (ExprIdent (QualifiedName { name: Ident name })) =
78 isMap imports (ExprIdent (QualifiedName { name: Ident name })) =
72 name == "map" && hasValue imports "map"
79 name == "map" && hasValue imports "map"
73 isMap _ _ = false
80 isMap _ _ = false
81+
lib/purelint/src/Purelint/Rules/UseMinMax.purs+2
@@ -64,6 +64,7 @@ useMinMaxRule = mkRule (RuleId "UseMinMax") run
64 , suggestion: Just $ Suggestion
64 , suggestion: Just $ Suggestion
65 { replacement: ReplacementText (fn <> " " <> a <> " " <> b)
65 { replacement: ReplacementText (fn <> " " <> a <> " " <> b)
66 , description: SuggestionDescription ("Use " <> fn <> " instead of if/else with comparison")
66 , description: SuggestionDescription ("Use " <> fn <> " instead of if/else with comparison")
67+ , requiredImports: []
67 }
68 }
68 }
69 }
69
70
@@ -76,3 +77,4 @@ useMinMaxRule = mkRule (RuleId "UseMinMax") run
76 _ -> Nothing
77 _ -> Nothing
77 getComparison imports (ExprParens (Wrapped { value })) = getComparison imports value
78 getComparison imports (ExprParens (Wrapped { value })) = getComparison imports value
78 getComparison _ _ = Nothing
79 getComparison _ _ = Nothing
80+
lib/purelint/src/Purelint/Rules/UseMinimumSort.purs+2
@@ -50,6 +50,7 @@ useMinimumSortRule = mkRule (RuleId "UseMinimumSort") run
50 , suggestion: Just $ Suggestion
50 , suggestion: Just $ Suggestion
51 { replacement: ReplacementText (newFn <> " " <> x)
51 { replacement: ReplacementText (newFn <> " " <> x)
52 , description: SuggestionDescription $ "Use " <> newFn <> " instead of sorting"
52 , description: SuggestionDescription $ "Use " <> newFn <> " instead of sorting"
53+ , requiredImports: []
53 }
54 }
54 }
55 }
55 ]
56 ]
@@ -76,3 +77,4 @@ useMinimumSortRule = mkRule (RuleId "UseMinimumSort") run
76 isSort imports (ExprIdent (QualifiedName { name: Ident name })) =
77 isSort imports (ExprIdent (QualifiedName { name: Ident name })) =
77 name == "sort" && hasValue imports "sort"
78 name == "sort" && hasValue imports "sort"
78 isSort _ _ = false
79 isSort _ _ = false
80+
lib/purelint/src/Purelint/Rules/UseNotElem.purs+2
@@ -42,6 +42,7 @@ useNotElemRule = mkRule (RuleId "UseNotElem") run
42 , suggestion: Just $ Suggestion
42 , suggestion: Just $ Suggestion
43 { replacement: ReplacementText ("notElem " <> xText <> " " <> yText)
43 { replacement: ReplacementText ("notElem " <> xText <> " " <> yText)
44 , description: SuggestionDescription "Use notElem instead of not (elem ...)"
44 , description: SuggestionDescription "Use notElem instead of not (elem ...)"
45+ , requiredImports: []
45 }
46 }
46 }
47 }
47 ]
48 ]
@@ -64,3 +65,4 @@ useNotElemRule = mkRule (RuleId "UseNotElem") run
64 _ -> Nothing
65 _ -> Nothing
65 getElemArgs imports (ExprParens (Wrapped { value })) = getElemArgs imports value
66 getElemArgs imports (ExprParens (Wrapped { value })) = getElemArgs imports value
66 getElemArgs _ _ = Nothing
67 getElemArgs _ _ = Nothing
68+
lib/purelint/src/Purelint/Rules/UseNull.purs+2
@@ -57,6 +57,7 @@ useNullRule = mkRule (RuleId "UseNull") run
57 , suggestion: Just $ Suggestion
57 , suggestion: Just $ Suggestion
58 { replacement: ReplacementText ("null " <> xText)
58 { replacement: ReplacementText ("null " <> xText)
59 , description: SuggestionDescription $ from <> " can be simplified to null x"
59 , description: SuggestionDescription $ from <> " can be simplified to null x"
60+ , requiredImports: []
60 }
61 }
61 }
62 }
62
63
@@ -77,3 +78,4 @@ useNullRule = mkRule (RuleId "UseNull") run
77 _ -> Nothing
78 _ -> Nothing
78 _ -> Nothing
79 _ -> Nothing
79 getLengthArg _ _ = Nothing
80 getLengthArg _ _ = Nothing
81+
lib/purelint/src/Purelint/Rules/UseOn.purs+2
@@ -54,6 +54,7 @@ useOnRule = mkRule (RuleId "UseOn") run
54 , suggestion: Just $ Suggestion
54 , suggestion: Just $ Suggestion
55 { replacement: ReplacementText ("on " <> f <> " " <> g1)
55 { replacement: ReplacementText ("on " <> f <> " " <> g1)
56 , description: SuggestionDescription "Use on instead of lambda applying g to both arguments"
56 , description: SuggestionDescription "Use on instead of lambda applying g to both arguments"
57+ , requiredImports: []
57 }
58 }
58 }
59 }
59 ]
60 ]
@@ -70,3 +71,4 @@ useOnRule = mkRule (RuleId "UseOn") run
70 _ -> Nothing
71 _ -> Nothing
71 _, _ -> Nothing
72 _, _ -> Nothing
72 extractFunctionCall _ = Nothing
73 extractFunctionCall _ = Nothing
74+
lib/purelint/src/Purelint/Rules/UseOr.purs+3
@@ -40,6 +40,7 @@ useOrRule = mkRule (RuleId "UseOr") run
40 , suggestion: Just $ Suggestion
40 , suggestion: Just $ Suggestion
41 { replacement: ReplacementText "or"
41 { replacement: ReplacementText "or"
42 , description: SuggestionDescription "Use or instead of any identity"
42 , description: SuggestionDescription "Use or instead of any identity"
43+ , requiredImports: []
43 }
44 }
44 }
45 }
45 ]
46 ]
@@ -56,6 +57,7 @@ useOrRule = mkRule (RuleId "UseOr") run
56 , suggestion: Just $ Suggestion
57 , suggestion: Just $ Suggestion
57 { replacement: ReplacementText ("or " <> x)
58 { replacement: ReplacementText ("or " <> x)
58 , description: SuggestionDescription "Use or instead of any identity"
59 , description: SuggestionDescription "Use or instead of any identity"
60+ , requiredImports: []
59 }
61 }
60 }
62 }
61 ]
63 ]
@@ -76,3 +78,4 @@ useOrRule = mkRule (RuleId "UseOr") run
76 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
78 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
77 (name == "identity" || name == "id") && hasValue imports "identity"
79 (name == "identity" || name == "id") && hasValue imports "identity"
78 isIdentity _ _ = false
80 isIdentity _ _ = false
81+
lib/purelint/src/Purelint/Rules/UsePatternGuards.purs+2
@@ -72,6 +72,7 @@ usePatternGuardsRule = mkRule (RuleId "UsePatternGuards") run
72 , suggestion: Just $ Suggestion
72 , suggestion: Just $ Suggestion
73 { replacement: ReplacementText replacement
73 { replacement: ReplacementText replacement
74 , description: SuggestionDescription $ "Use pattern guards instead of " <> show result.depth <> " nested case expressions"
74 , description: SuggestionDescription $ "Use pattern guards instead of " <> show result.depth <> " nested case expressions"
75+ , requiredImports: []
75 }
76 }
76 }
77 }
77 ]
78 ]
@@ -227,3 +228,4 @@ usePatternGuardsRule = mkRule (RuleId "UsePatternGuards") run
227 _ -> Nothing
228 _ -> Nothing
228 _ -> Nothing
229 _ -> Nothing
229 getMatchPatternAndBody _ = Nothing
230 getMatchPatternAndBody _ = Nothing
231+
lib/purelint/src/Purelint/Rules/UseReplicate.purs+8
@@ -44,6 +44,13 @@ useReplicateRule = mkRule (RuleId "UseReplicate") run
44 , suggestion: Just $ Suggestion
44 , suggestion: Just $ Suggestion
45 { replacement: ReplacementText ("replicate " <> n <> " " <> xText)
45 { replacement: ReplacementText ("replicate " <> n <> " " <> xText)
46 , description: SuggestionDescription "Use replicate instead of take n (repeat x)"
46 , 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+ ]
47 }
54 }
48 }
55 }
49 ]
56 ]
@@ -74,3 +81,4 @@ useReplicateRule = mkRule (RuleId "UseReplicate") run
74 [AppTerm arg] -> Just arg
81 [AppTerm arg] -> Just arg
75 _ -> Nothing
82 _ -> Nothing
76 _ -> Nothing
83 _ -> Nothing
84+
lib/purelint/src/Purelint/Rules/UseSequence.purs+8
@@ -37,6 +37,13 @@ useSequenceRule = mkRule (RuleId "UseSequence") run
37 , suggestion: Just $ Suggestion
37 , suggestion: Just $ Suggestion
38 { replacement: ReplacementText "sequence"
38 { replacement: ReplacementText "sequence"
39 , description: SuggestionDescription "Use sequence instead of traverse identity"
39 , 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+ ]
40 }
47 }
41 }
48 }
42 ]
49 ]
@@ -52,3 +59,4 @@ useSequenceRule = mkRule (RuleId "UseSequence") run
52 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
59 isIdentity imports (ExprIdent (QualifiedName { name: Ident name })) =
53 name == "identity" && hasValue imports "identity"
60 name == "identity" && hasValue imports "identity"
54 isIdentity _ _ = false
61 isIdentity _ _ = false
62+
lib/purelint/src/Purelint/Rules/UseSpan.purs+3
@@ -44,6 +44,7 @@ useSpanRule = mkRule (RuleId "UseSpan") run
44 , suggestion: Just $ Suggestion
44 , suggestion: Just $ Suggestion
45 { replacement: ReplacementText ("span " <> pText <> " " <> x)
45 { replacement: ReplacementText ("span " <> pText <> " " <> x)
46 , description: SuggestionDescription "Use span instead of break with negated predicate"
46 , description: SuggestionDescription "Use span instead of break with negated predicate"
47+ , requiredImports: []
47 }
48 }
48 }
49 }
49 ]
50 ]
@@ -61,6 +62,7 @@ useSpanRule = mkRule (RuleId "UseSpan") run
61 , suggestion: Just $ Suggestion
62 , suggestion: Just $ Suggestion
62 { replacement: ReplacementText ("span " <> pText)
63 { replacement: ReplacementText ("span " <> pText)
63 , description: SuggestionDescription "Use span instead of break with negated predicate"
64 , description: SuggestionDescription "Use span instead of break with negated predicate"
65+ , requiredImports: []
64 }
66 }
65 }
67 }
66 ]
68 ]
@@ -91,3 +93,4 @@ useSpanRule = mkRule (RuleId "UseSpan") run
91 [AppTerm p] -> Just p
93 [AppTerm p] -> Just p
92 _ -> Nothing
94 _ -> Nothing
93 _ -> Nothing
95 _ -> Nothing
96+
lib/purelint/src/Purelint/Rules/UseTraverse.purs+12
@@ -69,6 +69,8 @@ useTraverseRule = mkRule (RuleId "UseTraverse") run
69 replacement = if seqName == "sequenceA" || seqName == "sequenceA_" then "traverse" else "mapM"
69 replacement = if seqName == "sequenceA" || seqName == "sequenceA_" then "traverse" else "mapM"
70 replacementSuffix = if seqName == "sequenceA_" || seqName == "sequence_" then "_" else ""
70 replacementSuffix = if seqName == "sequenceA_" || seqName == "sequence_" then "_" else ""
71 concreteReplacement = replacement <> replacementSuffix <> " " <> fText <> " " <> xText
71 concreteReplacement = replacement <> replacementSuffix <> " " <> fText <> " " <> xText
72+ moduleName = if replacement == "mapM" then "Control.Monad" else "Data.Traversable"
73+ importItem = replacement <> replacementSuffix
72 in
74 in
73 [ LintWarning
75 [ LintWarning
74 { ruleId: RuleId "UseTraverse"
76 { ruleId: RuleId "UseTraverse"
@@ -78,6 +80,15 @@ useTraverseRule = mkRule (RuleId "UseTraverse") run
78 , suggestion: Just $ Suggestion
80 , suggestion: Just $ Suggestion
79 { replacement: ReplacementText concreteReplacement
81 { replacement: ReplacementText concreteReplacement
80 , description: SuggestionDescription $ seqName <> " (map f x) can be replaced with " <> replacement <> replacementSuffix <> " f x"
82 , 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+ ]
81 }
92 }
82 }
93 }
83 ]
94 ]
@@ -124,3 +135,4 @@ useTraverseRule = mkRule (RuleId "UseTraverse") run
124
135
125 getIdentName :: QualifiedName Ident -> String
136 getIdentName :: QualifiedName Ident -> String
126 getIdentName (QualifiedName { name: Ident name }) = name
137 getIdentName (QualifiedName { name: Ident name }) = name
138+
lib/purelint/src/Purelint/Rules/UseTraverseSequence.purs+8
@@ -42,6 +42,13 @@ useTraverseSequenceRule = mkRule (RuleId "UseTraverseSequence") run
42 , suggestion: Just $ Suggestion
42 , suggestion: Just $ Suggestion
43 { replacement: ReplacementText ("traverse " <> fText <> " " <> xText)
43 { replacement: ReplacementText ("traverse " <> fText <> " " <> xText)
44 , description: SuggestionDescription "Use traverse instead of sequence (map ...)"
44 , 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+ ]
45 }
52 }
46 }
53 }
47 ]
54 ]
@@ -64,3 +71,4 @@ useTraverseSequenceRule = mkRule (RuleId "UseTraverseSequence") run
64 _ -> Nothing
71 _ -> Nothing
65 getMapArgs imports (ExprParens (Wrapped { value })) = getMapArgs imports value
72 getMapArgs imports (ExprParens (Wrapped { value })) = getMapArgs imports value
66 getMapArgs _ _ = Nothing
73 getMapArgs _ _ = Nothing
74+
lib/purelint/src/Purelint/Rules/UseUncurry.purs+2
@@ -47,6 +47,7 @@ useUncurryRule = mkRule (RuleId "UseUncurry") run
47 , suggestion: Just $ Suggestion
47 , suggestion: Just $ Suggestion
48 { replacement: ReplacementText ("uncurry " <> f <> " " <> p1Text)
48 { replacement: ReplacementText ("uncurry " <> f <> " " <> p1Text)
49 , description: SuggestionDescription "Use uncurry instead of fst/snd"
49 , description: SuggestionDescription "Use uncurry instead of fst/snd"
50+ , requiredImports: []
50 }
51 }
51 }
52 }
52 ]
53 ]
@@ -88,3 +89,4 @@ useUncurryRule = mkRule (RuleId "UseUncurry") run
88 [AppTerm arg] -> Just arg
89 [AppTerm arg] -> Just arg
89 _ -> Nothing
90 _ -> Nothing
90 _ -> Nothing
91 _ -> Nothing
92+
lib/purelint/src/Purelint/Rules/UseUnless.purs+2
@@ -38,6 +38,7 @@ useUnlessRule = mkRule (RuleId "UseUnless") run
38 , suggestion: Just $ Suggestion
38 , suggestion: Just $ Suggestion
39 { replacement: ReplacementText ("unless " <> condText <> " " <> actionText)
39 { replacement: ReplacementText ("unless " <> condText <> " " <> actionText)
40 , description: SuggestionDescription "Use unless instead of if/else with pure unit"
40 , description: SuggestionDescription "Use unless instead of if/else with pure unit"
41+ , requiredImports: []
41 }
42 }
42 }
43 }
43 ]
44 ]
@@ -53,3 +54,4 @@ useUnlessRule = mkRule (RuleId "UseUnless") run
53 isPure imports (ExprIdent (QualifiedName { name: Ident name })) =
54 isPure imports (ExprIdent (QualifiedName { name: Ident name })) =
54 (name == "pure" && hasValue imports "pure") || (name == "return" && hasValue imports "return")
55 (name == "pure" && hasValue imports "pure") || (name == "return" && hasValue imports "return")
55 isPure _ _ = false
56 isPure _ _ = false
57+
lib/purelint/src/Purelint/Rules/UseUnwrap.purs+3
@@ -40,6 +40,7 @@ useUnwrapRule = mkRule (RuleId "UseUnwrap") run
40 , suggestion: Just $ Suggestion
40 , suggestion: Just $ Suggestion
41 { replacement: ReplacementText replacement
41 { replacement: ReplacementText replacement
42 , description: SuggestionDescription "Use un with typed hole to find the right accessor"
42 , description: SuggestionDescription "Use un with typed hole to find the right accessor"
43+ , requiredImports: []
43 }
44 }
44 }
45 }
45 ]
46 ]
@@ -54,6 +55,7 @@ useUnwrapRule = mkRule (RuleId "UseUnwrap") run
54 , suggestion: Just $ Suggestion
55 , suggestion: Just $ Suggestion
55 { replacement: ReplacementText "un ?Constructor"
56 { replacement: ReplacementText "un ?Constructor"
56 , description: SuggestionDescription "Use un with typed hole to find the right accessor"
57 , description: SuggestionDescription "Use un with typed hole to find the right accessor"
58+ , requiredImports: []
57 }
59 }
58 }
60 }
59 ]
61 ]
@@ -65,3 +67,4 @@ useUnwrapRule = mkRule (RuleId "UseUnwrap") run
65
67
66 isUnwrapIdent :: QualifiedName Ident -> Boolean
68 isUnwrapIdent :: QualifiedName Ident -> Boolean
67 isUnwrapIdent (QualifiedName { name: Ident name }) = name == "unwrap"
69 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
41 , suggestion: Just $ Suggestion
41 , suggestion: Just $ Suggestion
42 { replacement: ReplacementText ("void " <> aText)
42 { replacement: ReplacementText ("void " <> aText)
43 , description: SuggestionDescription "a *> pure unit can be simplified to void a"
43 , description: SuggestionDescription "a *> pure unit can be simplified to void a"
44+ , requiredImports: []
44 }
45 }
45 }
46 }
46 ]
47 ]
@@ -64,3 +65,4 @@ useVoidRule = mkRule (RuleId "UseVoid") run
64 isUnit :: Expr Void -> Boolean
65 isUnit :: Expr Void -> Boolean
65 isUnit (ExprIdent (QualifiedName { name: Ident name })) = name == "unit"
66 isUnit (ExprIdent (QualifiedName { name: Ident name })) = name == "unit"
66 isUnit _ = false
67 isUnit _ = false
68+
lib/purelint/src/Purelint/Rules/UseWhen.purs+2
@@ -38,6 +38,7 @@ useWhenRule = mkRule (RuleId "UseWhen") run
38 , suggestion: Just $ Suggestion
38 , suggestion: Just $ Suggestion
39 { replacement: ReplacementText ("when " <> condText <> " " <> actionText)
39 { replacement: ReplacementText ("when " <> condText <> " " <> actionText)
40 , description: SuggestionDescription "Use when instead of if/else with pure unit"
40 , description: SuggestionDescription "Use when instead of if/else with pure unit"
41+ , requiredImports: []
41 }
42 }
42 }
43 }
43 ]
44 ]
@@ -53,3 +54,4 @@ useWhenRule = mkRule (RuleId "UseWhen") run
53 isPure imports (ExprIdent (QualifiedName { name: Ident name })) =
54 isPure imports (ExprIdent (QualifiedName { name: Ident name })) =
54 (name == "pure" && hasValue imports "pure") || (name == "return" && hasValue imports "return")
55 (name == "pure" && hasValue imports "pure") || (name == "return" && hasValue imports "return")
55 isPure _ _ = false
56 isPure _ _ = false
57+
lib/purelint/src/Purelint/Rules/UseZip.purs+4
@@ -39,6 +39,7 @@ useZipRule = mkRule (RuleId "UseZip") run
39 , suggestion: Just $ Suggestion
39 , suggestion: Just $ Suggestion
40 { replacement: ReplacementText "zip"
40 { replacement: ReplacementText "zip"
41 , description: SuggestionDescription "Use zip instead of zipWith Tuple"
41 , description: SuggestionDescription "Use zip instead of zipWith Tuple"
42+ , requiredImports: []
42 }
43 }
43 }
44 }
44 ]
45 ]
@@ -55,6 +56,7 @@ useZipRule = mkRule (RuleId "UseZip") run
55 , suggestion: Just $ Suggestion
56 , suggestion: Just $ Suggestion
56 { replacement: ReplacementText ("zip " <> x)
57 { replacement: ReplacementText ("zip " <> x)
57 , description: SuggestionDescription "Use zip instead of zipWith Tuple"
58 , description: SuggestionDescription "Use zip instead of zipWith Tuple"
59+ , requiredImports: []
58 }
60 }
59 }
61 }
60 ]
62 ]
@@ -73,6 +75,7 @@ useZipRule = mkRule (RuleId "UseZip") run
73 , suggestion: Just $ Suggestion
75 , suggestion: Just $ Suggestion
74 { replacement: ReplacementText ("zip " <> x <> " " <> y)
76 { replacement: ReplacementText ("zip " <> x <> " " <> y)
75 , description: SuggestionDescription "Use zip instead of zipWith Tuple"
77 , description: SuggestionDescription "Use zip instead of zipWith Tuple"
78+ , requiredImports: []
76 }
79 }
77 }
80 }
78 ]
81 ]
@@ -93,3 +96,4 @@ useZipRule = mkRule (RuleId "UseZip") run
93 isTupleCtor (ExprConstructor (QualifiedName { name: Proper "Tuple" })) = true
96 isTupleCtor (ExprConstructor (QualifiedName { name: Proper "Tuple" })) = true
94 isTupleCtor (ExprIdent (QualifiedName { name: Ident "Tuple" })) = true
97 isTupleCtor (ExprIdent (QualifiedName { name: Ident "Tuple" })) = true
95 isTupleCtor _ = false
98 isTupleCtor _ = false
99+
lib/purelint/src/Purelint/Rules/WhenNot.purs+3
@@ -44,6 +44,7 @@ whenNotRule = mkRule (RuleId "WhenNot") run
44 , suggestion: Just $ Suggestion
44 , suggestion: Just $ Suggestion
45 { replacement: ReplacementText ("unless " <> xText <> " " <> action)
45 { replacement: ReplacementText ("unless " <> xText <> " " <> action)
46 , description: SuggestionDescription "Use unless instead of when (not ...)"
46 , description: SuggestionDescription "Use unless instead of when (not ...)"
47+ , requiredImports: []
47 }
48 }
48 }
49 }
49 ]
50 ]
@@ -61,6 +62,7 @@ whenNotRule = mkRule (RuleId "WhenNot") run
61 , suggestion: Just $ Suggestion
62 , suggestion: Just $ Suggestion
62 { replacement: ReplacementText ("unless " <> xText)
63 { replacement: ReplacementText ("unless " <> xText)
63 , description: SuggestionDescription "Use unless instead of when (not ...)"
64 , description: SuggestionDescription "Use unless instead of when (not ...)"
65+ , requiredImports: []
64 }
66 }
65 }
67 }
66 ]
68 ]
@@ -91,3 +93,4 @@ whenNotRule = mkRule (RuleId "WhenNot") run
91 [AppTerm arg] -> Just arg
93 [AppTerm arg] -> Just arg
92 _ -> Nothing
94 _ -> Nothing
93 _ -> Nothing
95 _ -> Nothing
96+
lib/purelint/src/Purelint/Types.purs+11
@@ -31,10 +31,19 @@ instance Show Severity where
31 show Warning = "warning"
31 show Warning = "warning"
32 show Error = "error"
32 show Error = "error"
33
33
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+
34-- | A suggested replacement for the original code
42-- | A suggested replacement for the original code
35newtype Suggestion = Suggestion
43newtype Suggestion = Suggestion
36 { replacement :: ReplacementText
44 { replacement :: ReplacementText
37 , description :: SuggestionDescription
45 , description :: SuggestionDescription
46+ , requiredImports :: Array RequiredImport
38 }
47 }
39
48
40derive instance Newtype Suggestion _
49derive instance Newtype Suggestion _
@@ -93,3 +102,5 @@ newtype SourceCode = SourceCode String
93derive instance Newtype SourceCode _
102derive instance Newtype SourceCode _
94derive newtype instance Eq SourceCode
103derive newtype instance Eq SourceCode
95derive newtype instance Show SourceCode
104derive newtype instance Show SourceCode
105+
106+