-- | Pattern matching on Template Haskell AST fragments for refactorings.
{-# LANGUAGE PatternSynonyms
           #-}
module Language.Haskell.Tools.AST.Match.TH where

import Language.Haskell.Tools.AST
import Language.Haskell.Tools.AST.ElementTypes

-- | A simple name splice: @$generateX@
pattern IdSplice :: Name dom -> Splice dom
pattern IdSplice n <- Ann _ (UIdSplice n)

-- | A splice with parentheses: @$(generate input)@
pattern ParenSplice :: Expr dom -> Splice dom
pattern ParenSplice e <- Ann _ (UParenSplice e)

-- | Template haskell quasi-quotation: @[quoter|str]@  
pattern QuasiQuote :: Name dom -> String -> QuasiQuote dom
pattern QuasiQuote n qqStr <- Ann _ (UQuasiQuote n (Ann _ (QQString qqStr)))

-- | Expression bracket (@ [| x + y |] @)
pattern ExprBracket :: Expr dom -> Bracket dom
pattern ExprBracket e <- Ann _ (UExprBracket e)

-- | Pattern bracket (@ [p| Point x y |] @)
pattern PatternBracket :: Pattern dom -> Bracket dom
pattern PatternBracket p <- Ann _ (UPatternBracket p)

-- | Type bracket (@ [t| (Int,Int) |] @)
pattern TypeBracket :: Type dom -> Bracket dom
pattern TypeBracket t <- Ann _ (UTypeBracket t)

-- | Declaration bracket (@ [d| f :: Int -> Int; f x = x*x |] @)
pattern DeclsBracket :: DeclList dom -> Bracket dom
pattern DeclsBracket d <- Ann _ (UDeclsBracket d)