module Language.Haskell.Lexer.Layout (layoutPre,PosToken) where
import Language.Haskell.Lexer.Tokens
import Language.Haskell.Lexer.Position
type PosToken = (Token,(Pos,String))
layoutPre :: [PosToken] -> [PosToken]
layoutPre :: [PosToken] -> [PosToken]
layoutPre = [PosToken] -> [PosToken]
indent ([PosToken] -> [PosToken])
-> ([PosToken] -> [PosToken]) -> [PosToken] -> [PosToken]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [PosToken] -> [PosToken]
open
open :: [PosToken] -> [PosToken]
open :: [PosToken] -> [PosToken]
open = [PosToken] -> [PosToken]
open1
open1 :: [PosToken] -> [PosToken]
open1 :: [PosToken] -> [PosToken]
open1 (t1 :: PosToken
t1@(Reservedid,(_,"module")):ts :: [PosToken]
ts) = PosToken
t1PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:[PosToken] -> [PosToken]
open2 [PosToken]
ts
open1 (t1 :: PosToken
t1@(Special,(_,"{")):ts :: [PosToken]
ts) = PosToken
t1PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:[PosToken] -> [PosToken]
open2 [PosToken]
ts
open1 ts :: [PosToken]
ts@((_,(p :: Pos
p,_)):_) = (Int -> Token
Open (Pos -> Int
column Pos
p),(Pos
p,""))PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:[PosToken] -> [PosToken]
open2 [PosToken]
ts
open1 [] = []
open2 :: [PosToken] -> [PosToken]
open2 :: [PosToken] -> [PosToken]
open2 (t1 :: PosToken
t1:ts1 :: [PosToken]
ts1) | PosToken -> Bool
forall a. (Token, (a, [Char])) -> Bool
isLtoken PosToken
t1 =
case [PosToken]
ts1 of
t2 :: PosToken
t2@(_,(p :: Pos
p,_)):ts2 :: [PosToken]
ts2 ->
if PosToken -> Bool
forall a. (Token, (a, [Char])) -> Bool
notLBrace PosToken
t2
then PosToken
t1PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:(Int -> Token
Open (Pos -> Int
column Pos
p),(Pos
p,""))PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:[PosToken] -> [PosToken]
open2 [PosToken]
ts1
else PosToken
t1PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:PosToken
t2PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:[PosToken] -> [PosToken]
open2 [PosToken]
ts2
[] -> PosToken
t1PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:(Int -> Token
Open 0,((Pos, [Char]) -> Pos
forall a b. (a, b) -> a
fst (PosToken -> (Pos, [Char])
forall a b. (a, b) -> b
snd PosToken
t1),""))PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:[]
where
isLtoken :: (Token, (a, [Char])) -> Bool
isLtoken (Reservedid,(_,s :: [Char]
s)) = [Char]
s [Char] -> [[Char]] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ["let","where","do","of"]
isLtoken _ = Bool
False
notLBrace :: (Token, (a, [Char])) -> Bool
notLBrace (Special,(_,"{")) = Bool
False
notLBrace _ = Bool
True
open2 (t :: PosToken
t:ts :: [PosToken]
ts) = PosToken
tPosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:[PosToken] -> [PosToken]
open2 [PosToken]
ts
open2 [] = []
indent :: [PosToken] -> [PosToken]
indent :: [PosToken] -> [PosToken]
indent (t1 :: PosToken
t1@(Open _,(p :: Pos
p,_)):ts :: [PosToken]
ts) = PosToken
t1PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:Int -> [PosToken] -> [PosToken]
indent2 (Pos -> Int
line Pos
p) [PosToken]
ts
indent (t1 :: PosToken
t1@(_,(p :: Pos
p,_)):ts :: [PosToken]
ts) = (Int -> Token
Indent (Pos -> Int
column Pos
p),(Pos
p,""))PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:PosToken
t1PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:Int -> [PosToken] -> [PosToken]
indent2 (Pos -> Int
line Pos
p) [PosToken]
ts
indent [] = []
indent2 :: Int -> [PosToken] -> [PosToken]
indent2 :: Int -> [PosToken] -> [PosToken]
indent2 r :: Int
r (t1 :: PosToken
t1@(_,(p :: Pos
p,_)):ts :: [PosToken]
ts) | Pos -> Int
line Pos
pInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
r = PosToken
t1PosToken -> [PosToken] -> [PosToken]
forall a. a -> [a] -> [a]
:Int -> [PosToken] -> [PosToken]
indent2 Int
r [PosToken]
ts
indent2 _ ts :: [PosToken]
ts = [PosToken] -> [PosToken]
indent [PosToken]
ts