packages feed

ghc-exactprint-1.3.0: src/Language/Haskell/GHC/ExactPrint/Lookup.hs

module Language.Haskell.GHC.ExactPrint.Lookup
  (
    keywordToString
  , AnnKeywordId(..)
  , Comment(..)
  ) where

import GHC (AnnKeywordId(..))
import Language.Haskell.GHC.ExactPrint.Types

-- | Maps `AnnKeywordId` to the corresponding String representation.
-- There is no specific mapping for the following constructors.
-- `AnnOpen`, `AnnClose`, `AnnVal`, `AnnPackageName`, `AnnHeader`, `AnnFunId`,
-- `AnnInfix`
keywordToString :: AnnKeywordId -> String
keywordToString kw =
  let mkErr x = error $ "keywordToString: missing case for:" ++ show x
  in
  case kw of
      -- Specifically handle all cases so that there are pattern match
      -- warnings if new constructors are added.
      AnnAnyclass -> "anyclass"
      AnnOpen -> mkErr kw
      AnnClose-> mkErr kw
      AnnVal  -> mkErr kw
      AnnPackageName -> mkErr kw
      AnnHeader-> mkErr kw
      AnnFunId -> mkErr kw
      AnnInfix -> mkErr kw
      AnnValStr-> mkErr kw
      AnnName  -> mkErr kw
      AnnAs    -> "as"
      AnnAt    -> "@"
      AnnBang  -> "!"
      AnnBackquote-> "`"
      AnnBy    -> "by"
      AnnCase  -> "case"
      AnnClass  -> "class"
      AnnCloseB -> "|)"
      AnnCloseBU-> "⦈"
      AnnCloseC -> "}"
      AnnCloseP -> ")"
      AnnClosePH-> "#)"
      AnnCloseQ -> "|]"
      AnnCloseQU-> "⟧"
      AnnCloseS -> "]"
      AnnColon  -> ":"
      AnnComma  -> ","
      AnnCommaTuple-> ","
      AnnDarrow -> "=>"
      AnnData   -> "data"
      AnnDcolon -> "::"
      AnnDefault-> "default"
      AnnDeriving-> "deriving"
      AnnDo      -> "do"
      AnnDot     -> "."
      AnnDotdot  -> ".."
      AnnElse    -> "else"
      AnnEqual   -> "="
      AnnExport  -> "export"
      AnnFamily  -> "family"
      AnnForall  -> "forall"
      AnnForeign -> "foreign"
      AnnGroup   -> "group"
      AnnHiding  -> "hiding"
      AnnIf      -> "if"
      AnnImport  -> "import"
      AnnIn      -> "in"
      AnnInstance-> "instance"
      AnnLam     -> "\\"
      AnnLarrow  -> "<-"
      AnnLet     -> "let"
      AnnLollyU  -> "⊸"
      AnnMdo     -> "mdo"
      AnnMinus   -> "-"
      AnnModule  -> "module"
      AnnNewtype -> "newtype"
      AnnOf      -> "of"
      AnnOpenB   -> "(|"
      AnnOpenBU  ->  "⦇"
      AnnOpenC   -> "{"
      AnnOpenE   -> "[e|"
      AnnOpenEQ  -> "[|"
      AnnOpenEQU ->  "⟦"
      AnnOpenP   -> "("
      AnnOpenPH  -> "(#"
      AnnOpenS   -> "["
      AnnPattern -> "pattern"
      AnnPercent  -> "%"
      AnnPercentOne -> "%1"
      AnnProc    -> "proc"
      AnnQualified-> "qualified"
      AnnRarrow  -> "->"
      AnnRec     -> "rec"
      AnnRole    -> "role"
      AnnSafe    -> "safe"
      AnnSemi    -> ";"
      AnnSignature -> "signature"
      AnnStock   -> "stock"
      AnnStatic  -> "static"
      AnnThen    -> "then"
      AnnTilde   -> "~"
      AnnType    -> "type"
      AnnUnit    -> "()"
      AnnUsing   -> "using"
      AnnVbar    -> "|"
      AnnWhere   -> "where"
      Annlarrowtail-> "-<"
      Annrarrowtail-> ">-"
      AnnLarrowtail-> "-<<"
      AnnRarrowtail-> ">>-"
      AnnSimpleQuote -> "'"
      AnnThTyQuote   -> "''"
      AnnDollar      -> "$"
      AnnDollarDollar-> "$$"
      AnnDarrowU     -> "⇒"
      AnnDcolonU     -> "∷"
      AnnForallU     -> "∀"
      AnnLarrowU     -> "←"
      AnnLarrowtailU -> "⤛"
      AnnRarrowU     -> "→"
      AnnRarrowtailU -> "⤜"
      AnnlarrowtailU -> "⤙"
      AnnrarrowtailU -> "⤚"
      -- AnnTypeApp             -> "@"
      AnnVia -> "via"