asil-1.2: src/SymView.ag
MODULE {SymView} {} {}
INCLUDE "SymViewAst.ag"
imports
{
import Data.Word
import ProgInfo
import Data.Maybe
}
DERIVING * : Eq, Show
-- Operations to construct views
{
tablesView :: [SymbolTables] -> FileV
tablesView tbls = FileV_File $ map tableView tbls
tableView :: SymbolTables -> TableV
tableView tbls = TableV_Table classes methods where
classes = map (classView tbls) (map Ref $ keysEnv $ tableClasses tbls)
methods = map (methodView tbls) (map Ref $ keysEnv $ tableSigs tbls)
classView :: SymbolTables -> ClassRef -> ClassV
classView tbls ref = res where
c = lookupClass ref tbls
nm = nameView tbls (clName c)
mbSuper = fmap (SuperV_Super . TypeV_Type (refNull $ fromJust $ clSuper c)) $ mbNameView tbls $ clSuper c
itfs = map (\tpRef -> ItfV_Itf $ TypeV_Type (refNull tpRef) $ nameView tbls tpRef) (clInterfaces c)
dynTraits = map (traitView tbls) (clDynTraits c)
staTraits = map (traitView tbls) (clStaTraits c)
res = ClassV_Class ref nm mbSuper itfs dynTraits staTraits
traitView :: SymbolTables -> TraitDescr -> TraitV
traitView tbls tr = case trData tr of
TraitMethod mRef -> TraitV_Method nm $ sigView tbls mRef
TraitField tpRef -> TraitV_Field nm $ TypeV_Type (refNull tpRef) $ nameView tbls tpRef
TraitClass _ -> TraitV_Other nm
where nm = nameView tbls (trName tr)
methodView :: SymbolTables -> MethodRef -> MethodV
methodView tbls ref = res where
m = lookupMethod ref tbls
mbNm = mbStringView tbls $ sigName m
sig = sigView' tbls ref m
res = MethodV_Method mbNm sig
sigView :: SymbolTables -> MethodRef -> SigV
sigView tbls ref = sigView' tbls ref m where
m = lookupMethod ref tbls
sigView' :: SymbolTables -> MethodRef -> Sig -> SigV
sigView' tbls ref m = res where
mbNm = mbStringView tbls $ sigName m
tRef = sigReturn m
ret = TypeV_Type (refNull tRef) $ nameView tbls tRef
ps = map (paramView tbls) (sigParams m)
res = SigV_Sig ref ret ps
paramView :: SymbolTables -> SigParam -> ParamV
paramView tbls p = ParamV_Param (mbStringView tbls $ spName p) (TypeV_Type (refNull tpRef) $ nameView tbls tpRef)
where tpRef = spType p
mbNameView :: SymbolTables -> Maybe NameRef -> MbNmV
mbNameView tbls = maybe Nothing (Just . nameView tbls)
nameView :: SymbolTables -> NameRef -> NmV
nameView tbls ref = case nmStr nm of
Nothing -> NmV_Other ref
Just strRef -> case nmQual nm of
QualNs nsRef -> NmV_Qual ref (namespaceView tbls nsRef) (stringView tbls strRef)
QualNss sRef -> case nsSpaces $ lookupNameset sRef tbls of
[nsRef] -> NmV_Qual ref (namespaceView tbls nsRef) (stringView tbls strRef)
_ -> NmV_Quals ref (namesetsView tbls sRef) (stringView tbls strRef)
_ -> NmV_Other ref
where nm = lookupName ref tbls
mbStringView :: SymbolTables -> Maybe StringRef -> MbStrV
mbStringView tbls = maybe Nothing (Just . stringView tbls)
stringView :: SymbolTables -> StringRef -> StrV
stringView tbls ref = StrV_Str ref (lookupString ref tbls)
namespaceView :: SymbolTables -> NamespaceRef -> NsV
namespaceView tbls ref = NsV_Ns ref (stringView tbls $ nsName $ lookupNamespace ref tbls)
namesetsView :: SymbolTables -> NamesetRef -> NsSetV
namesetsView tbls ref = NsSetV_Set ref views where
spaces = nsSpaces $ lookupNameset ref tbls
views = map (namespaceView tbls) spaces
}