Retrie/Query.hs (62 lines of code) (raw):
-- Copyright (c) Facebook, Inc. and its affiliates.
--
-- This source code is licensed under the MIT license found in the
-- LICENSE file in the root directory of this source tree.
--
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Retrie.Query
( QuerySpec(..)
, parseQuerySpecs
, genericQ
) where
import Retrie.ExactPrint
import Retrie.Fixity
import Retrie.GHC
import Retrie.Quantifiers
import Retrie.Substitution
import Retrie.SYB
import Retrie.Types
import Retrie.Universe
-- | Specifies which parser to use in 'Retrie.parseQueries'.
data QuerySpec
= QExpr String
| QType String
| QStmt String
parseQuerySpecs
:: LibDir
-> FixityEnv
-> [(Quantifiers, QuerySpec, v)]
-> IO [Query Universe v]
parseQuerySpecs libdir' fixityEnv =
mapM $ \(qQuantifiers, querySpec, qResult) -> do
qPattern <- parse libdir' querySpec
return Query{..}
where
parse libdir (QExpr s) = do
e <- parseExpr libdir s
fmap inject <$> transformA e (fix fixityEnv)
parse libdir (QType s) = fmap inject <$> parseType libdir s
parse libdir (QStmt s) = do
stmt <- parseStmt libdir s
fmap inject <$> transformA stmt (fix fixityEnv)
genericQ
:: Typeable a
=> Matcher v
-> Context
-> a
-> TransformT IO [(Context, Substitution, v)]
genericQ m ctxt =
mkQ (return []) (genericQImpl @(LHsExpr GhcPs) m ctxt)
`extQ` (genericQImpl @(LStmt GhcPs (LHsExpr GhcPs)) m ctxt)
`extQ` (genericQImpl @(LHsType GhcPs) m ctxt)
genericQImpl
:: forall ast v. Matchable ast
=> Matcher v
-> Context
-> ast
-> TransformT IO [(Context, Substitution, v)]
genericQImpl m ctxt ast = do
pairs <- runMatcher ctxt m ast
return [ (ctxt, sub, v) | (sub, v) <- pairs ]