packages feed

moonlight-pale-0.1.0.0: src-ghc-surface/Moonlight/Pale/Ghc/Expr/Parse.hs

{-| Parsing Haskell source into the scoped expression algebra. -}
module Moonlight.Pale.Ghc.Expr.Parse
  ( parseHsExprSource,
    convertHaskellExprSource,
  )
where

import GHC.Hs (GhcPs, HsExpr, LHsExpr)
import GHC.Parser (parseExpression)
import GHC.Parser.Lexer (P)
import GHC.Parser.PostProcess (PV, runPV, unECP)
import GHC.Types.SrcLoc (unLoc)
import Moonlight.Core (Pattern)
import Moonlight.Pale.Ghc.Expr.Convert.Coalgebra (convertHsExpr)
import Moonlight.Pale.Ghc.Expr.Convert.Obstruction (ConvertObstruction (..))
import Moonlight.Pale.Ghc.Expr.Syntax (HsExprF)
import Moonlight.Pale.Ghc.ModuleSurface (GhcParseFailure, parseWithGhcParser)

parseHsExprSource :: String -> Either GhcParseFailure (HsExpr GhcPs)
parseHsExprSource sourceText =
  unLoc <$> parseWithGhcParser "<haskell-expression>" sourceText parseLocatedHsExpr

convertHaskellExprSource :: String -> Either ConvertObstruction (Pattern HsExprF)
convertHaskellExprSource sourceText =
  either (Left . ConvertParseFailure) convertHsExpr (parseHsExprSource sourceText)

parseLocatedHsExpr :: P (LHsExpr GhcPs)
parseLocatedHsExpr = do
  exprValue <- parseExpression
  runPV (unECP exprValue :: PV (LHsExpr GhcPs))