Plan 9 from Bell Labs’s /usr/web/sources/contrib/fernan/nhc98/src/compiler98/ImportState.hs

Copyright © 2021 Plan 9 Foundation.
Distributed under the MIT License.
Download the Plan 9 distribution.


{- |
Internal state of the compiler used from need analysis until renaming

Needs 'IdSupply'?
-}
module ImportState (module ImportState, module Info, Decl) where

import State
import SysDeps(PackedString,packString)
import Syntax(Decl)
import qualified Data.Map as Map
import qualified Data.Set as Set
import Info
import Error
import Id


-- | It is probably best to refrain from direct access to the fields...
data  ImportState =
      ImportState {
        visibleIS :: Bool,
        uniqueIS :: Id,                -- ^ next unique 'Id'
        rpsIS :: PackedString,         -- ^ modid of interface file
        sectionRpsIS :: PackedString,  -- ^ modid of this section of the interface file
        needIS :: (Set.Set TokenId),   -- ^ needI [What does this mean? --SamB]
        renameIS :: (Map.Map (TokenId,IdKind) (Either [Pos] [Id])),
        -- ^ rename (name -> unique)
        symtabIS :: (Map.Map (TokenId,IdKind) Info),
        -- ^ symboltable (real name -> info)
        instsIS :: [(TokenId,TokenId,TokenId,[Id],[(Pos,TokenId,Id)])],
        -- ^ [ (mod,realClass, realData, free , Ctxs) ]
        fixityIS :: (TokenId -> (InfixClass TokenId,Int)),
        -- ^ fixity information (name -> fixity)
        errorsIS :: [Error]            -- ^ errors
      }

instance IdSupply ImportState where
    getUniqueId _ is@(ImportState { uniqueIS = unique }) 
        = (unique, is { uniqueIS = succ unique })
        
    
{- | initial import state -}
initIS :: Map.Map (TokenId,IdKind) [Pos] -> ImportState
initIS rt = 
  ImportState False (toEnum 1) (packString "???") (packString "???") Set.empty
    (Map.map Left rt) Map.empty [] (error "no fixity") []


{- | put modid of interface file into import state -}
putModidIS :: ImportState -> PackedString -> ImportState
putModidIS is rps = is { visibleIS = True, rpsIS = rps, sectionRpsIS = rps }

{- | put modid of current section of interface file into import state -}
putModid2IS :: ImportState -> Bool -> PackedString -> ImportState
putModid2IS is visible rps = is { visibleIS = visible, sectionRpsIS = rps }


getNeedIS :: ImportState -> (PackedString, PackedString, Set.Set TokenId)
getNeedIS is = (rpsIS is, sectionRpsIS is, needIS is)

getSymbolTableIS :: ImportState -> Map.Map (TokenId, IdKind) Info
getSymbolTableIS = symtabIS

getRenameTableIS :: ImportState -> Map.Map (TokenId, IdKind) (Either [Pos] [Id])
getRenameTableIS = renameIS

getErrIS :: ImportState -> Either [Error] ImportState
getErrIS is@(ImportState { errorsIS = errors })
  | null errors = Right is
  | otherwise   = Left errors

importError :: Error -> a -> () -> ImportState -> (a,ImportState)
importError err r _ is = (r, is { errorsIS = err : errorsIS is })



-- Things added as part of an attempt to keep "IExtract" from having
-- to pattern match on so many 'ImportState's

-- | Maybe this should be rolled into 'addSymbolIS'?
addNeedIS :: TokenId -> State0 a ImportState ImportState
addNeedIS tid _ is = is { needIS = Set.insert tid (needIS is) }

addSymbolIS :: (TokenId, IdKind) -> Info -> State0 a ImportState ImportState
addSymbolIS symbol info _ is = is { symtabIS = Map.insertWith combInfo symbol info (symtabIS is) }

findSymbolIS :: (TokenId, IdKind) -> State a ImportState (Maybe Info) ImportState
findSymbolIS symbol _ is = (Map.lookup symbol (symtabIS is), is)

Bell Labs OSI certified Powered by Plan 9

(Return to Plan 9 Home Page)

Copyright © 2021 Plan 9 Foundation. All Rights Reserved.
Comments to [email protected].