-- | Generation of basic AST fragments (names for example) for refactorings
{-# LANGUAGE PatternSynonyms #-}
module Language.Haskell.Tools.AST.Match.Names where

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

-- | A normal operator used as an operator.
pattern NormalOp :: QualifiedName dom -> Operator dom
pattern NormalOp n <- Ann _ (UNormalOp n)

-- | A normal name used as an operator with backticks: @ a \`mod\` b @
pattern BacktickOp :: QualifiedName dom -> Operator dom
pattern BacktickOp n <- Ann _ (UBacktickOp n)

-- | A normal, non-operator name.
pattern NormalName :: QualifiedName dom -> Name dom
pattern NormalName n <- Ann _ (UNormalName n)

-- | Parenthesized name: @ foldl (+) 0 @
pattern ParenName :: QualifiedName dom -> Name dom
pattern ParenName n <- Ann _ (UParenName n)

-- | Creates an implicit name: @ ?var @
pattern ImplicitName :: QualifiedName dom -> Name dom
pattern ImplicitName n <- Ann _ (UImplicitName n)

-- | Program elements formatted as string literals (import packages, pragma texts)
pattern StringNode :: String -> StringNode dom
pattern StringNode s <- Ann _ (UStringNode s )

-- | Possibly qualified name.
pattern QualifiedName :: NamePartList dom -> NamePart dom -> QualifiedName dom
pattern QualifiedName quals unqual <- Ann _ (UQualifiedName quals unqual)

-- | Parts of a qualified name.
pattern NamePart :: String -> NamePart dom
pattern NamePart str <- Ann _ (UNamePart str)