module Hint.Comment(commentHint) where
import Hint.Type
import Data.Char
import Data.List.Extra
import Refact.Types(Refactoring(ModifyComment))
pragmas :: [String]
pragmas = String -> [String]
words (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$
"LANGUAGE OPTIONS_GHC INCLUDE WARNING DEPRECATED MINIMAL INLINE NOINLINE INLINABLE " String -> String -> String
forall a. [a] -> [a] -> [a]
++
"CONLIKE LINE SPECIALIZE SPECIALISE UNPACK NOUNPACK SOURCE"
commentHint :: Comment -> [Idea]
c :: Comment
c@(Comment True span :: SrcSpan
span s :: String
s)
| "#" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
s Bool -> Bool -> Bool
&& Bool -> Bool
not ("#" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` String
s) = [String -> Comment -> String -> Idea
grab "Fix pragma markup" Comment
c (String -> Idea) -> String -> Idea
forall a b. (a -> b) -> a -> b
$ '#'Char -> String -> String
forall a. a -> [a] -> [a]
:String
s]
| String
name String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
pragmas = [String -> Comment -> String -> Idea
grab "Use pragma syntax" Comment
c (String -> Idea) -> String -> Idea
forall a b. (a -> b) -> a -> b
$ "# " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
trim String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ " #"]
where name :: String
name = (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
takeWhile (\x :: Char
x -> Char -> Bool
isAlphaNum Char
x Bool -> Bool -> Bool
|| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '_') (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile Char -> Bool
isSpace String
s
commentHint _ = []
grab :: String -> Comment -> String -> Idea
grab :: String -> Comment -> String -> Idea
grab msg :: String
msg (Comment typ :: Bool
typ pos :: SrcSpan
pos s1 :: String
s1) s2 :: String
s2 = Severity
-> String
-> SrcSpan
-> String
-> Maybe String
-> [Note]
-> [Refactoring SrcSpan]
-> Idea
rawIdea Severity
Suggestion String
msg SrcSpan
pos (String -> String
f String
s1) (String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String -> String
f String
s2) [] [Refactoring SrcSpan]
refact
where f :: String -> String
f s :: String
s = if Bool
typ then "{-" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ "-}" else "--" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s
refact :: [Refactoring SrcSpan]
refact = [SrcSpan -> String -> Refactoring SrcSpan
forall a. a -> String -> Refactoring a
ModifyComment (SrcSpan -> SrcSpan
toRefactSrcSpan SrcSpan
pos) (String -> String
f String
s2)]