@@ -5,14 +5,16 @@ import Prelude
55import Data.Array.NonEmpty as NEA
66import Data.Foldable (foldMap)
77import Data.Maybe (Maybe(..))
8+import Data.Monoid (power)
89import Data.String (joinWith) as String
10+import Data.String as Str
911import Purelint.Rule (Rule, RuleContext, mkRule)
1012import Purelint.Types (LintWarning(..), RuleId(..), Severity(..), Suggestion(..), SuggestionDescription(..), ReplacementText(..), WarningMessage(..))
1113import PureScript.CST.Print (printToken)
1214import PureScript.CST.Range (rangeOf, tokensOf)
1315import PureScript.CST.Range.TokenList as TokenList
1416import PureScript.CST.Traversal (defaultMonoidalVisitor, foldMapModule)
15โimport PureScript.CST.Types (Expr(..), LetBinding, Module)
17+import PureScript.CST.Types (Comment(..), Expr(..), LetBinding, Module, SourceToken)
1618
1719-- | Rule: let x = y in z -> z where x = y
1820-- | Suggests replacing let...in expressions with where clauses
@@ -28,8 +30,8 @@ letToWhereRule = mkRule (RuleId "LetToWhere") run
2830 checkExpr expr = case expr of
2931 ExprLet letIn ->
3032 let
31โ bodyText = printExpr letIn.body
32โ bindings = NEA.toArray letIn.bindings # map printBinding
33+ bodyText = printTokens letIn.body
34+ bindings = NEA.toArray letIn.bindings # map printBindingTokens
3335 bindingsText = String.joinWith "\n " bindings
3436 replacement = bodyText <> "\n where\n " <> bindingsText
3537 in
@@ -46,8 +48,25 @@ letToWhereRule = mkRule (RuleId "LetToWhere") run
4648 ]
4749 _ -> []
4850
49โ printExpr :: Expr Void -> String
50โ printExpr e = foldMap (\tok -> printToken tok.value) (TokenList.toArray (tokensOf e))
51+ -- | Print tokens preserving spaces but collapsing newlines to single space
52+ printTokens :: Expr Void -> String
53+ printTokens e =
54+ Str.trim $ foldMap printSourceTokenWithSpaces (TokenList.toArray (tokensOf e))
5155
52โ printBinding :: LetBinding Void -> String
53โ printBinding b = foldMap (\tok -> printToken tok.value) (TokenList.toArray (tokensOf b))
56+ printBindingTokens :: LetBinding Void -> String
57+ printBindingTokens b =
58+ Str.trim $ foldMap printSourceTokenWithSpaces (TokenList.toArray (tokensOf b))
59+
60+ -- | Print a source token, keeping spaces but converting newlines to spaces
61+ printSourceTokenWithSpaces :: SourceToken -> String
62+ printSourceTokenWithSpaces tok =
63+ foldMap printCommentSpacesOnly tok.leadingComments
64+ <> printToken tok.value
65+ <> foldMap printCommentSpacesOnly tok.trailingComments
66+
67+ -- | Print comment, keeping spaces but skipping newlines
68+ printCommentSpacesOnly :: forall l. Comment l -> String
69+ printCommentSpacesOnly = case _ of
70+ Comment str -> str
71+ Space n -> power " " n
72+ Line _ _ -> " "