module Language.Haskell.Tools.Refactor.BindingElem where
import Control.Reference
import Language.Haskell.Tools.AST
import Language.Haskell.Tools.AST.Rewrite
import SrcLoc (RealSrcSpan(..))
class NamedElement d => BindingElem d where
sigBind :: Simple Partial (Ann d dom SrcTemplateStage) (TypeSignature dom)
valBind :: Simple Partial (Ann d dom SrcTemplateStage) (ValueBind dom)
fixitySig :: Simple Partial (Ann d dom SrcTemplateStage) (FixitySignature dom)
createTypeSig :: TypeSignature dom -> Ann d dom SrcTemplateStage
createBinding :: ValueBind dom -> Ann d dom SrcTemplateStage
createFixitySig :: FixitySignature dom -> Ann d dom SrcTemplateStage
isTypeSig :: Ann d dom SrcTemplateStage -> Bool
isBinding :: Ann d dom SrcTemplateStage -> Bool
isFixitySig :: Ann d dom SrcTemplateStage -> Bool
instance BindingElem UDecl where
sigBind = declTypeSig
valBind = declValBind
fixitySig = declFixity
createTypeSig = mkTypeSigDecl
createBinding = mkValueBinding
createFixitySig = mkFixityDecl
isTypeSig TypeSigDecl {} = True
isTypeSig _ = False
isBinding ValueBinding {} = True
isBinding _ = False
isFixitySig FixityDecl {} = True
isFixitySig _ = False
instance BindingElem ULocalBind where
sigBind = localSig
valBind = localVal
fixitySig = localFixity
createTypeSig = mkLocalTypeSig
createBinding = mkLocalValBind
createFixitySig = mkLocalFixity
isTypeSig LocalTypeSig {} = True
isTypeSig _ = False
isBinding LocalValBind {} = True
isBinding _ = False
isFixitySig LocalFixity {} = True
isFixitySig _ = False
getValBindInList :: (BindingElem d) => RealSrcSpan -> AnnListG d dom SrcTemplateStage -> Maybe (ValueBind dom)
getValBindInList sp ls = case ls ^? valBindsInList & filtered (isInside sp) of
[] -> Nothing
[n] -> Just n
_ -> error "getValBindInList: Multiple nodes"
valBindsInList :: BindingElem d => Simple Traversal (AnnListG d dom SrcTemplateStage) (ValueBind dom)
valBindsInList = annList & valBind