ghc-7.8.4: The GHC API

Safe Haskell | None
Language | Haskell98

Rules

Contents

- RuleBase
  - Constructing
  - Checking rule applications
  - Manipulating `SpecInfo` rules
- Misc. CoreRule helpers

Description

Functions for collecting together and applying rewrite rules to a module. The `CoreRule` datatype itself is declared elsewhere.

Synopsis

- type RuleBase = NameEnv [CoreRule]
- emptyRuleBase :: RuleBase
- mkRuleBase :: [CoreRule] -> RuleBase
- extendRuleBaseList :: RuleBase -> [CoreRule] -> RuleBase
- unionRuleBase :: RuleBase -> RuleBase -> RuleBase
- pprRuleBase :: RuleBase -> SDoc
- ruleCheckProgram :: CompilerPhase -> String -> RuleBase -> CoreProgram -> SDoc
- mkSpecInfo :: [CoreRule] -> SpecInfo
- extendSpecInfo :: SpecInfo -> [CoreRule] -> SpecInfo
- addSpecInfo :: SpecInfo -> SpecInfo -> SpecInfo
- addIdSpecialisations :: Id -> [CoreRule] -> Id
- rulesOfBinds :: [CoreBind] -> [CoreRule]
- getRules :: RuleBase -> Id -> [CoreRule]
- pprRulesForUser :: [CoreRule] -> SDoc
- lookupRule :: DynFlags -> InScopeEnv -> (Activation -> Bool) -> Id -> [CoreExpr] -> [CoreRule] -> Maybe (CoreRule, CoreExpr)
- mkRule :: Bool -> Bool -> RuleName -> Activation -> Name -> [CoreBndr] -> [CoreExpr] -> CoreExpr -> CoreRule
- roughTopNames :: [CoreExpr] -> [Maybe Name]

# RuleBase

type RuleBase = NameEnv [CoreRule]

Gathers a collection of `CoreRule`s. Maps (the name of) an `Id` to its rules

## Constructing

emptyRuleBase :: RuleBase

mkRuleBase :: [CoreRule] -> RuleBase

extendRuleBaseList :: RuleBase -> [CoreRule] -> RuleBase

unionRuleBase :: RuleBase -> RuleBase -> RuleBase

pprRuleBase :: RuleBase -> SDoc

## Checking rule applications

ruleCheckProgram

Arguments

:: CompilerPhase | Rule activation test
-> String | Rule pattern
-> RuleBase | Database of rules
-> CoreProgram | Bindings to check in
-> SDoc | Resulting check message

Report partial matches for rules beginning with the specified string for the purposes of error reporting

## Manipulating `SpecInfo` rules

mkSpecInfo :: [CoreRule] -> SpecInfo

Make a `SpecInfo` containing a number of `CoreRule`s, suitable for putting into an `IdInfo`

extendSpecInfo :: SpecInfo -> [CoreRule] -> SpecInfo

addSpecInfo :: SpecInfo -> SpecInfo -> SpecInfo

addIdSpecialisations :: Id -> [CoreRule] -> Id

# Misc. CoreRule helpers

rulesOfBinds :: [CoreBind] -> [CoreRule]

Gather all the rules for locally bound identifiers from the supplied bindings

getRules :: RuleBase -> Id -> [CoreRule]

pprRulesForUser :: [CoreRule] -> SDoc

lookupRule :: DynFlags -> InScopeEnv -> (Activation -> Bool) -> Id -> [CoreExpr] -> [CoreRule] -> Maybe (CoreRule, CoreExpr)

The main rule matching function. Attempts to apply all (active) supplied rules to this instance of an application in a given context, returning the rule applied and the resulting expression if successful.

mkRule :: Bool -> Bool -> RuleName -> Activation -> Name -> [CoreBndr] -> [CoreExpr] -> CoreExpr -> CoreRule

Used to make `CoreRule` for an `Id` defined in the module being compiled. See also `CoreRule`

roughTopNames :: [CoreExpr] -> [Maybe Name]

Find the "top" free names of several expressions. Such names are either:

1. The function finally being applied to in an application chain (if that name is a GlobalId: see Var), or
2. The `TyCon` if the expression is a `Type`

This is used for the fast-match-check for rules; if the top names don't match, the rest can't