module Data.Array.Repa.Plugin.ToDDC.Convert.Base
        (Fail (..))
where
import DDC.Base.Pretty
import qualified DDC.Core.Flow          as D

import qualified Literal                as G
import qualified Var                    as G
import qualified OccName                as Occ
import qualified Name                   as Name

-- | A reason why we didn't convert a GHC Core thing to Disciple Core.
data Fail
        -- Atomic Failures ------------
        -- | Top level binding was not marked for conversion.
        = FailNotMarked

        -- | Cannot convert numeric type literals.
        | FailNoNumericTypeLiterals

        -- | Cannot convert recursive binding groups.
        | FailNoRecursion [G.Var]

        -- | Cannot convert type casts.
        | FailNoCasts

        -- | Cannot convert coercions.
        | FailNoCoercions

        -- | Unhandled literal value
        | FailUnhandledLiteral G.Literal

        -- | Case expressions not handled yet.
        | FailUnhandledCase

        -- | Name read from GHC Core is empty.
        | FailEmptyName

        -- | Dodgy top-level binding name.
        | FailDodgyTopLevelBindingName D.Name

        -- Fail combinators -----------
        -- | Failure in a top-level binding.
        | FailInBinding G.Var Fail


instance Pretty Fail where
 ppr FailNotMarked
  = text "Top level binding not marked for conversion."

 ppr FailNoNumericTypeLiterals
  = text "Cannot convert numeric type literals."

 ppr (FailNoRecursion _)
  = text "Cannot convert recursive binding groups."

 ppr FailNoCasts
  = text "Cannnot convert type casts."

 ppr FailNoCoercions
  = text "Cannot convert coercions."

 ppr (FailUnhandledLiteral _)
  = text "Unhandled literal value."

 ppr (FailUnhandledCase)
  = text "Unhandled case expresson."

 ppr FailEmptyName
  = text "Empty name in GHC Core program."

 ppr (FailDodgyTopLevelBindingName _)
  = text "Dodgy top level binding name."

 ppr (FailInBinding v fails)
  = vcat [ text "In binding "
                <> text "'" 
                <> (text $ Occ.occNameString $ Name.occName $ G.varName v)
                <> text "'"
         , ppr fails]