packages feed

evoke-0.2021.8.25: src/lib/Evoke/Type/Field.hs

module Evoke.Type.Field
  ( Field(..)
  , make
  , isOptional
  ) where

import qualified Evoke.Hsc as Hsc
import qualified GHC.Hs as Ghc
import qualified GhcPlugins as Ghc

data Field = Field
  { name :: Ghc.OccName
  , type_ :: Ghc.HsType Ghc.GhcPs
  }

make
  :: Ghc.SrcSpan
  -> Ghc.LHsType Ghc.GhcPs
  -> Ghc.LFieldOcc Ghc.GhcPs
  -> Ghc.Hsc Field
make srcSpan lHsType lFieldOcc = do
  lRdrName <- case Ghc.unLoc lFieldOcc of
    Ghc.FieldOcc _ x -> pure x
    _ -> Hsc.throwError srcSpan $ Ghc.text "unsupported LFieldOcc"
  occName <- case Ghc.unLoc lRdrName of
    Ghc.Unqual x -> pure x
    _ -> Hsc.throwError srcSpan $ Ghc.text "unsupported RdrName"
  pure Field { name = occName, type_ = Ghc.unLoc lHsType }

isOptional :: Field -> Bool
isOptional field = case type_ field of
  Ghc.HsAppTy _ lHsType _ -> case Ghc.unLoc lHsType of
    Ghc.HsTyVar _ _ lIdP -> case Ghc.unLoc lIdP of
      Ghc.Unqual occName -> Ghc.occNameString occName == "Maybe"
      _ -> False
    _ -> False
  _ -> False