----------------------------------------------------------------------------- -- |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 ] }