packages feed

hindent-6.3.0: src/HIndent/Ast/Expression/RangeExpression.hs

{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE RecordWildCards #-}

module HIndent.Ast.Expression.RangeExpression
  ( RangeExpression(..)
  , mkRangeExpression
  ) where

import {-# SOURCE #-} HIndent.Ast.Expression (Expression, mkExpression)
import HIndent.Ast.WithComments (WithComments, fromGenLocated)
import qualified HIndent.GhcLibParserWrapper.GHC.Hs as GHC
import {-# SOURCE #-} HIndent.Pretty
import HIndent.Pretty.Combinators
import HIndent.Pretty.NodeComments

data RangeExpression
  = From (WithComments Expression)
  | FromThen
      { from :: WithComments Expression
      , next :: WithComments Expression
      }
  | FromTo
      { from :: WithComments Expression
      , to :: WithComments Expression
      }
  | FromThenTo
      { from :: WithComments Expression
      , next :: WithComments Expression
      , to :: WithComments Expression
      }

instance CommentExtraction RangeExpression where
  nodeComments From {} = emptyNodeComments
  nodeComments FromThen {} = emptyNodeComments
  nodeComments FromTo {} = emptyNodeComments
  nodeComments FromThenTo {} = emptyNodeComments

instance Pretty RangeExpression where
  pretty' (From f) = brackets $ spaced [pretty f, string ".."]
  pretty' FromThen {..} =
    brackets $ spaced [pretty from >> comma >> pretty next, string ".."]
  pretty' FromTo {..} = brackets $ spaced [pretty from, string "..", pretty to]
  pretty' FromThenTo {..} =
    brackets
      $ spaced [pretty from >> comma >> pretty next, string "..", pretty to]

mkRangeExpression :: GHC.ArithSeqInfo GHC.GhcPs -> RangeExpression
mkRangeExpression (GHC.From f) = From $ mkExpression <$> fromGenLocated f
mkRangeExpression (GHC.FromThen f n) =
  FromThen
    { from = mkExpression <$> fromGenLocated f
    , next = mkExpression <$> fromGenLocated n
    }
mkRangeExpression (GHC.FromTo f t) =
  FromTo
    { from = mkExpression <$> fromGenLocated f
    , to = mkExpression <$> fromGenLocated t
    }
mkRangeExpression (GHC.FromThenTo f n t) =
  FromThenTo
    { from = mkExpression <$> fromGenLocated f
    , next = mkExpression <$> fromGenLocated n
    , to = mkExpression <$> fromGenLocated t
    }