ghc-9.13: The GHC API
Safe HaskellNone
LanguageGHC2021

GHC.Parser.PostProcess

Synopsis

Documentation

mkHsOpApp :: LHsExpr GhcPs -> IdP GhcPs -> LHsExpr GhcPs -> HsExpr GhcPs Source #

A useful function for building OpApps. The operator is always a variable, and we don't know the fixity yet.

mkTyClD :: forall (p :: Pass). LTyClDecl (GhcPass p) -> LHsDecl (GhcPass p) Source #

mkClassDecl builds a RdrClassDecl, filling in the names for tycon and datacon by deriving them from the name of the class. We fill in the names for the tycon and datacon corresponding to the class, by deriving them from the name of the class itself. This saves recording the names in the interface file (which would be equally good).

mkInstD :: forall (p :: Pass). LInstDecl (GhcPass p) -> LHsDecl (GhcPass p) Source #

setRdrNameSpace :: RdrName -> NameSpace -> RdrName Source #

This rather gruesome function is used mainly by the parser.

Case #1. When parsing:

data T a = T | T1 Int

we parse the data constructors as types because of parser ambiguities, so then we need to change the type constr to a data constr

The exact-name case can occur when parsing:

data [] a = [] | a : [a]

For the exact-name case we return an original name.

Case #2. When parsing:

x = fn (forall a. a)   -- RequiredTypeArguments

we use setRdrNameSpace to set the namespace of forall-bound variables.

fromSpecTyVarBndr :: LHsTyVarBndr Specificity GhcPs -> P (LHsTyVarBndr () GhcPs) Source #

Converts LHsTyVarBndr annotated with its Specificity to one without annotations. Only accepts specified variables, and errors if the provided binder has an InferredSpec annotation.

fromSpecTyVarBndrs :: [LHsTyVarBndr Specificity GhcPs] -> P [LHsTyVarBndr () GhcPs] Source #

Converts a list of LHsTyVarBndrs annotated with their Specificity to binders without annotations. Only accepts specified variables, and errors if any of the provided binders has an InferredSpec annotation.

annBinds :: EpToken "where" -> EpAnnComments -> HsLocalBinds GhcPs -> (HsLocalBinds GhcPs, Maybe EpAnnComments) Source #

Add the annotation for a 'where' keyword to existing HsLocalBinds

stmtsAnchor :: forall (tok :: Symbol) a. Located (OrdList (EpToken tok), a) -> Maybe EpaLocation Source #

The anchor for a stmtlist is based on either the location or the first semicolon annotion.

stmtsLoc :: forall (tok :: Symbol) a. Located (OrdList (EpToken tok), a) -> SrcSpan Source #

cvTopDecls :: OrdList (LHsDecl GhcPs) -> [LHsDecl GhcPs] Source #

Function definitions are restructured here. Each is assumed to be recursive initially, and non recursive definitions are discovered by the dependency analyser.

mkGadtDecl :: SrcSpan -> NonEmpty (LocatedN RdrName) -> TokDcolon -> LHsSigType GhcPs -> P (LConDecl GhcPs) Source #

Construct a GADT-style data constructor from the constructor names and their type. Some interesting aspects of this function:

  • This splits up the constructor type into its quantified type variables (if provided), context (if provided), argument types, and result type, and records whether this is a prefix or record GADT constructor. See Note [GADT abstract syntax] in GHC.Hs.Decls for more details.

checkImportDecl :: Maybe (EpToken "qualified") -> Maybe (EpToken "qualified") -> P () Source #

checkExpBlockArguments :: LHsExpr GhcPs -> PV () Source #

Yield a parse error if we have a function applied directly to a do block etc. and BlockArguments is not enabled.

checkPrecP Source #

Arguments

:: Located (SourceText, Int)

precedence

-> Located (OrdList (LocatedN RdrName))

operators

-> P () 

Check if a fixity is valid. We support bypassing the usual bound checks for some special operators.

checkContext :: LHsType GhcPs -> P (LHsContext GhcPs) Source #

Validate the context constraints and break up a context into a list of predicates.

    (Eq a, Ord b)        -->  [Eq a, Ord b]
    Eq a                 -->  [Eq a]
    (Eq a)               -->  [Eq a]
    (((Eq a)))           -->  [Eq a]

data ParseContext Source #

Extra information for the expression GHC is currently inspecting/parsing. It can be used to generate more informative parser diagnostics and hints.

Constructors

ParseContext 

Fields

Instances

Instances details
Eq ParseContext Source # 
Instance details

Defined in GHC.Parser.Errors.Types

checkMonadComp :: PV HsDoFlavour Source #

Check for monad comprehensions

If the flag MonadComprehensions is set, return a MonadComp context, otherwise use the usual ListComp context

data RuleTyTmVar Source #

Essentially a wrapper for a RuleBndr GhcPs

checkEmptyGADTs :: Located ((EpToken "where", EpToken "{", EpToken "}"), [LConDecl GhcPs]) -> P (Located ((EpToken "where", EpToken "{", EpToken "}"), [LConDecl GhcPs])) Source #

Check if the gadt_constrlist is empty. Only raise parse error for `data T where` to avoid affecting existing error message, see #8258.

addFatalError :: MonadP m => MsgEnvelope PsMessage -> m a Source #

Add a fatal error. This will be the last error reported by the parser, and the parser will not produce any result, ending in a PFailed state.

