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