packages feed

helium-1.8: src/Helium/StaticAnalysis/StaticChecks/ExportErrors.ag

-----------------------------------------------------------------------------
-- |The Helium Compiler : Static Analysis
-- 
-- Maintainer  :  bastiaan@cs.uu.nl
-- Stability   :  experimental
-- Portability :  unknown
--
-- !!! CLEAN UP THIS CODE !!!
--
-------------------------------------------------------------------------------

{-
SEM Export
    | TypeOrClassComplete
                  lhs . errors =  checkExport ExportTypeConstructor @name.self
                                    @lhs.tyconsInScope
    | TypeOrClass lhs . errors =  checkExport ExportTypeConstructor @name.self
                                    @lhs.tyconsInScope
                                ++
                                concatMap
                                    (\name ->
                                        checkExport ExportConstructor name
                                            @lhs.consInScope
                                    )
                                    @names.toList
-}
SEM Module
  | Module  exports . namesInScop   = concat [ @body.declVarNames
                                              , concatMap (M.keys . typeEnvironment) @lhs.importEnvironments
                                              , map fst @derivedFunctions
                                              ]
                    . modulesInScope = (@moduleName : @fileName : @body.importedModules)
                    . tyconsInScope  = @allTypeConstructors
                    . consInScope    = @allValueConstructors

SEM Module 
  | Module    loc . exportErrors = @exports.exportErrors
                    
ATTR MaybeExports Exports Export
    [ namesInScop   : Names
      modulesInScope : Names
      tyconsInScope  : Names
      consInScope    : Names
    |
    | exportErrors USE { ++ } { [] } : {[Error]}
    ]                    
    
{

checkExport :: Entity -> Name -> [Name] -> [Error]
checkExport entity name inScope =
    makeUndefined entity
        (if name `elem` inScope then
            []
         else
            [name]
        )
        (nubBy equalName inScope)

equalName :: Name -> Name -> Bool       
equalName x y =
    getNameName x == getNameName y        
}

SEM Export
    | Variable    lhs . exportErrors =  checkExport ExportVariable @name.self
                                           @lhs.namesInScop
    | Module      lhs . exportErrors =  checkExport ExportModule @name.self
                                           @lhs.modulesInScope    
-------------------------------------------
-- Collecting the imported modules

ATTR ImportDeclarations ImportDeclaration  [ | importedModules : Names | ]
ATTR Body                                  [ | | importedModules : Names ]  

SEM Body
  | Hole    lhs . importedModules = []
  | Body    importdeclarations . importedModules = []
    
SEM ImportDeclaration
  | Import   lhs . importedModules = @name.self : @lhs.importedModules