module Language.Haskell.Tools.AST.SemaInfoTypes where
import Name
import Id
import Module
import SrcLoc
import RdrName
import Outputable
import Data.Data
import Control.Reference
data NoSemanticInfo = NoSemanticInfo
deriving (Eq, Data)
data ScopeInfo = ScopeInfo { _exprScopedLocals :: [[Name]]
}
deriving (Eq, Data)
data NameInfo n = NameInfo { _nameScopedLocals :: [[Name]]
, _nameIsDefined :: Bool
, _nameInfo :: n
}
| AmbiguousNameInfo { _nameScopedLocals :: [[Name]]
, _nameIsDefined :: Bool
, _ambiguousName :: RdrName
, _ambiguousLocation :: SrcSpan
}
| ImplicitNameInfo { _nameScopedLocals :: [[Name]]
, _nameIsDefined :: Bool
, _implicitName :: String
}
deriving (Eq, Data)
data CNameInfo = CNameInfo { _cnameScopedLocals :: [[Name]]
, _cnameIsDefined :: Bool
, _cnameInfo :: Id
}
deriving (Eq, Data)
data ModuleInfo n = ModuleInfo { _defModuleName :: Module
, _implicitNames :: [n]
}
deriving (Eq, Data)
data ImportInfo n = ImportInfo { _importedModule :: Module
, _availableNames :: [n]
, _importedNames :: [n]
}
deriving (Eq, Data)
instance Show ScopeInfo where
show (ScopeInfo locals) = "(ScopeInfo " ++ showSDocUnsafe (ppr locals) ++ ")"
instance Outputable n => Show (NameInfo n) where
show (NameInfo locals defined nameInfo) = "(NameInfo " ++ showSDocUnsafe (ppr locals) ++ " " ++ show defined ++ " " ++ showSDocUnsafe (ppr nameInfo) ++ ")"
show (AmbiguousNameInfo locals defined nameInfo span) = "(AmbiguousNameInfo " ++ showSDocUnsafe (ppr locals) ++ " " ++ show defined ++ " " ++ showSDocUnsafe (ppr nameInfo) ++ " " ++ show span ++ ")"
show (ImplicitNameInfo locals defined nameInfo) = "(ImplicitNameInfo " ++ showSDocUnsafe (ppr locals) ++ " " ++ show defined ++ " " ++ showSDocUnsafe (ppr nameInfo) ++ ")"
instance Show CNameInfo where
show (CNameInfo locals defined nameInfo) = "(CNameInfo " ++ showSDocUnsafe (ppr locals) ++ " " ++ show defined ++ " " ++ showSDocUnsafe (ppr nameInfo) ++ ")"
instance Outputable n => Show (ModuleInfo n) where
show (ModuleInfo mod imp) = "(ModuleInfo " ++ showSDocUnsafe (ppr mod) ++ " " ++ showSDocUnsafe (ppr imp) ++ ")"
instance Outputable n => Show (ImportInfo n) where
show (ImportInfo mod avail imported) = "(ImportInfo " ++ showSDocUnsafe (ppr mod) ++ " " ++ showSDocUnsafe (ppr avail) ++ " " ++ showSDocUnsafe (ppr imported) ++ ")"
instance Show NoSemanticInfo where
show NoSemanticInfo = "NoSemanticInfo"
makeReferences ''NoSemanticInfo
makeReferences ''ScopeInfo
makeReferences ''NameInfo
makeReferences ''CNameInfo
makeReferences ''ModuleInfo
makeReferences ''ImportInfo
class HasNameInfo si where
semanticsName :: si -> Maybe Name
instance HasNameInfo (NameInfo Name) where
semanticsName = (^? nameInfo)
instance HasNameInfo CNameInfo where
semanticsName = fmap idName . (^? cnameInfo)
class HasIdInfo si where
semanticsId :: si -> Maybe Id
instance HasIdInfo (NameInfo Id) where
semanticsId = (^? nameInfo)
instance HasIdInfo CNameInfo where
semanticsId = (^? cnameInfo)
class HasScopeInfo si where
semanticsScope :: si -> [[Name]]
instance HasScopeInfo (NameInfo n) where
semanticsScope = (^. nameScopedLocals)
instance HasScopeInfo CNameInfo where
semanticsScope = (^. cnameScopedLocals)
instance HasScopeInfo ScopeInfo where
semanticsScope = (^. exprScopedLocals)
class HasDefiningInfo si where
semanticsDefining :: si -> Bool
instance HasDefiningInfo (NameInfo n) where
semanticsDefining = (^. nameIsDefined)
instance HasDefiningInfo CNameInfo where
semanticsDefining = (^. cnameIsDefined)
data NodeInfo sema src
= NodeInfo { _semanticInfo :: sema
, _sourceInfo :: src
}
deriving (Eq, Show, Data)
makeReferences ''NodeInfo