hintBangPat :: SrcSpan -> Pat GhcPs -> PV () Source #

Hint about bang patterns, assuming BangPatterns is off.

data UnpackednessPragma Source #

Result of parsing {-# UNPACK #-} or {-# NOUNPACK #-}.

data SumOrTuple b Source #

Constructors

Sum ConTag Arity (LocatedA b) [EpToken "|"] [EpToken "|"]

Last two are the locations of the '|' before and after the payload

Tuple [Either (EpAnn Bool) (LocatedA b)] 

data PV a Source #

Instances

Instances details
MonadP PV Source # 
Instance details

Defined in GHC.Parser.PostProcess

Applicative PV Source # 
Instance details

Defined in GHC.Parser.PostProcess

Methods

pure :: a -> PV a #

(<*>) :: PV (a -> b) -> PV a -> PV b #

liftA2 :: (a -> b -> c) -> PV a -> PV b -> PV c #

(*>) :: PV a -> PV b -> PV b #

(<*) :: PV a -> PV b -> PV a #

Functor PV Source # 
Instance details

Defined in GHC.Parser.PostProcess

Methods

fmap :: (a -> b) -> PV a -> PV b #

(<$) :: a -> PV b -> PV a #

Monad PV Source # 
Instance details

Defined in GHC.Parser.PostProcess

Methods

(>>=) :: PV a -> (a -> PV b) -> PV b #

(>>) :: PV a -> PV b -> PV b #

return :: a -> PV a #

runPV :: PV a -> P a Source #

newtype ECP Source #

Constructors

ECP 

Fields

class (b ~ Body b GhcPs, AnnoBody b) => DisambECP b where Source #

Disambiguate constructs that may appear when we do not know ahead of time whether we are parsing an expression, a command, or a pattern. See Note [Ambiguous syntactic categories]

Associated Types

type Body b :: Type -> Type Source #

See Note [Body in DisambECP]

type InfixOp b Source #

Infix operator representation

type FunArg b Source #

Function argument representation

Methods

ecpFromCmd' :: LHsCmd GhcPs -> PV (LocatedA b) Source #

Return a command without ambiguity, or fail in a non-command context.

ecpFromExp' :: LHsExpr GhcPs -> PV (LocatedA b) Source #

Return an expression without ambiguity, or fail in a non-expression context.

ecpFromPat' :: LPat GhcPs -> PV (LocatedA b) Source #

Return a pattern without ambiguity, or fail in a non-pattern context.

mkHsProjUpdatePV :: SrcSpan -> Located [LocatedAn NoEpAnns (DotFieldOcc GhcPs)] -> LocatedA b -> Bool -> Maybe (EpToken "=") -> PV (LHsRecProj GhcPs (LocatedA b)) Source #

mkHsLetPV :: SrcSpan -> EpToken "let" -> HsLocalBinds GhcPs -> EpToken "in" -> LocatedA b -> PV (LocatedA b) Source #

Disambiguate "let ... in ..."

superInfixOp :: (DisambInfixOp (InfixOp b) => PV (LocatedA b)) -> PV (LocatedA b) Source #

Bring superclass constraints on InfixOp into scope. See Note [UndecidableSuperClasses for associated types]

mkHsOpAppPV :: SrcSpan -> LocatedA b -> LocatedN (InfixOp b) -> LocatedA b -> PV (LocatedA b) Source #

Disambiguate "f # x" (infix operator)

mkHsCasePV :: SrcSpan -> LHsExpr GhcPs -> LocatedLW [LMatch GhcPs (LocatedA b)] -> EpAnnHsCase -> PV (LocatedA b) Source #

Disambiguate "case ... of ..."

mkHsLamPV :: SrcSpan -> HsLamVariant -> LocatedLW [LMatch GhcPs (LocatedA b)] -> EpAnnLam -> PV (LocatedA b) Source #

Disambiguate "... -> ..." (lambda), "case" and "cases"

superFunArg :: (DisambECP (FunArg b) => PV (LocatedA b)) -> PV (LocatedA b) Source #

Bring superclass constraints on FunArg into scope. See Note [UndecidableSuperClasses for associated types]

mkHsAppPV :: SrcSpanAnnA -> LocatedA b -> LocatedA (FunArg b) -> PV (LocatedA b) Source #

Disambiguate "f x" (function application)

mkHsAppTypePV :: SrcSpanAnnA -> LocatedA b -> EpToken "@" -> LHsType GhcPs -> PV (LocatedA b) Source #

Disambiguate "f @t" (visible type application)

mkHsIfPV :: SrcSpan -> LHsExpr GhcPs -> Bool -> LocatedA b -> Bool -> LocatedA b -> AnnsIf -> PV (LocatedA b) Source #

Disambiguate "if ... then ... else ..."

mkHsDoPV :: SrcSpan -> Maybe ModuleName -> LocatedLW [LStmt GhcPs (LocatedA b)] -> EpaLocation -> EpaLocation -> PV (LocatedA b) Source #

Disambiguate "do { ... }" (do notation)

mkHsParPV :: SrcSpan -> EpToken "(" -> LocatedA b -> EpToken ")" -> PV (LocatedA b) Source #

Disambiguate "( ... )" (parentheses)

mkHsVarPV :: LocatedN RdrName -> PV (LocatedA b) Source #

Disambiguate a variable "f" or a data constructor MkF.

mkHsLitPV :: Located (HsLit GhcPs) -> PV (LocatedA b) Source #

Disambiguate a monomorphic literal

mkHsOverLitPV :: LocatedAn a (HsOverLit GhcPs) -> PV (LocatedAn a b) Source #

Disambiguate an overloaded literal

mkHsWildCardPV :: NoAnn a => SrcSpan -> PV (LocatedAn a b) Source #

Disambiguate a wildcard

mkHsTySigPV :: SrcSpanAnnA -> LocatedA b -> LHsType GhcPs -> TokDcolon -> PV (LocatedA b) Source #

Disambiguate "a :: t" (type annotation)

mkHsExplicitListPV :: SrcSpan -> [LocatedA b] -> AnnList () -> PV (LocatedA b) Source #

Disambiguate "[a,b,c]" (list syntax)

mkHsSplicePV :: Located (HsUntypedSplice GhcPs) -> PV (LocatedA b) Source #

Disambiguate "$(...)" and "[quasi|...|]" (TH splices)

mkHsRecordPV :: Bool -> SrcSpan -> SrcSpan -> LocatedA b -> ([Fbind b], Maybe SrcSpan) -> (Maybe (EpToken "{"), Maybe (EpToken "}")) -> PV (LocatedA b) Source #

Disambiguate "f { a = b, ... }" syntax (record construction and record updates)

mkHsNegAppPV :: SrcSpan -> LocatedA b -> EpToken "-" -> PV (LocatedA b) Source #

Disambiguate "-a" (negation)

mkHsSectionR_PV :: SrcSpan -> LocatedA (InfixOp b) -> LocatedA b -> PV (LocatedA b) Source #

Disambiguate "(# a)" (right operator section)

mkHsArrowPV :: SrcSpan -> ArrowParsingMode lhs b -> LocatedA lhs -> HsArrowOf (LocatedA b) GhcPs -> LocatedA b -> PV (LocatedA b) Source #

Disambiguate "(a -> b)" (view pattern or function type arrow)

mkHsMultPV :: EpToken "%" -> LocatedA b -> PV (TokRarrow -> HsArrowOf (LocatedA b) GhcPs) Source #

Disambiguate "%m" to the left of "->" (multiplicity)

mkHsForallPV :: SrcSpan -> HsForAllTelescope GhcPs -> LocatedA b -> PV (LocatedA b) Source #

Disambiguate "forall a. b" and "forall a -> b" (forall telescope)

checkContextPV :: LocatedA b -> PV (LocatedC [LocatedA b]) Source #

Disambiguate "(a,b,c)" to the left of "=>" (constraint list)

mkQualPV :: SrcSpan -> LocatedC [LocatedA b] -> LocatedA b -> PV (LocatedA b) Source #

Disambiguate "a => b" (constraint context)

mkHsAsPatPV :: SrcSpan -> LocatedN RdrName -> EpToken "@" -> LocatedA b -> PV (LocatedA b) Source #

Disambiguate "a@b" (as-pattern)

mkHsLazyPatPV :: SrcSpan -> LocatedA b -> EpToken "~" -> PV (LocatedA b) Source #

Disambiguate "~a" (lazy pattern)

mkHsBangPatPV :: SrcSpan -> LocatedA b -> EpToken "!" -> PV (LocatedA b) Source #

Disambiguate "!a" (bang pattern)

mkSumOrTuplePV :: SrcSpanAnnA -> Boxity -> SumOrTuple b -> (EpaLocation, EpaLocation) -> PV (LocatedA b) Source #

Disambiguate tuple sections and unboxed sums

mkHsEmbTyPV :: SrcSpan -> EpToken "type" -> LHsType GhcPs -> PV (LocatedA b) Source #

Disambiguate "type t" (embedded type)

rejectPragmaPV :: LocatedA b -> PV () Source #

Validate infixexp LHS to reject unwanted {-# SCC ... #-} pragmas

Instances

Instances details
DisambECP (PatBuilder GhcPs) Source # 
Instance details

Defined in GHC.Parser.PostProcess

Associated Types

type Body (PatBuilder GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

type InfixOp (PatBuilder GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

type FunArg (PatBuilder GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

Methods

ecpFromCmd' :: LHsCmd GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

ecpFromExp' :: LHsExpr GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

ecpFromPat' :: LPat GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsProjUpdatePV :: SrcSpan -> Located [LocatedAn NoEpAnns (DotFieldOcc GhcPs)] -> LocatedA (PatBuilder GhcPs) -> Bool -> Maybe (EpToken "=") -> PV (LHsRecProj GhcPs (LocatedA (PatBuilder GhcPs))) Source #

mkHsLetPV :: SrcSpan -> EpToken "let" -> HsLocalBinds GhcPs -> EpToken "in" -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

superInfixOp :: (DisambInfixOp (InfixOp (PatBuilder GhcPs)) => PV (LocatedA (PatBuilder GhcPs))) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsOpAppPV :: SrcSpan -> LocatedA (PatBuilder GhcPs) -> LocatedN (InfixOp (PatBuilder GhcPs)) -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsCasePV :: SrcSpan -> LHsExpr GhcPs -> LocatedLW [LMatch GhcPs (LocatedA (PatBuilder GhcPs))] -> EpAnnHsCase -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsLamPV :: SrcSpan -> HsLamVariant -> LocatedLW [LMatch GhcPs (LocatedA (PatBuilder GhcPs))] -> EpAnnLam -> PV (LocatedA (PatBuilder GhcPs)) Source #

superFunArg :: (DisambECP (FunArg (PatBuilder GhcPs)) => PV (LocatedA (PatBuilder GhcPs))) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsAppPV :: SrcSpanAnnA -> LocatedA (PatBuilder GhcPs) -> LocatedA (FunArg (PatBuilder GhcPs)) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsAppTypePV :: SrcSpanAnnA -> LocatedA (PatBuilder GhcPs) -> EpToken "@" -> LHsType GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsIfPV :: SrcSpan -> LHsExpr GhcPs -> Bool -> LocatedA (PatBuilder GhcPs) -> Bool -> LocatedA (PatBuilder GhcPs) -> AnnsIf -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsDoPV :: SrcSpan -> Maybe ModuleName -> LocatedLW [LStmt GhcPs (LocatedA (PatBuilder GhcPs))] -> EpaLocation -> EpaLocation -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsParPV :: SrcSpan -> EpToken "(" -> LocatedA (PatBuilder GhcPs) -> EpToken ")" -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsVarPV :: LocatedN RdrName -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsLitPV :: Located (HsLit GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsOverLitPV :: LocatedAn a (HsOverLit GhcPs) -> PV (LocatedAn a (PatBuilder GhcPs)) Source #

mkHsWildCardPV :: NoAnn a => SrcSpan -> PV (LocatedAn a (PatBuilder GhcPs)) Source #

mkHsTySigPV :: SrcSpanAnnA -> LocatedA (PatBuilder GhcPs) -> LHsType GhcPs -> TokDcolon -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsExplicitListPV :: SrcSpan -> [LocatedA (PatBuilder GhcPs)] -> AnnList () -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsSplicePV :: Located (HsUntypedSplice GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsRecordPV :: Bool -> SrcSpan -> SrcSpan -> LocatedA (PatBuilder GhcPs) -> ([Fbind (PatBuilder GhcPs)], Maybe SrcSpan) -> (Maybe (EpToken "{"), Maybe (EpToken "}")) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsNegAppPV :: SrcSpan -> LocatedA (PatBuilder GhcPs) -> EpToken "-" -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsSectionR_PV :: SrcSpan -> LocatedA (InfixOp (PatBuilder GhcPs)) -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsArrowPV :: SrcSpan -> ArrowParsingMode lhs (PatBuilder GhcPs) -> LocatedA lhs -> HsArrowOf (LocatedA (PatBuilder GhcPs)) GhcPs -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsMultPV :: EpToken "%" -> LocatedA (PatBuilder GhcPs) -> PV (TokRarrow -> HsArrowOf (LocatedA (PatBuilder GhcPs)) GhcPs) Source #

mkHsForallPV :: SrcSpan -> HsForAllTelescope GhcPs -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

checkContextPV :: LocatedA (PatBuilder GhcPs) -> PV (LocatedC [LocatedA (PatBuilder GhcPs)]) Source #

mkQualPV :: SrcSpan -> LocatedC [LocatedA (PatBuilder GhcPs)] -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsAsPatPV :: SrcSpan -> LocatedN RdrName -> EpToken "@" -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsLazyPatPV :: SrcSpan -> LocatedA (PatBuilder GhcPs) -> EpToken "~" -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsBangPatPV :: SrcSpan -> LocatedA (PatBuilder GhcPs) -> EpToken "!" -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkSumOrTuplePV :: SrcSpanAnnA -> Boxity -> SumOrTuple (PatBuilder GhcPs) -> (EpaLocation, EpaLocation) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsEmbTyPV :: SrcSpan -> EpToken "type" -> LHsType GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

rejectPragmaPV :: LocatedA (PatBuilder GhcPs) -> PV () Source #

DisambECP (HsCmd GhcPs) Source # 
Instance details

Defined in GHC.Parser.PostProcess

Associated Types

type Body (HsCmd GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

type InfixOp (HsCmd GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

type FunArg (HsCmd GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

Methods

ecpFromCmd' :: LHsCmd GhcPs -> PV (LocatedA (HsCmd GhcPs)) Source #

ecpFromExp' :: LHsExpr GhcPs -> PV (LocatedA (HsCmd GhcPs)) Source #

ecpFromPat' :: LPat GhcPs -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsProjUpdatePV :: SrcSpan -> Located [LocatedAn NoEpAnns (DotFieldOcc GhcPs)] -> LocatedA (HsCmd GhcPs) -> Bool -> Maybe (EpToken "=") -> PV (LHsRecProj GhcPs (LocatedA (HsCmd GhcPs))) Source #

mkHsLetPV :: SrcSpan -> EpToken "let" -> HsLocalBinds GhcPs -> EpToken "in" -> LocatedA (HsCmd GhcPs) -> PV (LocatedA (HsCmd GhcPs)) Source #

superInfixOp :: (DisambInfixOp (InfixOp (HsCmd GhcPs)) => PV (LocatedA (HsCmd GhcPs))) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsOpAppPV :: SrcSpan -> LocatedA (HsCmd GhcPs) -> LocatedN (InfixOp (HsCmd GhcPs)) -> LocatedA (HsCmd GhcPs) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsCasePV :: SrcSpan -> LHsExpr GhcPs -> LocatedLW [LMatch GhcPs (LocatedA (HsCmd GhcPs))] -> EpAnnHsCase -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsLamPV :: SrcSpan -> HsLamVariant -> LocatedLW [LMatch GhcPs (LocatedA (HsCmd GhcPs))] -> EpAnnLam -> PV (LocatedA (HsCmd GhcPs)) Source #

superFunArg :: (DisambECP (FunArg (HsCmd GhcPs)) => PV (LocatedA (HsCmd GhcPs))) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsAppPV :: SrcSpanAnnA -> LocatedA (HsCmd GhcPs) -> LocatedA (FunArg (HsCmd GhcPs)) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsAppTypePV :: SrcSpanAnnA -> LocatedA (HsCmd GhcPs) -> EpToken "@" -> LHsType GhcPs -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsIfPV :: SrcSpan -> LHsExpr GhcPs -> Bool -> LocatedA (HsCmd GhcPs) -> Bool -> LocatedA (HsCmd GhcPs) -> AnnsIf -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsDoPV :: SrcSpan -> Maybe ModuleName -> LocatedLW [LStmt GhcPs (LocatedA (HsCmd GhcPs))] -> EpaLocation -> EpaLocation -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsParPV :: SrcSpan -> EpToken "(" -> LocatedA (HsCmd GhcPs) -> EpToken ")" -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsVarPV :: LocatedN RdrName -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsLitPV :: Located (HsLit GhcPs) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsOverLitPV :: LocatedAn a (HsOverLit GhcPs) -> PV (LocatedAn a (HsCmd GhcPs)) Source #

mkHsWildCardPV :: NoAnn a => SrcSpan -> PV (LocatedAn a (HsCmd GhcPs)) Source #

mkHsTySigPV :: SrcSpanAnnA -> LocatedA (HsCmd GhcPs) -> LHsType GhcPs -> TokDcolon -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsExplicitListPV :: SrcSpan -> [LocatedA (HsCmd GhcPs)] -> AnnList () -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsSplicePV :: Located (HsUntypedSplice GhcPs) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsRecordPV :: Bool -> SrcSpan -> SrcSpan -> LocatedA (HsCmd GhcPs) -> ([Fbind (HsCmd GhcPs)], Maybe SrcSpan) -> (Maybe (EpToken "{"), Maybe (EpToken "}")) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsNegAppPV :: SrcSpan -> LocatedA (HsCmd GhcPs) -> EpToken "-" -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsSectionR_PV :: SrcSpan -> LocatedA (InfixOp (HsCmd GhcPs)) -> LocatedA (HsCmd GhcPs) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsArrowPV :: SrcSpan -> ArrowParsingMode lhs (HsCmd GhcPs) -> LocatedA lhs -> HsArrowOf (LocatedA (HsCmd GhcPs)) GhcPs -> LocatedA (HsCmd GhcPs) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsMultPV :: EpToken "%" -> LocatedA (HsCmd GhcPs) -> PV (TokRarrow -> HsArrowOf (LocatedA (HsCmd GhcPs)) GhcPs) Source #

mkHsForallPV :: SrcSpan -> HsForAllTelescope GhcPs -> LocatedA (HsCmd GhcPs) -> PV (LocatedA (HsCmd GhcPs)) Source #

checkContextPV :: LocatedA (HsCmd GhcPs) -> PV (LocatedC [LocatedA (HsCmd GhcPs)]) Source #

mkQualPV :: SrcSpan -> LocatedC [LocatedA (HsCmd GhcPs)] -> LocatedA (HsCmd GhcPs) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsAsPatPV :: SrcSpan -> LocatedN RdrName -> EpToken "@" -> LocatedA (HsCmd GhcPs) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsLazyPatPV :: SrcSpan -> LocatedA (HsCmd GhcPs) -> EpToken "~" -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsBangPatPV :: SrcSpan -> LocatedA (HsCmd GhcPs) -> EpToken "!" -> PV (LocatedA (HsCmd GhcPs)) Source #

mkSumOrTuplePV :: SrcSpanAnnA -> Boxity -> SumOrTuple (HsCmd GhcPs) -> (EpaLocation, EpaLocation) -> PV (LocatedA (HsCmd GhcPs)) Source #

mkHsEmbTyPV :: SrcSpan -> EpToken "type" -> LHsType GhcPs -> PV (LocatedA (HsCmd GhcPs)) Source #

rejectPragmaPV :: LocatedA (HsCmd GhcPs) -> PV () Source #

DisambECP (HsExpr GhcPs) Source # 
Instance details

Defined in GHC.Parser.PostProcess

Associated Types

type Body (HsExpr GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

type InfixOp (HsExpr GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

type FunArg (HsExpr GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

Methods

ecpFromCmd' :: LHsCmd GhcPs -> PV (LocatedA (HsExpr GhcPs)) Source #

ecpFromExp' :: LHsExpr GhcPs -> PV (LocatedA (HsExpr GhcPs)) Source #

ecpFromPat' :: LPat GhcPs -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsProjUpdatePV :: SrcSpan -> Located [LocatedAn NoEpAnns (DotFieldOcc GhcPs)] -> LocatedA (HsExpr GhcPs) -> Bool -> Maybe (EpToken "=") -> PV (LHsRecProj GhcPs (LocatedA (HsExpr GhcPs))) Source #

mkHsLetPV :: SrcSpan -> EpToken "let" -> HsLocalBinds GhcPs -> EpToken "in" -> LocatedA (HsExpr GhcPs) -> PV (LocatedA (HsExpr GhcPs)) Source #

superInfixOp :: (DisambInfixOp (InfixOp (HsExpr GhcPs)) => PV (LocatedA (HsExpr GhcPs))) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsOpAppPV :: SrcSpan -> LocatedA (HsExpr GhcPs) -> LocatedN (InfixOp (HsExpr GhcPs)) -> LocatedA (HsExpr GhcPs) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsCasePV :: SrcSpan -> LHsExpr GhcPs -> LocatedLW [LMatch GhcPs (LocatedA (HsExpr GhcPs))] -> EpAnnHsCase -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsLamPV :: SrcSpan -> HsLamVariant -> LocatedLW [LMatch GhcPs (LocatedA (HsExpr GhcPs))] -> EpAnnLam -> PV (LocatedA (HsExpr GhcPs)) Source #

superFunArg :: (DisambECP (FunArg (HsExpr GhcPs)) => PV (LocatedA (HsExpr GhcPs))) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsAppPV :: SrcSpanAnnA -> LocatedA (HsExpr GhcPs) -> LocatedA (FunArg (HsExpr GhcPs)) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsAppTypePV :: SrcSpanAnnA -> LocatedA (HsExpr GhcPs) -> EpToken "@" -> LHsType GhcPs -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsIfPV :: SrcSpan -> LHsExpr GhcPs -> Bool -> LocatedA (HsExpr GhcPs) -> Bool -> LocatedA (HsExpr GhcPs) -> AnnsIf -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsDoPV :: SrcSpan -> Maybe ModuleName -> LocatedLW [LStmt GhcPs (LocatedA (HsExpr GhcPs))] -> EpaLocation -> EpaLocation -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsParPV :: SrcSpan -> EpToken "(" -> LocatedA (HsExpr GhcPs) -> EpToken ")" -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsVarPV :: LocatedN RdrName -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsLitPV :: Located (HsLit GhcPs) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsOverLitPV :: LocatedAn a (HsOverLit GhcPs) -> PV (LocatedAn a (HsExpr GhcPs)) Source #

mkHsWildCardPV :: NoAnn a => SrcSpan -> PV (LocatedAn a (HsExpr GhcPs)) Source #

mkHsTySigPV :: SrcSpanAnnA -> LocatedA (HsExpr GhcPs) -> LHsType GhcPs -> TokDcolon -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsExplicitListPV :: SrcSpan -> [LocatedA (HsExpr GhcPs)] -> AnnList () -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsSplicePV :: Located (HsUntypedSplice GhcPs) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsRecordPV :: Bool -> SrcSpan -> SrcSpan -> LocatedA (HsExpr GhcPs) -> ([Fbind (HsExpr GhcPs)], Maybe SrcSpan) -> (Maybe (EpToken "{"), Maybe (EpToken "}")) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsNegAppPV :: SrcSpan -> LocatedA (HsExpr GhcPs) -> EpToken "-" -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsSectionR_PV :: SrcSpan -> LocatedA (InfixOp (HsExpr GhcPs)) -> LocatedA (HsExpr GhcPs) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsArrowPV :: SrcSpan -> ArrowParsingMode lhs (HsExpr GhcPs) -> LocatedA lhs -> HsArrowOf (LocatedA (HsExpr GhcPs)) GhcPs -> LocatedA (HsExpr GhcPs) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsMultPV :: EpToken "%" -> LocatedA (HsExpr GhcPs) -> PV (TokRarrow -> HsArrowOf (LocatedA (HsExpr GhcPs)) GhcPs) Source #

mkHsForallPV :: SrcSpan -> HsForAllTelescope GhcPs -> LocatedA (HsExpr GhcPs) -> PV (LocatedA (HsExpr GhcPs)) Source #

checkContextPV :: LocatedA (HsExpr GhcPs) -> PV (LocatedC [LocatedA (HsExpr GhcPs)]) Source #

mkQualPV :: SrcSpan -> LocatedC [LocatedA (HsExpr GhcPs)] -> LocatedA (HsExpr GhcPs) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsAsPatPV :: SrcSpan -> LocatedN RdrName -> EpToken "@" -> LocatedA (HsExpr GhcPs) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsLazyPatPV :: SrcSpan -> LocatedA (HsExpr GhcPs) -> EpToken "~" -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsBangPatPV :: SrcSpan -> LocatedA (HsExpr GhcPs) -> EpToken "!" -> PV (LocatedA (HsExpr GhcPs)) Source #

mkSumOrTuplePV :: SrcSpanAnnA -> Boxity -> SumOrTuple (HsExpr GhcPs) -> (EpaLocation, EpaLocation) -> PV (LocatedA (HsExpr GhcPs)) Source #

mkHsEmbTyPV :: SrcSpan -> EpToken "type" -> LHsType GhcPs -> PV (LocatedA (HsExpr GhcPs)) Source #

rejectPragmaPV :: LocatedA (HsExpr GhcPs) -> PV () Source #

data ArrowParsingMode lhs rhs where Source #

Constructors

ArrowIsViewPat :: forall rhs. ArrowParsingMode (HsExpr GhcPs) rhs 
ArrowIsFunType :: forall lhs. ArrowParsingMode lhs lhs 

withArrowParsingMode :: DisambECP b => (forall lhs. DisambECP lhs => ArrowParsingMode lhs b -> PV r) -> PV r Source #

withArrowParsingMode' :: DisambECP b => (forall lhs. DisambECP lhs => ArrowParsingMode lhs b -> PV (LocatedA b)) -> PV (LocatedA b) Source #

data PatBuilder p Source #

See Note [Ambiguous syntactic categories] and Note [PatBuilder]

Instances

Instances details
DisambECP (PatBuilder GhcPs) Source # 
Instance details

Defined in GHC.Parser.PostProcess

Associated Types

type Body (PatBuilder GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

type InfixOp (PatBuilder GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

type FunArg (PatBuilder GhcPs) 
Instance details

Defined in GHC.Parser.PostProcess

Methods

ecpFromCmd' :: LHsCmd GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

ecpFromExp' :: LHsExpr GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

ecpFromPat' :: LPat GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsProjUpdatePV :: SrcSpan -> Located [LocatedAn NoEpAnns (DotFieldOcc GhcPs)] -> LocatedA (PatBuilder GhcPs) -> Bool -> Maybe (EpToken "=") -> PV (LHsRecProj GhcPs (LocatedA (PatBuilder GhcPs))) Source #

mkHsLetPV :: SrcSpan -> EpToken "let" -> HsLocalBinds GhcPs -> EpToken "in" -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

superInfixOp :: (DisambInfixOp (InfixOp (PatBuilder GhcPs)) => PV (LocatedA (PatBuilder GhcPs))) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsOpAppPV :: SrcSpan -> LocatedA (PatBuilder GhcPs) -> LocatedN (InfixOp (PatBuilder GhcPs)) -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsCasePV :: SrcSpan -> LHsExpr GhcPs -> LocatedLW [LMatch GhcPs (LocatedA (PatBuilder GhcPs))] -> EpAnnHsCase -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsLamPV :: SrcSpan -> HsLamVariant -> LocatedLW [LMatch GhcPs (LocatedA (PatBuilder GhcPs))] -> EpAnnLam -> PV (LocatedA (PatBuilder GhcPs)) Source #

superFunArg :: (DisambECP (FunArg (PatBuilder GhcPs)) => PV (LocatedA (PatBuilder GhcPs))) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsAppPV :: SrcSpanAnnA -> LocatedA (PatBuilder GhcPs) -> LocatedA (FunArg (PatBuilder GhcPs)) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsAppTypePV :: SrcSpanAnnA -> LocatedA (PatBuilder GhcPs) -> EpToken "@" -> LHsType GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsIfPV :: SrcSpan -> LHsExpr GhcPs -> Bool -> LocatedA (PatBuilder GhcPs) -> Bool -> LocatedA (PatBuilder GhcPs) -> AnnsIf -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsDoPV :: SrcSpan -> Maybe ModuleName -> LocatedLW [LStmt GhcPs (LocatedA (PatBuilder GhcPs))] -> EpaLocation -> EpaLocation -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsParPV :: SrcSpan -> EpToken "(" -> LocatedA (PatBuilder GhcPs) -> EpToken ")" -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsVarPV :: LocatedN RdrName -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsLitPV :: Located (HsLit GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsOverLitPV :: LocatedAn a (HsOverLit GhcPs) -> PV (LocatedAn a (PatBuilder GhcPs)) Source #

mkHsWildCardPV :: NoAnn a => SrcSpan -> PV (LocatedAn a (PatBuilder GhcPs)) Source #

mkHsTySigPV :: SrcSpanAnnA -> LocatedA (PatBuilder GhcPs) -> LHsType GhcPs -> TokDcolon -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsExplicitListPV :: SrcSpan -> [LocatedA (PatBuilder GhcPs)] -> AnnList () -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsSplicePV :: Located (HsUntypedSplice GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsRecordPV :: Bool -> SrcSpan -> SrcSpan -> LocatedA (PatBuilder GhcPs) -> ([Fbind (PatBuilder GhcPs)], Maybe SrcSpan) -> (Maybe (EpToken "{"), Maybe (EpToken "}")) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsNegAppPV :: SrcSpan -> LocatedA (PatBuilder GhcPs) -> EpToken "-" -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsSectionR_PV :: SrcSpan -> LocatedA (InfixOp (PatBuilder GhcPs)) -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsArrowPV :: SrcSpan -> ArrowParsingMode lhs (PatBuilder GhcPs) -> LocatedA lhs -> HsArrowOf (LocatedA (PatBuilder GhcPs)) GhcPs -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsMultPV :: EpToken "%" -> LocatedA (PatBuilder GhcPs) -> PV (TokRarrow -> HsArrowOf (LocatedA (PatBuilder GhcPs)) GhcPs) Source #

mkHsForallPV :: SrcSpan -> HsForAllTelescope GhcPs -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

checkContextPV :: LocatedA (PatBuilder GhcPs) -> PV (LocatedC [LocatedA (PatBuilder GhcPs)]) Source #

mkQualPV :: SrcSpan -> LocatedC [LocatedA (PatBuilder GhcPs)] -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsAsPatPV :: SrcSpan -> LocatedN RdrName -> EpToken "@" -> LocatedA (PatBuilder GhcPs) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsLazyPatPV :: SrcSpan -> LocatedA (PatBuilder GhcPs) -> EpToken "~" -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsBangPatPV :: SrcSpan -> LocatedA (PatBuilder GhcPs) -> EpToken "!" -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkSumOrTuplePV :: SrcSpanAnnA -> Boxity -> SumOrTuple (PatBuilder GhcPs) -> (EpaLocation, EpaLocation) -> PV (LocatedA (PatBuilder GhcPs)) Source #

mkHsEmbTyPV :: SrcSpan -> EpToken "type" -> LHsType GhcPs -> PV (LocatedA (PatBuilder GhcPs)) Source #

rejectPragmaPV :: LocatedA (PatBuilder GhcPs) -> PV () Source #

Outputable (PatBuilder GhcPs) Source # 
Instance details

Defined in GHC.Parser.Types

type Body (PatBuilder GhcPs) Source # 
Instance details

Defined in GHC.Parser.PostProcess

type FunArg (PatBuilder GhcPs) Source # 
Instance details

Defined in GHC.Parser.PostProcess

type InfixOp (PatBuilder GhcPs) Source # 
Instance details

Defined in GHC.Parser.PostProcess

type Anno [LocatedA (Match GhcPs (LocatedA (PatBuilder GhcPs)))] Source # 
Instance details

Defined in GHC.Parser.Types

type Anno [LocatedA (StmtLR GhcPs GhcPs (LocatedA (PatBuilder GhcPs)))] Source # 
Instance details

Defined in GHC.Parser.Types

type Anno (GRHS GhcPs (LocatedA (PatBuilder GhcPs))) Source # 
Instance details

Defined in GHC.Parser.Types

type Anno (Match GhcPs (LocatedA (PatBuilder GhcPs))) Source # 
Instance details

Defined in GHC.Parser.Types

type Anno (StmtLR GhcPs GhcPs (LocatedA (PatBuilder GhcPs))) Source # 
Instance details

Defined in GHC.Parser.Types

class DisambTD b where Source #

Disambiguate constructs that may appear when we do not know ahead of time whether we are parsing a type or a newtype/data constructor.

See Note [Ambiguous syntactic categories] for the general idea.

See Note [Parsing data constructors is hard] for the specific issue this particular class is solving.

Methods

mkHsAppTyHeadPV :: LHsType GhcPs -> PV (LocatedA b) Source #

Process the head of a type-level function/constructor application, i.e. the H in H a b c.

mkHsAppTyPV :: LocatedA b -> LHsType GhcPs -> PV (LocatedA b) Source #

Disambiguate f x (function application or prefix data constructor).

mkHsAppKindTyPV :: LocatedA b -> EpToken "@" -> LHsType GhcPs -> PV (LocatedA b) Source #

Disambiguate f @t (visible kind application)

mkHsOpTyPV :: PromotionFlag -> LHsType GhcPs -> LocatedN RdrName -> LHsType GhcPs -> PV (LocatedA b) Source #

Disambiguate f # x (infix operator)

mkUnpackednessPV :: Located UnpackednessPragma -> LocatedA b -> PV (LocatedA b) Source #

Disambiguate {-# UNPACK #-} t (unpack/nounpack pragma)

addUnpackednessP :: MonadP m => Located UnpackednessPragma -> LHsType GhcPs -> m (LHsType GhcPs) Source #

Annotate a type with either an {-# UNPACK #-} or a {-# NOUNPACK #-} pragma.

mkTupleSyntaxTy :: EpToken "(" -> [LocatedA (HsType GhcPs)] -> EpToken ")" -> P (HsType GhcPs) Source #

Decide whether to parse tuple syntax (Int, Double) in a type as a type or data constructor, based on the extension ListTuplePuns. The case with an explicit promotion quote, '(Int, Double), is handled by mkExplicitTupleTy.

mkTupleSyntaxTycon :: Boxity -> Int -> P RdrName Source #

Decide whether to parse tuple con syntax (,) in a type as a type or data constructor, based on the extension ListTuplePuns. The case with an explicit promotion quote, '(,), is handled by the rule SIMPLEQUOTE sysdcon_nolist in atype.

mkListSyntaxTy0 :: EpToken "[" -> EpToken "]" -> SrcSpan -> P (HsType GhcPs) Source #

Decide whether to parse list tycon syntax [] in a type as a type or data constructor, based on the extension ListTuplePuns. The case with an explicit promotion quote, '[], is handled by mkExplicitListTy.

mkListSyntaxTy1 :: EpToken "[" -> LocatedA (HsType GhcPs) -> EpToken "]" -> P (HsType GhcPs) Source #

Decide whether to parse list type syntax [Int] in a type as a type or data constructor, based on the extension ListTuplePuns. The case with an explicit promotion quote, '[Int], is handled by mkExplicitListTy.

withCombinedComments :: (HasLoc l1, HasLoc l2) => l1 -> l2 -> (SrcSpan -> P a) -> P (LocatedA a) Source #

Call a parser with a span and its comments given by a start and end token.

requireLTPuns :: PsErrPunDetails -> Located a -> Located b -> P () Source #

Emit an error of type PsErrInvalidPun with a location from start to end if the extension ListTuplePuns is disabled.

This is used in Parser.y to guard rules that require punning.