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