-----------------------------------------------------------------------------
-- |
-- Module      : Language.Python.Common.PrettyToken 
-- Copyright   : (c) 2009 Bernie Pope 
-- License     : BSD-style
-- Maintainer  : bjpop@csse.unimelb.edu.au
-- Stability   : experimental
-- Portability : ghc
--
-- Pretty printing of tokens. Note the output is intended for displaying in
-- messages to the user, and may not be valid Python syntax. For instance
-- the pretty printing is useful for displaying parser error messages, but
-- not useful for producing concrete Python source.
-----------------------------------------------------------------------------

module Language.Python.Common.PrettyToken where

import Language.Python.Common.Token
import Language.Python.Common.Pretty

instance Pretty Token where
   pretty :: Token -> Doc
pretty Token
tok = 
      case Token
tok of
        IndentToken {} -> String -> Doc
text String
"indentation"
        DedentToken {} -> String -> Doc
text String
"dedentation"
        NewlineToken {} -> String -> Doc
text String
"end of line" 
        LineJoinToken {} -> String -> Doc
text String
"line join"
        CommentToken { token_literal :: Token -> String
token_literal = String
str } -> 
           String -> Doc
text String
"comment:" Doc -> Doc -> Doc
<+> Int -> String -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrefix Int
10 String
str
        IdentifierToken { token_literal :: Token -> String
token_literal = String
str } ->
           String -> Doc
text String
"identifier:" Doc -> Doc -> Doc
<+> String -> Doc
text String
str 
        StringToken { token_literal :: Token -> String
token_literal = String
str } -> 
           String -> Doc
text String
"string:" Doc -> Doc -> Doc
<+> Int -> String -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrefix Int
10 String
str
        ByteStringToken { token_literal :: Token -> String
token_literal = String
str } ->
           String -> Doc
text String
"byte string:" Doc -> Doc -> Doc
<+> Int -> String -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrefix Int
10 String
str
        UnicodeStringToken { token_literal :: Token -> String
token_literal = String
str } ->
           String -> Doc
text String
"unicode string:" Doc -> Doc -> Doc
<+> Int -> String -> Doc
forall a. Pretty a => Int -> a -> Doc
prettyPrefix Int
10 String
str
        IntegerToken { token_literal :: Token -> String
token_literal = String
str } ->
           String -> Doc
text String
"integer:" Doc -> Doc -> Doc
<+> String -> Doc
text String
str 
        LongIntegerToken { token_literal :: Token -> String
token_literal = String
str } ->
           String -> Doc
text String
"long integer:" Doc -> Doc -> Doc
<+> String -> Doc
text String
str 
        FloatToken { token_literal :: Token -> String
token_literal = String
str } ->
           String -> Doc
text String
"floating point number:" Doc -> Doc -> Doc
<+> String -> Doc
text String
str 
        ImaginaryToken { token_literal :: Token -> String
token_literal = String
str } ->
           String -> Doc
text String
"imaginary number:" Doc -> Doc -> Doc
<+> String -> Doc
text String
str 
        DefToken {} -> String -> Doc
text String
"def" 
        WhileToken {} -> String -> Doc
text String
"while"
        IfToken {} -> String -> Doc
text String
"if"
        TrueToken {} -> String -> Doc
text String
"True"
        FalseToken {} -> String -> Doc
text String
"False"
        ReturnToken {} -> String -> Doc
text String
"return"
        TryToken {} -> String -> Doc
text String
"try"
        ExceptToken {} -> String -> Doc
text String
"except"
        RaiseToken {} -> String -> Doc
text String
"raise"
        InToken {} -> String -> Doc
text String
"in" 
        IsToken {} -> String -> Doc
text String
"is" 
        LambdaToken {} -> String -> Doc
text String
"lambda" 
        ClassToken {} -> String -> Doc
text String
"class"                       
        FinallyToken {} -> String -> Doc
text String
"finally"                     
        NoneToken {} -> String -> Doc
text String
"None"
        ForToken {} -> String -> Doc
text String
"for"
        FromToken {} -> String -> Doc
text String
"from"
        GlobalToken {} -> String -> Doc
text String
"global"
        WithToken {} -> String -> Doc
text String
"with"
        AsToken {} -> String -> Doc
text String
"as"
        ElifToken {} -> String -> Doc
