packages feed

language-ocaml-0.1.31: lib/Language/OCaml/Parser/TypeKind.hs

module Language.OCaml.Parser.TypeKind
  ( typeKindP
  ) where

import Text.Megaparsec

import Language.OCaml.Definitions.Parsing.ParseTree
import Language.OCaml.Parser.ConstructorDeclarations
import Language.OCaml.Parser.CoreType
import Language.OCaml.Parser.LabelDeclarations
import Language.OCaml.Parser.PrivateFlag
import Language.OCaml.Parser.Tokens
import Language.OCaml.Parser.Utils.Types

typeKindP :: Parser Structure -> Parser (TypeKind, PrivateFlag, Maybe CoreType)
typeKindP structureP = choice
  [ do
    t <- try $ do
      equalT
      coreTypeP
    return (PtypeAbstract, Public, Just t)
  , do
    cs <- try $ do
      equalT
      constructorDeclarationsP'
    return (PtypeVariant (reverse cs), Private, Nothing)
  , do
    priv <- try $ do
      equalT
      priv <- privateFlagP
      lBraceT
      return priv
    labels <- labelDeclarationsP
    rBraceT
    return (PtypeRecord labels, priv, Nothing)
  -- FIXME: commenting this out as it helps with debugging, but this is a valid parse of type kind
  -- , return (PtypeAbstract, Public, Nothing)
  ]
  where
    constructorDeclarationsP' = constructorDeclarationsP structureP coreTypeP