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