text String
"elif"
        YieldToken {} -> String -> Doc
text String
"yield"
        AsyncToken {} -> String -> Doc
text String
"async"
        AwaitToken {} -> String -> Doc
text String
"await"
        AssertToken {} -> String -> Doc
text String
"assert"
        ImportToken {} -> String -> Doc
text String
"import"
        PassToken {} -> String -> Doc
text String
"pass"
        BreakToken {} -> String -> Doc
text String
"break"
        ContinueToken {} -> String -> Doc
text String
"continue"
        DeleteToken {} -> String -> Doc
text String
"delete"
        ElseToken {} -> String -> Doc
text String
"else"
        NotToken {} -> String -> Doc
text String
"not"
        AndToken {} -> String -> Doc
text String
"and"
        OrToken {} -> String -> Doc
text String
"or"
        NonLocalToken {} -> String -> Doc
text String
"nonlocal"
        PrintToken {} -> String -> Doc
text String
"print"
        ExecToken {} -> String -> Doc
text String
"exec"
        AtToken {} -> String -> Doc
text String
"at"
        LeftRoundBracketToken {} -> String -> Doc
text String
"("
        RightRoundBracketToken {} -> String -> Doc
text String
")"
        LeftSquareBracketToken {} -> String -> Doc
text String
"["
        RightSquareBracketToken {} -> String -> Doc
text String
"]"
        LeftBraceToken {} -> String -> Doc
text String
"{"
        RightBraceToken {} -> String -> Doc
text String
"}"
        DotToken {} -> String -> Doc
text String
"." 
        CommaToken {} -> String -> Doc
text String
","
        SemiColonToken {} -> String -> Doc
text String
";"
        ColonToken {} -> String -> Doc
text String
":"
        EllipsisToken {} -> String -> Doc
text String
"..."
        RightArrowToken {} -> String -> Doc
text String
"->"
        AssignToken {} -> String -> Doc
text String
"="
        PlusAssignToken {} -> String -> Doc
text String
"+="
        MinusAssignToken {} -> String -> Doc
text String
"-="
        MultAssignToken {} -> String -> Doc
text String
"*="
        DivAssignToken {} -> String -> Doc
text String
"/="
        ModAssignToken {} -> String -> Doc
text String
"%="
        PowAssignToken {} -> String -> Doc
text String
"**="
        BinAndAssignToken {} -> String -> Doc
text String
"&="
        BinOrAssignToken {} -> String -> Doc
text String
"|="
        BinXorAssignToken {} -> String -> Doc
text String
"^="
        LeftShiftAssignToken {} -> String -> Doc
text String
"<<="
        RightShiftAssignToken {} -> String -> Doc
text String
">>="
        FloorDivAssignToken {} -> String -> Doc
text String
"//="
        MatrixMultAssignToken {} -> String -> Doc
text String
"@="
        BackQuoteToken {} -> String -> Doc
text String
"` (back quote)"
        PlusToken {} -> String -> Doc
text String
"+"
        MinusToken {} -> String -> Doc
text String
"-"
        MultToken {} -> String -> Doc
text String
"*" 
        DivToken {} -> String -> Doc
text String
"/"
        GreaterThanToken {} -> String -> Doc
text String
">"
        LessThanToken {} -> String -> Doc
text String
"<"
        EqualityToken {} -> String -> Doc
text String
"=="
        GreaterThanEqualsToken {} -> String -> Doc
text String
">="
        LessThanEqualsToken {} -> String -> Doc
text String
"<="
        ExponentToken {} -> String -> Doc
text String
"**" 
        BinaryOrToken {} -> String -> Doc
text String
"|"
        XorToken {} -> String -> Doc
text String
"^"
        BinaryAndToken {} -> String -> Doc
text String
"&"
        ShiftLeftToken {} -> String -> Doc
text String
"<<"
        ShiftRightToken {} -> String -> Doc
text String
">>"
        ModuloToken {} -> String -> Doc
text String
"%" 
        FloorDivToken {} -> String -> Doc
text String
"//"
        TildeToken {} -> String -> Doc
text String
"~"
        NotEqualsToken {} -> String -> Doc
text String
"!="
        NotEqualsV2Token {} -> String -> Doc
text String
"<>"
        EOFToken {} -> String -> Doc
text String
"end of input"