-- | Pattern matching on Template Haskell AST fragments for refactorings.
{-# LANGUAGE PatternSynonyms #-}

module Language.Haskell.Tools.Rewrite.Match.TH where

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

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

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

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

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

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

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

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