helium-1.8: src/Helium/StaticAnalysis/StaticChecks/ScopeErrors.ag
-----------------------------------------------------------------------------
-- |The Helium Compiler : Static Analysis
--
-- Maintainer : bastiaan@cs.uu.nl
-- Stability : experimental
-- Portability : unknown
--
-- Scope errors.
--
-----------------------------------------------------------------------------
ATTR Expression Expressions MaybeExpression Pattern Patterns Alternative Alternatives
Statement Statements Declaration Declarations MaybeDeclarations LeftHandSide RightHandSide
FunctionBinding FunctionBindings Body Qualifier Qualifiers
GuardedExpression GuardedExpressions Literal RecordExpressionBinding RecordPatternBinding
RecordExpressionBindings RecordPatternBindings
[ | collectScopeInfos : {[(ScopeInfo, Entity)]} | ]
SEM Module
| Module body . collectScopeInfos = []
loc . scopeErrors = makeErrors @collectScopeInfos
. scopeWarnings = makeWarnings @collectScopeInfos
SEM Module
| Module loc . collectScopeInfos = (topLevelScopeInfo @scopeInfo, Definition) : @body.collectScopeInfos
SEM FunctionBinding
| FunctionBinding lhs . collectScopeInfos = (@scopeInfo, Variable) : @righthandside.collectScopeInfos
SEM MaybeDeclarations
| Just lhs . collectScopeInfos = (@scopeInfo, Definition) : @declarations.collectScopeInfos
SEM Expression
| Lambda lhs . collectScopeInfos = (@scopeInfo, Variable) : @expression.collectScopeInfos
| Let lhs . collectScopeInfos = (@scopeInfo, Definition) : @expression.collectScopeInfos
SEM Alternative
| Alternative lhs . collectScopeInfos = (@scopeInfo, Variable) : @righthandside.collectScopeInfos
SEM Statement
| Let lhs . collectScopeInfos = (@scopeInfo, Definition) : @declarations.collectScopeInfos
| Generator lhs . collectScopeInfos = (@scopeInfo, Variable) : @expression.collectScopeInfos
SEM Qualifier
| Let lhs . collectScopeInfos = (@scopeInfo, Definition) : @declarations.collectScopeInfos
| Generator lhs . collectScopeInfos = (@scopeInfo, Variable) : @expression.collectScopeInfos
{
topLevelScopeInfo :: ScopeInfo -> ScopeInfo
topLevelScopeInfo (xs, _, _) = (xs, [], [])
makeErrors :: [(ScopeInfo, Entity)] -> Errors
makeErrors xs = [ Duplicated entity ys | ((yss, _, _), entity) <- xs, ys <- yss ]
makeWarnings :: [(ScopeInfo, Entity)] -> Warnings
makeWarnings xs = [ Unused entity name | ((_, names, _), entity) <- xs, name <- names ]
++ [ Shadow n2 n1 | ((_, _, pairs), _) <- xs, (n1, n2) <- pairs ]
}