packages feed

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

{-# LANGUAGE DisambiguateRecordFields #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}

module Language.OCaml.Parser.TypeDeclaration
  ( typeDeclarationP
  ) where

import           Data.Default
import           Text.Megaparsec

import           Language.OCaml.Definitions.Parsing.ASTHelper.Type as Type
import qualified Language.OCaml.Definitions.Parsing.ASTTypes       as ASTTypes
import           Language.OCaml.Definitions.Parsing.ParseTree
import           Language.OCaml.Parser.Common
import           Language.OCaml.Parser.NonRecFlag
import           Language.OCaml.Parser.OptionalTypeParameters
import           Language.OCaml.Parser.PostItemAttributes
import           Language.OCaml.Parser.Tokens
import           Language.OCaml.Parser.TypeKind
import           Language.OCaml.Parser.Utils.Types

typeDeclarationP :: Parser Structure -> Parser (ASTTypes.RecFlag, TypeDeclaration)
typeDeclarationP structureP = do
  try $ typeT
  -- TODO: extAttributes
  nonrecFlag <- nonrecFlagP
  params <- optionalTypeParametersP
  n <- lIdentT
  (kind, priv, manifest) <- typeKindP structureP
  -- TODO: constraints
  attrs <- postItemAttributesP structureP
  let ty = Type.mk (def { attrs, kind, params, priv }) manifest (mkRHS n 5)
  return (nonrecFlag, ty)