module Language.Haskell.Tools.AST.Ann where
import Data.Data
import Control.Reference
import SrcLoc
import Name
import RdrName
import Module
import Id
import Outputable
import Language.Haskell.Tools.AST.Utils.GHCInstances
data Ann elem annot
= Ann { _annotation :: annot
, _element :: elem annot
}
makeReferences ''Ann
data NodeInfo sema src
= NodeInfo { _semanticInfo :: sema
, _sourceInfo :: src
}
deriving (Eq, Show, Data)
makeReferences ''NodeInfo
data SpanInfo
= NodeSpan { _nodeSpan :: SrcSpan }
| ListPos { _listBefore :: String
, _listAfter :: String
, _listDefaultSep :: String
, _listIndented :: Bool
, _listPos :: SrcLoc
}
| OptionalPos { _optionalBefore :: String
, _optionalAfter :: String
, _optionalPos :: SrcLoc
}
deriving (Eq, Show, Data)
makeReferences ''SpanInfo
spanRange :: SpanInfo -> SrcSpan
spanRange (NodeSpan sp) = sp
spanRange ListPos{_listPos = pos} = srcLocSpan pos
spanRange OptionalPos{_optionalPos = pos} = srcLocSpan pos
class HasRange annot where
getRange :: annot -> SrcSpan
instance HasRange (NodeInfo sema SpanInfo) where
getRange = spanRange . (^. sourceInfo)
type RangeInfo = NodeInfo (SemanticInfo RdrName) SpanInfo
type RangeWithName = NodeInfo (SemanticInfo Name) SpanInfo
type RangeWithType = NodeInfo (SemanticInfo Id) SpanInfo
data SemanticInfo n
= NoSemanticInfo
| ScopeInfo { _scopedLocals :: [[Name]]
}
| NameInfo { _scopedLocals :: [[Name]]
, _isDefined :: Bool
, _nameInfo :: n
}
| ModuleInfo { _defModuleName :: Module
, _importedNames :: [n]
}
| ImportInfo { _importedModule :: Module
, _availableNames :: [n]
, _importedNames :: [n]
}
| AmbiguousNameInfo { _scopedLocals :: [[Name]]
, _isDefined :: Bool
, _ambiguousName :: RdrName
, _ambiguousLocation :: SrcSpan
}
deriving (Eq, Data)
instance Outputable n => Show (SemanticInfo n) where
show NoSemanticInfo = "NoSemanticInfo"
show (ScopeInfo locals) = "(ScopeInfo " ++ showSDocUnsafe (ppr locals) ++ ")"
show (NameInfo locals defined nameInfo) = "(NameInfo " ++ showSDocUnsafe (ppr locals) ++ " " ++ show defined ++ " " ++ showSDocUnsafe (ppr nameInfo) ++ ")"
show (ModuleInfo mod imp) = "(ModuleInfo " ++ showSDocUnsafe (ppr mod) ++ " " ++ showSDocUnsafe (ppr imp) ++ ")"
show (ImportInfo mod avail imported) = "(ImportInfo " ++ showSDocUnsafe (ppr mod) ++ " " ++ showSDocUnsafe (ppr avail) ++ " " ++ showSDocUnsafe (ppr imported) ++ ")"
makeReferences ''SemanticInfo
data AnnList e a = AnnList { _annListAnnot :: a
, _annListElems :: [Ann e a]
}
makeReferences ''AnnList
annList :: Traversal (AnnList e a) (AnnList e' a) (Ann e a) (Ann e' a)
annList = annListElems & traversal
data AnnMaybe e a = AnnMaybe { _annMaybeAnnot :: a
, _annMaybe :: Maybe (Ann e a)
}
makeReferences ''AnnMaybe
annJust :: Partial (AnnMaybe e a) (AnnMaybe e' a) (Ann e a) (Ann e' a)
annJust = annMaybe & just
annNil :: a -> AnnList e a
annNil a = AnnList a []
isAnnNothing :: AnnMaybe e a -> Bool
isAnnNothing (AnnMaybe _ Nothing) = True
isAnnNothing (AnnMaybe _ _) = False
annNothing :: a -> AnnMaybe e a
annNothing a = AnnMaybe a Nothing
class HasAnnot node where
getAnnot :: node a -> a
instance HasAnnot (Ann e) where
getAnnot = (^. annotation)
instance HasAnnot (AnnList e) where
getAnnot = (^. annListAnnot)
instance HasAnnot (AnnMaybe e) where
getAnnot = (^. annMaybeAnnot)