packages feed

hs-bindgen-1.0.0.0: src-internal/HsBindgen/Macro/Raw/Parse.hs

module HsBindgen.Macro.Raw.Parse (
    Raw -- opaque
  , VoidMacro
  , absurdVoidMacro
  , ParsedMacro(..)
  , coerceMacro
  , parseRaw
  ) where

import Data.Text (Text)

import Clang.HighLevel.Types

import HsBindgen.Runtime.Macro qualified as Runtime.Macro

import HsBindgen.Macro.Error
import HsBindgen.Macro.Interface qualified as Macro
import HsBindgen.Macro.Parse
import HsBindgen.Macro.Type qualified as Macro

data Raw

data VoidMacro a
  deriving stock (Functor, Foldable, Traversable, Show, Eq)

absurdVoidMacro :: VoidMacro a -> b
absurdVoidMacro m = case m of {}

-- | A macro definition, untyped
--
-- 'Macro.Parsed' is indexed by the /annotation/. For 'Runtime.Macro.Raw', the
-- annotation is a phantom: there is nothing in a raw macro to resolve.
newtype ParsedMacro ann = ParsedMacro {
      unwrap :: Runtime.Macro.Raw Text
    }
  deriving stock (Functor, Foldable, Traversable, Show, Eq)

coerceMacro :: ParsedMacro a -> ParsedMacro b
coerceMacro = ParsedMacro . (.unwrap)

instance Macro.HasTypes Raw where
  type Parsed           Raw = ParsedMacro
  type TypecheckedType  Raw = VoidMacro
  type TypecheckedValue Raw = ParsedMacro

parseRaw ::
     Runtime.Macro.Raw (Token SourcePath TokenSpelling)
  -> Either MacroParseError (Macro.Unresolved Raw)
parseRaw = Right . Macro.Unresolved . ParsedMacro . fmap spelling