packages feed

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