    -- |
    -- Module      :  $Header$
    -- Copyright   :  (c) 2013-2015 Galois, Inc.
    -- License     :  BSD3
    -- Maintainer  :  cryptol@galois.com
    -- Stability   :  provisional
    -- Portability :  portable
    --
    -- Utility functions that are also useful for translating programs
    -- from previous Cryptol versions.

    module Cryptol.Parser.Utils
      ( translateExprToNumT
      ) where

    import Cryptol.Parser.AST
    import Cryptol.Prims.Syntax

    translateExprToNumT :: Expr -> Maybe Type
    translateExprToNumT expr =
      case expr of
        ELocated e r -> (`TLocated` r) `fmap` translateExprToNumT e
        EVar (QName Nothing (Name "width")) -> mkFun TCWidth
        EVar x       -> return (TUser x [])
        ECon x       -> cvtCon x
        ELit x       -> cvtLit x
        EApp e1 e2   -> do t1 <- translateExprToNumT e1
                           t2 <- translateExprToNumT e2
                           tApp t1 t2
        _            -> Nothing

      where
      tApp ty t =
        case ty of
          TLocated t1 r -> (`TLocated` r) `fmap` tApp t1 t
          TApp f ts     -> return (TApp f (ts ++ [t]))
          TUser f ts    -> return (TUser f (ts ++ [t]))
          _             -> Nothing

      mkFun f = return (TApp f [])

      cvtLit (ECNum n CharLit)  = return (TChar $ toEnum $ fromInteger n)
      cvtLit (ECNum n _)        = return (TNum n)
      cvtLit (ECString _)       = Nothing

      cvtCon c =
        case c of
          ECPlus        -> mkFun TCAdd
          ECMinus       -> mkFun TCSub
          ECMul         -> mkFun TCMul
          ECDiv         -> mkFun TCDiv
          ECMod         -> mkFun TCMod
          ECExp         -> mkFun TCExp
          ECLg2         -> mkFun TCLg2
          ECMin         -> mkFun TCMin
          ECMax         -> mkFun TCMax
          _             -> Nothing